@tetrascience-npm/tetrascience-react-ui 0.5.0 → 0.6.0-beta.78.1

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 (192) hide show
  1. package/README.md +84 -37
  2. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +2 -0
  3. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -0
  4. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +140 -0
  5. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js.map +1 -0
  6. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +2 -0
  7. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -0
  8. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +126 -0
  9. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js.map +1 -0
  10. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs +2 -0
  11. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs.map +1 -0
  12. package/dist/components/composed/PlateMapEditor/PlateMapEditor.js +341 -0
  13. package/dist/components/composed/PlateMapEditor/PlateMapEditor.js.map +1 -0
  14. package/dist/components/composed/PlateMapEditor/PlateMapForm.cjs +2 -0
  15. package/dist/components/composed/PlateMapEditor/PlateMapForm.cjs.map +1 -0
  16. package/dist/components/composed/PlateMapEditor/PlateMapForm.js +43 -0
  17. package/dist/components/composed/PlateMapEditor/PlateMapForm.js.map +1 -0
  18. package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs +2 -0
  19. package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs.map +1 -0
  20. package/dist/components/composed/PlateMapEditor/PlateMapGrid.js +154 -0
  21. package/dist/components/composed/PlateMapEditor/PlateMapGrid.js.map +1 -0
  22. package/dist/components/composed/PlateMapEditor/PlateMapManifest.cjs +2 -0
  23. package/dist/components/composed/PlateMapEditor/PlateMapManifest.cjs.map +1 -0
  24. package/dist/components/composed/PlateMapEditor/PlateMapManifest.js +44 -0
  25. package/dist/components/composed/PlateMapEditor/PlateMapManifest.js.map +1 -0
  26. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +2 -0
  27. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -0
  28. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +136 -0
  29. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js.map +1 -0
  30. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs +2 -0
  31. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs.map +1 -0
  32. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +389 -0
  33. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -0
  34. package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs +2 -0
  35. package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs.map +1 -0
  36. package/dist/components/composed/PlateMapEditor/PlateZoomControl.js +54 -0
  37. package/dist/components/composed/PlateMapEditor/PlateZoomControl.js.map +1 -0
  38. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs +2 -0
  39. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs.map +1 -0
  40. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.js +96 -0
  41. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.js.map +1 -0
  42. package/dist/components/composed/PlateMapEditor/WellLegend.cjs +2 -0
  43. package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -0
  44. package/dist/components/composed/PlateMapEditor/WellLegend.js +58 -0
  45. package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -0
  46. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +2 -0
  47. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -0
  48. package/dist/components/composed/PlateMapEditor/WellManifestTable.js +421 -0
  49. package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -0
  50. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs +2 -0
  51. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs.map +1 -0
  52. package/dist/components/composed/PlateMapEditor/WellMetadataForm.js +177 -0
  53. package/dist/components/composed/PlateMapEditor/WellMetadataForm.js.map +1 -0
  54. package/dist/components/composed/PlateMapEditor/autoFill.cjs +2 -0
  55. package/dist/components/composed/PlateMapEditor/autoFill.cjs.map +1 -0
  56. package/dist/components/composed/PlateMapEditor/autoFill.js +41 -0
  57. package/dist/components/composed/PlateMapEditor/autoFill.js.map +1 -0
  58. package/dist/components/composed/PlateMapEditor/csvPlateTriage.cjs +4 -0
  59. package/dist/components/composed/PlateMapEditor/csvPlateTriage.cjs.map +1 -0
  60. package/dist/components/composed/PlateMapEditor/csvPlateTriage.js +103 -0
  61. package/dist/components/composed/PlateMapEditor/csvPlateTriage.js.map +1 -0
  62. package/dist/components/composed/PlateMapEditor/helpers.cjs +2 -0
  63. package/dist/components/composed/PlateMapEditor/helpers.cjs.map +1 -0
  64. package/dist/components/composed/PlateMapEditor/helpers.js +11 -0
  65. package/dist/components/composed/PlateMapEditor/helpers.js.map +1 -0
  66. package/dist/components/composed/PlateMapEditor/wellGrid.cjs +2 -0
  67. package/dist/components/composed/PlateMapEditor/wellGrid.cjs.map +1 -0
  68. package/dist/components/composed/PlateMapEditor/wellGrid.js +56 -0
  69. package/dist/components/composed/PlateMapEditor/wellGrid.js.map +1 -0
  70. package/dist/components/composed/ProcessFlow/ProcessFlow.cjs +2 -0
  71. package/dist/components/composed/ProcessFlow/ProcessFlow.cjs.map +1 -0
  72. package/dist/components/composed/ProcessFlow/ProcessFlow.js +543 -0
  73. package/dist/components/composed/ProcessFlow/ProcessFlow.js.map +1 -0
  74. package/dist/components/composed/ProcessFlow/ProcessFlow.utils.cjs +2 -0
  75. package/dist/components/composed/ProcessFlow/ProcessFlow.utils.cjs.map +1 -0
  76. package/dist/components/composed/ProcessFlow/ProcessFlow.utils.js +84 -0
  77. package/dist/components/composed/ProcessFlow/ProcessFlow.utils.js.map +1 -0
  78. package/dist/components/ui/accordion.cjs +1 -1
  79. package/dist/components/ui/accordion.cjs.map +1 -1
  80. package/dist/components/ui/accordion.js +1 -1
  81. package/dist/components/ui/accordion.js.map +1 -1
  82. package/dist/components/ui/badge.cjs +1 -1
  83. package/dist/components/ui/badge.cjs.map +1 -1
  84. package/dist/components/ui/badge.js +18 -18
  85. package/dist/components/ui/badge.js.map +1 -1
  86. package/dist/components/ui/button.cjs +1 -1
  87. package/dist/components/ui/button.cjs.map +1 -1
  88. package/dist/components/ui/button.js +16 -16
  89. package/dist/components/ui/button.js.map +1 -1
  90. package/dist/components/ui/calendar.cjs +1 -1
  91. package/dist/components/ui/calendar.cjs.map +1 -1
  92. package/dist/components/ui/calendar.js +5 -5
  93. package/dist/components/ui/calendar.js.map +1 -1
  94. package/dist/components/ui/card.cjs +1 -1
  95. package/dist/components/ui/card.cjs.map +1 -1
  96. package/dist/components/ui/card.js +1 -1
  97. package/dist/components/ui/card.js.map +1 -1
  98. package/dist/components/ui/checkbox.cjs +1 -1
  99. package/dist/components/ui/checkbox.cjs.map +1 -1
  100. package/dist/components/ui/checkbox.js +9 -9
  101. package/dist/components/ui/checkbox.js.map +1 -1
  102. package/dist/components/ui/combobox.cjs +1 -1
  103. package/dist/components/ui/combobox.cjs.map +1 -1
  104. package/dist/components/ui/combobox.js +5 -5
  105. package/dist/components/ui/combobox.js.map +1 -1
  106. package/dist/components/ui/data-table/data-table-group.cjs +2 -0
  107. package/dist/components/ui/data-table/data-table-group.cjs.map +1 -0
  108. package/dist/components/ui/data-table/data-table-group.js +118 -0
  109. package/dist/components/ui/data-table/data-table-group.js.map +1 -0
  110. package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
  111. package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
  112. package/dist/components/ui/data-table/data-table-pagination.js +22 -22
  113. package/dist/components/ui/data-table/data-table-pagination.js.map +1 -1
  114. package/dist/components/ui/data-table/data-table.cjs +1 -1
  115. package/dist/components/ui/data-table/data-table.cjs.map +1 -1
  116. package/dist/components/ui/data-table/data-table.js +567 -316
  117. package/dist/components/ui/data-table/data-table.js.map +1 -1
  118. package/dist/components/ui/dialog.cjs +1 -1
  119. package/dist/components/ui/dialog.cjs.map +1 -1
  120. package/dist/components/ui/dialog.js +13 -13
  121. package/dist/components/ui/dialog.js.map +1 -1
  122. package/dist/components/ui/input-group.cjs +1 -1
  123. package/dist/components/ui/input-group.cjs.map +1 -1
  124. package/dist/components/ui/input-group.js +29 -29
  125. package/dist/components/ui/input-group.js.map +1 -1
  126. package/dist/components/ui/input-otp.cjs +1 -1
  127. package/dist/components/ui/input-otp.cjs.map +1 -1
  128. package/dist/components/ui/input-otp.js +10 -10
  129. package/dist/components/ui/input-otp.js.map +1 -1
  130. package/dist/components/ui/input.cjs +1 -1
  131. package/dist/components/ui/input.cjs.map +1 -1
  132. package/dist/components/ui/input.js +7 -7
  133. package/dist/components/ui/input.js.map +1 -1
  134. package/dist/components/ui/item.cjs +1 -1
  135. package/dist/components/ui/item.cjs.map +1 -1
  136. package/dist/components/ui/item.js +17 -17
  137. package/dist/components/ui/item.js.map +1 -1
  138. package/dist/components/ui/navigation-menu.cjs +1 -1
  139. package/dist/components/ui/navigation-menu.cjs.map +1 -1
  140. package/dist/components/ui/navigation-menu.js +24 -24
  141. package/dist/components/ui/navigation-menu.js.map +1 -1
  142. package/dist/components/ui/popover.cjs +2 -0
  143. package/dist/components/ui/popover.cjs.map +1 -0
  144. package/dist/components/ui/popover.js +45 -0
  145. package/dist/components/ui/popover.js.map +1 -0
  146. package/dist/components/ui/radio-group.cjs +1 -1
  147. package/dist/components/ui/radio-group.cjs.map +1 -1
  148. package/dist/components/ui/radio-group.js +16 -16
  149. package/dist/components/ui/radio-group.js.map +1 -1
  150. package/dist/components/ui/scroll-area.cjs +1 -1
  151. package/dist/components/ui/scroll-area.cjs.map +1 -1
  152. package/dist/components/ui/scroll-area.js +6 -6
  153. package/dist/components/ui/scroll-area.js.map +1 -1
  154. package/dist/components/ui/select.cjs +1 -1
  155. package/dist/components/ui/select.cjs.map +1 -1
  156. package/dist/components/ui/select.js +48 -48
  157. package/dist/components/ui/select.js.map +1 -1
  158. package/dist/components/ui/slider.cjs +1 -1
  159. package/dist/components/ui/slider.cjs.map +1 -1
  160. package/dist/components/ui/slider.js +22 -22
  161. package/dist/components/ui/slider.js.map +1 -1
  162. package/dist/components/ui/switch.cjs +1 -1
  163. package/dist/components/ui/switch.cjs.map +1 -1
  164. package/dist/components/ui/switch.js +14 -14
  165. package/dist/components/ui/switch.js.map +1 -1
  166. package/dist/components/ui/table.cjs +1 -1
  167. package/dist/components/ui/table.cjs.map +1 -1
  168. package/dist/components/ui/table.js +2 -2
  169. package/dist/components/ui/table.js.map +1 -1
  170. package/dist/components/ui/tabs.cjs +1 -1
  171. package/dist/components/ui/tabs.cjs.map +1 -1
  172. package/dist/components/ui/tabs.js +9 -9
  173. package/dist/components/ui/tabs.js.map +1 -1
  174. package/dist/components/ui/textarea.cjs +1 -1
  175. package/dist/components/ui/textarea.cjs.map +1 -1
  176. package/dist/components/ui/textarea.js +6 -6
  177. package/dist/components/ui/textarea.js.map +1 -1
  178. package/dist/components/ui/toggle.cjs +1 -1
  179. package/dist/components/ui/toggle.cjs.map +1 -1
  180. package/dist/components/ui/toggle.js +13 -13
  181. package/dist/components/ui/toggle.js.map +1 -1
  182. package/dist/index.cjs +1 -1
  183. package/dist/index.css +1 -1
  184. package/dist/index.d.ts +830 -3
  185. package/dist/index.js +649 -593
  186. package/dist/index.js.map +1 -1
  187. package/dist/index.tailwind.css +1 -1
  188. package/dist/utils/colors.cjs +1 -1
  189. package/dist/utils/colors.cjs.map +1 -1
  190. package/dist/utils/colors.js +43 -21
  191. package/dist/utils/colors.js.map +1 -1
  192. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ import { ColumnOrderState } from '@tanstack/react-table';
12
12
  import { Combobox as Combobox_2 } from '@base-ui/react';
13
13
  import { Command as Command_2 } from 'cmdk';
14
14
  import { ComponentProps } from 'react';
15
+ import { ComponentPropsWithoutRef } from 'react';
15
16
  import { Context as Context_2 } from 'react';
16
17
  import { ContextMenu as ContextMenu_2 } from 'radix-ui';
17
18
  import { DayButton } from 'react-day-picker';
@@ -35,10 +36,12 @@ import { Locale } from 'react-day-picker';
35
36
  import { LucideIcon } from 'lucide-react';
36
37
  import { MemoExoticComponent } from 'react';
37
38
  import { Menubar as Menubar_2 } from 'radix-ui';
39
+ import { MouseEvent as MouseEvent_2 } from 'react';
38
40
  import { NavigationMenu as NavigationMenu_2 } from 'radix-ui';
39
41
  import { OnChange } from '@monaco-editor/react';
40
42
  import { OTPInput } from 'input-otp';
41
43
  import { PaginationState } from '@tanstack/react-table';
44
+ import { Popover as Popover_2 } from 'radix-ui';
42
45
  import { PropsWithChildren } from 'react';
43
46
  import { RadioGroup as RadioGroup_2 } from 'radix-ui';
44
47
  import * as React_2 from 'react';
@@ -115,6 +118,10 @@ declare const alertVariants: (props?: ({
115
118
  variant?: "default" | "destructive" | "info" | "positive" | "warning" | null | undefined;
116
119
  } & ClassProp) | undefined) => string;
117
120
 
121
+ export declare function allPositions(dims: PlateDimensions): WellId[];
122
+
123
+ export declare function applyFilterCondition(cellValue: string, operator: FilterOperator, filterValue: string): boolean;
124
+
118
125
  export declare interface AreaDataSeries {
119
126
  x: number[];
120
127
  y: number[];
@@ -220,6 +227,33 @@ export declare type AttachmentsProps = HTMLAttributes<HTMLDivElement> & {
220
227
 
221
228
  export declare type AttachmentVariant = "grid" | "inline" | "list";
222
229
 
230
+ export declare interface AutoFillOptions {
231
+ dims: PlateDimensions;
232
+ /** Number of distinct items to place. Each is repeated `replicates` times. */
233
+ count: number;
234
+ /** First well in fill order. Defaults to position (0,0). */
235
+ startWellId?: WellId;
236
+ /** Traversal strategy. Defaults to `"row-major"`. */
237
+ strategy?: FillStrategy;
238
+ /** Consecutive cells assigned per item. Defaults to 1. */
239
+ replicates?: number;
240
+ }
241
+
242
+ /**
243
+ * Compute the ordered list of well ids to assign to `count` items (each
244
+ * repeated `replicates` times) starting from `startWellId`. Returns at most
245
+ * `dims.rows * dims.columns` ids — overflow is silently truncated so callers
246
+ * can paginate onto multiple plates themselves.
247
+ */
248
+ export declare function autoFillPositions(options: AutoFillOptions): WellId[];
249
+
250
+ /**
251
+ * Convenience wrapper: assigns each input item to `replicates` consecutive
252
+ * wells, returning a `Map<WellId, T>`. The mapper builds the record stored at
253
+ * each well (e.g. stamp item-specific fields onto a base record).
254
+ */
255
+ export declare function autoFillRecords<T>(items: T[], buildRecord: (item: T, index: number, wellId: WellId) => T, options: Omit<AutoFillOptions, "count">): Map<WellId, T>;
256
+
223
257
  export declare function Avatar({ className, size, ...props }: React_2.ComponentProps<typeof Avatar_2.Root> & {
224
258
  size?: "default" | "sm" | "lg";
225
259
  }): JSX.Element;
@@ -509,11 +543,38 @@ export declare type ChainOfThoughtTriggerProps = ComponentProps<typeof Collapsib
509
543
  };
510
544
 
511
545
  /**
512
- * Chart color palette for consistent graph styling
513
- * Uses the primary graph colors from the design system
546
+ * Chart color palette for consistent graph styling.
547
+ *
548
+ * CVD-friendly (deuteranopia / protanopia / tritanopia) categorical palette.
549
+ * Single source of truth is the `--chart-1` … `--chart-12` CSS variables in
550
+ * `index.tailwind.css`; the hex fallbacks below are used during SSR / before
551
+ * the stylesheet resolves. Slots 1–8 are recommended; 9–12 are for sparing use
552
+ * when more than 8 series are needed.
514
553
  */
515
554
  export declare const CHART_COLORS: readonly [string, string, string, string, string, string, string, string, string, string, string, string];
516
555
 
556
+ /**
557
+ * CVD-friendly diverging ramps (midpoint at step 06/07). Red/green pairings
558
+ * are intentionally avoided (worst for deutan/protan).
559
+ * Source of truth: `--chart-div-*` CSS variables in `index.tailwind.css`.
560
+ */
561
+ export declare const CHART_DIVERGING: {
562
+ readonly blueOrange: string[];
563
+ readonly tealMagenta: string[];
564
+ readonly purpleYellowGreen: string[];
565
+ };
566
+
567
+ /**
568
+ * CVD-friendly sequential ramps (light → dark, anchored on brand).
569
+ * 12 steps each — pass to a chart's colorscale / sequential interpolator.
570
+ * Source of truth: `--chart-seq-*` CSS variables in `index.tailwind.css`.
571
+ */
572
+ export declare const CHART_SEQUENTIAL: {
573
+ readonly blue: string[];
574
+ readonly teal: string[];
575
+ readonly purple: string[];
576
+ };
577
+
517
578
  export declare const Chat: ({ initialMessages, models, defaultModel, suggestions, onSend, className, }: ChatProps) => JSX.Element;
518
579
 
519
580
  export declare interface ChatMessage {
@@ -1134,7 +1195,7 @@ export declare interface DataAppShellProps {
1134
1195
  className?: string;
1135
1196
  }
1136
1197
 
1137
- export declare function DataTable<TData, TValue>({ columns, data, toolbar, enableSorting, enableColumnVisibility, children, columnOrder: controlledColumnOrder, onColumnOrderChange, columnVisibility: controlledColumnVisibility, onColumnVisibilityChange, columnLabels: controlledColumnLabels, onColumnLabelChange, enablePagination, defaultPageSize, pagination: controlledPagination, onPaginationChange, enableColumnReorder, enableFiltering, filters: controlledFilters, onFiltersChange, filterConfig, manualFiltering, density, className, variant, containerClassName, truncate, }: DataTableProps<TData, TValue>): JSX.Element;
1198
+ export declare function DataTable<TData, TValue>({ columns, data, toolbar, enableSorting, enableColumnVisibility, children, columnOrder: controlledColumnOrder, onColumnOrderChange, columnVisibility: controlledColumnVisibility, onColumnVisibilityChange, columnLabels: controlledColumnLabels, onColumnLabelChange, enablePagination, defaultPageSize, pagination: controlledPagination, onPaginationChange, enableColumnReorder, enableFiltering, filters: controlledFilters, onFiltersChange, filterConfig, manualFiltering, enableGrouping, grouping: controlledGrouping, onGroupingChange, groupConfig, density, className, variant, containerClassName, truncate, }: DataTableProps<TData, TValue>): JSX.Element;
1138
1199
 
1139
1200
  export declare function DataTableColumnToggle({ className }: DataTableColumnToggleProps): JSX.Element | null;
1140
1201
 
@@ -1152,6 +1213,16 @@ export declare interface DataTableFilterProps {
1152
1213
  className?: string;
1153
1214
  }
1154
1215
 
1216
+ export declare function DataTableGroup({ className }: DataTableGroupProps): JSX.Element | null;
1217
+
1218
+ export declare namespace DataTableGroup {
1219
+ var displayName: string;
1220
+ }
1221
+
1222
+ export declare interface DataTableGroupProps {
1223
+ className?: string;
1224
+ }
1225
+
1155
1226
  export declare function DataTablePagination({ pageSizeOptions, className, }: DataTablePaginationProps): JSX.Element | null;
1156
1227
 
1157
1228
  export declare interface DataTablePaginationProps {
@@ -1183,6 +1254,11 @@ export declare interface DataTableProps<TData, TValue> {
1183
1254
  filterConfig?: FilterColumnConfig[];
1184
1255
  /** When true, filtering is handled externally — onFiltersChange fires but rows are not filtered client-side. */
1185
1256
  manualFiltering?: boolean;
1257
+ enableGrouping?: boolean;
1258
+ /** ID of the column currently grouped by, or null for no grouping. */
1259
+ grouping?: string | null;
1260
+ onGroupingChange?: (grouping: string | null) => void;
1261
+ groupConfig?: GroupColumnConfig[];
1186
1262
  density?: "compact" | "default" | "relaxed";
1187
1263
  children?: React_2.ReactNode;
1188
1264
  className?: string;
@@ -1356,6 +1432,8 @@ declare const fieldVariants: (props?: ({
1356
1432
  orientation?: "horizontal" | "vertical" | "responsive" | null | undefined;
1357
1433
  } & ClassProp) | undefined) => string;
1358
1434
 
1435
+ export declare type FillStrategy = "row-major" | "column-major" | "row-snake" | "column-snake";
1436
+
1359
1437
  export declare interface FilterColumnConfig {
1360
1438
  columnId: string;
1361
1439
  label?: string;
@@ -1384,6 +1462,8 @@ export declare const getAttachmentLabel: (data: AttachmentData) => string;
1384
1462
 
1385
1463
  export declare const getMediaCategory: (data: AttachmentData) => AttachmentMediaCategory;
1386
1464
 
1465
+ export declare function getPlateMapScopedWellId(plateBarcode: string, wellId: WellId): WellId;
1466
+
1387
1467
  export declare const getStatusBadge: (status: ToolPart["state"]) => JSX.Element;
1388
1468
 
1389
1469
  /**
@@ -1411,6 +1491,11 @@ export declare const getStatusBadge: (status: ToolPart["state"]) => JSX.Element;
1411
1491
  */
1412
1492
  export declare function getTdpBaseUrlFromReferrer(): string | null;
1413
1493
 
1494
+ export declare interface GroupColumnConfig {
1495
+ columnId: string;
1496
+ label?: string;
1497
+ }
1498
+
1414
1499
  export declare const Heatmap: default_2.FC<HeatmapProps>;
1415
1500
 
1416
1501
  /**
@@ -1484,6 +1569,13 @@ export declare function HoverCardContent({ className, align, sideOffset, ...prop
1484
1569
 
1485
1570
  export declare function HoverCardTrigger({ ...props }: React_2.ComponentProps<typeof HoverCard_2.Trigger>): JSX.Element;
1486
1571
 
1572
+ export declare interface ImportExportHandlers {
1573
+ onImportCsv?: (file: File, triage?: PlateMapCsvTriage) => void | Promise<void>;
1574
+ onExportCsv?: () => void;
1575
+ onImportTemplate?: (file: File) => void | Promise<void>;
1576
+ onExportTemplate?: () => void;
1577
+ }
1578
+
1487
1579
  export declare const InlineCitation: ({ className, ...props }: InlineCitationProps) => JSX.Element;
1488
1580
 
1489
1581
  export declare const InlineCitationCard: (props: InlineCitationCardProps) => JSX.Element;
@@ -1733,6 +1825,19 @@ export declare type LineGraphVariant = "lines" | "lines+markers" | "lines+marker
1733
1825
 
1734
1826
  export declare const LocalReferencedSourcesContext: Context_2<ReferencedSourcesContext | null>;
1735
1827
 
1828
+ export declare function ManifestFilterPopover({ columns, columnLabel, filters, onFiltersChange, triggerLabel, className, }: ManifestFilterPopoverProps): JSX.Element;
1829
+
1830
+ export declare interface ManifestFilterPopoverProps {
1831
+ /** Filterable columns. Operator subsets can be specified per column. */
1832
+ columns: FilterColumnConfig[];
1833
+ /** Column id → display label resolver. */
1834
+ columnLabel?: (columnId: string) => string;
1835
+ filters: FilterCondition[];
1836
+ onFiltersChange: (next: FilterCondition[]) => void;
1837
+ triggerLabel?: string;
1838
+ className?: string;
1839
+ }
1840
+
1736
1841
  export declare type MarkerSymbol = "circle" | "circle-open" | "circle-dot" | "circle-open-dot" | "square" | "square-open" | "square-dot" | "square-open-dot" | "diamond" | "diamond-open" | "diamond-dot" | "diamond-open-dot" | "cross" | "cross-open" | "cross-dot" | "cross-open-dot" | "x" | "x-open" | "x-dot" | "x-open-dot" | "triangle-up" | "triangle-up-open" | "triangle-up-dot" | "triangle-up-open-dot" | "triangle-down" | "triangle-down-open" | "triangle-down-dot" | "triangle-down-open-dot" | "triangle-left" | "triangle-left-open" | "triangle-left-dot" | "triangle-left-open-dot" | "triangle-right" | "triangle-right-open" | "triangle-right-dot" | "triangle-right-open-dot" | "triangle-ne" | "triangle-ne-open" | "triangle-ne-dot" | "triangle-ne-open-dot" | "triangle-se" | "triangle-se-open" | "triangle-se-dot" | "triangle-se-open-dot" | "triangle-sw" | "triangle-sw-open" | "triangle-sw-dot" | "triangle-sw-open-dot" | "triangle-nw" | "triangle-nw-open" | "triangle-nw-dot" | "triangle-nw-open-dot" | "pentagon" | "pentagon-open" | "pentagon-dot" | "pentagon-open-dot" | "hexagon" | "hexagon-open" | "hexagon-dot" | "hexagon-open-dot" | "hexagon2" | "hexagon2-open" | "hexagon2-dot" | "hexagon2-open-dot" | "octagon" | "octagon-open" | "octagon-dot" | "octagon-open-dot" | "star" | "star-open" | "star-dot" | "star-open-dot" | "hexagram" | "hexagram-open" | "hexagram-dot" | "hexagram-open-dot" | "star-triangle-up" | "star-triangle-up-open" | "star-triangle-up-dot" | "star-triangle-up-open-dot" | "star-triangle-down" | "star-triangle-down-open" | "star-triangle-down-dot" | "star-triangle-down-open-dot" | "star-square" | "star-square-open" | "star-square-dot" | "star-square-open-dot" | "star-diamond" | "star-diamond-open" | "star-diamond-dot" | "star-diamond-open-dot" | "diamond-tall" | "diamond-tall-open" | "diamond-tall-dot" | "diamond-tall-open-dot" | "diamond-wide" | "diamond-wide-open" | "diamond-wide-dot" | "diamond-wide-open-dot" | "hourglass" | "hourglass-open" | "bowtie" | "bowtie-open" | "circle-cross" | "circle-cross-open" | "circle-x" | "circle-x-open" | "square-cross" | "square-cross-open" | "square-x" | "square-x-open" | "diamond-cross" | "diamond-cross-open" | "diamond-x" | "diamond-x-open" | "cross-thin" | "cross-thin-open" | "x-thin" | "x-thin-open" | "asterisk" | "asterisk-open" | "hash" | "hash-open" | "hash-dot" | "hash-open-dot" | "y-up" | "y-up-open" | "y-down" | "y-down-open" | "y-left" | "y-left-open" | "y-right" | "y-right-open" | "line-ew" | "line-ew-open" | "line-ns" | "line-ns-open" | "line-ne" | "line-ne-open" | "line-nw" | "line-nw-open" | "arrow" | "arrow-open" | "arrow-wide" | "arrow-wide-open";
1737
1842
 
1738
1843
  declare type MarkerSymbol_2 = "circle" | "square" | "diamond" | "triangle-up" | "triangle-down" | "star";
@@ -1950,6 +2055,13 @@ export declare interface NavPage {
1950
2055
  onClick?: () => void;
1951
2056
  }
1952
2057
 
2058
+ export declare function parsePos(id: WellId, dims: PlateDimensions): {
2059
+ row: number;
2060
+ col: number;
2061
+ } | null;
2062
+
2063
+ export declare function parseRowLabel(label: string): number;
2064
+
1953
2065
  /**
1954
2066
  * Peak annotation for labeling peaks on the chromatogram.
1955
2067
  * Used for both user-provided annotations and auto-detected peaks.
@@ -2033,6 +2145,11 @@ declare const PLATE_FORMAT_96: "96";
2033
2145
 
2034
2146
  declare const PLATE_FORMAT_CUSTOM: "custom";
2035
2147
 
2148
+ export declare interface PlateDimensions {
2149
+ rows: number;
2150
+ columns: number;
2151
+ }
2152
+
2036
2153
  /**
2037
2154
  * Plate format presets for standard microplate configurations.
2038
2155
  * - `"96"`: 8 rows × 12 columns (wells A1-H12)
@@ -2067,6 +2184,326 @@ export declare type PlateFormat = typeof PLATE_FORMAT_96 | typeof PLATE_FORMAT_3
2067
2184
  */
2068
2185
  export declare const PlateMap: default_2.FC<PlateMapProps>;
2069
2186
 
2187
+ export declare function PlateMapActionsMenu({ templates, templateId, onTemplateChange, onClearTemplate, hasEntries, onImportCsv, onExportCsv, onImportTemplate, onExportTemplate, label, align, side, csvAccept, templateAccept, importTemplateLabel, exportTemplateLabel, importCsvLabel, exportCsvLabel, clearLabel, className, }: PlateMapActionsMenuProps): JSX.Element | null;
2188
+
2189
+ export declare interface PlateMapActionsMenuProps extends ImportExportHandlers {
2190
+ templates?: TemplateOption[];
2191
+ templateId?: string;
2192
+ onTemplateChange?: (id: string) => void;
2193
+ onClearTemplate?: () => void;
2194
+ /** Disable export/save actions when there is nothing to export. */
2195
+ hasEntries?: boolean;
2196
+ label?: React_2.ReactNode;
2197
+ align?: "start" | "center" | "end";
2198
+ side?: "top" | "right" | "bottom" | "left";
2199
+ csvAccept?: string;
2200
+ templateAccept?: string;
2201
+ importTemplateLabel?: string;
2202
+ exportTemplateLabel?: string;
2203
+ importCsvLabel?: string;
2204
+ exportCsvLabel?: string;
2205
+ clearLabel?: string;
2206
+ className?: string;
2207
+ }
2208
+
2209
+ export declare interface PlateMapCsvPlate {
2210
+ /** User-provided plate barcode used as the selectable plate id. */
2211
+ id: string;
2212
+ barcode: string;
2213
+ rows: PlateMapCsvRow[];
2214
+ rowCount: number;
2215
+ }
2216
+
2217
+ export declare interface PlateMapCsvRow {
2218
+ /** 1-based CSV line number, including the header line. */
2219
+ line: number;
2220
+ values: Record<string, string>;
2221
+ }
2222
+
2223
+ export declare interface PlateMapCsvTriage {
2224
+ headers: string[];
2225
+ /** Resolved header name for the plate barcode column, when present. */
2226
+ plateBarcodeColumn?: string;
2227
+ rows: PlateMapCsvRow[];
2228
+ plates: PlateMapCsvPlate[];
2229
+ /** Rows missing a barcode. The editor does not create fallback barcodes. */
2230
+ missingBarcodeRows: PlateMapCsvRow[];
2231
+ }
2232
+
2233
+ export declare interface PlateMapCsvTriageOptions {
2234
+ /** Exact column name to use before trying aliases. */
2235
+ plateBarcodeColumn?: string;
2236
+ /** Additional accepted names for the plate barcode column. */
2237
+ plateBarcodeColumnAliases?: readonly string[];
2238
+ }
2239
+
2240
+ export declare function PlateMapEditor<T extends WellRecord = WellRecord>({ format, rows, columns, values, onChange, selection, onSelectionChange, fields, tableColumns, colorForWell, emptyEntry, mergeOnApply, isPopulated, cycleFieldOnWellDoubleClick, title, badges, banner, legend, formExtras, formSlot, footer, plateTitle, plateToolbar, plates, activePlateId, onPlateChange, onAddPlate, onRemovePlate, addPlateLabel, removePlateLabel, plateSelectorLabel, plateSelectorVariant, plateBarcodeField, plateBarcodeColumnHeader, hidePlateBarcodeColumn, groups, activeGroupId, onGroupClick, renderHoverSummary, cellSize, emptyWellFillColor, wellShape, framedPlate, wrapWell, highlightedWellIds, onHoveredWellChange, manifestFilterable, manifestGroupable, autoScaleGrid, minCellSize, maxCellSize, className, templates, templateId, onTemplateChange, onClearTemplate, onImportCsv, onExportCsv, onImportTemplate, onExportTemplate, csvAccept, templateAccept, label, align, side, importTemplateLabel, exportTemplateLabel, importCsvLabel, exportCsvLabel, clearLabel, }: PlateMapEditorProps<T>): JSX.Element;
2241
+
2242
+ export declare interface PlateMapEditorProps<T extends WellRecord = WellRecord> extends Omit<PlateMapActionsMenuProps, "hasEntries" | "className"> {
2243
+ format: PlateFormat;
2244
+ rows?: number;
2245
+ columns?: number;
2246
+ values: Map<WellId, T>;
2247
+ onChange: (next: Map<WellId, T>) => void;
2248
+ selection: Set<WellId>;
2249
+ onSelectionChange: (next: Set<WellId>) => void;
2250
+ fields: WellField<T>[];
2251
+ tableColumns: WellColumn<T>[];
2252
+ /** Resolves the SVG fill color for a well. */
2253
+ colorForWell: (well: T | undefined, wellId: WellId) => string;
2254
+ /** Builds an empty record when a well is freshly created. */
2255
+ emptyEntry: (wellId: WellId) => T;
2256
+ /**
2257
+ * Merges the staged form record onto an existing well record on Apply.
2258
+ * Defaults to a shallow merge (form keys overwrite existing keys when set).
2259
+ */
2260
+ mergeOnApply?: (existing: T | undefined, staged: Partial<T>, wellId: WellId) => T;
2261
+ /** Filter for the manifest's "hide empty" mode. */
2262
+ isPopulated?: (row: T) => boolean;
2263
+ /** Select field cycled when double-clicking a single well, e.g. role painting. */
2264
+ cycleFieldOnWellDoubleClick?: keyof T & string;
2265
+ /** Optional header title (e.g. plate set name). */
2266
+ title?: string;
2267
+ /** Optional badges shown in the header next to the title. */
2268
+ badges?: React_2.ReactNode;
2269
+ /** Optional banner (e.g. import/error alert) shown above the layout. */
2270
+ banner?: React_2.ReactNode;
2271
+ /** Legend block rendered under the form column. */
2272
+ legend?: React_2.ReactNode;
2273
+ /** Form helper slot rendered between fields and the action row. */
2274
+ formExtras?: React_2.ReactNode;
2275
+ /**
2276
+ * Fully replaces the left column. When set, the built-in `WellMetadataForm`
2277
+ * is omitted — use this for alternative workflows like a drag-and-drop
2278
+ * source palette. The legend slot still renders beneath the replacement.
2279
+ */
2280
+ formSlot?: React_2.ReactNode;
2281
+ /** Footer actions (e.g. Save, Back). */
2282
+ footer?: React_2.ReactNode;
2283
+ /** Title for the plate grid panel. */
2284
+ plateTitle?: React_2.ReactNode;
2285
+ /** Optional controls shown next to the built-in actions menu. */
2286
+ plateToolbar?: React_2.ReactNode;
2287
+ /** User-provided plates available for this editor. Barcodes are never generated by the editor. */
2288
+ plates?: PlateMapPlateOption[];
2289
+ activePlateId?: string;
2290
+ onPlateChange?: (plateId: string) => void;
2291
+ /** Opens the host app's manual barcode entry flow for creating a plate. */
2292
+ onAddPlate?: () => void;
2293
+ /** Removes a plate (typically when using `plateSelectorVariant="tabs"`). */
2294
+ onRemovePlate?: (plateId: string) => void;
2295
+ addPlateLabel?: string;
2296
+ removePlateLabel?: string;
2297
+ plateSelectorLabel?: string;
2298
+ /** Layout of the plate selector. Defaults to `"dropdown"`. */
2299
+ plateSelectorVariant?: PlateMapPlateSelectorVariant;
2300
+ /** Row field used to stamp the active user-provided barcode onto edited wells. Defaults to `plateBarcode`. */
2301
+ plateBarcodeField?: keyof T & string;
2302
+ /** Header for the automatic manifest barcode column. */
2303
+ plateBarcodeColumnHeader?: string;
2304
+ /** Hide the automatic manifest barcode column when plate-scoped editing is active. */
2305
+ hidePlateBarcodeColumn?: boolean;
2306
+ /** Optional grouped well shortcuts rendered under the grid. */
2307
+ groups?: PlateMapGroupOption[];
2308
+ activeGroupId?: string;
2309
+ onGroupClick?: (group: PlateMapGroupOption) => void;
2310
+ /** Custom hover summary for the strip above the grid. */
2311
+ renderHoverSummary?: (well: T | undefined, wellId: WellId) => React_2.ReactNode;
2312
+ /** Fixed well size. When unset, the grid grows with the available width. */
2313
+ cellSize?: number;
2314
+ /** Fill color for empty wells. Pass `null` to delegate empty wells to `colorForWell`. */
2315
+ emptyWellFillColor?: string | null;
2316
+ /** Well shape forwarded to `PlatePaintGrid`. Defaults to `"rect"`. */
2317
+ wellShape?: WellShape;
2318
+ /** When true, wraps the grid in a card-like plate frame (rounded + border + soft shadow). */
2319
+ framedPlate?: boolean;
2320
+ /**
2321
+ * Forwarded to `PlatePaintGrid`. Render-prop that places a node inside each
2322
+ * absolute-positioned well cell — used to wire drop targets without binding
2323
+ * the kit to a specific DnD library.
2324
+ */
2325
+ wrapWell?: (wellId: WellId, cellSize: number) => React_2.ReactNode;
2326
+ /** Wells to highlight (e.g. when hovering a legend item externally). */
2327
+ highlightedWellIds?: ReadonlySet<WellId>;
2328
+ /** Fires whenever the currently hovered well changes (null on leave). */
2329
+ onHoveredWellChange?: (wellId: WellId | null) => void;
2330
+ /** Enables the filter popover on the manifest table. */
2331
+ manifestFilterable?: boolean;
2332
+ /** Enables the group-by selector on the manifest table. */
2333
+ manifestGroupable?: boolean;
2334
+ autoScaleGrid?: boolean;
2335
+ minCellSize?: number;
2336
+ maxCellSize?: number;
2337
+ className?: string;
2338
+ }
2339
+
2340
+ /**
2341
+ * Card-agnostic metadata form panel. Renders the staged-value form (or a
2342
+ * caller-supplied `formSlot`) plus an optional legend. Bring your own
2343
+ * container — drop it bare into a sidebar, wrap it in a `Card`, or stack it
2344
+ * above the grid.
2345
+ */
2346
+ export declare function PlateMapForm<T extends WellRecord = WellRecord>({ fields, value, onChange, selectionSize, onApply, onClear, applyLabel, clearLabel, extras, legend, formSlot, className, }: PlateMapFormProps<T>): JSX.Element;
2347
+
2348
+ export declare interface PlateMapFormProps<T extends WellRecord = WellRecord> {
2349
+ fields: WellField<T>[];
2350
+ /** Staged values applied across the current selection on Apply. */
2351
+ value: Partial<T>;
2352
+ onChange: (next: Partial<T>) => void;
2353
+ selectionSize: number;
2354
+ onApply: () => void;
2355
+ onClear: () => void;
2356
+ applyLabel?: string;
2357
+ clearLabel?: string;
2358
+ /** Helper slot rendered between the fields and the action row. */
2359
+ extras?: React_2.ReactNode;
2360
+ /** Legend block rendered beneath the form, separated by a divider. */
2361
+ legend?: React_2.ReactNode;
2362
+ /**
2363
+ * Fully replaces the built-in `WellMetadataForm` — e.g. a drag-and-drop
2364
+ * source palette. The legend slot still renders beneath the replacement.
2365
+ */
2366
+ formSlot?: React_2.ReactNode;
2367
+ className?: string;
2368
+ }
2369
+
2370
+ /**
2371
+ * Card-agnostic plate grid panel. Renders the selection toolbar, hover
2372
+ * summary, the interactive `PlatePaintGrid`, and optional group shortcuts —
2373
+ * and owns the ephemeral hover state internally. The plate title, plate
2374
+ * selector, and actions menu are intentionally NOT part of this panel; compose
2375
+ * `PlateMapPlateSelector` and `PlateMapActionsMenu` around it for full layout
2376
+ * freedom.
2377
+ */
2378
+ export declare function PlateMapGrid<T extends WellRecord = WellRecord>({ format, rows, columns, values, selection, onSelectionChange, colorForWell, fields, renderHoverSummary, onHoveredWellChange, hoveredWellId, toolbar, hideSelectionControls, selectAllLabel, deselectAllLabel, emptyWellFillColor, wellShape, framed, wrapWell, highlightedWellIds, onWellDoubleClick, selectionFillMode, flashWellId, flashWellKey, cellSize, autoScale, minCellSize, maxCellSize, groups, activeGroupId, onGroupClick, className, }: PlateMapGridProps<T>): JSX.Element;
2379
+
2380
+ export declare interface PlateMapGridProps<T extends WellRecord = WellRecord> {
2381
+ format: PlateFormat;
2382
+ rows?: number;
2383
+ columns?: number;
2384
+ values: Map<WellId, T>;
2385
+ selection: Set<WellId>;
2386
+ onSelectionChange: (next: Set<WellId>) => void;
2387
+ /** Resolves the SVG fill color for a well. */
2388
+ colorForWell: (well: T | undefined, wellId: WellId) => string;
2389
+ /** Field schema used to build the default hover summary string. */
2390
+ fields?: WellField<T>[];
2391
+ /** Custom hover summary for the strip above the grid. */
2392
+ renderHoverSummary?: (well: T | undefined, wellId: WellId) => React_2.ReactNode;
2393
+ /** Fires whenever the currently hovered well changes (null on leave). */
2394
+ onHoveredWellChange?: (wellId: WellId | null) => void;
2395
+ /**
2396
+ * Controlled hovered well id. When provided, the panel reflects this value
2397
+ * instead of tracking hover internally — useful for syncing the hover
2398
+ * summary with external state (e.g. resetting it on a plate switch).
2399
+ */
2400
+ hoveredWellId?: WellId | null;
2401
+ /** Controls rendered to the left of the built-in select/deselect links. */
2402
+ toolbar?: React_2.ReactNode;
2403
+ /** Hide the built-in "Select all" / "Deselect all" links. */
2404
+ hideSelectionControls?: boolean;
2405
+ selectAllLabel?: string;
2406
+ deselectAllLabel?: string;
2407
+ /** Fill color for empty wells. Pass `null` to delegate empty wells to `colorForWell`. */
2408
+ emptyWellFillColor?: string | null;
2409
+ /** Well shape forwarded to `PlatePaintGrid`. Defaults to `"rect"`. */
2410
+ wellShape?: WellShape;
2411
+ /** When true, wraps the grid in a card-like plate frame (rounded + border + soft shadow). */
2412
+ framed?: boolean;
2413
+ /** Render-prop that places a node inside each absolute-positioned well cell. */
2414
+ wrapWell?: (wellId: WellId, cellSize: number) => React_2.ReactNode;
2415
+ /** Wells to highlight (e.g. when hovering a legend item externally). */
2416
+ highlightedWellIds?: ReadonlySet<WellId>;
2417
+ onWellDoubleClick?: (wellId: WellId) => void;
2418
+ selectionFillMode?: "selection" | "well";
2419
+ flashWellId?: WellId;
2420
+ flashWellKey?: number;
2421
+ /** Fixed well size. When unset, the grid grows with the available width. */
2422
+ cellSize?: number;
2423
+ autoScale?: boolean;
2424
+ minCellSize?: number;
2425
+ maxCellSize?: number;
2426
+ /** Optional grouped well shortcuts rendered under the grid. */
2427
+ groups?: PlateMapGroupOption[];
2428
+ activeGroupId?: string;
2429
+ onGroupClick?: (group: PlateMapGroupOption) => void;
2430
+ className?: string;
2431
+ }
2432
+
2433
+ export declare interface PlateMapGroupOption {
2434
+ id: string;
2435
+ label: string;
2436
+ /** Well ids in the group; callers can use this to select the group. */
2437
+ wellIds?: WellId[];
2438
+ /** Optional explicit count; defaults to `wellIds.length` when present. */
2439
+ count?: number;
2440
+ color?: string;
2441
+ borderColor?: string;
2442
+ disabled?: boolean;
2443
+ }
2444
+
2445
+ /**
2446
+ * Card-agnostic sample-manifest panel. A thin wrapper over `WellManifestTable`
2447
+ * with an optional heading and no width constraint of its own, so it can span
2448
+ * the full screen width or sit inside any container the caller chooses.
2449
+ */
2450
+ export declare function PlateMapManifest<T extends WellRecord = WellRecord>({ values, onChange, columns, fields, selection, onSelectionChange, emptyEntry, isPopulated, filterable, groupable, pageSize, pageSizeOptions, title, className, }: PlateMapManifestProps<T>): JSX.Element;
2451
+
2452
+ export declare interface PlateMapManifestProps<T extends WellRecord = WellRecord> {
2453
+ values: Map<WellId, T>;
2454
+ onChange: (next: Map<WellId, T>) => void;
2455
+ columns: WellColumn<T>[];
2456
+ fields?: WellField<T>[];
2457
+ selection?: Set<WellId>;
2458
+ onSelectionChange?: (next: Set<WellId>) => void;
2459
+ /** Builds an empty record when a manifest row is freshly created. */
2460
+ emptyEntry: (id: WellId) => T;
2461
+ /** Filter for the manifest's "hide empty" mode. */
2462
+ isPopulated?: (row: T) => boolean;
2463
+ /** Enables the filter popover on the manifest table. */
2464
+ filterable?: boolean;
2465
+ /** Enables the group-by selector on the manifest table. */
2466
+ groupable?: boolean;
2467
+ pageSize?: number;
2468
+ pageSizeOptions?: number[];
2469
+ /** Optional heading rendered above the table. Omit for a bare table. */
2470
+ title?: React_2.ReactNode;
2471
+ className?: string;
2472
+ }
2473
+
2474
+ export declare interface PlateMapPlateOption {
2475
+ /** Stable plate id. For imported CSVs this should be the user-provided barcode. */
2476
+ id: string;
2477
+ /** User-provided plate barcode. Barcodes are never generated by the editor. */
2478
+ barcode: string;
2479
+ /** Optional display label when it differs from the barcode. */
2480
+ label?: string;
2481
+ /** Optional count shown beside the plate pill, usually imported row/well count. */
2482
+ count?: number;
2483
+ disabled?: boolean;
2484
+ }
2485
+
2486
+ export declare function PlateMapPlateSelector({ plates, activePlateId, onPlateChange, onAddPlate, onRemovePlate, addPlateLabel, removePlateLabel, label, variant, align, side, className, }: PlateMapPlateSelectorProps): JSX.Element;
2487
+
2488
+ export declare interface PlateMapPlateSelectorProps {
2489
+ plates?: PlateMapPlateOption[];
2490
+ activePlateId?: string;
2491
+ onPlateChange?: (plateId: string) => void;
2492
+ onAddPlate?: () => void;
2493
+ /** When supplied, the tabs variant renders a delete affordance per plate. */
2494
+ onRemovePlate?: (plateId: string) => void;
2495
+ addPlateLabel?: string;
2496
+ removePlateLabel?: string;
2497
+ label?: string;
2498
+ /** Layout. `"dropdown"` is the default single-trigger menu, `"tabs"` is a horizontal tab strip. */
2499
+ variant?: PlateMapPlateSelectorVariant;
2500
+ align?: "start" | "center" | "end";
2501
+ side?: "top" | "right" | "bottom" | "left";
2502
+ className?: string;
2503
+ }
2504
+
2505
+ export declare type PlateMapPlateSelectorVariant = "dropdown" | "tabs";
2506
+
2070
2507
  /**
2071
2508
  * Props for PlateMap component
2072
2509
  */
@@ -2168,6 +2605,76 @@ export declare interface PlateMapProps {
2168
2605
  onWellClick?: (wellData: WellData) => void;
2169
2606
  }
2170
2607
 
2608
+ export declare function plateOptionsFromCsvTriage(triage: PlateMapCsvTriage): PlateMapPlateOption[];
2609
+
2610
+ /**
2611
+ * Interactive plate grid with drag-rectangle selection.
2612
+ * - Click & drag: replace selection
2613
+ * - Shift + drag: add to selection
2614
+ * - Alt + drag: remove from selection
2615
+ */
2616
+ export declare function PlatePaintGrid<T extends WellRecord = WellRecord>({ format, rows, columns, values, selection, onSelectionChange, colorForWell, emptyWellFillColor, wellShape, framed, cellSize, autoScale, minCellSize, maxCellSize, borderColor, selectedBorderColor, selectedFillColor, selectedFillOpacity, selectionFillMode, flashWellId, flashWellKey, highlightedWellIds, highlightBorderColor, onWellHover, onWellDoubleClick, wrapWell, className, }: PlatePaintGridProps<T>): JSX.Element;
2617
+
2618
+ export declare interface PlatePaintGridProps<T extends WellRecord = WellRecord> {
2619
+ format: PlateFormat;
2620
+ rows?: number;
2621
+ columns?: number;
2622
+ values: Map<WellId, T>;
2623
+ selection: Set<WellId>;
2624
+ onSelectionChange: (next: Set<WellId>) => void;
2625
+ /** Returns the fill color for a given well record (or undefined if empty). */
2626
+ colorForWell: (well: T | undefined, wellId: WellId) => string;
2627
+ /** Fill color for empty wells. Pass `null` to delegate empty wells to `colorForWell`. */
2628
+ emptyWellFillColor?: string | null;
2629
+ /** Geometric shape of each well. `"circle"` matches scientific plate visuals. Defaults to `"rect"`. */
2630
+ wellShape?: WellShape;
2631
+ /**
2632
+ * When true, wraps the grid in a card-like surface (rounded, bordered,
2633
+ * padded, soft shadow) so it reads as a physical plate. Pairs well with
2634
+ * `wellShape="circle"`.
2635
+ */
2636
+ framed?: boolean;
2637
+ /** Pixel size of each well cell. Defaults to 34 when fixed. */
2638
+ cellSize?: number;
2639
+ /** Resize wells to fill available width when `cellSize` is not fixed. */
2640
+ autoScale?: boolean;
2641
+ minCellSize?: number;
2642
+ /** Defaults to 72 for 96-well style plates and 36 for denser plates. */
2643
+ maxCellSize?: number;
2644
+ /** Stroke color for non-selected wells. Defaults to a light border. */
2645
+ borderColor?: string;
2646
+ /** Stroke color for selected wells. Defaults to the kit primary blue. */
2647
+ selectedBorderColor?: string;
2648
+ /** Fill color for selected wells. Defaults to the kit primary blue. */
2649
+ selectedFillColor?: string;
2650
+ /** Selected fill opacity. */
2651
+ selectedFillOpacity?: number;
2652
+ /** Whether selected wells use the selection fill or keep their assigned well color. */
2653
+ selectionFillMode?: "selection" | "well";
2654
+ /** Well id that should briefly flash, usually after a double-click assignment. */
2655
+ flashWellId?: WellId;
2656
+ /** Changing this value restarts the flash animation for the same well. */
2657
+ flashWellKey?: number;
2658
+ /**
2659
+ * Well ids that should render with a highlight ring. Used for cross-component
2660
+ * hover sync (e.g. hovering a legend item to highlight matching wells).
2661
+ */
2662
+ highlightedWellIds?: ReadonlySet<WellId>;
2663
+ /** Stroke color for highlighted wells. Defaults to the kit primary blue. */
2664
+ highlightBorderColor?: string;
2665
+ onWellHover?: (wellId: WellId | null) => void;
2666
+ onWellDoubleClick?: (wellId: WellId) => void;
2667
+ /**
2668
+ * Optional render-prop invoked once per well. The returned node is placed
2669
+ * inside an absolutely-positioned cell on top of the SVG, sized to
2670
+ * `cellSize`. The wrapper layer is `pointer-events: none` so the SVG keeps
2671
+ * pointer interaction by default; consumers wiring drop targets are expected
2672
+ * to set `pointer-events: auto` on their own element while a drag is active.
2673
+ */
2674
+ wrapWell?: (wellId: WellId, cellSize: number) => React_2.ReactNode;
2675
+ className?: string;
2676
+ }
2677
+
2171
2678
  /**
2172
2679
  * A region to highlight on the plate (e.g., controls, sample areas, empty wells)
2173
2680
  */
@@ -2189,6 +2696,127 @@ declare interface PlateRegion {
2189
2696
  fillColor?: string;
2190
2697
  }
2191
2698
 
2699
+ export declare function PlateZoomControl({ zoom, onZoomChange, step, min, max, showReadout, className, }: PlateZoomControlProps): JSX.Element;
2700
+
2701
+ export declare interface PlateZoomControlProps {
2702
+ zoom: number;
2703
+ onZoomChange: (next: number) => void;
2704
+ /** Increment per click. Defaults to 0.1. */
2705
+ step?: number;
2706
+ min?: number;
2707
+ max?: number;
2708
+ /** Render a percentage readout between the buttons. Defaults to true. */
2709
+ showReadout?: boolean;
2710
+ className?: string;
2711
+ }
2712
+
2713
+ export declare function Popover({ ...props }: React_2.ComponentProps<typeof Popover_2.Root>): JSX.Element;
2714
+
2715
+ export declare function PopoverAnchor({ ...props }: React_2.ComponentProps<typeof Popover_2.Anchor>): JSX.Element;
2716
+
2717
+ export declare function PopoverContent({ className, align, sideOffset, ...props }: React_2.ComponentProps<typeof Popover_2.Content>): JSX.Element;
2718
+
2719
+ export declare function PopoverTrigger({ ...props }: React_2.ComponentProps<typeof Popover_2.Trigger>): JSX.Element;
2720
+
2721
+ export declare function pos(row: number, col: number, columns: number): WellId;
2722
+
2723
+ /**
2724
+ * Runtime list of the visual states supported by ProcessFlow steps.
2725
+ * Use this for controls, schemas, and forms that need to present the same status values the component understands.
2726
+ */
2727
+ export declare const PROCESS_FLOW_STEP_STATUSES: readonly ["pending", "active", "completed", "error", "disabled"];
2728
+
2729
+ export declare function ProcessFlow({ steps, connections, selectedStepId, onStepSelect, orientation, size, showDescriptions, className, style, "aria-label": ariaLabel, ...props }: ProcessFlowProps): JSX.Element | null;
2730
+
2731
+ /** Connection between two steps in a branching/configurable flow. Linear flows derive connections automatically. */
2732
+ export declare interface ProcessFlowConnection {
2733
+ id?: string;
2734
+ from: string;
2735
+ to: string;
2736
+ status?: ProcessFlowStepStatus;
2737
+ ariaLabel?: string;
2738
+ }
2739
+
2740
+ /** Direction for linear process flows. Branching flows are configured with step positions and connections. */
2741
+ export declare type ProcessFlowOrientation = "horizontal" | "vertical";
2742
+
2743
+ /**
2744
+ * Presentational process flow.
2745
+ *
2746
+ * ProcessFlow is fully controlled by props. It visualizes parent-owned workflow state and emits user selection through
2747
+ * onStepSelect. It intentionally does not own status transitions or fire completion/error side effects.
2748
+ */
2749
+ export declare interface ProcessFlowProps extends Omit<ComponentPropsWithoutRef<"nav">, "onSelect"> {
2750
+ /** Ordered list of steps to render. Each step controls its own visual status. */
2751
+ steps: ProcessFlowStep[];
2752
+ /** Optional explicit connections for branching/configurable flows. */
2753
+ connections?: ProcessFlowConnection[];
2754
+ /** Selected/viewed step id. This is separate from the active workflow status. */
2755
+ selectedStepId?: string;
2756
+ /** Called when a selectable step is clicked. Disabled and non-selectable steps do not call this. */
2757
+ onStepSelect?: (step: ProcessFlowStep, details: ProcessFlowStepSelectDetails) => void;
2758
+ orientation?: ProcessFlowOrientation;
2759
+ size?: ProcessFlowSize;
2760
+ /** Defaults to true. Set to false to hide step descriptions. */
2761
+ showDescriptions?: boolean;
2762
+ }
2763
+
2764
+ /** Visual density of the process flow. */
2765
+ export declare type ProcessFlowSize = "default" | "compact";
2766
+
2767
+ /**
2768
+ * Configurable step rendered by ProcessFlow.
2769
+ *
2770
+ * Keep workflow-specific behavior in the parent. A step config should describe what to render, not what to do when a
2771
+ * workflow completes or errors.
2772
+ */
2773
+ export declare interface ProcessFlowStep {
2774
+ /** Stable identifier used for selection and connections. */
2775
+ id: string;
2776
+ /** Visible step label. */
2777
+ label: ReactNode;
2778
+ /** Optional secondary text shown under or beside the label. */
2779
+ description?: ReactNode;
2780
+ /** Parent-controlled visual state. Defaults to "pending". */
2781
+ status?: ProcessFlowStepStatus;
2782
+ /** Accessible label for selectable steps. */
2783
+ ariaLabel?: string;
2784
+ /** Forces the step into the disabled visual/non-interactive state. */
2785
+ disabled?: boolean;
2786
+ /** Set to false when the step should render as non-navigable even when onStepSelect is provided. */
2787
+ selectable?: boolean;
2788
+ /** Optional grid position for simple branching/configurable layouts. */
2789
+ position?: ProcessFlowStepPosition;
2790
+ }
2791
+
2792
+ export declare type ProcessFlowStepConfig = ProcessFlowStep;
2793
+
2794
+ export declare interface ProcessFlowStepPosition {
2795
+ /** Zero-based row used when rendering a simple branching/configurable flow. */
2796
+ row?: number;
2797
+ /** Zero-based column used when rendering a simple branching/configurable flow. */
2798
+ column?: number;
2799
+ }
2800
+
2801
+ export declare interface ProcessFlowStepSelectDetails {
2802
+ /** Zero-based index of the selected step in the steps prop. */
2803
+ stepIndex: number;
2804
+ /** Current visual status of the selected step. */
2805
+ status: ProcessFlowStepStatus;
2806
+ nativeEvent: MouseEvent_2<HTMLButtonElement>;
2807
+ }
2808
+
2809
+ /**
2810
+ * Visual state for a ProcessFlow step.
2811
+ *
2812
+ * The parent application owns this state. ProcessFlow renders the provided status and does not run workflow side effects.
2813
+ */
2814
+ export declare type ProcessFlowStepStatus = (typeof PROCESS_FLOW_STEP_STATUSES)[number];
2815
+
2816
+ export declare type ProcessStep = ProcessFlowStep;
2817
+
2818
+ export declare type ProcessStepStatus = ProcessFlowStepStatus;
2819
+
2192
2820
  export declare const PromptInput: ({ className, accept, multiple, globalDrop, syncHiddenInput, maxFiles, maxFileSize, onError, onSubmit, children, ...props }: PromptInputProps) => JSX.Element;
2193
2821
 
2194
2822
  export declare const PromptInputActionAddAttachments: ({ label, ...props }: PromptInputActionAddAttachmentsProps) => JSX.Element;
@@ -2521,6 +3149,8 @@ export declare type ReasoningTriggerProps = ComponentProps<typeof CollapsibleTri
2521
3149
  getThinkingMessage?: (isStreaming: boolean, duration?: number) => ReactNode;
2522
3150
  };
2523
3151
 
3152
+ export declare function rectPositions(r0: number, c0: number, r1: number, c1: number, columns: number): WellId[];
3153
+
2524
3154
  export declare interface ReferencedSourcesContext {
2525
3155
  sources: (SourceDocumentUIPart & {
2526
3156
  id: string;
@@ -2538,6 +3168,8 @@ export declare function ResizablePanel({ ...props }: ResizablePrimitive.PanelPro
2538
3168
 
2539
3169
  export declare function ResizablePanelGroup({ className, ...props }: ResizablePrimitive.GroupProps): JSX.Element;
2540
3170
 
3171
+ export declare function resolveDimensions(format: PlateFormat, rows?: number, columns?: number): PlateDimensions;
3172
+
2541
3173
  export declare function RichListItem({ leading, primary, secondary, trailing, actions, className, variant, size, ...props }: RichListItemProps): JSX.Element;
2542
3174
 
2543
3175
  export declare function RichListItemAvatar({ initials, className, fallbackClassName, size, ...props }: RichListItemAvatarProps): JSX.Element;
@@ -2560,6 +3192,9 @@ export declare interface RichListItemProps extends Omit<React_2.ComponentProps<t
2560
3192
  actions?: React_2.ReactNode;
2561
3193
  }
2562
3194
 
3195
+ /** Letter for a row index. Supports A-Z then AA-ZZ for 1536-format plates. */
3196
+ export declare function rowLabel(row: number): string;
3197
+
2563
3198
  export declare interface ScatterDataPoint {
2564
3199
  x: number;
2565
3200
  y: number;
@@ -2880,6 +3515,10 @@ declare interface TableContextValue<TData> {
2880
3515
  setFilters: (filters: FilterCondition[]) => void;
2881
3516
  filterConfig: FilterColumnConfig[];
2882
3517
  enableFiltering: boolean;
3518
+ grouping: string | null;
3519
+ setGrouping: (columnId: string | null) => void;
3520
+ groupConfig: GroupColumnConfig[];
3521
+ enableGrouping: boolean;
2883
3522
  }
2884
3523
 
2885
3524
  export declare function TableFooter({ className, ...props }: React_2.ComponentProps<"tfoot">): JSX.Element;
@@ -3119,6 +3758,30 @@ export declare interface TdpSearchSort {
3119
3758
  order: "asc" | "desc";
3120
3759
  }
3121
3760
 
3761
+ export declare function TemplateIOPanel({ templates, templateId, onTemplateChange, onClearTemplate, hasEntries, onImportCsv, onExportCsv, onImportTemplate, onExportTemplate, className, csvAccept, templateAccept, }: TemplateIOPanelProps): JSX.Element;
3762
+
3763
+ export declare interface TemplateIOPanelProps extends ImportExportHandlers {
3764
+ templates?: TemplateOption[];
3765
+ templateId?: string;
3766
+ onTemplateChange?: (id: string) => void;
3767
+ onClearTemplate?: () => void;
3768
+ /** Disable export buttons when there's nothing to export. */
3769
+ hasEntries?: boolean;
3770
+ className?: string;
3771
+ csvAccept?: string;
3772
+ templateAccept?: string;
3773
+ }
3774
+
3775
+ export declare interface TemplateOption {
3776
+ id: string;
3777
+ label: string;
3778
+ /** Optional group header in the dropdown (e.g. "Built-in", "User"). */
3779
+ group?: string;
3780
+ /** Optional supporting text for richer chooser menus. */
3781
+ description?: string;
3782
+ disabled?: boolean;
3783
+ }
3784
+
3122
3785
  export declare const TetraScienceIcon: React_2.ForwardRefExoticComponent<Omit<TetraScienceIconProps, "ref"> & React_2.RefAttributes<SVGSVGElement>>;
3123
3786
 
3124
3787
  export declare interface TetraScienceIconProps extends React_2.SVGProps<SVGSVGElement> {
@@ -3235,6 +3898,10 @@ declare type ToolUIPartApproval = {
3235
3898
  reason?: string;
3236
3899
  } | undefined;
3237
3900
 
3901
+ export declare function triagePlateMapCsvByBarcode(text: string, options?: PlateMapCsvTriageOptions): PlateMapCsvTriage;
3902
+
3903
+ export declare function triagePlateMapCsvFile(file: File, options?: PlateMapCsvTriageOptions): Promise<PlateMapCsvTriage | undefined>;
3904
+
3238
3905
  /** TetraScience brand gradient — Light Blue 300 → Purple 500 → Violet Marble */
3239
3906
  export declare const TS_SHIMMER_GRADIENT = "linear-gradient(90deg, #549DFF, #8243BA, #9665F4)";
3240
3907
 
@@ -3335,6 +4002,27 @@ export declare interface UseTdpNavigationReturn {
3335
4002
  */
3336
4003
  declare type VisualizationMode = "heatmap" | "categorical";
3337
4004
 
4005
+ export declare interface WellColumn<T extends WellRecord = WellRecord> {
4006
+ /** Stable id; falls back to `field` if omitted. */
4007
+ id?: string;
4008
+ header: string;
4009
+ /** Optional leading icon in the table header. */
4010
+ icon?: React_2.ReactNode;
4011
+ /** Read direct property when `field` is set. */
4012
+ field?: keyof T & string;
4013
+ /** Min width in px (applied via inline style). */
4014
+ minWidth?: number;
4015
+ /**
4016
+ * Cell renderer. If omitted, the cell renders a display value. `select`
4017
+ * fields render as badge-style custom cells using the matching option label.
4018
+ */
4019
+ render?: (ctx: {
4020
+ row: T;
4021
+ wellId: WellId;
4022
+ update: (patch: Partial<T>) => void;
4023
+ }) => React_2.ReactNode;
4024
+ }
4025
+
3338
4026
  /**
3339
4027
  * Well data for individual wells.
3340
4028
  *
@@ -3390,6 +4078,145 @@ export declare interface WellData {
3390
4078
  tooltipData?: Record<string, unknown>;
3391
4079
  }
3392
4080
 
4081
+ export declare interface WellField<T extends WellRecord = WellRecord> {
4082
+ /** Key in the well record this field reads/writes. */
4083
+ key: keyof T & string;
4084
+ label: string;
4085
+ /** Optional leading icon shown in form labels and matching table headers. */
4086
+ icon?: React_2.ReactNode;
4087
+ kind: WellFieldKind;
4088
+ placeholder?: string;
4089
+ /** Required for `kind: "select"` and `kind: "multiselect"`. */
4090
+ options?: WellSelectOption[];
4091
+ /** Visual style for `kind: "boolean"`. Defaults to `"checkbox"`. */
4092
+ boolStyle?: "checkbox" | "switch";
4093
+ /**
4094
+ * When true, matching `WellManifestTable` cells render an inline editor of
4095
+ * this field's `kind` (mirroring the form). Defaults to false — cells stay
4096
+ * read-only unless the developer opts in or supplies `WellColumn.render`.
4097
+ */
4098
+ editableInTable?: boolean;
4099
+ /**
4100
+ * Custom renderer for the form input. Receives current value and a setter
4101
+ * that patches the field on the staged form record.
4102
+ */
4103
+ render?: (ctx: {
4104
+ value: unknown;
4105
+ onChange: (next: unknown) => void;
4106
+ selectionSize: number;
4107
+ }) => React_2.ReactNode;
4108
+ }
4109
+
4110
+ /**
4111
+ * Field kinds rendered by `WellMetadataForm` and (when `editableInTable`) by
4112
+ * `WellManifestTable`.
4113
+ */
4114
+ export declare type WellFieldKind = "text" | "number" | "integer" | "boolean" | "date" | "datetime" | "time" | "select" | "multiselect" | "custom";
4115
+
4116
+ export declare type WellId = string;
4117
+
4118
+ export declare function WellLegend({ items, renderItem, onHoverEnter, onHoverLeave, onRemove, removeLabel, emptyLabel, className, }: WellLegendProps): JSX.Element;
4119
+
4120
+ export declare interface WellLegendItem {
4121
+ id: string;
4122
+ label: React_2.ReactNode;
4123
+ color: string;
4124
+ /** Optional secondary text shown beneath the label. */
4125
+ meta?: React_2.ReactNode;
4126
+ disabled?: boolean;
4127
+ }
4128
+
4129
+ export declare interface WellLegendProps {
4130
+ items: WellLegendItem[];
4131
+ /** Render-prop for fully custom cards. Bypasses the default card layout. */
4132
+ renderItem?: (item: WellLegendItem) => React_2.ReactNode;
4133
+ onHoverEnter?: (id: string) => void;
4134
+ onHoverLeave?: (id: string) => void;
4135
+ onRemove?: (id: string) => void;
4136
+ removeLabel?: string;
4137
+ emptyLabel?: string;
4138
+ className?: string;
4139
+ }
4140
+
4141
+ export declare function WellManifestTable<T extends WellRecord = WellRecord>({ values, columns, fields, selection, onSelectionChange, onChange, emptyEntry, isPopulated, pageSize: initialPageSize, pageSizeOptions, enableFillDown, rowProps, filterable, filterColumns, groupable, className, }: WellManifestTableProps<T>): JSX.Element;
4142
+
4143
+ export declare interface WellManifestTableProps<T extends WellRecord = WellRecord> {
4144
+ values: Map<WellId, T>;
4145
+ columns: WellColumn<T>[];
4146
+ /**
4147
+ * Field schema. If a column has `field` matching a `select`-kind field, a
4148
+ * Select cell renders automatically with that field's options.
4149
+ */
4150
+ fields?: WellField<T>[];
4151
+ selection?: Set<WellId>;
4152
+ onSelectionChange?: (next: Set<WellId>) => void;
4153
+ onChange: (next: Map<WellId, T>) => void;
4154
+ /** Builds an empty record for a freshly-created row. */
4155
+ emptyEntry: (id: WellId) => T;
4156
+ /** Filter that controls which empty rows surface. Defaults to `false`. */
4157
+ isPopulated?: (row: T) => boolean;
4158
+ pageSize?: number;
4159
+ pageSizeOptions?: number[];
4160
+ /** Adds a column header action that copies the first non-empty value downward. */
4161
+ enableFillDown?: boolean;
4162
+ /**
4163
+ * Extra props spread onto each `<tr>` — typically used to attach a DnD
4164
+ * library's `setNodeRef`, listeners, and data attributes so rows can act as
4165
+ * drag sources. The kit stays DnD-library-agnostic.
4166
+ */
4167
+ rowProps?: (ctx: WellManifestTableRowContext<T>) => React_2.ComponentProps<"tr"> | undefined;
4168
+ /** Enables an inline filter popover above the table. Defaults to false. */
4169
+ filterable?: boolean;
4170
+ /**
4171
+ * Optional override of filterable column configs. When omitted, every column
4172
+ * with a `field` becomes filterable using the default operator set from the
4173
+ * shared data-table filter system.
4174
+ */
4175
+ filterColumns?: FilterColumnConfig[];
4176
+ /** Enables an inline group-by selector. Defaults to false. */
4177
+ groupable?: boolean;
4178
+ className?: string;
4179
+ }
4180
+
4181
+ export declare interface WellManifestTableRowContext<T extends WellRecord = WellRecord> {
4182
+ wellId: WellId;
4183
+ row: T;
4184
+ isSelected: boolean;
4185
+ }
4186
+
4187
+ export declare function WellMetadataForm<T extends WellRecord = WellRecord>({ fields, value, onChange, selectionSize, onApply, onClear, applyLabel, clearLabel, extras, className, }: WellMetadataFormProps<T>): JSX.Element;
4188
+
4189
+ export declare interface WellMetadataFormProps<T extends WellRecord = WellRecord> {
4190
+ fields: WellField<T>[];
4191
+ /** Staged values used to apply across the selection. */
4192
+ value: Partial<T>;
4193
+ onChange: (next: Partial<T>) => void;
4194
+ selectionSize: number;
4195
+ onApply: () => void;
4196
+ onClear: () => void;
4197
+ applyLabel?: string;
4198
+ clearLabel?: string;
4199
+ /** Optional extra slot rendered between fields and action row. */
4200
+ extras?: React_2.ReactNode;
4201
+ className?: string;
4202
+ }
4203
+
4204
+ /**
4205
+ * Generic per-well record. Callers supply concrete shape via the `T` generic
4206
+ * on `PlateMapEditor`. Permissive base accepts both interfaces and indexable
4207
+ * record types.
4208
+ */
4209
+ export declare type WellRecord = NonNullable<unknown>;
4210
+
4211
+ export declare interface WellSelectOption {
4212
+ value: string;
4213
+ label: string;
4214
+ /** Optional swatch color shown next to the label. */
4215
+ swatch?: string;
4216
+ }
4217
+
4218
+ export declare type WellShape = "rect" | "circle";
4219
+
3393
4220
  export { }
3394
4221
 
3395
4222