@tetrascience-npm/tetrascience-react-ui 1.0.0-beta.156.1 → 1.0.0-beta.158.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 (73) hide show
  1. package/README.md +113 -0
  2. package/dist/components/composed/DataAppShell/RightPanel.cjs +1 -1
  3. package/dist/components/composed/DataAppShell/RightPanel.cjs.map +1 -1
  4. package/dist/components/composed/DataAppShell/RightPanel.d.ts +11 -1
  5. package/dist/components/composed/DataAppShell/RightPanel.js +128 -126
  6. package/dist/components/composed/DataAppShell/RightPanel.js.map +1 -1
  7. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +1 -1
  8. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -1
  9. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.d.ts +5 -1
  10. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +32 -30
  11. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js.map +1 -1
  12. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs +1 -1
  13. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs.map +1 -1
  14. package/dist/components/composed/PlateMapEditor/PlateMapEditor.d.ts +269 -13
  15. package/dist/components/composed/PlateMapEditor/PlateMapEditor.js +392 -310
  16. package/dist/components/composed/PlateMapEditor/PlateMapEditor.js.map +1 -1
  17. package/dist/components/composed/PlateMapEditor/PlateMapForm.cjs +1 -1
  18. package/dist/components/composed/PlateMapEditor/PlateMapForm.cjs.map +1 -1
  19. package/dist/components/composed/PlateMapEditor/PlateMapForm.d.ts +5 -1
  20. package/dist/components/composed/PlateMapEditor/PlateMapForm.js +19 -15
  21. package/dist/components/composed/PlateMapEditor/PlateMapForm.js.map +1 -1
  22. package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs +1 -1
  23. package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs.map +1 -1
  24. package/dist/components/composed/PlateMapEditor/PlateMapGrid.d.ts +12 -1
  25. package/dist/components/composed/PlateMapEditor/PlateMapGrid.js +69 -63
  26. package/dist/components/composed/PlateMapEditor/PlateMapGrid.js.map +1 -1
  27. package/dist/components/composed/PlateMapEditor/PlateMapManifest.cjs +1 -1
  28. package/dist/components/composed/PlateMapEditor/PlateMapManifest.cjs.map +1 -1
  29. package/dist/components/composed/PlateMapEditor/PlateMapManifest.d.ts +13 -4
  30. package/dist/components/composed/PlateMapEditor/PlateMapManifest.js +38 -29
  31. package/dist/components/composed/PlateMapEditor/PlateMapManifest.js.map +1 -1
  32. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs +1 -1
  33. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs.map +1 -1
  34. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.d.ts +6 -1
  35. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +490 -275
  36. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -1
  37. package/dist/components/composed/PlateMapEditor/WellLegend.cjs +1 -1
  38. package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -1
  39. package/dist/components/composed/PlateMapEditor/WellLegend.d.ts +8 -2
  40. package/dist/components/composed/PlateMapEditor/WellLegend.js +8 -7
  41. package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -1
  42. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +1 -1
  43. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -1
  44. package/dist/components/composed/PlateMapEditor/WellManifestTable.d.ts +6 -2
  45. package/dist/components/composed/PlateMapEditor/WellManifestTable.js +288 -256
  46. package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -1
  47. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs +1 -1
  48. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs.map +1 -1
  49. package/dist/components/composed/PlateMapEditor/WellMetadataForm.d.ts +5 -1
  50. package/dist/components/composed/PlateMapEditor/WellMetadataForm.js +61 -66
  51. package/dist/components/composed/PlateMapEditor/WellMetadataForm.js.map +1 -1
  52. package/dist/components/composed/PlateMapEditor/WellQuickPaint.cjs +2 -0
  53. package/dist/components/composed/PlateMapEditor/WellQuickPaint.cjs.map +1 -0
  54. package/dist/components/composed/PlateMapEditor/WellQuickPaint.d.ts +23 -0
  55. package/dist/components/composed/PlateMapEditor/WellQuickPaint.js +75 -0
  56. package/dist/components/composed/PlateMapEditor/WellQuickPaint.js.map +1 -0
  57. package/dist/components/composed/PlateMapEditor/index.d.ts +6 -2
  58. package/dist/components/composed/PlateMapEditor/types.d.ts +65 -0
  59. package/dist/components/composed/PlateMapEditor/usePlateMapEditorState.cjs +2 -0
  60. package/dist/components/composed/PlateMapEditor/usePlateMapEditorState.cjs.map +1 -0
  61. package/dist/components/composed/PlateMapEditor/usePlateMapEditorState.d.ts +109 -0
  62. package/dist/components/composed/PlateMapEditor/usePlateMapEditorState.js +246 -0
  63. package/dist/components/composed/PlateMapEditor/usePlateMapEditorState.js.map +1 -0
  64. package/dist/composed/PlateMapEditor.cjs +1 -1
  65. package/dist/composed/PlateMapEditor.js +48 -42
  66. package/dist/composed/PlateMapEditor.js.map +1 -1
  67. package/dist/index.cjs +1 -1
  68. package/dist/index.css +1 -1
  69. package/dist/index.js +701 -695
  70. package/dist/index.js.map +1 -1
  71. package/dist/index.scoped.css +1 -1
  72. package/dist/index.tailwind.css +1 -1
  73. package/package.json +1 -1
@@ -1,10 +1,90 @@
1
+ import { getPlateMapScopedWellId, PlateMapApplyScope } from './usePlateMapEditorState';
1
2
  import { PlateMapActionsMenuProps } from './PlateMapActionsMenu';
2
3
  import { PlateMapPlateSelectorVariant } from './PlateMapPlateSelector';
3
4
  import { WellShape } from './PlatePaintGrid';
4
- import { PlateFormat, PlateMapGroupOption, PlateMapPlateOption, WellColumn, WellField, WellId, WellRecord } from './types';
5
+ import { PlateFormat, PlateMapEditorLabels, PlateMapGroupOption, PlateMapPlateOption, WellColumn, WellField, WellId, WellRecord } from './types';
6
+ import { FilterColumnConfig } from '../../ui/data-table/data-table';
5
7
  import { Badge } from '../../ui/badge';
6
8
  import * as React from "react";
7
- export declare function getPlateMapScopedWellId(plateBarcode: string, wellId: WellId): WellId;
9
+ /**
10
+ * Width at which the form and plate stop stacking and sit side by side.
11
+ *
12
+ * These are **container** widths, not viewport widths — the editor measures the
13
+ * space it is actually given, so it lays out correctly inside a narrow panel,
14
+ * split pane, or drawer on a wide monitor, not just on a small device. Below
15
+ * the chosen width both regions are full-width and stacked.
16
+ *
17
+ * `"sm"` 640px · `"md"` 768px (default) · `"lg"` 1024px · `"xl"` 1280px ·
18
+ * `"never"` always stacked.
19
+ */
20
+ export type PlateMapEditorStackAt = "sm" | "md" | "lg" | "xl" | "never";
21
+ /** Where the metadata form sits relative to the plate grid. */
22
+ export type PlateMapEditorFormPlacement = "start" | "end" | "top" | "bottom";
23
+ export { getPlateMapScopedWellId };
24
+ /**
25
+ * Imperative handle for driving the editor's staged-edit state from outside —
26
+ * the supported way to render the metadata form somewhere the editor can't
27
+ * reach (a host sidebar, a drawer, a toolbar) while keeping the editor's
28
+ * selection and apply behaviour.
29
+ *
30
+ * Pair with `hideForm` and your own form:
31
+ *
32
+ * ```tsx
33
+ * const editor = React.useRef<PlateMapEditorHandle<MyWell>>(null);
34
+ * <PlateMapEditor ref={editor} hideForm … />
35
+ * <MySidebarForm
36
+ * onChange={(next) => editor.current?.setStaged(next)}
37
+ * onApply={() => editor.current?.apply()}
38
+ * onClear={() => editor.current?.clear()}
39
+ * />
40
+ * ```
41
+ */
42
+ /**
43
+ * Per-region class hooks. Each card also carries
44
+ * `data-plate-map-region="form|plate|manifest"`, so plain CSS can target the
45
+ * same regions without threading props.
46
+ */
47
+ export interface PlateMapEditorClassNames {
48
+ /** The row (or column) holding the form and plate cards. */
49
+ layout?: string;
50
+ /** The form column `Card`. Merged after the width rules, so width utilities here win. */
51
+ formCard?: string;
52
+ /** The plate column `Card`. */
53
+ plateCard?: string;
54
+ /** The manifest `Card`. */
55
+ manifestCard?: string;
56
+ /** The `PlateMapForm` panel inside the form card. */
57
+ form?: string;
58
+ /** The `PlateMapGrid` panel inside the plate card. */
59
+ grid?: string;
60
+ /** The `PlateMapManifest` panel inside the manifest card. */
61
+ manifest?: string;
62
+ }
63
+ /** Manifest table behaviour. Structural bits (`hideManifest`, `manifestTitle`, `manifestSlot`) stay top-level. */
64
+ export interface PlateMapEditorManifestOptions {
65
+ /** Enables the filter popover. */
66
+ filterable?: boolean;
67
+ /** Overrides which columns are filterable and how. */
68
+ filterColumns?: FilterColumnConfig[];
69
+ /** Enables the group-by selector. */
70
+ groupable?: boolean;
71
+ /** Field grouped by on first render. Requires `groupable`. */
72
+ defaultGroupBy?: string;
73
+ pageSize?: number;
74
+ pageSizeOptions?: number[];
75
+ /** Adds the copy-first-value-downward column action. Defaults to true. */
76
+ enableFillDown?: boolean;
77
+ }
78
+ export interface PlateMapEditorHandle<T extends WellRecord = WellRecord> {
79
+ /** Applies the staged record across the current selection. */
80
+ apply: (scope?: PlateMapApplyScope) => void;
81
+ /** Clears the current selection's wells. */
82
+ clear: (scope?: PlateMapApplyScope) => void;
83
+ /** Replaces the staged record. */
84
+ setStaged: (next: Partial<T>) => void;
85
+ /** Reads the staged record. */
86
+ getStaged: () => Partial<T>;
87
+ }
8
88
  export interface PlateMapEditorProps<T extends WellRecord = WellRecord> extends Omit<PlateMapActionsMenuProps, "hasEntries" | "className"> {
9
89
  format: PlateFormat;
10
90
  rows?: number;
@@ -15,10 +95,14 @@ export interface PlateMapEditorProps<T extends WellRecord = WellRecord> extends
15
95
  onSelectionChange: (next: Set<WellId>) => void;
16
96
  fields: WellField<T>[];
17
97
  tableColumns: WellColumn<T>[];
18
- /** Resolves the SVG fill color for a well. */
19
- colorForWell: (well: T | undefined, wellId: WellId) => string;
20
- /** Builds an empty record when a well is freshly created. */
21
- emptyEntry: (wellId: WellId) => T;
98
+ /**
99
+ * Resolves the SVG fill color for a well. Optional — defaults to a filled
100
+ * swatch for populated wells and the empty-well token for the rest, which is
101
+ * enough for read-only or single-category views.
102
+ */
103
+ colorForWell?: (well: T | undefined, wellId: WellId) => string;
104
+ /** Builds an empty record when a well is freshly created. Defaults to `{}`. */
105
+ emptyEntry?: (wellId: WellId) => T;
22
106
  /**
23
107
  * Merges the staged form record onto an existing well record on Apply.
24
108
  * Defaults to a shallow merge (form keys overwrite existing keys when set).
@@ -28,14 +112,37 @@ export interface PlateMapEditorProps<T extends WellRecord = WellRecord> extends
28
112
  isPopulated?: (row: T) => boolean;
29
113
  /** Select field cycled when double-clicking a single well, e.g. role painting. */
30
114
  cycleFieldOnWellDoubleClick?: keyof T & string;
115
+ /**
116
+ * Names a `select` field whose options appear as a swatch strip anchored above
117
+ * the selection, so a value can be painted across it in one click without a
118
+ * trip to the form. Swatch colours come from each option's `swatch`.
119
+ *
120
+ * Applies immediately — this is a shortcut for the common case, not a staged
121
+ * edit. Off unless set.
122
+ */
123
+ quickPaintField?: keyof T & string;
124
+ /**
125
+ * Controlled staged form record. Pair with `onStagedChange` to prefill the
126
+ * form, read what's staged, or drive Apply from outside. When omitted the
127
+ * editor owns staged state internally.
128
+ */
129
+ staged?: Partial<T>;
130
+ onStagedChange?: (next: Partial<T>) => void;
31
131
  /** Optional header title (e.g. plate set name). */
32
132
  title?: string;
33
133
  /** Optional badges shown in the header next to the title. */
34
134
  badges?: React.ReactNode;
35
- /** Optional banner (e.g. import/error alert) shown above the layout. */
135
+ /** Optional banner (e.g. import/error alert) shown above the whole layout. */
36
136
  banner?: React.ReactNode;
37
- /** Legend block rendered under the form column. */
137
+ /** Legend block. Position controlled by `legendPlacement`. */
38
138
  legend?: React.ReactNode;
139
+ /**
140
+ * Where `legend` renders. `"form"` (default) puts it under the form column,
141
+ * separated by a divider. `"plate"` puts it under the grid inside the plate
142
+ * card, stacked above anything in `plateFooter`. With `hideForm`, `"form"`
143
+ * drops the legend entirely — use `"plate"` there.
144
+ */
145
+ legendPlacement?: "form" | "plate";
39
146
  /** Form helper slot rendered between fields and the action row. */
40
147
  formExtras?: React.ReactNode;
41
148
  /**
@@ -44,12 +151,41 @@ export interface PlateMapEditorProps<T extends WellRecord = WellRecord> extends
44
151
  * source palette. The legend slot still renders beneath the replacement.
45
152
  */
46
153
  formSlot?: React.ReactNode;
47
- /** Footer actions (e.g. Save, Back). */
154
+ /** Hides the form column entirely, leaving grid (+ manifest). */
155
+ hideForm?: boolean;
156
+ /**
157
+ * Where the metadata form sits relative to the plate grid. `"start"` /
158
+ * `"end"` put it beside the grid (subject to `stackAt`); `"top"` / `"bottom"`
159
+ * stack it full-width at every breakpoint. Defaults to `"start"`.
160
+ */
161
+ formPlacement?: PlateMapEditorFormPlacement;
162
+ /**
163
+ * Viewport width at which the form and grid sit side by side. Below it they
164
+ * always stack full-width. Ignored when `formPlacement` is `"top"`/`"bottom"`.
165
+ * Defaults to `"md"`.
166
+ */
167
+ stackAt?: PlateMapEditorStackAt;
168
+ /**
169
+ * Width of the form column at and above `stackAt`. Any CSS length (`"420px"`,
170
+ * `"28rem"`, `"30%"`) or a number treated as px. Defaults to `"360px"`.
171
+ * Below `stackAt` the form is always full-width regardless of this value.
172
+ */
173
+ formWidth?: number | string;
174
+ /** Footer actions (e.g. Save, Back), rendered at the very bottom of the editor. */
48
175
  footer?: React.ReactNode;
49
176
  /** Title for the plate grid panel. */
50
177
  plateTitle?: React.ReactNode;
51
- /** Optional controls shown next to the built-in actions menu. */
178
+ /** Optional controls shown above the grid, inside the plate card. */
52
179
  plateToolbar?: React.ReactNode;
180
+ /** Slot rendered above the grid's toolbar, scoped to the plate card only. */
181
+ plateBanner?: React.ReactNode;
182
+ /**
183
+ * Content for the plate card's footer — the one slot below the grid. Renders
184
+ * as a real `CardFooter`, so it picks up the card's footer styling. Use it
185
+ * for per-plate actions or a summary; for the editor-wide action row use
186
+ * `footer`.
187
+ */
188
+ plateFooter?: React.ReactNode;
53
189
  /** User-provided plates available for this editor. Barcodes are never generated by the editor. */
54
190
  plates?: PlateMapPlateOption[];
55
191
  activePlateId?: string;
@@ -65,6 +201,15 @@ export interface PlateMapEditorProps<T extends WellRecord = WellRecord> extends
65
201
  plateSelectorVariant?: PlateMapPlateSelectorVariant;
66
202
  /** Row field used to stamp the active user-provided barcode onto edited wells. Defaults to `plateBarcode`. */
67
203
  plateBarcodeField?: keyof T & string;
204
+ /**
205
+ * Which plates Apply/Clear write to. `"active-plate"` (default) touches only
206
+ * the plate on screen; `"all-plates"` writes the same well positions on every
207
+ * plate in `plates`, each row stamped with its own barcode.
208
+ *
209
+ * For a UI offering both side by side, use `usePlateMapEditorState` directly —
210
+ * `applyStagedToSelection("all-plates")` takes a per-call override.
211
+ */
212
+ applyScope?: PlateMapApplyScope;
68
213
  /** Header for the automatic manifest barcode column. */
69
214
  plateBarcodeColumnHeader?: string;
70
215
  /** Hide the automatic manifest barcode column when plate-scoped editing is active. */
@@ -81,6 +226,13 @@ export interface PlateMapEditorProps<T extends WellRecord = WellRecord> extends
81
226
  emptyWellFillColor?: string | null;
82
227
  /** Well shape forwarded to `PlatePaintGrid`. Defaults to `"rect"`. */
83
228
  wellShape?: WellShape;
229
+ /**
230
+ * How a selected well is filled. `"well"` (default) keeps the well's own
231
+ * colour and shows selection via the ring, so the result of an Apply is
232
+ * visible while the wells are still selected. `"selection"` replaces the
233
+ * fill with the selection tint.
234
+ */
235
+ selectionFillMode?: "selection" | "well";
84
236
  /** When true, wraps the grid in a card-like plate frame (rounded + border + soft shadow). */
85
237
  framedPlate?: boolean;
86
238
  /**
@@ -93,14 +245,118 @@ export interface PlateMapEditorProps<T extends WellRecord = WellRecord> extends
93
245
  highlightedWellIds?: ReadonlySet<WellId>;
94
246
  /** Fires whenever the currently hovered well changes (null on leave). */
95
247
  onHoveredWellChange?: (wellId: WellId | null) => void;
96
- /** Enables the filter popover on the manifest table. */
248
+ /** Hides the grid's built-in "Select all" / "Deselect all" links. */
249
+ hideSelectionControls?: boolean;
250
+ /**
251
+ * Overrides every user-facing string the editor and its manifest render —
252
+ * the single place to localise. Omitted keys fall back to English defaults.
253
+ *
254
+ * Does not cover `plateTitle` / `manifestTitle` (own props, `ReactNode`) or
255
+ * the import/export menu's labels (`importCsvLabel` and friends, inherited
256
+ * from `PlateMapActionsMenuProps`).
257
+ */
258
+ labels?: PlateMapEditorLabels;
259
+ /** Hides the sample manifest panel entirely. */
260
+ hideManifest?: boolean;
261
+ /**
262
+ * Fully replaces the manifest panel's body, keeping the card and heading.
263
+ * Use for a bespoke summary table; pair with `hideManifest` to drop the
264
+ * region altogether.
265
+ */
266
+ manifestSlot?: React.ReactNode;
267
+ /** Heading for the manifest card. Defaults to `"Sample manifest"`. */
268
+ manifestTitle?: React.ReactNode;
269
+ /** Manifest table behaviour. See {@link PlateMapEditorManifestOptions}. */
270
+ manifest?: PlateMapEditorManifestOptions;
271
+ /** @deprecated Use `manifest={{ filterable }}`. */
97
272
  manifestFilterable?: boolean;
98
- /** Enables the group-by selector on the manifest table. */
273
+ /** @deprecated Use `manifest={{ groupable }}`. */
99
274
  manifestGroupable?: boolean;
100
275
  autoScaleGrid?: boolean;
101
276
  minCellSize?: number;
102
277
  maxCellSize?: number;
278
+ /** Applied to the editor root. */
103
279
  className?: string;
280
+ /** Inline styles for the editor root. */
281
+ style?: React.CSSProperties;
282
+ /** Per-region class hooks. See {@link PlateMapEditorClassNames}. */
283
+ classNames?: PlateMapEditorClassNames;
284
+ /**
285
+ * Imperative handle for driving staged edits from outside the editor.
286
+ * See {@link PlateMapEditorHandle}.
287
+ */
288
+ ref?: React.Ref<PlateMapEditorHandle<T>>;
104
289
  }
105
- 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>): import("react/jsx-runtime").JSX.Element;
290
+ /**
291
+ * Turnkey plate-map editing surface: a metadata form, an interactive plate
292
+ * grid, and a sample manifest, wired together with the staged-edit controller
293
+ * in {@link usePlateMapEditorState}.
294
+ *
295
+ * ## Choosing a level
296
+ *
297
+ * | You need | Use |
298
+ * | --- | --- |
299
+ * | The standard surface, tuned by props | `PlateMapEditor` (this) |
300
+ * | A layout these props can't express | {@link usePlateMapEditorState} + `PlateMapForm` / `PlateMapGrid` / `PlateMapManifest` |
301
+ * | One region only, wired yourself | The primitives directly |
302
+ *
303
+ * Dropping to the hook keeps the apply/clear semantics, plate scoping, and
304
+ * barcode stamping — you only take over layout.
305
+ *
306
+ * ## Customization map
307
+ *
308
+ * - **Layout** — `formPlacement` (`start`/`end`/`top`/`bottom`), `stackAt`,
309
+ * `formWidth`, `hideForm`, `hideManifest`.
310
+ * - **Slots** — `title`, `badges`, `banner` (whole editor), `plateBanner`
311
+ * (plate card only), `plateToolbar` (above grid), `plateFooter` (the plate
312
+ * card's footer), `footer` (editor-wide action row), `legend` +
313
+ * `legendPlacement`, `formExtras`, `formSlot` (replaces the form),
314
+ * `manifestSlot` (replaces the manifest body).
315
+ * - **Edit semantics** — `mergeOnApply`, `emptyEntry`, `isPopulated`,
316
+ * `cycleFieldOnWellDoubleClick`, and `staged` / `onStagedChange` to make the
317
+ * staged record controlled.
318
+ * - **Labels** — one `labels` object covers every string the editor and its
319
+ * manifest render. `plateTitle` / `manifestTitle` and the import/export menu
320
+ * labels stay separate (they are `ReactNode` slots, not plain text).
321
+ * - **Styling** — `className` / `style` on the root plus one `classNames` map
322
+ * for the regions. Each card also carries
323
+ * `data-plate-map-region="form|plate|manifest"` for CSS targeting.
324
+ * - **Manifest** — one `manifest` options object; `hideManifest`,
325
+ * `manifestTitle` and `manifestSlot` stay top-level.
326
+ *
327
+ * ## Responsiveness
328
+ *
329
+ * The editor responds to **its container's** width, not the viewport's, so it
330
+ * lays out correctly inside a narrow panel, split pane, or drawer on a wide
331
+ * screen. `stackAt` names a container width (`sm` 640 / `md` 768 / `lg` 1024 /
332
+ * `xl` 1280 / `never`); below it the form and grid stack full-width. A plate
333
+ * too dense to fit scrolls inside its own container rather than widening the
334
+ * page.
335
+ *
336
+ * @example Default surface
337
+ * ```tsx
338
+ * <PlateMapEditor
339
+ * format="96"
340
+ * values={values}
341
+ * onChange={setValues}
342
+ * selection={selection}
343
+ * onSelectionChange={setSelection}
344
+ * fields={FIELDS}
345
+ * tableColumns={COLUMNS}
346
+ * />
347
+ * ```
348
+ *
349
+ * @example Grid-only, form on the right, localised
350
+ * ```tsx
351
+ * <PlateMapEditor
352
+ * {...base}
353
+ * formPlacement="end"
354
+ * stackAt="lg"
355
+ * formWidth="22rem"
356
+ * hideManifest
357
+ * labels={{ apply: "Appliquer", clearWells: "Vider les puits" }}
358
+ * />
359
+ * ```
360
+ */
361
+ export declare function PlateMapEditor<T extends WellRecord = WellRecord>({ format, rows, columns, values, onChange, selection, onSelectionChange, fields, tableColumns, colorForWell, emptyEntry, mergeOnApply, isPopulated, cycleFieldOnWellDoubleClick, quickPaintField, staged: controlledStaged, onStagedChange, title, badges, banner, legend, legendPlacement, formExtras, formSlot, hideForm, formPlacement, stackAt, formWidth, footer, plateTitle, plateToolbar, plateBanner, plateFooter, plates, activePlateId, onPlateChange, onAddPlate, onRemovePlate, addPlateLabel, removePlateLabel, plateSelectorLabel, plateSelectorVariant, plateBarcodeField, applyScope, plateBarcodeColumnHeader, hidePlateBarcodeColumn, groups, activeGroupId, onGroupClick, renderHoverSummary, cellSize, emptyWellFillColor, wellShape, selectionFillMode, framedPlate, wrapWell, highlightedWellIds, onHoveredWellChange, hideSelectionControls, labels, hideManifest, manifestSlot, manifestTitle, manifest, manifestFilterable, manifestGroupable, autoScaleGrid, minCellSize, maxCellSize, className, style, classNames, ref, templates, templateId, onTemplateChange, onClearTemplate, onImportCsv, onExportCsv, onImportTemplate, onExportTemplate, csvAccept, templateAccept, label, align, side, importTemplateLabel, exportTemplateLabel, importCsvLabel, exportCsvLabel, clearLabel, }: PlateMapEditorProps<T>): import("react/jsx-runtime").JSX.Element;
106
362
  export { Badge as PlateBadge };