@ai-matrx/records-ui 0.103.10 → 0.104.2

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.
package/dist/index.d.ts CHANGED
@@ -1,15 +1,15 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode, KeyboardEvent, ReactElement, ComponentType, RefObject, SVGAttributes } from 'react';
3
3
  import * as _ai_matrx_records from '@ai-matrx/records';
4
- import { Uuid, RowAction, Field, RowActionStep, RecordScopeContext, EnrichCell, RecordsError, TableDecorations, RecordDocument, Table, ReadRow, StoreFilter, RecordRead, PermissionLevel, AggregateFilter, RelationDisplay, WriteConflict, RecordsErrorCode, RecordFilter, RuleExpression, RecordsResult, SavedViewRow, ImportRun, DeclarableFieldKind, NewerFieldKind, ParityFieldType, NewFieldDeclaration, ChoiceRehome, FieldOptionEdit, StoredRecord, ChoiceNudge, HiddenFieldNotice, ValueEnvelope, ChecklistRequirementKind, ContextPolicy, WorkDueState, FieldSensitivity, StageRuleOnFail, SubscriptionCadence, WorkApprovalState, WorkInboxKind, FieldKind, ArchiveLane, ArchivedRow, WorkInboxView, WorkInboxItem, PortalAccent, FormSummary, PortalCard, PortalPrincipal, PortalPreviewRow, PublicPicture, PortalStyle, MySubscription, DashboardBlockKind, AggregateBucket, AggregateMeasure, AggregateCompare, DashboardTarget, DashboardBlock, DashboardSummary, AggregateGroupValue, DocTemplateRow, DocRenderRow, QuietHours, DashboardBlockResult, ChecklistRunStep, BookingSummary, CaptureSheetFace, CaptureField, AnonTokenBinding, RecordsConfig, RecordsActor, RecordsDataSource, TableDuplicated, HistoryActor, FieldHistoryEntry, DrillDefinition, DrillSource, TableDuplicateProgress, TableArchiveProgress } from '@ai-matrx/records';
4
+ import { Uuid, RowAction, Field, RowActionStep, RecordScopeContext, EnrichCell, RecordsError, RecordDocument, Table, ReadRow, RecordRead, PermissionLevel, AggregateFilter, RelationDisplay, WriteConflict, RecordsErrorCode, TableDecorations, RecordFilter, RuleExpression, RecordsResult, SavedViewRow, StoreFilter as StoreFilter$1, ImportRun, DeclarableFieldKind, NewerFieldKind, ParityFieldType, NewFieldDeclaration, ChoiceRehome, FieldOptionEdit, StoredRecord, ChoiceNudge, HiddenFieldNotice, ValueEnvelope, ChecklistRequirementKind, ContextPolicy, WorkDueState, FieldSensitivity, StageRuleOnFail, SubscriptionCadence, WorkApprovalState, WorkInboxKind, FieldKind, ArchiveLane, ArchivedRow, WorkInboxView, WorkInboxItem, PortalAccent, FormSummary, PortalCard, PortalPrincipal, PortalPreviewRow, PublicPicture, PortalStyle, MySubscription, DashboardBlockKind, AggregateBucket, AggregateMeasure, AggregateCompare, DashboardTarget, DashboardBlock, DashboardSummary, AggregateGroupValue, DocTemplateRow, DocRenderRow, QuietHours, DashboardBlockResult, ChecklistRunStep, BookingSummary, CaptureSheetFace, CaptureField, AnonTokenBinding, RecordsConfig, RecordsActor, RecordsDataSource, TableDuplicated, HistoryActor, FieldHistoryEntry, DrillDefinition, DrillSource, TableDuplicateProgress, TableArchiveProgress } from '@ai-matrx/records';
5
5
  import { ReversibleAnnouncement } from '@ai-matrx/kit/reversible';
6
6
  import { W as WhatYouMayDo, T as TableActionHost, O as ObjectAction, a as ObjectActionIcon } from './objectActions-XkhxU-DP.js';
7
7
  export { A as ACTION_CHECKING_ACCESS_REASON, b as ACTION_NOT_HERE_REASON, c as ACTION_NO_ACCESS_REASON, d as ACTION_PLATFORM_TABLE_REASON, B as BuiltOnDestination, C as Capability, D as DEFAULT_ACTION_ORIGIN, K as KERNEL_REASON, L as LEVEL_WORD, N as NOT_ANSWERED_YET, e as OBJECT_ACTION_GROUPS, f as ObjectActionDropdownEntry, g as ObjectActionGroup, h as ObjectActionGroupDef, i as ObjectActionSection, S as STANDARD_VERBS, j as STRIP_FEATURE_ROWS, k as StandardVerbId, l as StripAndRows, m as TableActionSubject, n as TableActionsInput, o as dropdownActionIds, p as dropdownActions, q as groupObjectActions, r as levelNeededFor, s as rightsReason, t as tableActions, u as tableLink, v as toDropdownEntries, w as toStripAndRows, x as whatYouMayDo, y as whatYouMayDoWithTable, z as withExtensions } from './objectActions-XkhxU-DP.js';
8
- import { Uuid as Uuid$1, Table as Table$1, Field as Field$1, ReadRow as ReadRow$1, StoreFilter as StoreFilter$1, useRecordsClient } from '@ai-matrx/records/react';
9
- import { TableStyle, GroupAggregateSpec, GroupOrder, ChoiceColorLookup, MatrxTableCardProps, StyleColor, MatrxDataTableDrillConfig, MatrxColumnDef as MatrxColumnDef$1, MatrxDrillDimension, MatrxDrillMeasure, MatrxDrillFilter, MatrxDrillQuestion, MatrxDrillAnswers } from '@ai-matrx/design-system/data-table';
10
- import { FieldFormatConfig } from '@ai-matrx/design-system/field-formats';
8
+ import { Uuid as Uuid$1, Table as Table$1, Field as Field$1, ReadRow as ReadRow$1, StoreFilter, useRecordsClient } from '@ai-matrx/records/react';
11
9
  import { RecordsClient, ParsedImport, NewFieldSpec } from '@ai-matrx/records/core';
12
10
  export { DEFAULT_FIELDS, DeclareResult, NewFieldSpec, NewTableSpec, addFields, declareTable, fieldDeclarationFor, tokenFor } from '@ai-matrx/records/core';
11
+ import { FieldFormatConfig } from '@ai-matrx/design-system/field-formats';
12
+ import { TableStyle, GroupAggregateSpec, GroupOrder, ChoiceColorLookup, MatrxTableCardProps, StyleColor, MatrxDataTableDrillConfig, MatrxColumnDef as MatrxColumnDef$1, MatrxDrillDimension, MatrxDrillMeasure, MatrxDrillFilter, MatrxDrillQuestion, MatrxDrillAnswers } from '@ai-matrx/design-system/data-table';
13
13
  import { GuessedFieldType, TableShape } from './table-shape.js';
14
14
  export { ColumnGuess, FEWEST_KEY_VALUE_PAIRS, FEWEST_LIST_ITEMS, TableShapeKind, TableShapeSplit, cellWords, guessColumn, hasTableShape, parseDelimited, readTableShape, readTableShapes, shapeOfGrid, shapeOfValue, shapeTextOfNode } from './table-shape.js';
15
15
  import { Column, Row, Values } from '@ai-matrx/records/data';
@@ -200,250 +200,6 @@ interface EnrichPanelProps {
200
200
  */
201
201
  declare function EnrichPanel({ tableId, fieldId, className }: EnrichPanelProps): react.JSX.Element;
202
202
 
203
- /**
204
- * HOW A TABLE LOOKS — colors, formats and the frozen column.
205
- *
206
- * THE SPLIT, AND WHY IT IS THIS ONE. A Field declares WHAT it holds: a
207
- * currency, a percent, a date, a person. A VIEW declares HOW that reads and
208
- * what it is worth looking at: two decimal places or none, tint the row when
209
- * Status is Blocked, keep Name in place while the rest scrolls. Airtable draws
210
- * the line in exactly this place, and it has to be here: two people read one
211
- * table two different ways, and neither reading is a fact about the records.
212
- *
213
- * So nothing in this module is a new column on a Field and nothing here needed
214
- * a migration. A presentation lives on the saved-view record (`views.ts`), which
215
- * is an ordinary record of an ordinary Table — which means an agent sets it
216
- * through the same `records` tool it uses for everything else, and it travels
217
- * with the table the way every other record does.
218
- *
219
- * A FIELD STILL GETS ITS MONEY RIGHT WITH NO CONFIGURATION. `formatForField`
220
- * reads the Field's OWN declaration — a `currency` parity type with unit `$`, a
221
- * `percent`, a `datetime` with `config.kind` — and returns the format that
222
- * follows from it. The view's `formats` map only OVERRIDES that. A table nobody
223
- * has ever styled still shows `$1,250.50` and `45%`.
224
- */
225
-
226
- /**
227
- * SECTIONS BY A FIELD — the view's own grouping.
228
- *
229
- * `field` is a Field KEY, exactly like `frozen` and the keys of `formats`,
230
- * because a view is written against the Table's declaration and never against
231
- * whatever id a screen happened to build its columns with.
232
- *
233
- * `aggregates` is keyed by Field key too, and `collapsed` holds the data
234
- * table's own group keys (`s:Blocked`, `n:3`, `empty`), which is what the
235
- * primitive emits and the only thing that survives a value rendering the same
236
- * text as another.
237
- *
238
- * NOTHING HERE IS EVER CALLED `valueOf`, `toString` or `hasOwnProperty`: every
239
- * object in JavaScript already has all three, so an optional field by one of
240
- * those names is NEVER absent and a `config.valueOf ? … : …` check silently
241
- * reads `Object.prototype`. It cost the primitive a whole grouping once.
242
- */
243
- type GridGrouping = {
244
- /** The Field key whose value makes the sections. */
245
- field: string;
246
- /** Per-Field-key subtotal on every section header. */
247
- aggregates?: Record<string, GroupAggregateSpec>;
248
- /** Section order. The primitive's default is `value-asc`; blanks sort last. */
249
- order?: GroupOrder;
250
- /** The sections this view keeps shut, by the primitive's own group key. */
251
- collapsed?: string[];
252
- /** The grouped column drawn as a column too. Absent = it steps aside (the headers name its value). */
253
- showColumn?: boolean;
254
- /**
255
- * SUB-GROUPS (lane S1-PRIME VIEW-KEYS; ui-bench LISTS "sub-grouping"): up to two more levels
256
- * inside each section, by Field key. At most three levels in all — the store refuses a fourth
257
- * (`custom.view_declare`). A layout that draws one level ignores the rest; it never drops them,
258
- * because this list is parsed and written back whole with the rest of the look.
259
- */
260
- then?: GridSubGroup[];
261
- /**
262
- * DRILL (lane DRILL-TABLE-PRIMITIVE): the Dimension pivoted across the top — a Field key, or
263
- * `<key>:<grain>` for a date cut into periods.
264
- */
265
- across?: string;
266
- /** DRILL: the period `field` is cut into when it is a date (`month`); the store keeps `field` a Field key. */
267
- grain?: string;
268
- /** The Measures shown ("what to display"), by the store's own keys (`count`, `sum_quantity`). */
269
- show?: string[];
270
- /** The drill trail, in order: each crumb a Dimension reference and the value it narrowed to. */
271
- trail?: GridDrillStep[];
272
- };
273
- /** One crumb of a saved drill trail. `value: null` is "no value". */
274
- type GridDrillStep = {
275
- dim: string;
276
- value: string | null;
277
- };
278
- /** One sub-group level: a Field key and its section order. */
279
- type GridSubGroup = {
280
- field: string;
281
- order?: GroupOrder;
282
- grain?: string;
283
- };
284
- /** Everything a view says about how its table LOOKS. */
285
- type GridPresentation = {
286
- /** Color-by-a-column, rules and manual highlights. */
287
- style?: TableStyle;
288
- /** Per-column format overrides, by the Field's key. */
289
- formats?: Record<string, FieldFormatConfig>;
290
- /**
291
- * The columns that stay in place while the table scrolls sideways, by Field
292
- * key. Only the LEADING run of the view's column order can actually freeze —
293
- * the data table decides that, and declines rather than pinning a column at a
294
- * guessed offset.
295
- */
296
- frozen?: string[];
297
- /** Collapsible sections by one Field, with subtotals on each header. */
298
- grouping?: GridGrouping;
299
- /**
300
- * The width a person dragged a column to, by Field key. SPARSE on purpose —
301
- * a view saved before widths existed carries none and still parses, and a
302
- * column nobody resized is left to the table's own measurement.
303
- */
304
- widths?: Record<string, number>;
305
- /** The body row height this view remembers, in px. */
306
- rowHeight?: number;
307
- /**
308
- * Field keys hidden from this view — the SAME hidden-column list the grid's
309
- * own column picker holds, now given a place on the view so it survives a
310
- * reload and a layout switch reads the identical set gallery and grid agree
311
- * on, rather than a second "fields shown" list nobody kept in sync.
312
- */
313
- hiddenFields?: string[];
314
- /**
315
- * THE FIELDS A CARD LEAVES OFF (board, list, gallery, calendar, timeline), by Field key — the
316
- * card's own choice, kept apart from `hiddenFields` so a board's "Card fields" never hides the
317
- * grid's columns when the view switches layout (v7 TABLE-EXPERIENCE, walk 2026-10-05). An empty
318
- * list is a choice (every field shown); absent means the card never chose.
319
- */
320
- cardHidden?: string[];
321
- /**
322
- * THE ORDER A PERSON DRAGGED THE COLUMNS INTO, by Field key (merge tranche 6a). Sparse like
323
- * `widths`: a key it does not name keeps its Field's own place after the named ones, and a key
324
- * whose Field is gone is skipped — a column order can never hide or invent a column.
325
- */
326
- columnOrder?: string[];
327
- /**
328
- * The gallery's card size, remembered the same way the grid remembers its
329
- * row height — a per-view look, not a global default.
330
- */
331
- gallerySize?: "small" | "medium" | "large";
332
- /**
333
- * THIS VIEW'S OWN LAYOUT CHOICES, over the organization's `custom/grid_layout` knob (lane
334
- * DEFAULT-GRID-PARITY, TABLE-PARITY D1 D5 D6). Absent means "whatever the organization
335
- * says"; present is the view's word. `freezeFirst: false` is an explicit NO over an
336
- * organization that freezes the first column — an empty `frozen` cannot say that.
337
- */
338
- wrap?: boolean;
339
- /** NOTION'S "WRAP COLUMN" (N5): the columns that wrap their text when the view as a whole does not. */
340
- wrapColumns?: string[];
341
- fit?: "auto" | "fit" | "scroll";
342
- freezeFirst?: boolean;
343
- /**
344
- * THE SUMMARY BAR (TABLE-PARITY F1): Field key → the store measure shown under that column
345
- * (`count`, `sum`, `avg`, `min`, `max`, `median`, `filled`, `empty`, `unique`), worked out
346
- * by `custom.record_aggregate` over the whole table.
347
- */
348
- summaries?: Record<string, string>;
349
- /**
350
- * WHERE THE FOOTER SITS (lane TABLE-PAGE-CHROME, owner 2026-09-25) — the row count and the
351
- * pages: `sticky`, pinned to the bottom of the screen while the rows scroll (the older grid's
352
- * way, and the default when a view says nothing), or `inline`, right after the last row with
353
- * the page scrolling. Read by the Grid and a host's Sheet.
354
- */
355
- footer?: FooterPlacement;
356
- };
357
- /** Where a grid's footer sits. */
358
- type FooterPlacement = "sticky" | "inline";
359
- /** What a view that says nothing gets — the older grid's pinned footer. */
360
- declare const DEFAULT_FOOTER: FooterPlacement;
361
- /** Where THIS view's footer sits, said or defaulted. */
362
- declare function footerOf(p: GridPresentation | null | undefined): FooterPlacement;
363
- declare const EMPTY_PRESENTATION: GridPresentation;
364
- /** A frozen column needs a known width, or the table declines to freeze at all. */
365
- declare const FROZEN_COLUMN_WIDTH = 200;
366
- /**
367
- * WHAT A ROW HEIGHT IS ALLOWED TO BE. Below the floor the text is clipped and
368
- * no editor fits; above the ceiling one record fills the screen. A view asking
369
- * for anything outside it is DROPPED rather than obeyed, because a saved look
370
- * must not be able to make a table unreadable — and the Fields' own heights
371
- * still draw, which is the tolerant half.
372
- */
373
- declare const MIN_ROW_HEIGHT = 24;
374
- declare const MAX_ROW_HEIGHT = 96;
375
- /**
376
- * Read a presentation out of whatever the view record holds — an object, or the
377
- * JSON string a text field stores.
378
- *
379
- * Tolerant in exactly the way `parseTableStyle` is: an unreadable half is
380
- * dropped and the rest still applies, because a table must keep drawing when
381
- * one piece of its styling goes out of date.
382
- */
383
- declare function parseGridPresentation(raw: unknown): GridPresentation;
384
- /** True when nothing here would change how anything looks. */
385
- declare function presentationIsEmpty(p: GridPresentation): boolean;
386
- /** The string a view record stores. Empty string for "this view styles nothing". */
387
- declare function presentationDocument(p: GridPresentation): string;
388
- /**
389
- * The format a Field's OWN declaration implies, before any view says anything.
390
- *
391
- * Returns `undefined` for a Field whose value the record renderer already draws
392
- * better than a formatter could — a relation chip, a person, an attachment, a
393
- * choice — because handing those to a text formatter would REPLACE a working
394
- * control with a string.
395
- */
396
- declare function formatForField(field: Field): FieldFormatConfig | undefined;
397
- declare function currencyCodeFor(unit: string | null | undefined): string;
398
- /**
399
- * The color a value paints with when a view colors BY a column.
400
- *
401
- * NOTHING FAILS SILENTLY, so this never returns "no color" for a value that
402
- * exists. The store keeps a list column's choices as records of another Table,
403
- * and this grid has not read that Table's option colors, so the color is
404
- * derived from the value's own text: the same word always gets the same color,
405
- * different words get different ones, and `true` is green the way every
406
- * checklist reads. When those option colors do land, this is the ONE function
407
- * that changes and every screen follows.
408
- */
409
- declare const colorFromTheValue: ChoiceColorLookup;
410
- /**
411
- * G1's TABLE-LEVEL COLORS (`custom.table_decorations` / `client.tableDecorations`),
412
- * TRANSLATED INTO A `TableStyle` — the same document a saved view's own `presentation.style`
413
- * is, so one resolver (`resolveTableStyle`, below) can treat "the table's colors" and "this
414
- * view's colors" as two layers of the SAME thing instead of two unrelated systems.
415
- *
416
- * THE TRANSLATION IS NECESSARY AND IT IS THE ONLY ONE. G1 addresses a Field by its ID
417
- * (REC-17 — a column renamed keeps its color), because it is the STORE's own door; a
418
- * `TableStyle` addresses a Field by its KEY, because it reads straight off `row.document`,
419
- * which is keyed by Field key. A rule or a color-by whose Field has been deleted (its id no
420
- * longer resolves to a key) is dropped rather than crashing the whole style — a defect in
421
- * one rule costs that rule, never the read.
422
- */
423
- declare function styleFromDecorations(decorations: TableDecorations | null | undefined, fields: readonly Field[]): TableStyle;
424
- /**
425
- * THE ONE PRESENTATION RESOLVER every colored surface in this package reads —
426
- * `Grid`, and (via `Card`) the kanban board, the calendar and the gallery.
427
- *
428
- * THE CLASS THIS CLOSES (lane UI-QUICK-1, TABLE-PARITY review, 2026-09-24). Threading
429
- * `view.presentation.style` into `Card` closed the instance the CALENDAR-GALLERY bench
430
- * found — a VIEW that had its own color-by looked right everywhere — but it left the
431
- * class open: a table whose colors are the ORGANIZATION's decorations (G1's
432
- * `custom.table_decorations` — "color rows by Account Type", "MAXED and NEAR rules" on
433
- * Arman's own Coding Accounts table) and whose views never set a `presentation.style` of
434
- * their own drew NOTHING, on the grid exactly as much as on every other layout, because
435
- * nothing in this package had ever read G1's door at all.
436
- *
437
- * TWO LAYERS, ONE DOCUMENT. The table's decorations are the base coat — what every view
438
- * of this table shows until a view says otherwise. A view's OWN `presentation.style` is
439
- * an override, piece by piece: a view that only ever set manual row highlights still
440
- * inherits the table's color-by and rules for everything it never touched, and a view
441
- * that fully redecorated (its own `colorBy` AND its own `rules`) is not haunted by a
442
- * table rule it meant to replace. Per-piece, never all-or-nothing, because a view is a
443
- * LOOK on top of the table, not a wholesale substitute for it.
444
- */
445
- declare function resolveTableStyle(decorations: TableDecorations | null | undefined, fields: readonly Field[], viewStyle: TableStyle | undefined): TableStyle;
446
-
447
203
  /** One record as the grid shows it: its id, its name (the row label) and its masked document. */
448
204
  interface GridContextRecord {
449
205
  id: Uuid;
@@ -551,45 +307,6 @@ declare const NO_RIGHTS: TableRights;
551
307
  * ladder cannot produce (write without read, share without edit).
552
308
  */
553
309
  declare function tableRightsAt(level: PermissionLevel | null): TableRights;
554
- /**
555
- * A LAYOUT THE HOST DRAWS, beside the package's own four (Grid, Kanban, Calendar,
556
- * Gallery) in the SAME layout row of every table page. The host owns what it
557
- * draws; the package owns where it sits, its button, and its address (`?view=<id>`).
558
- *
559
- * WHY A PORT: an app with a richer surface for one kind of looking at a table —
560
- * AI Matrx's spreadsheet-feel Sheet, the older /data grid ported onto the record
561
- * store — must be a layout of the one table page, never a second page for the
562
- * same table. It is page-level, not saved onto the view record: the store's
563
- * layout words are the four the package draws.
564
- */
565
- interface HostLayout {
566
- /** The address word (`?view=sheet`). Lowercase; must not be one of the package's own. */
567
- id: string;
568
- /** The button's words. */
569
- label: string;
570
- /** Draw it for this table, with the question the address asked when there is one. */
571
- render: (args: {
572
- tableId: Uuid;
573
- filter?: StoreFilter | undefined;
574
- /**
575
- * Opens the page's own export (CSV, XLSX, copy and transform) — the one export a table has,
576
- * so a host layout's "Export this table…" never needs a second one or a hunt for a button.
577
- * Absent on a page that draws no export.
578
- */
579
- openExport?: (() => void) | undefined;
580
- /**
581
- * Where the view's footer sits (lane TABLE-PAGE-CHROME): `sticky` — fill the height given and
582
- * keep the counts and pages on the bottom edge; `inline` — after the last row.
583
- */
584
- footer?: FooterPlacement | undefined;
585
- /**
586
- * THE PAGE'S ONE TOOLBAR ROW (lane TABLE-PAGE-CHROME). A host layout with controls of its own
587
- * (search, columns, sort) draws them INTO this element — never a second bar under the page's.
588
- * `null`: the row is mounting (draw nothing yet). Absent: no page row, draw in place.
589
- */
590
- toolbarSlot?: HTMLElement | null | undefined;
591
- }) => ReactNode;
592
- }
593
310
  /**
594
311
  * The authored-text slots `renderText` is asked to draw. `cell`: a long-text cell of the merged
595
312
  * grid and the whole-text dialog's preview — the host may return block content there (the grid
@@ -636,8 +353,6 @@ interface RecordsUiHost {
636
353
  * merge step 9, when `merged` is the only grid.
637
354
  */
638
355
  grid?: "classic" | "merged";
639
- /** Layouts the host draws beside the package's own. See `HostLayout`. */
640
- layouts?: HostLayout[];
641
356
  /**
642
357
  * OPTIONAL. CLEAN A PASTED PIECE OF HTML INTO PLAIN TEXT (merge tranche 6m, inventory A7).
643
358
  *
@@ -1651,133 +1366,377 @@ interface Options {
1651
1366
  * the merged grid's undo pushes one step per accepted cell. Unbound, nothing is told.
1652
1367
  */
1653
1368
  /**
1654
- * The grid's one versions-at-load source (`useRecordVersions`), shared with its paste, fill, bulk and
1655
- * undo. Unbound, the session keeps its own over `rows`.
1369
+ * The grid's one versions-at-load source (`useRecordVersions`), shared with its paste, fill, bulk and
1370
+ * undo. Unbound, the session keeps its own over `rows`.
1371
+ */
1372
+ versions?: RecordVersions | undefined;
1373
+ /** One cell the store took: its value before and after, and the record version that write made. */
1374
+ onWritten?: ((write: {
1375
+ rowId: Uuid;
1376
+ key: string;
1377
+ before: unknown;
1378
+ after: unknown;
1379
+ version?: number;
1380
+ }) => void) | undefined;
1381
+ /**
1382
+ * THE GRID GETS ITS KEYS BACK (merged-grid review 2026-09-26, A1). Bound, an editor that closes
1383
+ * by a key or a pick says so — Enter `down`, Tab `right` (Shift-Tab `left`), Escape and a pick
1384
+ * `stay` — and Tab no longer opens the next cell's editor: it commits and the CURSOR moves right,
1385
+ * as in Sheets and Airtable. A blur (a click elsewhere) says nothing: the click has the focus.
1386
+ * Unbound (the classic grid), Tab chains editors as before.
1387
+ */
1388
+ onEnded?: ((exit: "down" | "right" | "left" | "stay", from: CellAddress, how: "keyboard" | "pointer") => void) | undefined;
1389
+ }
1390
+ /** How an open cell was closed: a key (Enter, Tab, Escape), the picker's own close, or a blur. */
1391
+ type EditVia = "key" | "pick" | "blur";
1392
+ declare function useGridEditing({ tableId, fields, rows, reload, reloadAfterWrite, canWrite, mayWriteRow, onWritten, onEnded, versions: shared }: Options): GridEditing;
1393
+ /**
1394
+ * ONE CELL. Read, until somebody asks to change it; then the Field's own
1395
+ * editor, in place, with the keys a person expects from a grid.
1396
+ *
1397
+ * `data-matrx-cell-control` is the data table's own opt-out from whole-row
1398
+ * click, so opening a cell never also opens the record panel behind it.
1399
+ */
1400
+ declare function GridCell({ field, row, editing, canWrite, whyNot, format, onAskWhoChanged, clickOpens, }: {
1401
+ field: Field;
1402
+ row: ReadRow;
1403
+ /**
1404
+ * ONE CLICK OPENS THE EDITOR (a record page, Notion's property list: lane CELL-EDITORS, night walk
1405
+ * 2026-10-06). A grid selects on a click and opens on the second; a record page has no cursor, so a
1406
+ * click on any value — a chip included, which then opens its picker rather than its record — edits it.
1407
+ */
1408
+ clickOpens?: boolean | undefined;
1409
+ /**
1410
+ * The edit session, or NULL on a cell nobody may edit.
1411
+ *
1412
+ * 🚨 Null is not "do not render me". "Who changed this?" is a READING
1413
+ * question — the person who may not edit a cell is exactly the person who
1414
+ * wants to know who did — and the cell used to disappear entirely the moment
1415
+ * editing was off, taking the control with it while this file's own comments
1416
+ * claimed it was offered at viewer. A null session means no editor, nothing
1417
+ * else.
1418
+ */
1419
+ editing: GridEditing | null;
1420
+ /** Whether this person may write THIS row. Asked before the cell is drawn. */
1421
+ canWrite: boolean;
1422
+ /**
1423
+ * Why not, when not — one sentence naming the level it would take and who can
1424
+ * give it. A cell that is simply not a control, with nothing to say about it,
1425
+ * is the silent half of the same defect this file closes.
1426
+ */
1427
+ whyNot?: string | undefined;
1428
+ /** The column's declared format, so the read view reads like its header. */
1429
+ format?: FieldFormatConfig | undefined;
1430
+ /**
1431
+ * "WHO CHANGED THIS?" — the question a person asks of the CELL they are
1432
+ * looking at. Bound by the host; absent, no control is drawn at all, because
1433
+ * a control that opens nothing is the thing this package exists to prevent.
1434
+ */
1435
+ onAskWhoChanged?: ((fieldKey: string, recordId: Uuid) => void) | undefined;
1436
+ }): react.JSX.Element;
1437
+
1438
+ /**
1439
+ * Kept for callers outside this package that already ask the question. The
1440
+ * answer is `plainWords.ts`'s, so there is one shape list and not two.
1441
+ */
1442
+ declare function hintIsMachineIdentity(hint: string): boolean;
1443
+ /** The hint a PERSON should read, or null when it is written for an engineer. */
1444
+ declare function hintForAPerson(hint: string | null | undefined): string | null;
1445
+ declare function RefusalNotice({ error, className, actions, onKeepEditing, onDiscard, }: {
1446
+ error: RecordsError;
1447
+ className?: string | undefined;
1448
+ actions?: ReactNode | undefined;
1449
+ /**
1450
+ * KEEP EDITING / DISCARD (lane REFUSAL-SWEEP, 2026-09-23). Pass these ONLY where
1451
+ * an editor is open holding what the person typed and the refusal is about that
1452
+ * text: the notice then owns the two doors out, so the notice — never a clock —
1453
+ * decides how long the typed text is kept. Keep editing hands the person back
1454
+ * to their text; Discard throws it away and puts back what was there. A surface
1455
+ * with nothing typed to keep passes neither and gets no buttons.
1456
+ */
1457
+ onKeepEditing?: (() => void) | undefined;
1458
+ onDiscard?: (() => void) | undefined;
1459
+ }): react.JSX.Element;
1460
+ /** A small inline one, for a cell or a field where a block would break the layout. */
1461
+ declare function RefusalLine({ error, className }: {
1462
+ error: RecordsError;
1463
+ className?: string | undefined;
1464
+ }): react.JSX.Element;
1465
+
1466
+ /**
1467
+ * A refusal in this package's own words.
1468
+ *
1469
+ * @param code what KIND of refusal — picks the notice's title and its fallback remedy.
1470
+ * @param sentence what happened, for a person.
1471
+ * @param remedy what to do now, when this call site knows better than the code's default.
1472
+ * @param diagnostic an engineer's note (a thrown message, a status) — rendered out of sight.
1473
+ */
1474
+ declare function refusal(code: RecordsErrorCode, sentence: string, remedy?: string | null, diagnostic?: string | null): RecordsError;
1475
+ /**
1476
+ * A refusal made from something THROWN in the browser. The thrown text is an
1477
+ * engineer's (a parser's "Unexpected token } in JSON at position 14", a
1478
+ * library's stack) and goes out of sight; the person reads `sentence`.
1479
+ */
1480
+ declare function refusalFromThrown(thrown: unknown, sentence: string, remedy?: string | null, code?: RecordsErrorCode): RecordsError;
1481
+ /**
1482
+ * The store's refusal when there is one, otherwise this package's own sentence —
1483
+ * for the call sites whose answer MAY carry an error (`res.error?.message ?? "…"`
1484
+ * was the old shape, and it printed the store's message raw).
1485
+ */
1486
+ declare function refusalOr(error: RecordsError | null | undefined, code: RecordsErrorCode, sentence: string): RecordsError;
1487
+ /**
1488
+ * Whatever a host callback threw, as a refusal: the store's own `RecordsError`
1489
+ * when that is what arrived (it is drawn with its own words and remedy), and
1490
+ * otherwise `refusalFromThrown` — the thrown text out of sight, `sentence` in view.
1491
+ */
1492
+ declare function asRefusal(thrown: unknown, sentence: string, remedy?: string | null, code?: RecordsErrorCode): RecordsError;
1493
+
1494
+ /**
1495
+ * HOW A TABLE LOOKS — colors, formats and the frozen column.
1496
+ *
1497
+ * THE SPLIT, AND WHY IT IS THIS ONE. A Field declares WHAT it holds: a
1498
+ * currency, a percent, a date, a person. A VIEW declares HOW that reads and
1499
+ * what it is worth looking at: two decimal places or none, tint the row when
1500
+ * Status is Blocked, keep Name in place while the rest scrolls. Airtable draws
1501
+ * the line in exactly this place, and it has to be here: two people read one
1502
+ * table two different ways, and neither reading is a fact about the records.
1503
+ *
1504
+ * So nothing in this module is a new column on a Field and nothing here needed
1505
+ * a migration. A presentation lives on the saved-view record (`views.ts`), which
1506
+ * is an ordinary record of an ordinary Table — which means an agent sets it
1507
+ * through the same `records` tool it uses for everything else, and it travels
1508
+ * with the table the way every other record does.
1509
+ *
1510
+ * A FIELD STILL GETS ITS MONEY RIGHT WITH NO CONFIGURATION. `formatForField`
1511
+ * reads the Field's OWN declaration — a `currency` parity type with unit `$`, a
1512
+ * `percent`, a `datetime` with `config.kind` — and returns the format that
1513
+ * follows from it. The view's `formats` map only OVERRIDES that. A table nobody
1514
+ * has ever styled still shows `$1,250.50` and `45%`.
1515
+ */
1516
+
1517
+ /**
1518
+ * SECTIONS BY A FIELD — the view's own grouping.
1519
+ *
1520
+ * `field` is a Field KEY, exactly like `frozen` and the keys of `formats`,
1521
+ * because a view is written against the Table's declaration and never against
1522
+ * whatever id a screen happened to build its columns with.
1523
+ *
1524
+ * `aggregates` is keyed by Field key too, and `collapsed` holds the data
1525
+ * table's own group keys (`s:Blocked`, `n:3`, `empty`), which is what the
1526
+ * primitive emits and the only thing that survives a value rendering the same
1527
+ * text as another.
1528
+ *
1529
+ * NOTHING HERE IS EVER CALLED `valueOf`, `toString` or `hasOwnProperty`: every
1530
+ * object in JavaScript already has all three, so an optional field by one of
1531
+ * those names is NEVER absent and a `config.valueOf ? … : …` check silently
1532
+ * reads `Object.prototype`. It cost the primitive a whole grouping once.
1533
+ */
1534
+ type GridGrouping = {
1535
+ /** The Field key whose value makes the sections. */
1536
+ field: string;
1537
+ /** Per-Field-key subtotal on every section header. */
1538
+ aggregates?: Record<string, GroupAggregateSpec>;
1539
+ /** Section order. The primitive's default is `value-asc`; blanks sort last. */
1540
+ order?: GroupOrder;
1541
+ /** The sections this view keeps shut, by the primitive's own group key. */
1542
+ collapsed?: string[];
1543
+ /** The grouped column drawn as a column too. Absent = it steps aside (the headers name its value). */
1544
+ showColumn?: boolean;
1545
+ /**
1546
+ * SUB-GROUPS (lane S1-PRIME VIEW-KEYS; ui-bench LISTS "sub-grouping"): up to two more levels
1547
+ * inside each section, by Field key. At most three levels in all — the store refuses a fourth
1548
+ * (`custom.view_declare`). A layout that draws one level ignores the rest; it never drops them,
1549
+ * because this list is parsed and written back whole with the rest of the look.
1550
+ */
1551
+ then?: GridSubGroup[];
1552
+ /**
1553
+ * DRILL (lane DRILL-TABLE-PRIMITIVE): the Dimension pivoted across the top — a Field key, or
1554
+ * `<key>:<grain>` for a date cut into periods.
1555
+ */
1556
+ across?: string;
1557
+ /** DRILL: the period `field` is cut into when it is a date (`month`); the store keeps `field` a Field key. */
1558
+ grain?: string;
1559
+ /** The Measures shown ("what to display"), by the store's own keys (`count`, `sum_quantity`). */
1560
+ show?: string[];
1561
+ /** The drill trail, in order: each crumb a Dimension reference and the value it narrowed to. */
1562
+ trail?: GridDrillStep[];
1563
+ };
1564
+ /** One crumb of a saved drill trail. `value: null` is "no value". */
1565
+ type GridDrillStep = {
1566
+ dim: string;
1567
+ value: string | null;
1568
+ };
1569
+ /** One sub-group level: a Field key and its section order. */
1570
+ type GridSubGroup = {
1571
+ field: string;
1572
+ order?: GroupOrder;
1573
+ grain?: string;
1574
+ };
1575
+ /** Everything a view says about how its table LOOKS. */
1576
+ type GridPresentation = {
1577
+ /** Color-by-a-column, rules and manual highlights. */
1578
+ style?: TableStyle;
1579
+ /** Per-column format overrides, by the Field's key. */
1580
+ formats?: Record<string, FieldFormatConfig>;
1581
+ /**
1582
+ * The columns that stay in place while the table scrolls sideways, by Field
1583
+ * key. Only the LEADING run of the view's column order can actually freeze —
1584
+ * the data table decides that, and declines rather than pinning a column at a
1585
+ * guessed offset.
1586
+ */
1587
+ frozen?: string[];
1588
+ /** Collapsible sections by one Field, with subtotals on each header. */
1589
+ grouping?: GridGrouping;
1590
+ /**
1591
+ * The width a person dragged a column to, by Field key. SPARSE on purpose —
1592
+ * a view saved before widths existed carries none and still parses, and a
1593
+ * column nobody resized is left to the table's own measurement.
1594
+ */
1595
+ widths?: Record<string, number>;
1596
+ /** The body row height this view remembers, in px. */
1597
+ rowHeight?: number;
1598
+ /**
1599
+ * Field keys hidden from this view — the SAME hidden-column list the grid's
1600
+ * own column picker holds, now given a place on the view so it survives a
1601
+ * reload and a layout switch reads the identical set gallery and grid agree
1602
+ * on, rather than a second "fields shown" list nobody kept in sync.
1603
+ */
1604
+ hiddenFields?: string[];
1605
+ /**
1606
+ * THE FIELDS A CARD LEAVES OFF (board, list, gallery, calendar, timeline), by Field key — the
1607
+ * card's own choice, kept apart from `hiddenFields` so a board's "Card fields" never hides the
1608
+ * grid's columns when the view switches layout (v7 TABLE-EXPERIENCE, walk 2026-10-05). An empty
1609
+ * list is a choice (every field shown); absent means the card never chose.
1656
1610
  */
1657
- versions?: RecordVersions | undefined;
1658
- /** One cell the store took: its value before and after, and the record version that write made. */
1659
- onWritten?: ((write: {
1660
- rowId: Uuid;
1661
- key: string;
1662
- before: unknown;
1663
- after: unknown;
1664
- version?: number;
1665
- }) => void) | undefined;
1611
+ cardHidden?: string[];
1666
1612
  /**
1667
- * THE GRID GETS ITS KEYS BACK (merged-grid review 2026-09-26, A1). Bound, an editor that closes
1668
- * by a key or a pick says so — Enter `down`, Tab `right` (Shift-Tab `left`), Escape and a pick
1669
- * `stay` — and Tab no longer opens the next cell's editor: it commits and the CURSOR moves right,
1670
- * as in Sheets and Airtable. A blur (a click elsewhere) says nothing: the click has the focus.
1671
- * Unbound (the classic grid), Tab chains editors as before.
1613
+ * THE ORDER A PERSON DRAGGED THE COLUMNS INTO, by Field key (merge tranche 6a). Sparse like
1614
+ * `widths`: a key it does not name keeps its Field's own place after the named ones, and a key
1615
+ * whose Field is gone is skipped — a column order can never hide or invent a column.
1672
1616
  */
1673
- onEnded?: ((exit: "down" | "right" | "left" | "stay", from: CellAddress, how: "keyboard" | "pointer") => void) | undefined;
1674
- }
1675
- /** How an open cell was closed: a key (Enter, Tab, Escape), the picker's own close, or a blur. */
1676
- type EditVia = "key" | "pick" | "blur";
1677
- declare function useGridEditing({ tableId, fields, rows, reload, reloadAfterWrite, canWrite, mayWriteRow, onWritten, onEnded, versions: shared }: Options): GridEditing;
1678
- /**
1679
- * ONE CELL. Read, until somebody asks to change it; then the Field's own
1680
- * editor, in place, with the keys a person expects from a grid.
1681
- *
1682
- * `data-matrx-cell-control` is the data table's own opt-out from whole-row
1683
- * click, so opening a cell never also opens the record panel behind it.
1684
- */
1685
- declare function GridCell({ field, row, editing, canWrite, whyNot, format, onAskWhoChanged, clickOpens, }: {
1686
- field: Field;
1687
- row: ReadRow;
1617
+ columnOrder?: string[];
1688
1618
  /**
1689
- * ONE CLICK OPENS THE EDITOR (a record page, Notion's property list: lane CELL-EDITORS, night walk
1690
- * 2026-10-06). A grid selects on a click and opens on the second; a record page has no cursor, so a
1691
- * click on any value — a chip included, which then opens its picker rather than its record — edits it.
1619
+ * The gallery's card size, remembered the same way the grid remembers its
1620
+ * row height — a per-view look, not a global default.
1692
1621
  */
1693
- clickOpens?: boolean | undefined;
1622
+ gallerySize?: "small" | "medium" | "large";
1694
1623
  /**
1695
- * The edit session, or NULL on a cell nobody may edit.
1696
- *
1697
- * 🚨 Null is not "do not render me". "Who changed this?" is a READING
1698
- * question — the person who may not edit a cell is exactly the person who
1699
- * wants to know who did — and the cell used to disappear entirely the moment
1700
- * editing was off, taking the control with it while this file's own comments
1701
- * claimed it was offered at viewer. A null session means no editor, nothing
1702
- * else.
1624
+ * THIS VIEW'S OWN LAYOUT CHOICES, over the organization's `custom/grid_layout` knob (lane
1625
+ * DEFAULT-GRID-PARITY, TABLE-PARITY D1 D5 D6). Absent means "whatever the organization
1626
+ * says"; present is the view's word. `freezeFirst: false` is an explicit NO over an
1627
+ * organization that freezes the first column — an empty `frozen` cannot say that.
1703
1628
  */
1704
- editing: GridEditing | null;
1705
- /** Whether this person may write THIS row. Asked before the cell is drawn. */
1706
- canWrite: boolean;
1629
+ wrap?: boolean;
1630
+ /** NOTION'S "WRAP COLUMN" (N5): the columns that wrap their text when the view as a whole does not. */
1631
+ wrapColumns?: string[];
1632
+ fit?: "auto" | "fit" | "scroll";
1633
+ freezeFirst?: boolean;
1707
1634
  /**
1708
- * Why not, when not — one sentence naming the level it would take and who can
1709
- * give it. A cell that is simply not a control, with nothing to say about it,
1710
- * is the silent half of the same defect this file closes.
1635
+ * THE SUMMARY BAR (TABLE-PARITY F1): Field key → the store measure shown under that column
1636
+ * (`count`, `sum`, `avg`, `min`, `max`, `median`, `filled`, `empty`, `unique`), worked out
1637
+ * by `custom.record_aggregate` over the whole table.
1711
1638
  */
1712
- whyNot?: string | undefined;
1713
- /** The column's declared format, so the read view reads like its header. */
1714
- format?: FieldFormatConfig | undefined;
1639
+ summaries?: Record<string, string>;
1715
1640
  /**
1716
- * "WHO CHANGED THIS?" — the question a person asks of the CELL they are
1717
- * looking at. Bound by the host; absent, no control is drawn at all, because
1718
- * a control that opens nothing is the thing this package exists to prevent.
1641
+ * WHERE THE FOOTER SITS (lane TABLE-PAGE-CHROME, owner 2026-09-25) — the row count and the
1642
+ * pages: `sticky`, pinned to the bottom of the screen while the rows scroll (the older grid's
1643
+ * way, and the default when a view says nothing), or `inline`, right after the last row with
1644
+ * the page scrolling. Read by the Grid and a host's Sheet.
1719
1645
  */
1720
- onAskWhoChanged?: ((fieldKey: string, recordId: Uuid) => void) | undefined;
1721
- }): react.JSX.Element;
1722
-
1646
+ footer?: FooterPlacement;
1647
+ };
1648
+ /** Where a grid's footer sits. */
1649
+ type FooterPlacement = "sticky" | "inline";
1650
+ /** What a view that says nothing gets — the older grid's pinned footer. */
1651
+ declare const DEFAULT_FOOTER: FooterPlacement;
1652
+ /** Where THIS view's footer sits, said or defaulted. */
1653
+ declare function footerOf(p: GridPresentation | null | undefined): FooterPlacement;
1654
+ declare const EMPTY_PRESENTATION: GridPresentation;
1655
+ /** A frozen column needs a known width, or the table declines to freeze at all. */
1656
+ declare const FROZEN_COLUMN_WIDTH = 200;
1723
1657
  /**
1724
- * Kept for callers outside this package that already ask the question. The
1725
- * answer is `plainWords.ts`'s, so there is one shape list and not two.
1658
+ * WHAT A ROW HEIGHT IS ALLOWED TO BE. Below the floor the text is clipped and
1659
+ * no editor fits; above the ceiling one record fills the screen. A view asking
1660
+ * for anything outside it is DROPPED rather than obeyed, because a saved look
1661
+ * must not be able to make a table unreadable — and the Fields' own heights
1662
+ * still draw, which is the tolerant half.
1726
1663
  */
1727
- declare function hintIsMachineIdentity(hint: string): boolean;
1728
- /** The hint a PERSON should read, or null when it is written for an engineer. */
1729
- declare function hintForAPerson(hint: string | null | undefined): string | null;
1730
- declare function RefusalNotice({ error, className, actions, onKeepEditing, onDiscard, }: {
1731
- error: RecordsError;
1732
- className?: string | undefined;
1733
- actions?: ReactNode | undefined;
1734
- /**
1735
- * KEEP EDITING / DISCARD (lane REFUSAL-SWEEP, 2026-09-23). Pass these ONLY where
1736
- * an editor is open holding what the person typed and the refusal is about that
1737
- * text: the notice then owns the two doors out, so the notice — never a clock —
1738
- * decides how long the typed text is kept. Keep editing hands the person back
1739
- * to their text; Discard throws it away and puts back what was there. A surface
1740
- * with nothing typed to keep passes neither and gets no buttons.
1741
- */
1742
- onKeepEditing?: (() => void) | undefined;
1743
- onDiscard?: (() => void) | undefined;
1744
- }): react.JSX.Element;
1745
- /** A small inline one, for a cell or a field where a block would break the layout. */
1746
- declare function RefusalLine({ error, className }: {
1747
- error: RecordsError;
1748
- className?: string | undefined;
1749
- }): react.JSX.Element;
1750
-
1664
+ declare const MIN_ROW_HEIGHT = 24;
1665
+ declare const MAX_ROW_HEIGHT = 96;
1751
1666
  /**
1752
- * A refusal in this package's own words.
1667
+ * Read a presentation out of whatever the view record holds — an object, or the
1668
+ * JSON string a text field stores.
1753
1669
  *
1754
- * @param code what KIND of refusal — picks the notice's title and its fallback remedy.
1755
- * @param sentence what happened, for a person.
1756
- * @param remedy what to do now, when this call site knows better than the code's default.
1757
- * @param diagnostic an engineer's note (a thrown message, a status) — rendered out of sight.
1670
+ * Tolerant in exactly the way `parseTableStyle` is: an unreadable half is
1671
+ * dropped and the rest still applies, because a table must keep drawing when
1672
+ * one piece of its styling goes out of date.
1758
1673
  */
1759
- declare function refusal(code: RecordsErrorCode, sentence: string, remedy?: string | null, diagnostic?: string | null): RecordsError;
1674
+ declare function parseGridPresentation(raw: unknown): GridPresentation;
1675
+ /** True when nothing here would change how anything looks. */
1676
+ declare function presentationIsEmpty(p: GridPresentation): boolean;
1677
+ /** The string a view record stores. Empty string for "this view styles nothing". */
1678
+ declare function presentationDocument(p: GridPresentation): string;
1760
1679
  /**
1761
- * A refusal made from something THROWN in the browser. The thrown text is an
1762
- * engineer's (a parser's "Unexpected token } in JSON at position 14", a
1763
- * library's stack) and goes out of sight; the person reads `sentence`.
1680
+ * The format a Field's OWN declaration implies, before any view says anything.
1681
+ *
1682
+ * Returns `undefined` for a Field whose value the record renderer already draws
1683
+ * better than a formatter could — a relation chip, a person, an attachment, a
1684
+ * choice — because handing those to a text formatter would REPLACE a working
1685
+ * control with a string.
1764
1686
  */
1765
- declare function refusalFromThrown(thrown: unknown, sentence: string, remedy?: string | null, code?: RecordsErrorCode): RecordsError;
1687
+ declare function formatForField(field: Field): FieldFormatConfig | undefined;
1688
+ declare function currencyCodeFor(unit: string | null | undefined): string;
1766
1689
  /**
1767
- * The store's refusal when there is one, otherwise this package's own sentence —
1768
- * for the call sites whose answer MAY carry an error (`res.error?.message ?? "…"`
1769
- * was the old shape, and it printed the store's message raw).
1690
+ * The color a value paints with when a view colors BY a column.
1691
+ *
1692
+ * NOTHING FAILS SILENTLY, so this never returns "no color" for a value that
1693
+ * exists. The store keeps a list column's choices as records of another Table,
1694
+ * and this grid has not read that Table's option colors, so the color is
1695
+ * derived from the value's own text: the same word always gets the same color,
1696
+ * different words get different ones, and `true` is green the way every
1697
+ * checklist reads. When those option colors do land, this is the ONE function
1698
+ * that changes and every screen follows.
1770
1699
  */
1771
- declare function refusalOr(error: RecordsError | null | undefined, code: RecordsErrorCode, sentence: string): RecordsError;
1700
+ declare const colorFromTheValue: ChoiceColorLookup;
1772
1701
  /**
1773
- * Whatever a host callback threw, as a refusal: the store's own `RecordsError`
1774
- * when that is what arrived (it is drawn with its own words and remedy), and
1775
- * otherwise `refusalFromThrown` — the thrown text out of sight, `sentence` in view.
1702
+ * G1's TABLE-LEVEL COLORS (`custom.table_decorations` / `client.tableDecorations`),
1703
+ * TRANSLATED INTO A `TableStyle` — the same document a saved view's own `presentation.style`
1704
+ * is, so one resolver (`resolveTableStyle`, below) can treat "the table's colors" and "this
1705
+ * view's colors" as two layers of the SAME thing instead of two unrelated systems.
1706
+ *
1707
+ * THE TRANSLATION IS NECESSARY AND IT IS THE ONLY ONE. G1 addresses a Field by its ID
1708
+ * (REC-17 — a column renamed keeps its color), because it is the STORE's own door; a
1709
+ * `TableStyle` addresses a Field by its KEY, because it reads straight off `row.document`,
1710
+ * which is keyed by Field key. A rule or a color-by whose Field has been deleted (its id no
1711
+ * longer resolves to a key) is dropped rather than crashing the whole style — a defect in
1712
+ * one rule costs that rule, never the read.
1776
1713
  */
1777
- declare function asRefusal(thrown: unknown, sentence: string, remedy?: string | null, code?: RecordsErrorCode): RecordsError;
1714
+ declare function styleFromDecorations(decorations: TableDecorations | null | undefined, fields: readonly Field[]): TableStyle;
1715
+ /**
1716
+ * THE ONE PRESENTATION RESOLVER every colored surface in this package reads —
1717
+ * `Grid`, and (via `Card`) the kanban board, the calendar and the gallery.
1718
+ *
1719
+ * THE CLASS THIS CLOSES (lane UI-QUICK-1, TABLE-PARITY review, 2026-09-24). Threading
1720
+ * `view.presentation.style` into `Card` closed the instance the CALENDAR-GALLERY bench
1721
+ * found — a VIEW that had its own color-by looked right everywhere — but it left the
1722
+ * class open: a table whose colors are the ORGANIZATION's decorations (G1's
1723
+ * `custom.table_decorations` — "color rows by Account Type", "MAXED and NEAR rules" on
1724
+ * Arman's own Coding Accounts table) and whose views never set a `presentation.style` of
1725
+ * their own drew NOTHING, on the grid exactly as much as on every other layout, because
1726
+ * nothing in this package had ever read G1's door at all.
1727
+ *
1728
+ * TWO LAYERS, ONE DOCUMENT. The table's decorations are the base coat — what every view
1729
+ * of this table shows until a view says otherwise. A view's OWN `presentation.style` is
1730
+ * an override, piece by piece: a view that only ever set manual row highlights still
1731
+ * inherits the table's color-by and rules for everything it never touched, and a view
1732
+ * that fully redecorated (its own `colorBy` AND its own `rules`) is not haunted by a
1733
+ * table rule it meant to replace. Per-piece, never all-or-nothing, because a view is a
1734
+ * LOOK on top of the table, not a wholesale substitute for it.
1735
+ */
1736
+ declare function resolveTableStyle(decorations: TableDecorations | null | undefined, fields: readonly Field[], viewStyle: TableStyle | undefined): TableStyle;
1778
1737
 
1779
- /** Every surface a saved view is drawn by. `sheet` is the spreadsheet surface (G-lanes). */
1780
- type ViewKeyLayout = "grid" | "kanban" | "calendar" | "gallery" | "sheet" | "timeline" | "list";
1738
+ /** Every surface a saved view is drawn by. */
1739
+ type ViewKeyLayout = "grid" | "kanban" | "calendar" | "gallery" | "timeline" | "list";
1781
1740
  /**
1782
1741
  * 🚩 THE ONE SWITCH FOR THE TIMELINE'S STORE KEYS (lane VIEWS-AND-FIELDS, sublane TL).
1783
1742
  *
@@ -1811,7 +1770,7 @@ interface ViewKeyDeclaration {
1811
1770
  declare const VIEW_KEYS: readonly ViewKeyDeclaration[];
1812
1771
  /**
1813
1772
  * THE LAYOUTS THE STORE KEEPS ON A VIEW. `custom.view_keys()` judges a view's `layout` against its
1814
- * own list (grid, kanban, calendar, gallery, sheet) and refuses any other word by name. A layout this
1773
+ * own list (grid, kanban, calendar, gallery) and refuses any other word by name. A layout this
1815
1774
  * package draws before the store keeps it — the timeline, 2026-10-02 — is never sent as a view's or a
1816
1775
  * look's layout (`viewSettingsPatch`, `viewDocument`): it is drawn for this visit and says so. When the
1817
1776
  * store's registry admits it, add it here and nothing else changes.
@@ -1894,7 +1853,7 @@ declare const LAYOUT_LABEL: Record<ViewLayout, string>;
1894
1853
  * · gallery a FILE column for the card's picture. NOT blocking: the cards draw without one,
1895
1854
  * so the offer sits above them instead of in place of them.
1896
1855
  * · timeline a DATE column each bar starts on (the calendar's `dateField`). Blocking.
1897
- * `PAGE_VIEWS`' two extra values (dashboards, archived) and the host's layouts (the Sheet) read
1856
+ * `PAGE_VIEWS`' two extra values (dashboards, archived) read
1898
1857
  * nothing a table can lack. This package ships no map layout; the day it does,
1899
1858
  * `Record<ViewLayout, …>` below refuses to compile until the new layout names what it needs.
1900
1859
  */
@@ -2021,56 +1980,9 @@ interface SavedView extends SavedViewSpec {
2021
1980
  id: Uuid;
2022
1981
  /** Where the view came from when it was moved in (the mover, the S0 repair), else null. */
2023
1982
  movedFrom: Record<string, unknown> | null;
2024
- /**
2025
- * THE WAY THIS TABLE IS MEANT TO BE LOOKED AT, when somebody decided one — a layout id the
2026
- * host draws (`sheet`), read off the stored kind before `layout` folds it to the four the
2027
- * package draws. Null when nobody designated one. See `designatedLayoutOf`.
2028
- */
2029
- designatedLayout?: string | null;
2030
1983
  }
2031
- /**
2032
- * WHICH LAYOUT A VIEW WAS DESIGNATED, OR NULL (lane DATA-V2-FACE, owner 2026-09-24).
2033
- *
2034
- * "For something like my data tables, which are predetermined with a default view of 'Sheet'
2035
- * I want to see … it just shows them the way it should in the default view. That's how you take
2036
- * custom systems and fake like they're hard-coded builtin systems."
2037
- *
2038
- * A designation is a DELIBERATE write, never a click: a view whose stored kind is a layout the
2039
- * HOST draws (`sheet` — a layout the store's view-keys registry declares, and one the layout
2040
- * buttons never write onto a view). That is the ONE way a table is designated (lane
2041
- * VIEW-KEYS-SHEET): the mover and the repair write `layout: "sheet"` on a copied older table's
2042
- * default view; `moved_from` says only where a view came from and designates nothing. A package
2043
- * kind (`grid`, `kanban`, …) is not a designation: picking Kanban writes `layout: "kanban"` onto
2044
- * the view, and a click must never take the layout chooser away.
2045
- */
2046
- declare function designatedLayoutOf(definition: Record<string, unknown> | null | undefined): string | null;
2047
- /**
2048
- * HOW THE TABLE OPENS, decided once from its default view and the layouts the host draws.
2049
- *
2050
- * · `designated` — the default view names a host layout this host registered: the page opens
2051
- * IN it and offers no other layout by default (the others sit in the page's one menu);
2052
- * · `chooser` — nothing designated (or the host does not draw what was designated): the
2053
- * page opens on the view's own layout and shows the layout chooser.
2054
- *
2055
- * Only the DEFAULT view designates: a person who opens another saved view is choosing, and the
2056
- * chooser is theirs.
2057
- */
2058
- type TableOpening = {
2059
- kind: "designated";
2060
- hostLayout: string;
2061
- } | {
2062
- kind: "chooser";
2063
- };
2064
- declare function tableOpening(view: Pick<SavedView, "isDefault" | "designatedLayout"> | null | undefined, hostLayoutIds: readonly string[]): TableOpening;
2065
- /**
2066
- * THE TABLE'S DEFAULT VIEW WHEN MORE THAN ONE SAYS IT IS (lane DATA-V2-FACE-2).
2067
- *
2068
- * Two views can both claim the default: the mover's designated one (the older table's own, the
2069
- * Sheet) and a page seed that a later move of the view bar's older store brings in beside it —
2070
- * both named "All records", so the store's name order cannot tell them apart. A designation is a
2071
- * deliberate write and a seed is not, so the designated default wins; then the first default.
2072
- */
2073
- declare function defaultViewOf<V extends Pick<SavedView, "isDefault" | "designatedLayout">>(views: readonly V[]): V | undefined;
1984
+ /** THE TABLE'S DEFAULT VIEW: the first view that says it is. */
1985
+ declare function defaultViewOf<V extends Pick<SavedView, "isDefault">>(views: readonly V[]): V | undefined;
2074
1986
  /**
2075
1987
  * WHICH FIELD EACH LAYOUT CAN BE DRAWN FROM, decided from the FIELD'S OWN
2076
1988
  * DECLARATION and never from the values it happens to hold.
@@ -2176,7 +2088,7 @@ interface ColumnSort {
2176
2088
  field: string;
2177
2089
  direction: "asc" | "desc";
2178
2090
  }
2179
- /** THE SORT CONTROL'S WORDS, the Sheet's, so the grid and the Sheet never read differently. */
2091
+ /** THE SORT CONTROL'S WORDS, said once, so the grid and the board never read differently. */
2180
2092
  declare const MANUAL_SORT: {
2181
2093
  readonly label: "Manual";
2182
2094
  readonly detail: "· set by hand";
@@ -2195,7 +2107,7 @@ declare const MANUAL_SORT: {
2195
2107
  * above the table's own toolbar. It is now one compact control in the one toolbar row: a sort
2196
2108
  * icon, the order in a word ("Manual", "Reset Date ↑"), a badge when a column sort is setting a
2197
2109
  * hand-set order aside, and a popover that says the state in ONE line and offers the actions.
2198
- * Airtable's sort button carries its state the same way. The grid and the Sheet both draw it.
2110
+ * Airtable's sort button carries its state the same way. Every layout draws it.
2199
2111
  */
2200
2112
  interface SortStateAction {
2201
2113
  key: string;
@@ -2220,7 +2132,7 @@ interface SortStateControlProps {
2220
2132
  declare function SortStateControl({ label, line, attention, actions, mode }: SortStateControlProps): react.JSX.Element;
2221
2133
  /** The sentence the popover says for a hand-ordered view, with or without a column sort over it. */
2222
2134
  declare function handOrderLine(sortName: string | null, direction: "asc" | "desc" | null): string;
2223
- /** The control's props for a hand-ordered view — the grid's and the Sheet's words, once. */
2135
+ /** The control's props for a hand-ordered view — the grid's words, once. */
2224
2136
  declare function handOrderSortState(args: {
2225
2137
  sortName: string | null;
2226
2138
  direction: "asc" | "desc" | null;
@@ -2294,7 +2206,7 @@ interface GridProps {
2294
2206
  * S2-PRIME: either shape — the flat map, or a view's own nested question (the Rule shape);
2295
2207
  * the store compiles both into the one WHERE clause.
2296
2208
  */
2297
- filter?: StoreFilter$1 | undefined;
2209
+ filter?: StoreFilter | undefined;
2298
2210
  /**
2299
2211
  * Clear the question `filter` carries (the view's own filter), for the "No rows match these
2300
2212
  * filters" screen's Clear filters. Left out, that screen clears only the grid's own search and
@@ -2445,7 +2357,7 @@ declare function RecordsTableCard(props: RecordsTableCardProps): react.JSX.Eleme
2445
2357
 
2446
2358
  /** What a view asks of the store, and how it draws columns. */
2447
2359
  interface ViewReading {
2448
- filter?: StoreFilter | null | undefined;
2360
+ filter?: StoreFilter$1 | null | undefined;
2449
2361
  sorts?: readonly ViewSort[] | undefined;
2450
2362
  presentation?: GridPresentation | undefined;
2451
2363
  /** A hand-ordered view with no sort is read by its own id (the store places its rows). */
@@ -4062,27 +3974,18 @@ interface ViewSwitcherProps {
4062
3974
  * S2-PRIME: either shape — a flat map, or the view's own nested question (`where`, the
4063
3975
  * store's Rule shape). The grid, the board's headings and the numbers all ask it.
4064
3976
  */
4065
- filter?: StoreFilter | undefined;
3977
+ filter?: StoreFilter$1 | undefined;
4066
3978
  /**
4067
3979
  * Clear the question `filter` carries, for the "No rows match these filters" screen of every
4068
3980
  * layout. Left out, that screen says the view's filter holds every row back without a button.
4069
3981
  */
4070
3982
  onClearFilter?: (() => void) | undefined;
4071
- /**
4072
- * The HOST layout showing now (`RecordsUiHost.layouts`, by id), or null for the
4073
- * package's own. Controlled by the page, because the address names it.
4074
- */
4075
- hostLayout?: string | null | undefined;
4076
- /** The person picked a host layout (its id), or went back to one of the four (null). */
4077
- onHostLayoutChange?: ((id: string | null) => void) | undefined;
4078
3983
  /**
4079
3984
  * Whether this component draws its own row — the view's name and the layout buttons. `false`
4080
3985
  * when the page that mounts it draws the layout choice itself (`TablePage` keeps one control
4081
3986
  * cluster for the whole table, lane DATA-V2-FACE). Default `true`, for every other host.
4082
3987
  */
4083
3988
  chooser?: boolean | undefined;
4084
- /** Handed to a host layout's `render` — the page's own export. */
4085
- openExport?: (() => void) | undefined;
4086
3989
  /**
4087
3990
  * THE SAVED VIEW'S OWN ID, when the view is a stored one (lane GRID-MANUAL). A hand-set order
4088
3991
  * lives on the view's row, so the grid reads it (`custom.read_records_in_view_order`) and writes
@@ -4098,7 +4001,7 @@ interface ViewSwitcherProps {
4098
4001
  /**
4099
4002
  * Where the grid's footer sits (lane TABLE-PAGE-CHROME) — `sticky`: the layout fills the height
4100
4003
  * the page gives it and the footer stays on the bottom edge; `inline`: after the last row. Handed
4101
- * to the Grid and to a host layout (the Sheet). Left out: natural height, as always.
4004
+ * to the Grid. Left out: natural height, as always.
4102
4005
  */
4103
4006
  footer?: FooterPlacement | undefined;
4104
4007
  /** The grid as an embedded table (`GridProps.embedded`): its page furniture off. */
@@ -4121,7 +4024,7 @@ interface ViewSwitcherProps {
4121
4024
  className?: string | undefined;
4122
4025
  }
4123
4026
  /** The records this view holds: its Rule's members when it names one, the table otherwise. */
4124
- declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?: StoreFilter, viewId?: Uuid$1 | null): {
4027
+ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?: StoreFilter$1, viewId?: Uuid$1 | null): {
4125
4028
  rows: ReadRow$1[];
4126
4029
  manual: boolean;
4127
4030
  /** How many records the view holds, as the store counted them (null when it did not count). */
@@ -4147,7 +4050,7 @@ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?:
4147
4050
  */
4148
4051
  membership: string;
4149
4052
  };
4150
- declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, openRecordId, onCloseRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize: pageSizeAsked, titleField, filter, onClearFilter, hostLayout, onHostLayoutChange, chooser, openExport, viewId, onOrderPlaced, footer, embedded, sortOverride, searchOverride, onSearchChange, searchBox, newRowLabel, className, }: ViewSwitcherProps): react.JSX.Element;
4053
+ declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, openRecordId, onCloseRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize: pageSizeAsked, titleField, filter, onClearFilter, chooser, viewId, onOrderPlaced, footer, embedded, sortOverride, searchOverride, onSearchChange, searchBox, newRowLabel, className, }: ViewSwitcherProps): react.JSX.Element;
4151
4054
 
4152
4055
  type CalendarMode = "month" | "week" | "day" | "list";
4153
4056
  interface CalendarViewProps {
@@ -4639,12 +4542,68 @@ interface FormQuestionSpec {
4639
4542
  * question: a person is never silently skipped past something.
4640
4543
  */
4641
4544
  showIf?: RuleExpression | null;
4545
+ /**
4546
+ * LOGIC JUMPS (lane TYPEFORM-DUP). After this question, the FIRST jump whose `when` the store
4547
+ * answers true is taken — to a later question or to one of the form's endings. A jump with no
4548
+ * `when` is "always". Undecided falls through to the next question. The store judges the route
4549
+ * (`custom._form_route`); this package never does.
4550
+ */
4551
+ jumps?: FormJump[] | null;
4552
+ /** SCORING: what each answer is worth (`{"Yes": 5}`); a list answer adds each of its parts. */
4553
+ points?: Record<string, number> | null;
4554
+ }
4555
+ /** One logic jump: when the Rule is true, go to a later question or to an ending. */
4556
+ interface FormJump {
4557
+ when?: RuleExpression | null;
4558
+ to: {
4559
+ question: string;
4560
+ } | {
4561
+ ending: string;
4562
+ };
4563
+ }
4564
+ /**
4565
+ * ONE ENDING (lane TYPEFORM-DUP). A form may have several; a jump picks one, or the first whose
4566
+ * condition holds (`when`, `scoreMin`, `scoreMax`), or else the first with no condition.
4567
+ */
4568
+ interface FormEnding {
4569
+ /** A short name, lower-case letters, digits, - and _. Jumps point at it. */
4570
+ id: string;
4571
+ title?: string | null;
4572
+ body?: string | null;
4573
+ /** One of the organization's public pictures (the builder's side). */
4574
+ pictureFileId?: Uuid | null;
4575
+ /** The picture's public address (the store resolves it for the public page). */
4576
+ pictureUrl?: string | null;
4577
+ buttonLabel?: string | null;
4578
+ /** A secure page on the organization's own sites — the thank-you's own rule. */
4579
+ redirectUrl?: string | null;
4580
+ when?: RuleExpression | null;
4581
+ scoreMin?: number | null;
4582
+ scoreMax?: number | null;
4583
+ }
4584
+ /** THE WELCOME SCREEN, before question one: a title, a message, a picture and a Start button. */
4585
+ interface FormWelcome {
4586
+ title?: string | null;
4587
+ body?: string | null;
4588
+ pictureFileId?: Uuid | null;
4589
+ pictureUrl?: string | null;
4590
+ buttonLabel?: string | null;
4642
4591
  }
4643
4592
  /** The look. Tokens, so light and dark both come out right without a second theme. */
4644
4593
  interface FormTheme {
4645
4594
  /** A design-system accent class or a CSS color. Left out, the app's own accent. */
4646
4595
  accent?: string | null;
4647
4596
  align?: "left" | "center" | null;
4597
+ /** One of design-system `FORM_FONTS`. */
4598
+ font?: string | null;
4599
+ /** One of design-system `FORM_BUTTON_STYLES`. */
4600
+ button?: string | null;
4601
+ /** One of design-system `FORM_BACKGROUNDS`. */
4602
+ background?: string | null;
4603
+ /** The picture for the `picture` background: a public picture of the organization. */
4604
+ backgroundFileId?: Uuid | null;
4605
+ /** Its public address, as the store resolved it for the public page. */
4606
+ backgroundUrl?: string | null;
4648
4607
  }
4649
4608
  /**
4650
4609
  * THE FORM'S OWN LOOK, in the portal's words (`custom._portal_style` resolves both): a colour of
@@ -4685,6 +4644,15 @@ interface FormSpec {
4685
4644
  */
4686
4645
  thankYou?: FormThankYou | null;
4687
4646
  submitLabel?: string | null;
4647
+ /** A separate first screen with a Start button (lane TYPEFORM-DUP). */
4648
+ welcome?: FormWelcome | null;
4649
+ /** Several endings, each picked by the answers (lane TYPEFORM-DUP). */
4650
+ endings?: FormEnding[] | null;
4651
+ /**
4652
+ * HIDDEN FIELDS: names read from the link (`?utm_source=…&ref=…`), kept on the submission and
4653
+ * never shown. Not questions — a question with the same key is prefilled instead.
4654
+ */
4655
+ hiddenFields?: string[] | null;
4688
4656
  /**
4689
4657
  * Is this form meant to be answerable by someone who is not signed in? The
4690
4658
  * runner does NOT make that true by itself — it needs the anonymous write
@@ -4725,6 +4693,27 @@ interface SavedForm extends FormSpec {
4725
4693
  * different lists.
4726
4694
  */
4727
4695
  declare function formPresentation(spec: FormSpec): Record<string, unknown>;
4696
+ declare function themeFromDocument(raw: unknown): FormTheme | null;
4697
+ declare function welcomeFromDocument(raw: unknown): FormWelcome | null;
4698
+ declare function endingsFromDocument(raw: unknown): FormEnding[];
4699
+ /** The hidden fields' values out of a link's query, narrowed to the names the form declares. */
4700
+ declare function hiddenFromLink(hiddenFields: readonly string[] | null | undefined, params: Record<string, string | string[] | undefined>): Record<string, string>;
4701
+ /** Does this form route at all — conditions, jumps, endings or points the store must judge? */
4702
+ declare function formRoutes(form: Pick<FormSpec, "questions" | "endings">): boolean;
4703
+ /** HOW A FORM GOES INTO SOMEBODY ELSE'S PAGE. */
4704
+ declare const FORM_EMBEDS: readonly ["inline", "popup", "slider"];
4705
+ type FormEmbed = (typeof FORM_EMBEDS)[number];
4706
+ /**
4707
+ * THE SNIPPET THE OWNER COPIES (lane TYPEFORM-DUP). `inline` is a plain iframe of the public link
4708
+ * in embed mode; `popup` and `slider` are one button plus the platform's own embed script
4709
+ * (`<origin>/embed/form.js`), which opens the same iframe in a centred window or a side panel.
4710
+ * Nothing in either needs a cookie: the form keeps its place in its own storage and posts to its
4711
+ * own origin, so it keeps working with third-party cookies blocked.
4712
+ */
4713
+ declare function formEmbedSnippet(kind: FormEmbed, formUrl: string, options?: {
4714
+ label?: string | null;
4715
+ height?: number | null;
4716
+ }): string;
4728
4717
  /** `presentation.look` both directions. Nothing set is `null`, one spelling on both sides. */
4729
4718
  declare function formLookDocument(look: FormLook | null): Record<string, unknown> | null;
4730
4719
  declare function formLookFromDocument(raw: unknown): FormLook | null;
@@ -4756,6 +4745,14 @@ declare function submissionStamp(args: {
4756
4745
  onBehalfOf?: string | null;
4757
4746
  }): Record<string, unknown>;
4758
4747
 
4748
+ interface FormResultsPanelProps {
4749
+ form: SavedForm | (FormSpec & {
4750
+ id: Uuid$1;
4751
+ });
4752
+ className?: string | undefined;
4753
+ }
4754
+ declare function FormResultsPanel({ form, className }: FormResultsPanelProps): react.JSX.Element;
4755
+
4759
4756
  interface PortalBuilderProps {
4760
4757
  /**
4761
4758
  * OPTIONAL. The Table whose rail this was opened from. It is pre-ticked as a
@@ -5643,8 +5640,8 @@ declare function filterTargets(filter: FilterPageBlock, blocks: readonly PageBlo
5643
5640
  * value wins). The view asks a Rule: the extras join it under `and`, by field id, which is the only
5644
5641
  * way the Rule shape names a column (REC-17). An extra whose key has no id is left out and named.
5645
5642
  */
5646
- declare function combineFilter(base: StoreFilter | null | undefined, extra: RecordFilter, fieldIdOf: (key: string) => string | undefined): {
5647
- filter: StoreFilter | null;
5643
+ declare function combineFilter(base: StoreFilter$1 | null | undefined, extra: RecordFilter, fieldIdOf: (key: string) => string | undefined): {
5644
+ filter: StoreFilter$1 | null;
5648
5645
  dropped: string[];
5649
5646
  };
5650
5647
 
@@ -5676,6 +5673,10 @@ type FormAsked = {
5676
5673
  asked: boolean;
5677
5674
  said?: string | null;
5678
5675
  }>;
5676
+ /** TYPEFORM-DUP: the ending the store's route reached (null: the thank-you screen). */
5677
+ ending?: string | null | undefined;
5678
+ /** TYPEFORM-DUP: the score so far (null: the form carries no points). */
5679
+ score?: number | null | undefined;
5679
5680
  } | {
5680
5681
  ok: false;
5681
5682
  message: string;
@@ -5736,6 +5737,10 @@ interface FormRunnerProps {
5736
5737
  preview?: boolean | undefined;
5737
5738
  onSubmitted?: ((recordId: Uuid$1 | null) => void) | undefined;
5738
5739
  className?: string | undefined;
5740
+ /** TYPEFORM-DUP: called once, at the person's first answer — the host counts a start. */
5741
+ onStart?: (() => void) | undefined;
5742
+ /** TYPEFORM-DUP: called as each question is put in front of the person — the host counts drop-off. */
5743
+ onQuestionShown?: ((fieldKey: string) => void) | undefined;
5739
5744
  }
5740
5745
  /**
5741
5746
  * THE ONE ENTRY POINT. It picks the arm and nothing else: a caller that brought
@@ -6269,10 +6274,7 @@ interface TablePageProps$1 {
6269
6274
  * Half a deep link is a link that works when you arrive and lies when you
6270
6275
  * copy it out of the address bar afterwards.
6271
6276
  */
6272
- /**
6273
- * Called with the view the person moved to — one of `PAGE_VIEWS`, or the id of a
6274
- * layout the HOST draws (`RecordsUiHost.layouts`), which the address carries too.
6275
- */
6277
+ /** Called with the view the person moved to: one of `PAGE_VIEWS`, which the address carries too. */
6276
6278
  onViewChanged?: ((view: PageView | string) => void) | undefined;
6277
6279
  /**
6278
6280
  * WHICH FIELD THE ADDRESS WANTS THE BOARD'S COLUMNS TO BE, for this visit.
@@ -6370,7 +6372,7 @@ interface TablePageProps$1 {
6370
6372
  */
6371
6373
  onShownViewChange?: ((shown: ShownViewReport) => void) | undefined;
6372
6374
  /**
6373
- * THE VIEW IN THE ADDRESS BAR (FTS-5 item 2, adopted from the older Sheet). What the address
6375
+ * THE VIEW IN THE ADDRESS BAR (FTS-5 item 2). What the address
6374
6376
  * said about the person's look on arrival — sort, column filters, search, hidden columns, page
6375
6377
  * (`viewAddressFromParams`). Read once, on arrival. Absent: the page opens as it always did.
6376
6378
  */
@@ -6401,7 +6403,7 @@ interface ShownViewReport {
6401
6403
  /** The saved view under the look; null while the views are read or when there are none. */
6402
6404
  viewId: string | null;
6403
6405
  viewName: string | null;
6404
- /** "records" layouts (grid, kanban, calendar, gallery, or a host layout id), or the main view. */
6406
+ /** "records" layouts (grid, kanban, calendar, gallery), or the main view. */
6405
6407
  showing: string;
6406
6408
  groupField: string | null;
6407
6409
  dateField: string | null;
@@ -6909,7 +6911,7 @@ interface PipelineBoardProps {
6909
6911
  * headings are counted by the store with THE SAME question (`pipelineBoard({filter})`), so a
6910
6912
  * column never says 16 over the 4 cards a view put in it.
6911
6913
  */
6912
- filter?: StoreFilter | null | undefined;
6914
+ filter?: StoreFilter$1 | null | undefined;
6913
6915
  onMeasureChange?: ((key: string | null) => void) | undefined;
6914
6916
  onOpenRecord?: ((recordId: Uuid$1) => void) | undefined;
6915
6917
  /** Called after a move lands, so the host re-reads the rows it owns. */
@@ -6962,7 +6964,7 @@ declare function useDrillAnswers(args: {
6962
6964
  question: MatrxDrillQuestion;
6963
6965
  where: Record<string, unknown>;
6964
6966
  /** A custom Table's nested (Rule) question, when its view asks one. */
6965
- rule?: StoreFilter$1 | undefined;
6967
+ rule?: StoreFilter | undefined;
6966
6968
  /** The time Dimension a window (and a comparison) runs along. */
6967
6969
  windowKey?: string | undefined;
6968
6970
  version?: unknown;
@@ -6984,7 +6986,7 @@ declare function useDrill(args: {
6984
6986
  onQuestionChange: (next: MatrxDrillQuestion) => void;
6985
6987
  /** The host's own flat filter, before the trail. */
6986
6988
  filter?: RecordFilter | undefined;
6987
- rule?: StoreFilter$1 | undefined;
6989
+ rule?: StoreFilter | undefined;
6988
6990
  version?: unknown;
6989
6991
  rowNoun?: string;
6990
6992
  rootLabel?: string;
@@ -7294,4 +7296,4 @@ declare function RecordsSkeleton({ layout, embedded, rows, className }: RecordsS
7294
7296
  */
7295
7297
  declare function TablePageSkeleton({ layout: layoutAsked, embedded, rows, tableId, className, }: RecordsSkeletonProps): react.JSX.Element;
7296
7298
 
7297
- export { ABSENCE_WORD_LABEL, ABSENCE_WORD_VALUES, ACTION_KINDS, ARCHIVED_NEVER_DESTROYED, ARCHIVE_MEANS, ASK_EXAMPLE, type AbsenceWord, AccentSwatches, type AccentSwatchesProps, ActionInbox, type ActionInboxProps, type ActionKind, type AgentBuildAsk, type AnnounceTableArchived, type AppletPageBlock, ArchiveDeliberatelyDialog, type ArchiveDeliberatelyDialogProps, ArchivedDisclosure, type ArchivedDisclosureProps, ArchivedPortals, type ArchivedPortalsProps, ArchivedView, type ArchivedViewProps, type AskRead, BODY_COLUMN_NAME, BODY_SAVE_PAUSE_MS, BOOKING_NOT_HERE_LINE, BOOKING_PAGE_STATE_LABEL, BOOKING_PAGE_STATE_VALUES, BookingBuilder, type BookingBuilderProps, type BookingPageState, BookingSlots, type BookingSlotsProps, BuildOrAsk, type BuildOrAskProps, type BuildableKind, type ButtonPageBlock, CAPTURE_MODES, CHART_KINDS, CHART_KIND_LABEL, CHART_NEEDS, CHECKLIST_REQUIREMENT_KINDS, CHECKLIST_REQUIREMENT_LABEL, CONDITION_OPS, CONTEXT_POLICY_LABEL, ADDABLE_TYPES as CUSTOM_FIELD_ADDABLE_TYPES, type CalendarMode, CalendarView, type CalendarViewProps, type CaptureMode, type CaptureQueuePort, CaptureRun, type CaptureRunProps, CaptureSheet, type CaptureSheetProps, type CellAddress, type CellRefusal, type CellState, ChartBlock, type ChartBlockProps, type ChartConfig, ChartFrame, type ChartKind, ChartLegendContent, type ChartPageBlock, type ChartSpec, ChartTooltipContent, ChecklistRunner, type ChecklistRunnerProps, ChecklistTemplateEditor, ChecklistsPanel, type ChecklistsPanelProps, type ChoiceAddition, type ChoiceAsk, ChoiceAskButtons, ChoiceListEditor, type ChoiceListRow, type CombinedRows, CommentThread, type CommentThreadProps, type ConditionField, ConditionGroup, type ConditionGroupProps, ConditionRow, type ConditionRowProps, type CustomFieldAddRequest, type CustomFieldAddResult, type CustomFieldSetResult, type CustomFieldValuesRequest, type CustomFieldsAgentDoor, type CustomFieldsAgentState, CustomFieldsSection, type CustomFieldsSectionProps, DEFAULT_FOOTER, DEFAULT_VIEW_NAME, DUE_STATE_LABEL, DashboardCanvas, type DashboardCanvasProps, DigestScheduler, type DigestSchedulerProps, DocRender, type DocRenderProps, DocTemplate, type DocTemplateProps, type DocTemplateSpec, EMPTY_PRESENTATION, ENGINEER_TEXT, ENTITY_REFERENCE_KINDS_MISSING, type EditorKind, EmbedFrame, type EmbedFrameProps, type EnrichAsk, EnrichBadge, type EnrichBadgeProps, type EnrichOutcome, EnrichPanel, type EnrichPanelProps, EntityBoard, type EntityBoardProps, EntityChartBlock, type EntityChartBlockProps, type EntityColumn, EntityDataScope, EntityGrid, type EntityLayout, EntityReferenceKindPicker, type EntityReferenceKindPickerProps, type EntityRow, type EntitySource, type EntityTable, EntityTablePage, type EntityTablePageProps, ExportMenu, type ExportMenuProps, FIELD_RULE_KIND_LABEL, FIELD_RULE_KIND_VALUES, FIELD_SENSITIVITY_LABEL, FIELD_TYPE_CATALOGUE, FIELD_TYPE_CHOICES, FIELD_TYPE_GROUPS, FOOTER_WORDS, FORMULA_FUNCTIONS, FORMULA_OP_JOINS, FORMULA_OP_LABEL, FORMULA_OP_VALUES, FORM_FLOWS, FORM_NOT_HERE_LINE, FROZEN_COLUMN_WIDTH, FieldControl, FieldEditor, type FieldEditorControlProps, type FieldEditorProps, FieldHistoryPanel, type FieldHistoryPanelProps, FieldLabel, type FieldProposalRow, type FieldRuleKindValue, type FieldTypeChoice, FilePicker, type FilePickerProps, type FilterPageBlock, type FooterPlacement, type FormAsked, FormBuilder, type FormBuilderProps, type FormFlow, type FormLook, FormLookFrame, type FormLookFrameProps, FormLookLogo, type FormLookView, type FormPageBlock, type FormQuestionSpec, FormRunner, type FormRunnerProps, type FormSpec, type FormSubmitOutcome, type FormTheme, FormsPanel, type FormsPanelProps, type FormulaHelpAsk, type FormulaOp, Grid, GridCell, type GridContextRecord, type GridContextSnapshot, type GridEditing, type GridGrouping, type GridPresentation, type GridProps, GuessedFieldType, type HeadingPageBlock, HistoryPanel, type HistoryPanelProps, type HostLayout, INBOX_GROUPINGS, INBOX_VIEWS, IN_MEMORY_QUEUE_REASON, ImportNotice, type ImportNoticeProps, type ImportSource, ImportWizard, type ImportWizardProps, InTableToolbar, type InboxGroup, type InboxGrouping, LANE_EMPTY, LANE_TITLE, LAYOUT_FIELD_KIND, LAYOUT_LABEL, LOOK_WORDS, type LabelLookup, type LinkRail, type ListPageBlock, MACHINE_IDENTITY, MANUAL_SORT, MAX_ROW_HEIGHT, MIN_ROW_HEIGHT, MOST_NEW_COLUMNS, type MainView, type MoveWritten, MyChecklistSteps, NEEDS_A_SENTENCE, NEW_COLUMN_TYPES, NOT_DRAWN_HERE, NO_AGENT_PORT, NO_CHAT_REASON, NO_COLUMNS_YET, NO_ENRICH_REASON, NO_MEMBERS_REASON, NO_OPEN_RECORDS_REASON, NO_REASK_REASON, NO_RIGHTS, NO_RULES_YET, NO_SAVED_VIEWS_REASON, NO_SHARE_REASON, NO_UPLOAD_REASON, type NewColumn, type NewColumnType, NotifyRuleEditor, type NotifyRuleEditorProps, type NotifyRuleSpec, ObjectAction, ObjectActionContextMenuItems, ObjectActionGlyph, ObjectActionIcon, ObjectActionMenuItems, type ObjectActionMenuItemsProps, type OpenRecordsAsk, type OrganizationMember, PAGE_BLOCK_KINDS, PAGE_BLOCK_LABEL, PAGE_KIND, PAGE_VIEWS, PAGE_VIEW_LABEL, PARITY_LABEL, PARITY_MADE_OF, PORTAL_NOT_HERE_LINE, PROPOSED_CHANGE_ACT_LABEL, PROPOSED_CHANGE_ACT_VALUES, type PageBlock, type PageBlockKind, PageScreen, type PageScreenProps, type PageView, Peek, type PeekProps, type PendingCapture, PersonPicker, type PersonPickerProps, PickOrAdd, type PickOrAddItem, type PickOrAddProps, type PickableFieldType, type PickerTable, PipelineBoard, type PipelineBoardProps, type PlainFieldType, type PlainRefusal, type PortalAnswer, PortalBuilder, type PortalBuilderProps, PortalCardView, type PortalCardViewProps, PortalLookEditor, type PortalLookEditorProps, PortalShell, type PortalShellProps, PortalsPanel, type PortalsPanelProps, type ProposalOutcome, ProposalRow, type ProposalRowProps, type ProposedChange, type ProposedChangeAct, ProvenanceBadge, PublicPicturePicker, type PublicPicturePickerProps, PublicViewPage, type PublicViewPageProps, QUESTION_OPS, QUESTION_SURFACE, type QuestionAnswer, QuestionAnswerView, type QuestionGroup, type QuestionMeasure, type QuestionOp, QuestionPanel, type QuestionPanelProps, type QuestionRow, type QuestionShow, type QuestionSpec, RECORDS_GRID_ROW_PX, RECORDS_SKELETON_LAYOUTS, ROLLUP_AGG_LABEL, ROLLUP_AGG_VALUES, RULE_NOT_HERE_LINE, type ReaskContext, type ReasonGroup, type RecordActionHost, RecordActionMenu, type RecordActionMenuProps, type RecordActionSubject, type RecordActionsInput, RecordBody, RecordChat, type RecordChatContext, type RecordChatEntry, type RecordChatProps, type RecordChatWithheld, RecordChip, RecordForm, type RecordFormProps, RecordLabelProvider, type RecordMoves, type RecordPageBlock, RecordPanel, type RecordPanelProps, RecordValue, RecordsMount, type RecordsMountProps, RecordsSkeleton, type RecordsSkeletonLayout, type RecordsSkeletonProps, RecordsTableCard, type RecordsTableCardProps, type RecordsUiHost, RecordsUiProvider, ReferenceBuilder, type ReferenceBuilderProps, type ReferenceChoice, RefusalLine, RefusalNotice, type RefusedRow, type RelationFieldType, RelationPicker, type RelationPickerProps, type RenderTextSlot, type ResolveName, type RichTextEditProps, type RollupAgg, SAVED_VIEWS_UNAVAILABLE, SAVE_TO_TABLE_TYPES, SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS, SECTIONS_UNKNOWN, SERIES_COLORS, SHARE_NOT_YOURS_LINE, SIGNED_WORD, SOMEBODY, STAGE_RULE_ON_FAIL_LABEL, STORE_ANSWERS_THESE, STORE_DECIDES_REASON, STORE_KEEPS_TIMELINE, STORE_KEPT_LAYOUTS, SUBSCRIPTION_CADENCES, SUBSCRIPTION_CADENCE_LABEL, SUBSCRIPTION_CHANNEL_LABEL, SUBSCRIPTION_CHANNEL_VALUES, SaveToTable, type SaveToTableProps, type SaveToTableSource, type SavedDashboard, type SavedForm, type SavedQuestion, type SavedView, type SavedViewSpec, ShareControl, type ShareControlProps, type ShareSubject, ShowListsToggle, type ShownViewReport, SignBlock, type SignBlockProps, SignaturePad, SignatureValue, type SnoozeChoice, type SortStateAction, SortStateControl, type SortStateControlProps, StageRulesSection, type StageRulesSectionProps, type StandardColumn, StandardRecordForm, type StandardRecordFormProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_NAME_MAX, TABLE_NOT_REACHABLE, TABLE_TOOLBAR_ROW_CLASS, THE_SYSTEM, TIMELINE_ZOOMS, TableActionHost, TableAsk, type TableAskProps, TableDetails, TableDuplicateDialog, type TableDuplicateDialogProps, TableFoundationSwitch, type TableLane, type TableOpening, TablePage, type TablePageActionHost, type TablePageHeaderChrome, type TablePageProps, TablePageSkeleton, type TablePageSource, type TablePickerEntries, type TablePickerEntry, TableReferenceDialog, TableRenameDialog, TableRestoreRefused, type TableRights, TableSettings, type TableSettingsAgent, type TableSettingsProps, type TableSettingsSnapshot, TableShape, TableToolbarSlotContext, TablesHome, type TablesHomeProps, TemplatePreview, type TemplatePreviewProps, type TextPageBlock, type ThroughCondition, type TimelineSettings, TimelineView, type TimelineViewProps, type TimelineZoom, type TitleRepeats, type TrackedVersion, UNREAD_RECORD_LABEL, type UseSystemTableState, VIEW_ADDRESS_KEYS, VIEW_KEYS, VIEW_LAYOUTS, VIEW_NEEDS, VIEW_NOT_SAVED_YET, VISIBILITY_LANES, VISIBILITY_LANE_TITLE, type ViewAddressSort, type ViewAddressState, ViewBar, type ViewBarProps, type ViewKeyDeclaration, type ViewKeyLayout, type ViewKeyWriter, type ViewLayout, type ViewLook, type ViewNeed, type ViewNeedKind, ViewNeeds, type ViewNeedsProps, type ViewSettings, type ViewSettingsPatch, type ViewSort, type ViewSortKey, ViewSwitcher, type ViewSwitcherProps, type VisibilityLane, WITHHELD_RECORD_LABEL, WITHHELD_WORD, WORK_APPROVAL_STATES, WORK_APPROVAL_STATE_LABEL, WORK_DUE_STATES, WORK_INBOX_KINDS, WORK_INBOX_KIND_GROUP_LABEL, WORK_INBOX_KIND_LABEL, WhatYouMayDo, WhereItLives, type WhereItLivesProps, type WhoChanged, WhoChangedSource, WithheldValue, actionForAgent, actorBadge, actorWords, addDays, announceTableArchived, applyLook, archiveConfirmSentence, archivedRowLine, asRefusal, askExampleFor, askQuestion, askableFields, blockFromSpec, bodyFieldOf, bodyForReading, bodyFromKeys, calendarDayLabel, calendarDayOf, cameFromLine, cardTitleField, cardWords, carriesTimeOfDay, cellState, choiceAddition, choiceAskSentence, choiceListPatch, choiceNudgeOf, choiceRowsFrom, chooseSurface, codeDependsRefusal, colorFromTheValue, columnDeclarationFor, columnForField, columnFromName, columnNamesFrom, columnsFrom, combineFilter, combineRows, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, copyNameFor, currencyCodeFor, customFieldRequestProblems, dashboardDeclareArgs, dashboardFromSummary, dateFormatFor, dateText, dayAt, dayKeyOf, daysBetween, declareView, defaultViewOf, descriptionPatch, designatedLayoutOf, drawnBelowOnPage, drawnSignatureOf, drillDimensionsOf, drillMeasuresOf, drillPathsOf, drillWhere, duplicateProgressWords, editorKindFor, ensureSystemTable, entityCellValue, entityChoiceColumns, entityNameColumn, entityReferenceSpec, entityShownColumns, entityTableColumns, entityTitleColumn, entityValueText, envelopeFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, fieldsForNewColumns, filterTargets, flatWhere, footerOf, formDeclareArgs, formFromSummary, formLookDocument, formLookFromDocument, formLookView, formPresentation, formatForField, freeColumnName, freshFormName, gridContextKey, gridContextSnapshot, groupInbox, groupLabel, groupReasons, groupableFields, handOrderLine, handOrderSortState, hasTimePart, hintForAPerson, hintIsMachineIdentity, idsOf, isChoiceAddition, isDateField, isEngineerText, isFoundationTable, isId, isKeptTable, isMachineIdentity, isPage, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, isValueSet, isViewAddressEmpty, keepLook, keptByTheApp, keyFor, kindsWithNoChoice, laneFor, lastChangeSentence, lookDiffers, lookDocument, lookFromDocument, lookPart, looksLikeId, machineIdentityIn, mayNotRestoreLine, measurableFields, memberName, moveRecordValue, newQuestion, nextInWords, nextSummaryAt, notAChoiceSentence, onlyCandidate, openingRail, openingView, packOverlaps, pageBlocksOf, pagePresentation, pageViewFromParam, parityTypesWithNoExplanation, parseGridPresentation, personActor, personRecordForMember, pickableTypeOf, pointsAtRecords, presentationDocument, presentationIsEmpty, previewLine, previewWords, publiclyAnswerable, questionArchive, questionFromDefinition, questionFromWords, questionSave, questionsOf, railFromParam, readLooks, recordActions, recordLink, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, refusedFileName, refusedRowsCsv, renderValue, rescheduledValue, resolveTableStyle, revokeConsequence, rowActionFromAgent, rowLabelChoices, rowName, rowNameIn, runToNotice, sameRecordLikely, sameViewAddress, saveTableDescription, saveToViewPlan, saveViewPatch, scalarText, seedIsSatisfied, shapesOfSource, shareUnavailableReason, signatureFileIn, signatureFileOf, signatureWords, singularNoun, skeletonLayoutFor, snoozeChoices, specFromBlock, standardTokenOf, starterPageBlocks, stepFromAgent, storeDecidesRights, storeKeepsLayout, storePublishesKind, styleFromDecorations, submissionStamp, surfaceChosen, tableName, tableNameProblem, tableOpening, tablePickerEntries, tableReferenceChoices, tableRightsAt, titleRepeats, unknownRailLine, unknownViewLine, unreadableKeys, useCanShare, useChoiceNudge, useDrill, useDrillAnswers, useDrillDefinition, useEmbedHandshake, useEnrichCells, useEntityTable, useGridEditing, useLabelWait, useMeasuredWidth, useMyChecklistSteps, usePickerTables, useRecordActionHost, useRecordLabels, useRecordMoves, useRecordRights, useRecordsUi, useRowColorBy, useRowRights, useSystemTable, useTableRights, useTableToolbarSlot, useTemplatePreview, useViewRecords, useWhoChanged, viewActions, viewAddressFromParams, viewAddressToParams, viewDocument, viewFromRow, viewKeysFor, viewNeedFor, viewPatchDocument, viewSettings, viewSettingsFor, viewSettingsPatch, visibilityLaneFor, whatIsMissing, whatIsMissingForEntityReference, whatTheChoiceListIsMissing, whenWords, whyNotAskable, withheldNoticeOf, withheldSentence, withoutAddition, wordsList };
7299
+ export { ABSENCE_WORD_LABEL, ABSENCE_WORD_VALUES, ACTION_KINDS, ARCHIVED_NEVER_DESTROYED, ARCHIVE_MEANS, ASK_EXAMPLE, type AbsenceWord, AccentSwatches, type AccentSwatchesProps, ActionInbox, type ActionInboxProps, type ActionKind, type AgentBuildAsk, type AnnounceTableArchived, type AppletPageBlock, ArchiveDeliberatelyDialog, type ArchiveDeliberatelyDialogProps, ArchivedDisclosure, type ArchivedDisclosureProps, ArchivedPortals, type ArchivedPortalsProps, ArchivedView, type ArchivedViewProps, type AskRead, BODY_COLUMN_NAME, BODY_SAVE_PAUSE_MS, BOOKING_NOT_HERE_LINE, BOOKING_PAGE_STATE_LABEL, BOOKING_PAGE_STATE_VALUES, BookingBuilder, type BookingBuilderProps, type BookingPageState, BookingSlots, type BookingSlotsProps, BuildOrAsk, type BuildOrAskProps, type BuildableKind, type ButtonPageBlock, CAPTURE_MODES, CHART_KINDS, CHART_KIND_LABEL, CHART_NEEDS, CHECKLIST_REQUIREMENT_KINDS, CHECKLIST_REQUIREMENT_LABEL, CONDITION_OPS, CONTEXT_POLICY_LABEL, ADDABLE_TYPES as CUSTOM_FIELD_ADDABLE_TYPES, type CalendarMode, CalendarView, type CalendarViewProps, type CaptureMode, type CaptureQueuePort, CaptureRun, type CaptureRunProps, CaptureSheet, type CaptureSheetProps, type CellAddress, type CellRefusal, type CellState, ChartBlock, type ChartBlockProps, type ChartConfig, ChartFrame, type ChartKind, ChartLegendContent, type ChartPageBlock, type ChartSpec, ChartTooltipContent, ChecklistRunner, type ChecklistRunnerProps, ChecklistTemplateEditor, ChecklistsPanel, type ChecklistsPanelProps, type ChoiceAddition, type ChoiceAsk, ChoiceAskButtons, ChoiceListEditor, type ChoiceListRow, type CombinedRows, CommentThread, type CommentThreadProps, type ConditionField, ConditionGroup, type ConditionGroupProps, ConditionRow, type ConditionRowProps, type CustomFieldAddRequest, type CustomFieldAddResult, type CustomFieldSetResult, type CustomFieldValuesRequest, type CustomFieldsAgentDoor, type CustomFieldsAgentState, CustomFieldsSection, type CustomFieldsSectionProps, DEFAULT_FOOTER, DEFAULT_VIEW_NAME, DUE_STATE_LABEL, DashboardCanvas, type DashboardCanvasProps, DigestScheduler, type DigestSchedulerProps, DocRender, type DocRenderProps, DocTemplate, type DocTemplateProps, type DocTemplateSpec, EMPTY_PRESENTATION, ENGINEER_TEXT, ENTITY_REFERENCE_KINDS_MISSING, type EditorKind, EmbedFrame, type EmbedFrameProps, type EnrichAsk, EnrichBadge, type EnrichBadgeProps, type EnrichOutcome, EnrichPanel, type EnrichPanelProps, EntityBoard, type EntityBoardProps, EntityChartBlock, type EntityChartBlockProps, type EntityColumn, EntityDataScope, EntityGrid, type EntityLayout, EntityReferenceKindPicker, type EntityReferenceKindPickerProps, type EntityRow, type EntitySource, type EntityTable, EntityTablePage, type EntityTablePageProps, ExportMenu, type ExportMenuProps, FIELD_RULE_KIND_LABEL, FIELD_RULE_KIND_VALUES, FIELD_SENSITIVITY_LABEL, FIELD_TYPE_CATALOGUE, FIELD_TYPE_CHOICES, FIELD_TYPE_GROUPS, FOOTER_WORDS, FORMULA_FUNCTIONS, FORMULA_OP_JOINS, FORMULA_OP_LABEL, FORMULA_OP_VALUES, FORM_EMBEDS, FORM_FLOWS, FORM_NOT_HERE_LINE, FROZEN_COLUMN_WIDTH, FieldControl, FieldEditor, type FieldEditorControlProps, type FieldEditorProps, FieldHistoryPanel, type FieldHistoryPanelProps, FieldLabel, type FieldProposalRow, type FieldRuleKindValue, type FieldTypeChoice, FilePicker, type FilePickerProps, type FilterPageBlock, type FooterPlacement, type FormAsked, FormBuilder, type FormBuilderProps, type FormEmbed, type FormEnding, type FormFlow, type FormJump, type FormLook, FormLookFrame, type FormLookFrameProps, FormLookLogo, type FormLookView, type FormPageBlock, type FormQuestionSpec, FormResultsPanel, type FormResultsPanelProps, FormRunner, type FormRunnerProps, type FormSpec, type FormSubmitOutcome, type FormTheme, type FormWelcome, FormsPanel, type FormsPanelProps, type FormulaHelpAsk, type FormulaOp, Grid, GridCell, type GridContextRecord, type GridContextSnapshot, type GridEditing, type GridGrouping, type GridPresentation, type GridProps, GuessedFieldType, type HeadingPageBlock, HistoryPanel, type HistoryPanelProps, INBOX_GROUPINGS, INBOX_VIEWS, IN_MEMORY_QUEUE_REASON, ImportNotice, type ImportNoticeProps, type ImportSource, ImportWizard, type ImportWizardProps, InTableToolbar, type InboxGroup, type InboxGrouping, LANE_EMPTY, LANE_TITLE, LAYOUT_FIELD_KIND, LAYOUT_LABEL, LOOK_WORDS, type LabelLookup, type LinkRail, type ListPageBlock, MACHINE_IDENTITY, MANUAL_SORT, MAX_ROW_HEIGHT, MIN_ROW_HEIGHT, MOST_NEW_COLUMNS, type MainView, type MoveWritten, MyChecklistSteps, NEEDS_A_SENTENCE, NEW_COLUMN_TYPES, NOT_DRAWN_HERE, NO_AGENT_PORT, NO_CHAT_REASON, NO_COLUMNS_YET, NO_ENRICH_REASON, NO_MEMBERS_REASON, NO_OPEN_RECORDS_REASON, NO_REASK_REASON, NO_RIGHTS, NO_RULES_YET, NO_SAVED_VIEWS_REASON, NO_SHARE_REASON, NO_UPLOAD_REASON, type NewColumn, type NewColumnType, NotifyRuleEditor, type NotifyRuleEditorProps, type NotifyRuleSpec, ObjectAction, ObjectActionContextMenuItems, ObjectActionGlyph, ObjectActionIcon, ObjectActionMenuItems, type ObjectActionMenuItemsProps, type OpenRecordsAsk, type OrganizationMember, PAGE_BLOCK_KINDS, PAGE_BLOCK_LABEL, PAGE_KIND, PAGE_VIEWS, PAGE_VIEW_LABEL, PARITY_LABEL, PARITY_MADE_OF, PORTAL_NOT_HERE_LINE, PROPOSED_CHANGE_ACT_LABEL, PROPOSED_CHANGE_ACT_VALUES, type PageBlock, type PageBlockKind, PageScreen, type PageScreenProps, type PageView, Peek, type PeekProps, type PendingCapture, PersonPicker, type PersonPickerProps, PickOrAdd, type PickOrAddItem, type PickOrAddProps, type PickableFieldType, type PickerTable, PipelineBoard, type PipelineBoardProps, type PlainFieldType, type PlainRefusal, type PortalAnswer, PortalBuilder, type PortalBuilderProps, PortalCardView, type PortalCardViewProps, PortalLookEditor, type PortalLookEditorProps, PortalShell, type PortalShellProps, PortalsPanel, type PortalsPanelProps, type ProposalOutcome, ProposalRow, type ProposalRowProps, type ProposedChange, type ProposedChangeAct, ProvenanceBadge, PublicPicturePicker, type PublicPicturePickerProps, PublicViewPage, type PublicViewPageProps, QUESTION_OPS, QUESTION_SURFACE, type QuestionAnswer, QuestionAnswerView, type QuestionGroup, type QuestionMeasure, type QuestionOp, QuestionPanel, type QuestionPanelProps, type QuestionRow, type QuestionShow, type QuestionSpec, RECORDS_GRID_ROW_PX, RECORDS_SKELETON_LAYOUTS, ROLLUP_AGG_LABEL, ROLLUP_AGG_VALUES, RULE_NOT_HERE_LINE, type ReaskContext, type ReasonGroup, type RecordActionHost, RecordActionMenu, type RecordActionMenuProps, type RecordActionSubject, type RecordActionsInput, RecordBody, RecordChat, type RecordChatContext, type RecordChatEntry, type RecordChatProps, type RecordChatWithheld, RecordChip, RecordForm, type RecordFormProps, RecordLabelProvider, type RecordMoves, type RecordPageBlock, RecordPanel, type RecordPanelProps, RecordValue, RecordsMount, type RecordsMountProps, RecordsSkeleton, type RecordsSkeletonLayout, type RecordsSkeletonProps, RecordsTableCard, type RecordsTableCardProps, type RecordsUiHost, RecordsUiProvider, ReferenceBuilder, type ReferenceBuilderProps, type ReferenceChoice, RefusalLine, RefusalNotice, type RefusedRow, type RelationFieldType, RelationPicker, type RelationPickerProps, type RenderTextSlot, type ResolveName, type RichTextEditProps, type RollupAgg, SAVED_VIEWS_UNAVAILABLE, SAVE_TO_TABLE_TYPES, SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS, SECTIONS_UNKNOWN, SERIES_COLORS, SHARE_NOT_YOURS_LINE, SIGNED_WORD, SOMEBODY, STAGE_RULE_ON_FAIL_LABEL, STORE_ANSWERS_THESE, STORE_DECIDES_REASON, STORE_KEEPS_TIMELINE, STORE_KEPT_LAYOUTS, SUBSCRIPTION_CADENCES, SUBSCRIPTION_CADENCE_LABEL, SUBSCRIPTION_CHANNEL_LABEL, SUBSCRIPTION_CHANNEL_VALUES, SaveToTable, type SaveToTableProps, type SaveToTableSource, type SavedDashboard, type SavedForm, type SavedQuestion, type SavedView, type SavedViewSpec, ShareControl, type ShareControlProps, type ShareSubject, ShowListsToggle, type ShownViewReport, SignBlock, type SignBlockProps, SignaturePad, SignatureValue, type SnoozeChoice, type SortStateAction, SortStateControl, type SortStateControlProps, StageRulesSection, type StageRulesSectionProps, type StandardColumn, StandardRecordForm, type StandardRecordFormProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_NAME_MAX, TABLE_NOT_REACHABLE, TABLE_TOOLBAR_ROW_CLASS, THE_SYSTEM, TIMELINE_ZOOMS, TableActionHost, TableAsk, type TableAskProps, TableDetails, TableDuplicateDialog, type TableDuplicateDialogProps, TableFoundationSwitch, type TableLane, TablePage, type TablePageActionHost, type TablePageHeaderChrome, type TablePageProps, TablePageSkeleton, type TablePageSource, type TablePickerEntries, type TablePickerEntry, TableReferenceDialog, TableRenameDialog, TableRestoreRefused, type TableRights, TableSettings, type TableSettingsAgent, type TableSettingsProps, type TableSettingsSnapshot, TableShape, TableToolbarSlotContext, TablesHome, type TablesHomeProps, TemplatePreview, type TemplatePreviewProps, type TextPageBlock, type ThroughCondition, type TimelineSettings, TimelineView, type TimelineViewProps, type TimelineZoom, type TitleRepeats, type TrackedVersion, UNREAD_RECORD_LABEL, type UseSystemTableState, VIEW_ADDRESS_KEYS, VIEW_KEYS, VIEW_LAYOUTS, VIEW_NEEDS, VIEW_NOT_SAVED_YET, VISIBILITY_LANES, VISIBILITY_LANE_TITLE, type ViewAddressSort, type ViewAddressState, ViewBar, type ViewBarProps, type ViewKeyDeclaration, type ViewKeyLayout, type ViewKeyWriter, type ViewLayout, type ViewLook, type ViewNeed, type ViewNeedKind, ViewNeeds, type ViewNeedsProps, type ViewSettings, type ViewSettingsPatch, type ViewSort, type ViewSortKey, ViewSwitcher, type ViewSwitcherProps, type VisibilityLane, WITHHELD_RECORD_LABEL, WITHHELD_WORD, WORK_APPROVAL_STATES, WORK_APPROVAL_STATE_LABEL, WORK_DUE_STATES, WORK_INBOX_KINDS, WORK_INBOX_KIND_GROUP_LABEL, WORK_INBOX_KIND_LABEL, WhatYouMayDo, WhereItLives, type WhereItLivesProps, type WhoChanged, WhoChangedSource, WithheldValue, actionForAgent, actorBadge, actorWords, addDays, announceTableArchived, applyLook, archiveConfirmSentence, archivedRowLine, asRefusal, askExampleFor, askQuestion, askableFields, blockFromSpec, bodyFieldOf, bodyForReading, bodyFromKeys, calendarDayLabel, calendarDayOf, cameFromLine, cardTitleField, cardWords, carriesTimeOfDay, cellState, choiceAddition, choiceAskSentence, choiceListPatch, choiceNudgeOf, choiceRowsFrom, chooseSurface, codeDependsRefusal, colorFromTheValue, columnDeclarationFor, columnForField, columnFromName, columnNamesFrom, columnsFrom, combineFilter, combineRows, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, copyNameFor, currencyCodeFor, customFieldRequestProblems, dashboardDeclareArgs, dashboardFromSummary, dateFormatFor, dateText, dayAt, dayKeyOf, daysBetween, declareView, defaultViewOf, descriptionPatch, drawnBelowOnPage, drawnSignatureOf, drillDimensionsOf, drillMeasuresOf, drillPathsOf, drillWhere, duplicateProgressWords, editorKindFor, endingsFromDocument, ensureSystemTable, entityCellValue, entityChoiceColumns, entityNameColumn, entityReferenceSpec, entityShownColumns, entityTableColumns, entityTitleColumn, entityValueText, envelopeFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, fieldsForNewColumns, filterTargets, flatWhere, footerOf, formDeclareArgs, formEmbedSnippet, formFromSummary, formLookDocument, formLookFromDocument, formLookView, formPresentation, formRoutes, formatForField, freeColumnName, freshFormName, gridContextKey, gridContextSnapshot, groupInbox, groupLabel, groupReasons, groupableFields, handOrderLine, handOrderSortState, hasTimePart, hiddenFromLink, hintForAPerson, hintIsMachineIdentity, idsOf, isChoiceAddition, isDateField, isEngineerText, isFoundationTable, isId, isKeptTable, isMachineIdentity, isPage, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, isValueSet, isViewAddressEmpty, keepLook, keptByTheApp, keyFor, kindsWithNoChoice, laneFor, lastChangeSentence, lookDiffers, lookDocument, lookFromDocument, lookPart, looksLikeId, machineIdentityIn, mayNotRestoreLine, measurableFields, memberName, moveRecordValue, newQuestion, nextInWords, nextSummaryAt, notAChoiceSentence, onlyCandidate, openingRail, openingView, packOverlaps, pageBlocksOf, pagePresentation, pageViewFromParam, parityTypesWithNoExplanation, parseGridPresentation, personActor, personRecordForMember, pickableTypeOf, pointsAtRecords, presentationDocument, presentationIsEmpty, previewLine, previewWords, publiclyAnswerable, questionArchive, questionFromDefinition, questionFromWords, questionSave, questionsOf, railFromParam, readLooks, recordActions, recordLink, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, refusedFileName, refusedRowsCsv, renderValue, rescheduledValue, resolveTableStyle, revokeConsequence, rowActionFromAgent, rowLabelChoices, rowName, rowNameIn, runToNotice, sameRecordLikely, sameViewAddress, saveTableDescription, saveToViewPlan, saveViewPatch, scalarText, seedIsSatisfied, shapesOfSource, shareUnavailableReason, signatureFileIn, signatureFileOf, signatureWords, singularNoun, skeletonLayoutFor, snoozeChoices, specFromBlock, standardTokenOf, starterPageBlocks, stepFromAgent, storeDecidesRights, storeKeepsLayout, storePublishesKind, styleFromDecorations, submissionStamp, surfaceChosen, tableName, tableNameProblem, tablePickerEntries, tableReferenceChoices, tableRightsAt, themeFromDocument, titleRepeats, unknownRailLine, unknownViewLine, unreadableKeys, useCanShare, useChoiceNudge, useDrill, useDrillAnswers, useDrillDefinition, useEmbedHandshake, useEnrichCells, useEntityTable, useGridEditing, useLabelWait, useMeasuredWidth, useMyChecklistSteps, usePickerTables, useRecordActionHost, useRecordLabels, useRecordMoves, useRecordRights, useRecordsUi, useRowColorBy, useRowRights, useSystemTable, useTableRights, useTableToolbarSlot, useTemplatePreview, useViewRecords, useWhoChanged, viewActions, viewAddressFromParams, viewAddressToParams, viewDocument, viewFromRow, viewKeysFor, viewNeedFor, viewPatchDocument, viewSettings, viewSettingsFor, viewSettingsPatch, visibilityLaneFor, welcomeFromDocument, whatIsMissing, whatIsMissingForEntityReference, whatTheChoiceListIsMissing, whenWords, whyNotAskable, withheldNoticeOf, withheldSentence, withoutAddition, wordsList };