@tetrascience-npm/tetrascience-react-ui 0.5.0-beta.55.1 → 0.5.0-beta.58.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 (83) hide show
  1. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +2 -0
  2. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -0
  3. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +140 -0
  4. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js.map +1 -0
  5. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +2 -0
  6. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -0
  7. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +126 -0
  8. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js.map +1 -0
  9. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs +2 -0
  10. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs.map +1 -0
  11. package/dist/components/composed/PlateMapEditor/PlateMapEditor.js +422 -0
  12. package/dist/components/composed/PlateMapEditor/PlateMapEditor.js.map +1 -0
  13. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +2 -0
  14. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -0
  15. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +136 -0
  16. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js.map +1 -0
  17. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs +2 -0
  18. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs.map +1 -0
  19. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +389 -0
  20. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -0
  21. package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs +2 -0
  22. package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs.map +1 -0
  23. package/dist/components/composed/PlateMapEditor/PlateZoomControl.js +54 -0
  24. package/dist/components/composed/PlateMapEditor/PlateZoomControl.js.map +1 -0
  25. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs +2 -0
  26. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs.map +1 -0
  27. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.js +96 -0
  28. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.js.map +1 -0
  29. package/dist/components/composed/PlateMapEditor/WellLegend.cjs +2 -0
  30. package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -0
  31. package/dist/components/composed/PlateMapEditor/WellLegend.js +58 -0
  32. package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -0
  33. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +2 -0
  34. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -0
  35. package/dist/components/composed/PlateMapEditor/WellManifestTable.js +408 -0
  36. package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -0
  37. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs +2 -0
  38. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs.map +1 -0
  39. package/dist/components/composed/PlateMapEditor/WellMetadataForm.js +177 -0
  40. package/dist/components/composed/PlateMapEditor/WellMetadataForm.js.map +1 -0
  41. package/dist/components/composed/PlateMapEditor/autoFill.cjs +2 -0
  42. package/dist/components/composed/PlateMapEditor/autoFill.cjs.map +1 -0
  43. package/dist/components/composed/PlateMapEditor/autoFill.js +41 -0
  44. package/dist/components/composed/PlateMapEditor/autoFill.js.map +1 -0
  45. package/dist/components/composed/PlateMapEditor/csvPlateTriage.cjs +4 -0
  46. package/dist/components/composed/PlateMapEditor/csvPlateTriage.cjs.map +1 -0
  47. package/dist/components/composed/PlateMapEditor/csvPlateTriage.js +103 -0
  48. package/dist/components/composed/PlateMapEditor/csvPlateTriage.js.map +1 -0
  49. package/dist/components/composed/PlateMapEditor/helpers.cjs +2 -0
  50. package/dist/components/composed/PlateMapEditor/helpers.cjs.map +1 -0
  51. package/dist/components/composed/PlateMapEditor/helpers.js +11 -0
  52. package/dist/components/composed/PlateMapEditor/helpers.js.map +1 -0
  53. package/dist/components/composed/PlateMapEditor/wellGrid.cjs +2 -0
  54. package/dist/components/composed/PlateMapEditor/wellGrid.cjs.map +1 -0
  55. package/dist/components/composed/PlateMapEditor/wellGrid.js +56 -0
  56. package/dist/components/composed/PlateMapEditor/wellGrid.js.map +1 -0
  57. package/dist/components/ui/data-table/data-table-filter.cjs +1 -1
  58. package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -1
  59. package/dist/components/ui/data-table/data-table-filter.js +124 -139
  60. package/dist/components/ui/data-table/data-table-filter.js.map +1 -1
  61. package/dist/components/ui/data-table/data-table-group.cjs +2 -0
  62. package/dist/components/ui/data-table/data-table-group.cjs.map +1 -0
  63. package/dist/components/ui/data-table/data-table-group.js +118 -0
  64. package/dist/components/ui/data-table/data-table-group.js.map +1 -0
  65. package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
  66. package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
  67. package/dist/components/ui/data-table/data-table-pagination.js +22 -22
  68. package/dist/components/ui/data-table/data-table-pagination.js.map +1 -1
  69. package/dist/components/ui/data-table/data-table.cjs +1 -1
  70. package/dist/components/ui/data-table/data-table.cjs.map +1 -1
  71. package/dist/components/ui/data-table/data-table.js +567 -316
  72. package/dist/components/ui/data-table/data-table.js.map +1 -1
  73. package/dist/components/ui/popover.cjs +2 -0
  74. package/dist/components/ui/popover.cjs.map +1 -0
  75. package/dist/components/ui/popover.js +45 -0
  76. package/dist/components/ui/popover.js.map +1 -0
  77. package/dist/index.cjs +1 -1
  78. package/dist/index.css +1 -1
  79. package/dist/index.d.ts +580 -1
  80. package/dist/index.js +637 -593
  81. package/dist/index.js.map +1 -1
  82. package/dist/index.tailwind.css +1 -1
  83. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -39,6 +39,7 @@ import { NavigationMenu as NavigationMenu_2 } from 'radix-ui';
39
39
  import { OnChange } from '@monaco-editor/react';
40
40
  import { OTPInput } from 'input-otp';
41
41
  import { PaginationState } from '@tanstack/react-table';
42
+ import { Popover as Popover_2 } from 'radix-ui';
42
43
  import { PropsWithChildren } from 'react';
43
44
  import { RadioGroup as RadioGroup_2 } from 'radix-ui';
44
45
  import * as React_2 from 'react';
@@ -115,6 +116,10 @@ declare const alertVariants: (props?: ({
115
116
  variant?: "default" | "destructive" | "info" | "positive" | "warning" | null | undefined;
116
117
  } & ClassProp) | undefined) => string;
117
118
 
119
+ export declare function allPositions(dims: PlateDimensions): WellId[];
120
+
121
+ export declare function applyFilterCondition(cellValue: string, operator: FilterOperator, filterValue: string): boolean;
122
+
118
123
  export declare interface AreaDataSeries {
119
124
  x: number[];
120
125
  y: number[];
@@ -220,6 +225,33 @@ export declare type AttachmentsProps = HTMLAttributes<HTMLDivElement> & {
220
225
 
221
226
  export declare type AttachmentVariant = "grid" | "inline" | "list";
222
227
 
228
+ export declare interface AutoFillOptions {
229
+ dims: PlateDimensions;
230
+ /** Number of distinct items to place. Each is repeated `replicates` times. */
231
+ count: number;
232
+ /** First well in fill order. Defaults to position (0,0). */
233
+ startWellId?: WellId;
234
+ /** Traversal strategy. Defaults to `"row-major"`. */
235
+ strategy?: FillStrategy;
236
+ /** Consecutive cells assigned per item. Defaults to 1. */
237
+ replicates?: number;
238
+ }
239
+
240
+ /**
241
+ * Compute the ordered list of well ids to assign to `count` items (each
242
+ * repeated `replicates` times) starting from `startWellId`. Returns at most
243
+ * `dims.rows * dims.columns` ids — overflow is silently truncated so callers
244
+ * can paginate onto multiple plates themselves.
245
+ */
246
+ export declare function autoFillPositions(options: AutoFillOptions): WellId[];
247
+
248
+ /**
249
+ * Convenience wrapper: assigns each input item to `replicates` consecutive
250
+ * wells, returning a `Map<WellId, T>`. The mapper builds the record stored at
251
+ * each well (e.g. stamp item-specific fields onto a base record).
252
+ */
253
+ export declare function autoFillRecords<T>(items: T[], buildRecord: (item: T, index: number, wellId: WellId) => T, options: Omit<AutoFillOptions, "count">): Map<WellId, T>;
254
+
223
255
  export declare function Avatar({ className, size, ...props }: React_2.ComponentProps<typeof Avatar_2.Root> & {
224
256
  size?: "default" | "sm" | "lg";
225
257
  }): JSX.Element;
@@ -1134,7 +1166,7 @@ export declare interface DataAppShellProps {
1134
1166
  className?: string;
1135
1167
  }
1136
1168
 
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;
1169
+ 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
1170
 
1139
1171
  export declare function DataTableColumnToggle({ className }: DataTableColumnToggleProps): JSX.Element | null;
1140
1172
 
@@ -1152,6 +1184,16 @@ export declare interface DataTableFilterProps {
1152
1184
  className?: string;
1153
1185
  }
1154
1186
 
1187
+ export declare function DataTableGroup({ className }: DataTableGroupProps): JSX.Element | null;
1188
+
1189
+ export declare namespace DataTableGroup {
1190
+ var displayName: string;
1191
+ }
1192
+
1193
+ export declare interface DataTableGroupProps {
1194
+ className?: string;
1195
+ }
1196
+
1155
1197
  export declare function DataTablePagination({ pageSizeOptions, className, }: DataTablePaginationProps): JSX.Element | null;
1156
1198
 
1157
1199
  export declare interface DataTablePaginationProps {
@@ -1183,6 +1225,11 @@ export declare interface DataTableProps<TData, TValue> {
1183
1225
  filterConfig?: FilterColumnConfig[];
1184
1226
  /** When true, filtering is handled externally — onFiltersChange fires but rows are not filtered client-side. */
1185
1227
  manualFiltering?: boolean;
1228
+ enableGrouping?: boolean;
1229
+ /** ID of the column currently grouped by, or null for no grouping. */
1230
+ grouping?: string | null;
1231
+ onGroupingChange?: (grouping: string | null) => void;
1232
+ groupConfig?: GroupColumnConfig[];
1186
1233
  density?: "compact" | "default" | "relaxed";
1187
1234
  children?: React_2.ReactNode;
1188
1235
  className?: string;
@@ -1356,6 +1403,8 @@ declare const fieldVariants: (props?: ({
1356
1403
  orientation?: "horizontal" | "vertical" | "responsive" | null | undefined;
1357
1404
  } & ClassProp) | undefined) => string;
1358
1405
 
1406
+ export declare type FillStrategy = "row-major" | "column-major" | "row-snake" | "column-snake";
1407
+
1359
1408
  export declare interface FilterColumnConfig {
1360
1409
  columnId: string;
1361
1410
  label?: string;
@@ -1384,6 +1433,8 @@ export declare const getAttachmentLabel: (data: AttachmentData) => string;
1384
1433
 
1385
1434
  export declare const getMediaCategory: (data: AttachmentData) => AttachmentMediaCategory;
1386
1435
 
1436
+ export declare function getPlateMapScopedWellId(plateBarcode: string, wellId: WellId): WellId;
1437
+
1387
1438
  export declare const getStatusBadge: (status: ToolPart["state"]) => JSX.Element;
1388
1439
 
1389
1440
  /**
@@ -1411,6 +1462,11 @@ export declare const getStatusBadge: (status: ToolPart["state"]) => JSX.Element;
1411
1462
  */
1412
1463
  export declare function getTdpBaseUrlFromReferrer(): string | null;
1413
1464
 
1465
+ export declare interface GroupColumnConfig {
1466
+ columnId: string;
1467
+ label?: string;
1468
+ }
1469
+
1414
1470
  export declare const Heatmap: default_2.FC<HeatmapProps>;
1415
1471
 
1416
1472
  /**
@@ -1484,6 +1540,13 @@ export declare function HoverCardContent({ className, align, sideOffset, ...prop
1484
1540
 
1485
1541
  export declare function HoverCardTrigger({ ...props }: React_2.ComponentProps<typeof HoverCard_2.Trigger>): JSX.Element;
1486
1542
 
1543
+ export declare interface ImportExportHandlers {
1544
+ onImportCsv?: (file: File, triage?: PlateMapCsvTriage) => void | Promise<void>;
1545
+ onExportCsv?: () => void;
1546
+ onImportTemplate?: (file: File) => void | Promise<void>;
1547
+ onExportTemplate?: () => void;
1548
+ }
1549
+
1487
1550
  export declare const InlineCitation: ({ className, ...props }: InlineCitationProps) => JSX.Element;
1488
1551
 
1489
1552
  export declare const InlineCitationCard: (props: InlineCitationCardProps) => JSX.Element;
@@ -1733,6 +1796,19 @@ export declare type LineGraphVariant = "lines" | "lines+markers" | "lines+marker
1733
1796
 
1734
1797
  export declare const LocalReferencedSourcesContext: Context_2<ReferencedSourcesContext | null>;
1735
1798
 
1799
+ export declare function ManifestFilterPopover({ columns, columnLabel, filters, onFiltersChange, triggerLabel, className, }: ManifestFilterPopoverProps): JSX.Element;
1800
+
1801
+ export declare interface ManifestFilterPopoverProps {
1802
+ /** Filterable columns. Operator subsets can be specified per column. */
1803
+ columns: FilterColumnConfig[];
1804
+ /** Column id → display label resolver. */
1805
+ columnLabel?: (columnId: string) => string;
1806
+ filters: FilterCondition[];
1807
+ onFiltersChange: (next: FilterCondition[]) => void;
1808
+ triggerLabel?: string;
1809
+ className?: string;
1810
+ }
1811
+
1736
1812
  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
1813
 
1738
1814
  declare type MarkerSymbol_2 = "circle" | "square" | "diamond" | "triangle-up" | "triangle-down" | "star";
@@ -1950,6 +2026,13 @@ export declare interface NavPage {
1950
2026
  onClick?: () => void;
1951
2027
  }
1952
2028
 
2029
+ export declare function parsePos(id: WellId, dims: PlateDimensions): {
2030
+ row: number;
2031
+ col: number;
2032
+ } | null;
2033
+
2034
+ export declare function parseRowLabel(label: string): number;
2035
+
1953
2036
  /**
1954
2037
  * Peak annotation for labeling peaks on the chromatogram.
1955
2038
  * Used for both user-provided annotations and auto-detected peaks.
@@ -2033,6 +2116,11 @@ declare const PLATE_FORMAT_96: "96";
2033
2116
 
2034
2117
  declare const PLATE_FORMAT_CUSTOM: "custom";
2035
2118
 
2119
+ export declare interface PlateDimensions {
2120
+ rows: number;
2121
+ columns: number;
2122
+ }
2123
+
2036
2124
  /**
2037
2125
  * Plate format presets for standard microplate configurations.
2038
2126
  * - `"96"`: 8 rows × 12 columns (wells A1-H12)
@@ -2067,6 +2155,204 @@ export declare type PlateFormat = typeof PLATE_FORMAT_96 | typeof PLATE_FORMAT_3
2067
2155
  */
2068
2156
  export declare const PlateMap: default_2.FC<PlateMapProps>;
2069
2157
 
2158
+ 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;
2159
+
2160
+ export declare interface PlateMapActionsMenuProps extends ImportExportHandlers {
2161
+ templates?: TemplateOption[];
2162
+ templateId?: string;
2163
+ onTemplateChange?: (id: string) => void;
2164
+ onClearTemplate?: () => void;
2165
+ /** Disable export/save actions when there is nothing to export. */
2166
+ hasEntries?: boolean;
2167
+ label?: React_2.ReactNode;
2168
+ align?: "start" | "center" | "end";
2169
+ side?: "top" | "right" | "bottom" | "left";
2170
+ csvAccept?: string;
2171
+ templateAccept?: string;
2172
+ importTemplateLabel?: string;
2173
+ exportTemplateLabel?: string;
2174
+ importCsvLabel?: string;
2175
+ exportCsvLabel?: string;
2176
+ clearLabel?: string;
2177
+ className?: string;
2178
+ }
2179
+
2180
+ export declare interface PlateMapCsvPlate {
2181
+ /** User-provided plate barcode used as the selectable plate id. */
2182
+ id: string;
2183
+ barcode: string;
2184
+ rows: PlateMapCsvRow[];
2185
+ rowCount: number;
2186
+ }
2187
+
2188
+ export declare interface PlateMapCsvRow {
2189
+ /** 1-based CSV line number, including the header line. */
2190
+ line: number;
2191
+ values: Record<string, string>;
2192
+ }
2193
+
2194
+ export declare interface PlateMapCsvTriage {
2195
+ headers: string[];
2196
+ /** Resolved header name for the plate barcode column, when present. */
2197
+ plateBarcodeColumn?: string;
2198
+ rows: PlateMapCsvRow[];
2199
+ plates: PlateMapCsvPlate[];
2200
+ /** Rows missing a barcode. The editor does not create fallback barcodes. */
2201
+ missingBarcodeRows: PlateMapCsvRow[];
2202
+ }
2203
+
2204
+ export declare interface PlateMapCsvTriageOptions {
2205
+ /** Exact column name to use before trying aliases. */
2206
+ plateBarcodeColumn?: string;
2207
+ /** Additional accepted names for the plate barcode column. */
2208
+ plateBarcodeColumnAliases?: readonly string[];
2209
+ }
2210
+
2211
+ 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;
2212
+
2213
+ export declare interface PlateMapEditorProps<T extends WellRecord = WellRecord> extends Omit<PlateMapActionsMenuProps, "hasEntries" | "className"> {
2214
+ format: PlateFormat;
2215
+ rows?: number;
2216
+ columns?: number;
2217
+ values: Map<WellId, T>;
2218
+ onChange: (next: Map<WellId, T>) => void;
2219
+ selection: Set<WellId>;
2220
+ onSelectionChange: (next: Set<WellId>) => void;
2221
+ fields: WellField<T>[];
2222
+ tableColumns: WellColumn<T>[];
2223
+ /** Resolves the SVG fill color for a well. */
2224
+ colorForWell: (well: T | undefined, wellId: WellId) => string;
2225
+ /** Builds an empty record when a well is freshly created. */
2226
+ emptyEntry: (wellId: WellId) => T;
2227
+ /**
2228
+ * Merges the staged form record onto an existing well record on Apply.
2229
+ * Defaults to a shallow merge (form keys overwrite existing keys when set).
2230
+ */
2231
+ mergeOnApply?: (existing: T | undefined, staged: Partial<T>, wellId: WellId) => T;
2232
+ /** Filter for the manifest's "hide empty" mode. */
2233
+ isPopulated?: (row: T) => boolean;
2234
+ /** Select field cycled when double-clicking a single well, e.g. role painting. */
2235
+ cycleFieldOnWellDoubleClick?: keyof T & string;
2236
+ /** Optional header title (e.g. plate set name). */
2237
+ title?: string;
2238
+ /** Optional badges shown in the header next to the title. */
2239
+ badges?: React_2.ReactNode;
2240
+ /** Optional banner (e.g. import/error alert) shown above the layout. */
2241
+ banner?: React_2.ReactNode;
2242
+ /** Legend block rendered under the form column. */
2243
+ legend?: React_2.ReactNode;
2244
+ /** Form helper slot rendered between fields and the action row. */
2245
+ formExtras?: React_2.ReactNode;
2246
+ /**
2247
+ * Fully replaces the left column. When set, the built-in `WellMetadataForm`
2248
+ * is omitted — use this for alternative workflows like a drag-and-drop
2249
+ * source palette. The legend slot still renders beneath the replacement.
2250
+ */
2251
+ formSlot?: React_2.ReactNode;
2252
+ /** Footer actions (e.g. Save, Back). */
2253
+ footer?: React_2.ReactNode;
2254
+ /** Title for the plate grid panel. */
2255
+ plateTitle?: React_2.ReactNode;
2256
+ /** Optional controls shown next to the built-in actions menu. */
2257
+ plateToolbar?: React_2.ReactNode;
2258
+ /** User-provided plates available for this editor. Barcodes are never generated by the editor. */
2259
+ plates?: PlateMapPlateOption[];
2260
+ activePlateId?: string;
2261
+ onPlateChange?: (plateId: string) => void;
2262
+ /** Opens the host app's manual barcode entry flow for creating a plate. */
2263
+ onAddPlate?: () => void;
2264
+ /** Removes a plate (typically when using `plateSelectorVariant="tabs"`). */
2265
+ onRemovePlate?: (plateId: string) => void;
2266
+ addPlateLabel?: string;
2267
+ removePlateLabel?: string;
2268
+ plateSelectorLabel?: string;
2269
+ /** Layout of the plate selector. Defaults to `"dropdown"`. */
2270
+ plateSelectorVariant?: PlateMapPlateSelectorVariant;
2271
+ /** Row field used to stamp the active user-provided barcode onto edited wells. Defaults to `plateBarcode`. */
2272
+ plateBarcodeField?: keyof T & string;
2273
+ /** Header for the automatic manifest barcode column. */
2274
+ plateBarcodeColumnHeader?: string;
2275
+ /** Hide the automatic manifest barcode column when plate-scoped editing is active. */
2276
+ hidePlateBarcodeColumn?: boolean;
2277
+ /** Optional grouped well shortcuts rendered under the grid. */
2278
+ groups?: PlateMapGroupOption[];
2279
+ activeGroupId?: string;
2280
+ onGroupClick?: (group: PlateMapGroupOption) => void;
2281
+ /** Custom hover summary for the strip above the grid. */
2282
+ renderHoverSummary?: (well: T | undefined, wellId: WellId) => React_2.ReactNode;
2283
+ /** Fixed well size. When unset, the grid grows with the available width. */
2284
+ cellSize?: number;
2285
+ /** Fill color for empty wells. Pass `null` to delegate empty wells to `colorForWell`. */
2286
+ emptyWellFillColor?: string | null;
2287
+ /** Well shape forwarded to `PlatePaintGrid`. Defaults to `"rect"`. */
2288
+ wellShape?: WellShape;
2289
+ /** When true, wraps the grid in a card-like plate frame (rounded + border + soft shadow). */
2290
+ framedPlate?: boolean;
2291
+ /**
2292
+ * Forwarded to `PlatePaintGrid`. Render-prop that places a node inside each
2293
+ * absolute-positioned well cell — used to wire drop targets without binding
2294
+ * the kit to a specific DnD library.
2295
+ */
2296
+ wrapWell?: (wellId: WellId, cellSize: number) => React_2.ReactNode;
2297
+ /** Wells to highlight (e.g. when hovering a legend item externally). */
2298
+ highlightedWellIds?: ReadonlySet<WellId>;
2299
+ /** Fires whenever the currently hovered well changes (null on leave). */
2300
+ onHoveredWellChange?: (wellId: WellId | null) => void;
2301
+ /** Enables the filter popover on the manifest table. */
2302
+ manifestFilterable?: boolean;
2303
+ /** Enables the group-by selector on the manifest table. */
2304
+ manifestGroupable?: boolean;
2305
+ autoScaleGrid?: boolean;
2306
+ minCellSize?: number;
2307
+ maxCellSize?: number;
2308
+ className?: string;
2309
+ }
2310
+
2311
+ export declare interface PlateMapGroupOption {
2312
+ id: string;
2313
+ label: string;
2314
+ /** Well ids in the group; callers can use this to select the group. */
2315
+ wellIds?: WellId[];
2316
+ /** Optional explicit count; defaults to `wellIds.length` when present. */
2317
+ count?: number;
2318
+ color?: string;
2319
+ borderColor?: string;
2320
+ disabled?: boolean;
2321
+ }
2322
+
2323
+ export declare interface PlateMapPlateOption {
2324
+ /** Stable plate id. For imported CSVs this should be the user-provided barcode. */
2325
+ id: string;
2326
+ /** User-provided plate barcode. Barcodes are never generated by the editor. */
2327
+ barcode: string;
2328
+ /** Optional display label when it differs from the barcode. */
2329
+ label?: string;
2330
+ /** Optional count shown beside the plate pill, usually imported row/well count. */
2331
+ count?: number;
2332
+ disabled?: boolean;
2333
+ }
2334
+
2335
+ export declare function PlateMapPlateSelector({ plates, activePlateId, onPlateChange, onAddPlate, onRemovePlate, addPlateLabel, removePlateLabel, label, variant, align, side, className, }: PlateMapPlateSelectorProps): JSX.Element;
2336
+
2337
+ export declare interface PlateMapPlateSelectorProps {
2338
+ plates?: PlateMapPlateOption[];
2339
+ activePlateId?: string;
2340
+ onPlateChange?: (plateId: string) => void;
2341
+ onAddPlate?: () => void;
2342
+ /** When supplied, the tabs variant renders a delete affordance per plate. */
2343
+ onRemovePlate?: (plateId: string) => void;
2344
+ addPlateLabel?: string;
2345
+ removePlateLabel?: string;
2346
+ label?: string;
2347
+ /** Layout. `"dropdown"` is the default single-trigger menu, `"tabs"` is a horizontal tab strip. */
2348
+ variant?: PlateMapPlateSelectorVariant;
2349
+ align?: "start" | "center" | "end";
2350
+ side?: "top" | "right" | "bottom" | "left";
2351
+ className?: string;
2352
+ }
2353
+
2354
+ export declare type PlateMapPlateSelectorVariant = "dropdown" | "tabs";
2355
+
2070
2356
  /**
2071
2357
  * Props for PlateMap component
2072
2358
  */
@@ -2168,6 +2454,76 @@ export declare interface PlateMapProps {
2168
2454
  onWellClick?: (wellData: WellData) => void;
2169
2455
  }
2170
2456
 
2457
+ export declare function plateOptionsFromCsvTriage(triage: PlateMapCsvTriage): PlateMapPlateOption[];
2458
+
2459
+ /**
2460
+ * Interactive plate grid with drag-rectangle selection.
2461
+ * - Click & drag: replace selection
2462
+ * - Shift + drag: add to selection
2463
+ * - Alt + drag: remove from selection
2464
+ */
2465
+ 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;
2466
+
2467
+ export declare interface PlatePaintGridProps<T extends WellRecord = WellRecord> {
2468
+ format: PlateFormat;
2469
+ rows?: number;
2470
+ columns?: number;
2471
+ values: Map<WellId, T>;
2472
+ selection: Set<WellId>;
2473
+ onSelectionChange: (next: Set<WellId>) => void;
2474
+ /** Returns the fill color for a given well record (or undefined if empty). */
2475
+ colorForWell: (well: T | undefined, wellId: WellId) => string;
2476
+ /** Fill color for empty wells. Pass `null` to delegate empty wells to `colorForWell`. */
2477
+ emptyWellFillColor?: string | null;
2478
+ /** Geometric shape of each well. `"circle"` matches scientific plate visuals. Defaults to `"rect"`. */
2479
+ wellShape?: WellShape;
2480
+ /**
2481
+ * When true, wraps the grid in a card-like surface (rounded, bordered,
2482
+ * padded, soft shadow) so it reads as a physical plate. Pairs well with
2483
+ * `wellShape="circle"`.
2484
+ */
2485
+ framed?: boolean;
2486
+ /** Pixel size of each well cell. Defaults to 34 when fixed. */
2487
+ cellSize?: number;
2488
+ /** Resize wells to fill available width when `cellSize` is not fixed. */
2489
+ autoScale?: boolean;
2490
+ minCellSize?: number;
2491
+ /** Defaults to 72 for 96-well style plates and 36 for denser plates. */
2492
+ maxCellSize?: number;
2493
+ /** Stroke color for non-selected wells. Defaults to a light border. */
2494
+ borderColor?: string;
2495
+ /** Stroke color for selected wells. Defaults to the kit primary blue. */
2496
+ selectedBorderColor?: string;
2497
+ /** Fill color for selected wells. Defaults to the kit primary blue. */
2498
+ selectedFillColor?: string;
2499
+ /** Selected fill opacity. */
2500
+ selectedFillOpacity?: number;
2501
+ /** Whether selected wells use the selection fill or keep their assigned well color. */
2502
+ selectionFillMode?: "selection" | "well";
2503
+ /** Well id that should briefly flash, usually after a double-click assignment. */
2504
+ flashWellId?: WellId;
2505
+ /** Changing this value restarts the flash animation for the same well. */
2506
+ flashWellKey?: number;
2507
+ /**
2508
+ * Well ids that should render with a highlight ring. Used for cross-component
2509
+ * hover sync (e.g. hovering a legend item to highlight matching wells).
2510
+ */
2511
+ highlightedWellIds?: ReadonlySet<WellId>;
2512
+ /** Stroke color for highlighted wells. Defaults to the kit primary blue. */
2513
+ highlightBorderColor?: string;
2514
+ onWellHover?: (wellId: WellId | null) => void;
2515
+ onWellDoubleClick?: (wellId: WellId) => void;
2516
+ /**
2517
+ * Optional render-prop invoked once per well. The returned node is placed
2518
+ * inside an absolutely-positioned cell on top of the SVG, sized to
2519
+ * `cellSize`. The wrapper layer is `pointer-events: none` so the SVG keeps
2520
+ * pointer interaction by default; consumers wiring drop targets are expected
2521
+ * to set `pointer-events: auto` on their own element while a drag is active.
2522
+ */
2523
+ wrapWell?: (wellId: WellId, cellSize: number) => React_2.ReactNode;
2524
+ className?: string;
2525
+ }
2526
+
2171
2527
  /**
2172
2528
  * A region to highlight on the plate (e.g., controls, sample areas, empty wells)
2173
2529
  */
@@ -2189,6 +2545,30 @@ declare interface PlateRegion {
2189
2545
  fillColor?: string;
2190
2546
  }
2191
2547
 
2548
+ export declare function PlateZoomControl({ zoom, onZoomChange, step, min, max, showReadout, className, }: PlateZoomControlProps): JSX.Element;
2549
+
2550
+ export declare interface PlateZoomControlProps {
2551
+ zoom: number;
2552
+ onZoomChange: (next: number) => void;
2553
+ /** Increment per click. Defaults to 0.1. */
2554
+ step?: number;
2555
+ min?: number;
2556
+ max?: number;
2557
+ /** Render a percentage readout between the buttons. Defaults to true. */
2558
+ showReadout?: boolean;
2559
+ className?: string;
2560
+ }
2561
+
2562
+ export declare function Popover({ ...props }: React_2.ComponentProps<typeof Popover_2.Root>): JSX.Element;
2563
+
2564
+ export declare function PopoverAnchor({ ...props }: React_2.ComponentProps<typeof Popover_2.Anchor>): JSX.Element;
2565
+
2566
+ export declare function PopoverContent({ className, align, sideOffset, ...props }: React_2.ComponentProps<typeof Popover_2.Content>): JSX.Element;
2567
+
2568
+ export declare function PopoverTrigger({ ...props }: React_2.ComponentProps<typeof Popover_2.Trigger>): JSX.Element;
2569
+
2570
+ export declare function pos(row: number, col: number, columns: number): WellId;
2571
+
2192
2572
  export declare const PromptInput: ({ className, accept, multiple, globalDrop, syncHiddenInput, maxFiles, maxFileSize, onError, onSubmit, children, ...props }: PromptInputProps) => JSX.Element;
2193
2573
 
2194
2574
  export declare const PromptInputActionAddAttachments: ({ label, ...props }: PromptInputActionAddAttachmentsProps) => JSX.Element;
@@ -2521,6 +2901,8 @@ export declare type ReasoningTriggerProps = ComponentProps<typeof CollapsibleTri
2521
2901
  getThinkingMessage?: (isStreaming: boolean, duration?: number) => ReactNode;
2522
2902
  };
2523
2903
 
2904
+ export declare function rectPositions(r0: number, c0: number, r1: number, c1: number, columns: number): WellId[];
2905
+
2524
2906
  export declare interface ReferencedSourcesContext {
2525
2907
  sources: (SourceDocumentUIPart & {
2526
2908
  id: string;
@@ -2538,6 +2920,8 @@ export declare function ResizablePanel({ ...props }: ResizablePrimitive.PanelPro
2538
2920
 
2539
2921
  export declare function ResizablePanelGroup({ className, ...props }: ResizablePrimitive.GroupProps): JSX.Element;
2540
2922
 
2923
+ export declare function resolveDimensions(format: PlateFormat, rows?: number, columns?: number): PlateDimensions;
2924
+
2541
2925
  export declare function RichListItem({ leading, primary, secondary, trailing, actions, className, variant, size, ...props }: RichListItemProps): JSX.Element;
2542
2926
 
2543
2927
  export declare function RichListItemAvatar({ initials, className, fallbackClassName, size, ...props }: RichListItemAvatarProps): JSX.Element;
@@ -2560,6 +2944,9 @@ export declare interface RichListItemProps extends Omit<React_2.ComponentProps<t
2560
2944
  actions?: React_2.ReactNode;
2561
2945
  }
2562
2946
 
2947
+ /** Letter for a row index. Supports A-Z then AA-ZZ for 1536-format plates. */
2948
+ export declare function rowLabel(row: number): string;
2949
+
2563
2950
  export declare interface ScatterDataPoint {
2564
2951
  x: number;
2565
2952
  y: number;
@@ -2880,6 +3267,10 @@ declare interface TableContextValue<TData> {
2880
3267
  setFilters: (filters: FilterCondition[]) => void;
2881
3268
  filterConfig: FilterColumnConfig[];
2882
3269
  enableFiltering: boolean;
3270
+ grouping: string | null;
3271
+ setGrouping: (columnId: string | null) => void;
3272
+ groupConfig: GroupColumnConfig[];
3273
+ enableGrouping: boolean;
2883
3274
  }
2884
3275
 
2885
3276
  export declare function TableFooter({ className, ...props }: React_2.ComponentProps<"tfoot">): JSX.Element;
@@ -3119,6 +3510,30 @@ export declare interface TdpSearchSort {
3119
3510
  order: "asc" | "desc";
3120
3511
  }
3121
3512
 
3513
+ export declare function TemplateIOPanel({ templates, templateId, onTemplateChange, onClearTemplate, hasEntries, onImportCsv, onExportCsv, onImportTemplate, onExportTemplate, className, csvAccept, templateAccept, }: TemplateIOPanelProps): JSX.Element;
3514
+
3515
+ export declare interface TemplateIOPanelProps extends ImportExportHandlers {
3516
+ templates?: TemplateOption[];
3517
+ templateId?: string;
3518
+ onTemplateChange?: (id: string) => void;
3519
+ onClearTemplate?: () => void;
3520
+ /** Disable export buttons when there's nothing to export. */
3521
+ hasEntries?: boolean;
3522
+ className?: string;
3523
+ csvAccept?: string;
3524
+ templateAccept?: string;
3525
+ }
3526
+
3527
+ export declare interface TemplateOption {
3528
+ id: string;
3529
+ label: string;
3530
+ /** Optional group header in the dropdown (e.g. "Built-in", "User"). */
3531
+ group?: string;
3532
+ /** Optional supporting text for richer chooser menus. */
3533
+ description?: string;
3534
+ disabled?: boolean;
3535
+ }
3536
+
3122
3537
  export declare const TetraScienceIcon: React_2.ForwardRefExoticComponent<Omit<TetraScienceIconProps, "ref"> & React_2.RefAttributes<SVGSVGElement>>;
3123
3538
 
3124
3539
  export declare interface TetraScienceIconProps extends React_2.SVGProps<SVGSVGElement> {
@@ -3235,6 +3650,10 @@ declare type ToolUIPartApproval = {
3235
3650
  reason?: string;
3236
3651
  } | undefined;
3237
3652
 
3653
+ export declare function triagePlateMapCsvByBarcode(text: string, options?: PlateMapCsvTriageOptions): PlateMapCsvTriage;
3654
+
3655
+ export declare function triagePlateMapCsvFile(file: File, options?: PlateMapCsvTriageOptions): Promise<PlateMapCsvTriage | undefined>;
3656
+
3238
3657
  /** TetraScience brand gradient — Light Blue 300 → Purple 500 → Violet Marble */
3239
3658
  export declare const TS_SHIMMER_GRADIENT = "linear-gradient(90deg, #549DFF, #8243BA, #9665F4)";
3240
3659
 
@@ -3335,6 +3754,27 @@ export declare interface UseTdpNavigationReturn {
3335
3754
  */
3336
3755
  declare type VisualizationMode = "heatmap" | "categorical";
3337
3756
 
3757
+ export declare interface WellColumn<T extends WellRecord = WellRecord> {
3758
+ /** Stable id; falls back to `field` if omitted. */
3759
+ id?: string;
3760
+ header: string;
3761
+ /** Optional leading icon in the table header. */
3762
+ icon?: React_2.ReactNode;
3763
+ /** Read direct property when `field` is set. */
3764
+ field?: keyof T & string;
3765
+ /** Min width in px (applied via inline style). */
3766
+ minWidth?: number;
3767
+ /**
3768
+ * Cell renderer. If omitted, the cell renders a display value. `select`
3769
+ * fields render as badge-style custom cells using the matching option label.
3770
+ */
3771
+ render?: (ctx: {
3772
+ row: T;
3773
+ wellId: WellId;
3774
+ update: (patch: Partial<T>) => void;
3775
+ }) => React_2.ReactNode;
3776
+ }
3777
+
3338
3778
  /**
3339
3779
  * Well data for individual wells.
3340
3780
  *
@@ -3390,6 +3830,145 @@ export declare interface WellData {
3390
3830
  tooltipData?: Record<string, unknown>;
3391
3831
  }
3392
3832
 
3833
+ export declare interface WellField<T extends WellRecord = WellRecord> {
3834
+ /** Key in the well record this field reads/writes. */
3835
+ key: keyof T & string;
3836
+ label: string;
3837
+ /** Optional leading icon shown in form labels and matching table headers. */
3838
+ icon?: React_2.ReactNode;
3839
+ kind: WellFieldKind;
3840
+ placeholder?: string;
3841
+ /** Required for `kind: "select"` and `kind: "multiselect"`. */
3842
+ options?: WellSelectOption[];
3843
+ /** Visual style for `kind: "boolean"`. Defaults to `"checkbox"`. */
3844
+ boolStyle?: "checkbox" | "switch";
3845
+ /**
3846
+ * When true, matching `WellManifestTable` cells render an inline editor of
3847
+ * this field's `kind` (mirroring the form). Defaults to false — cells stay
3848
+ * read-only unless the developer opts in or supplies `WellColumn.render`.
3849
+ */
3850
+ editableInTable?: boolean;
3851
+ /**
3852
+ * Custom renderer for the form input. Receives current value and a setter
3853
+ * that patches the field on the staged form record.
3854
+ */
3855
+ render?: (ctx: {
3856
+ value: unknown;
3857
+ onChange: (next: unknown) => void;
3858
+ selectionSize: number;
3859
+ }) => React_2.ReactNode;
3860
+ }
3861
+
3862
+ /**
3863
+ * Field kinds rendered by `WellMetadataForm` and (when `editableInTable`) by
3864
+ * `WellManifestTable`.
3865
+ */
3866
+ export declare type WellFieldKind = "text" | "number" | "integer" | "boolean" | "date" | "datetime" | "time" | "select" | "multiselect" | "custom";
3867
+
3868
+ export declare type WellId = string;
3869
+
3870
+ export declare function WellLegend({ items, renderItem, onHoverEnter, onHoverLeave, onRemove, removeLabel, emptyLabel, className, }: WellLegendProps): JSX.Element;
3871
+
3872
+ export declare interface WellLegendItem {
3873
+ id: string;
3874
+ label: React_2.ReactNode;
3875
+ color: string;
3876
+ /** Optional secondary text shown beneath the label. */
3877
+ meta?: React_2.ReactNode;
3878
+ disabled?: boolean;
3879
+ }
3880
+
3881
+ export declare interface WellLegendProps {
3882
+ items: WellLegendItem[];
3883
+ /** Render-prop for fully custom cards. Bypasses the default card layout. */
3884
+ renderItem?: (item: WellLegendItem) => React_2.ReactNode;
3885
+ onHoverEnter?: (id: string) => void;
3886
+ onHoverLeave?: (id: string) => void;
3887
+ onRemove?: (id: string) => void;
3888
+ removeLabel?: string;
3889
+ emptyLabel?: string;
3890
+ className?: string;
3891
+ }
3892
+
3893
+ 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;
3894
+
3895
+ export declare interface WellManifestTableProps<T extends WellRecord = WellRecord> {
3896
+ values: Map<WellId, T>;
3897
+ columns: WellColumn<T>[];
3898
+ /**
3899
+ * Field schema. If a column has `field` matching a `select`-kind field, a
3900
+ * Select cell renders automatically with that field's options.
3901
+ */
3902
+ fields?: WellField<T>[];
3903
+ selection?: Set<WellId>;
3904
+ onSelectionChange?: (next: Set<WellId>) => void;
3905
+ onChange: (next: Map<WellId, T>) => void;
3906
+ /** Builds an empty record for a freshly-created row. */
3907
+ emptyEntry: (id: WellId) => T;
3908
+ /** Filter that controls which empty rows surface. Defaults to `false`. */
3909
+ isPopulated?: (row: T) => boolean;
3910
+ pageSize?: number;
3911
+ pageSizeOptions?: number[];
3912
+ /** Adds a column header action that copies the first non-empty value downward. */
3913
+ enableFillDown?: boolean;
3914
+ /**
3915
+ * Extra props spread onto each `<tr>` — typically used to attach a DnD
3916
+ * library's `setNodeRef`, listeners, and data attributes so rows can act as
3917
+ * drag sources. The kit stays DnD-library-agnostic.
3918
+ */
3919
+ rowProps?: (ctx: WellManifestTableRowContext<T>) => React_2.ComponentProps<"tr"> | undefined;
3920
+ /** Enables an inline filter popover above the table. Defaults to false. */
3921
+ filterable?: boolean;
3922
+ /**
3923
+ * Optional override of filterable column configs. When omitted, every column
3924
+ * with a `field` becomes filterable using the default operator set from the
3925
+ * shared data-table filter system.
3926
+ */
3927
+ filterColumns?: FilterColumnConfig[];
3928
+ /** Enables an inline group-by selector. Defaults to false. */
3929
+ groupable?: boolean;
3930
+ className?: string;
3931
+ }
3932
+
3933
+ export declare interface WellManifestTableRowContext<T extends WellRecord = WellRecord> {
3934
+ wellId: WellId;
3935
+ row: T;
3936
+ isSelected: boolean;
3937
+ }
3938
+
3939
+ export declare function WellMetadataForm<T extends WellRecord = WellRecord>({ fields, value, onChange, selectionSize, onApply, onClear, applyLabel, clearLabel, extras, className, }: WellMetadataFormProps<T>): JSX.Element;
3940
+
3941
+ export declare interface WellMetadataFormProps<T extends WellRecord = WellRecord> {
3942
+ fields: WellField<T>[];
3943
+ /** Staged values used to apply across the selection. */
3944
+ value: Partial<T>;
3945
+ onChange: (next: Partial<T>) => void;
3946
+ selectionSize: number;
3947
+ onApply: () => void;
3948
+ onClear: () => void;
3949
+ applyLabel?: string;
3950
+ clearLabel?: string;
3951
+ /** Optional extra slot rendered between fields and action row. */
3952
+ extras?: React_2.ReactNode;
3953
+ className?: string;
3954
+ }
3955
+
3956
+ /**
3957
+ * Generic per-well record. Callers supply concrete shape via the `T` generic
3958
+ * on `PlateMapEditor`. Permissive base accepts both interfaces and indexable
3959
+ * record types.
3960
+ */
3961
+ export declare type WellRecord = NonNullable<unknown>;
3962
+
3963
+ export declare interface WellSelectOption {
3964
+ value: string;
3965
+ label: string;
3966
+ /** Optional swatch color shown next to the label. */
3967
+ swatch?: string;
3968
+ }
3969
+
3970
+ export declare type WellShape = "rect" | "circle";
3971
+
3393
3972
  export { }
3394
3973
 
3395
3974