@ai-matrx/records-ui 0.84.8 → 0.85.6

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,9 +1,10 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode, ComponentType, RefObject } from 'react';
3
3
  import * as _ai_matrx_records from '@ai-matrx/records';
4
- import { PermissionLevel, Table, RecordScopeContext, EnrichCell, RecordsError, Uuid as Uuid$1, RecordFilter, AggregateFilter, Field, RecordDocument, ReadRow, RelationDisplay, WriteConflict, RecordsErrorCode, DeclarableFieldKind, ParityFieldType, NewFieldDeclaration, RuleExpression, ValueEnvelope, ChecklistRequirementKind, ContextPolicy, WorkDueState, FieldSensitivity, StageRuleOnFail, SubscriptionCadence, WorkInboxKind, FieldKind, RecordsResult, ArchiveLane, ArchivedRow, FormSummary, PortalCard, PortalPrincipal, PortalPreviewRow, MySubscription, DashboardBlockKind, AggregateBucket, AggregateMeasure, DashboardBlock, DashboardSummary, DocTemplateRow, DocRenderRow, QuietHours, DashboardBlockResult, ChecklistRunStep, BookingSummary, CaptureSheetFace, CaptureField, AnonTokenBinding, RecordsConfig, RecordsActor, RecordsDataSource, HistoryActor, FieldHistoryEntry, FieldTypeWord } from '@ai-matrx/records';
5
- import { Uuid, RecordFilter as RecordFilter$1, Field as Field$1, ReadRow as ReadRow$1 } from '@ai-matrx/records/react';
4
+ import { PermissionLevel, Table, RecordScopeContext, EnrichCell, RecordsError, Uuid as Uuid$1, StoreFilter, AggregateFilter, Field, ReadRow, RecordDocument, RelationDisplay, WriteConflict, RecordsErrorCode, TableDecorations, DeclarableFieldKind, ParityFieldType, NewFieldDeclaration, RuleExpression, HiddenFieldNotice, ValueEnvelope, ChecklistRequirementKind, ContextPolicy, WorkDueState, FieldSensitivity, StageRuleOnFail, SubscriptionCadence, WorkApprovalState, WorkInboxKind, FieldKind, RecordFilter, RecordsResult, SavedViewRow, ArchiveLane, ArchivedRow, WorkInboxItem, FormSummary, PortalCard, PortalPrincipal, PortalPreviewRow, MySubscription, DashboardBlockKind, AggregateBucket, AggregateMeasure, AggregateCompare, DashboardTarget, DashboardBlock, DashboardSummary, DocTemplateRow, DocRenderRow, QuietHours, DashboardBlockResult, ChecklistRunStep, BookingSummary, CaptureSheetFace, CaptureField, AnonTokenBinding, RecordsConfig, RecordsActor, RecordsDataSource, HistoryActor, FieldHistoryEntry } from '@ai-matrx/records';
5
+ import { Uuid, StoreFilter as StoreFilter$1, Field as Field$1, ReadRow as ReadRow$1 } from '@ai-matrx/records/react';
6
6
  import { RecordsClient } from '@ai-matrx/records/core';
7
+ export { DEFAULT_FIELDS, DeclareResult, NewFieldSpec, NewTableSpec, addFields, declareTable, fieldDeclarationFor, tokenFor } from '@ai-matrx/records/core';
7
8
  import { FieldFormatConfig } from '@ai-matrx/design-system/field-formats';
8
9
  import { MatrxColumnDef } from '@ai-matrx/design-system/data-table/types';
9
10
  import { TableStyle, GroupAggregateSpec, GroupOrder, ChoiceColorLookup } from '@ai-matrx/design-system/data-table';
@@ -246,7 +247,13 @@ interface HostLayout {
246
247
  /** Draw it for this table, with the question the address asked when there is one. */
247
248
  render: (args: {
248
249
  tableId: Uuid$1;
249
- filter?: RecordFilter | undefined;
250
+ filter?: StoreFilter | undefined;
251
+ /**
252
+ * Opens the page's own export (CSV, XLSX, copy and transform) — the one export a table has,
253
+ * so a host layout's "Export this table…" never needs a second one or a hunt for a button.
254
+ * Absent on a page that draws no export.
255
+ */
256
+ openExport?: (() => void) | undefined;
250
257
  }) => ReactNode;
251
258
  }
252
259
  interface RecordsUiHost {
@@ -359,6 +366,25 @@ interface RecordsUiHost {
359
366
  recordId: Uuid$1;
360
367
  title: string;
361
368
  }) => void;
369
+ /**
370
+ * OPTIONAL. A TABLE'S AGENT BUTTON, PRESSED (TABLE-PARITY M3, lane DEFAULT-GRID-PARITY).
371
+ *
372
+ * A row action of kind `agent` ("Ask Dr. Whitfield") hands the row to an agent with the
373
+ * action's own `prompt`. Only the host can start that conversation — this package ships no
374
+ * chat — so the grid hands the row, the action's name and its prompt here, and the host
375
+ * opens its one chat surface bound to the record with that prompt as the opening ask. It is
376
+ * a separate port from `talkToRecord` because that one carries no prompt: a host that bound
377
+ * only `talkToRecord` would open an empty chat and silently drop what the button was for.
378
+ *
379
+ * ABSENT, NEVER DEAD: unbound, agent buttons are not drawn.
380
+ */
381
+ runAgentAction?: (target: {
382
+ tableId: Uuid$1;
383
+ recordId: Uuid$1;
384
+ title: string;
385
+ action: string;
386
+ prompt: string;
387
+ }) => void;
362
388
  /**
363
389
  * OPTIONAL. THE SERVER'S `records` TOOL (SCR-27).
364
390
  *
@@ -731,6 +757,15 @@ declare function rowNameIn(table: TitledTable, row: ReadRow | undefined, fallbac
731
757
  * 2026-09-20).
732
758
  */
733
759
  declare const WITHHELD_RECORD_LABEL = "A record you have not been given access to";
760
+ /**
761
+ * THE FIELD A CARD IS TITLED BY — kanban, calendar, gallery and pipeline alike.
762
+ *
763
+ * Order: the Table's `title_field` → a conventional name key (`title`, `name`, …) → the first
764
+ * text column in declared `sort` order → the first other column that can title (never a
765
+ * checkbox, never the group column, never a system stamp). `undefined` when nothing can, and
766
+ * the card falls back to `rowName`, which says "Untitled" rather than "false".
767
+ */
768
+ declare function cardTitleField(fields: readonly Field[], titleKey: string | null | undefined, exclude?: readonly (string | null | undefined)[]): Field | undefined;
734
769
 
735
770
  /** What a person has chosen: the table, and optionally which of its columns to show. */
736
771
  interface ReferenceChoice {
@@ -1031,6 +1066,18 @@ type GridGrouping = {
1031
1066
  order?: GroupOrder;
1032
1067
  /** The sections this view keeps shut, by the primitive's own group key. */
1033
1068
  collapsed?: string[];
1069
+ /**
1070
+ * SUB-GROUPS (lane S1-PRIME VIEW-KEYS; ui-bench LISTS "sub-grouping"): up to two more levels
1071
+ * inside each section, by Field key. At most three levels in all — the store refuses a fourth
1072
+ * (`custom.view_declare`). A layout that draws one level ignores the rest; it never drops them,
1073
+ * because this list is parsed and written back whole with the rest of the look.
1074
+ */
1075
+ then?: GridSubGroup[];
1076
+ };
1077
+ /** One sub-group level: a Field key and its section order. */
1078
+ type GridSubGroup = {
1079
+ field: string;
1080
+ order?: GroupOrder;
1034
1081
  };
1035
1082
  /** Everything a view says about how its table LOOKS. */
1036
1083
  type GridPresentation = {
@@ -1055,6 +1102,33 @@ type GridPresentation = {
1055
1102
  widths?: Record<string, number>;
1056
1103
  /** The body row height this view remembers, in px. */
1057
1104
  rowHeight?: number;
1105
+ /**
1106
+ * Field keys hidden from this view — the SAME hidden-column list the grid's
1107
+ * own column picker holds, now given a place on the view so it survives a
1108
+ * reload and a layout switch reads the identical set gallery and grid agree
1109
+ * on, rather than a second "fields shown" list nobody kept in sync.
1110
+ */
1111
+ hiddenFields?: string[];
1112
+ /**
1113
+ * The gallery's card size, remembered the same way the grid remembers its
1114
+ * row height — a per-view look, not a global default.
1115
+ */
1116
+ gallerySize?: "small" | "medium" | "large";
1117
+ /**
1118
+ * THIS VIEW'S OWN LAYOUT CHOICES, over the organization's `custom/grid_layout` knob (lane
1119
+ * DEFAULT-GRID-PARITY, TABLE-PARITY D1 D5 D6). Absent means "whatever the organization
1120
+ * says"; present is the view's word. `freezeFirst: false` is an explicit NO over an
1121
+ * organization that freezes the first column — an empty `frozen` cannot say that.
1122
+ */
1123
+ wrap?: boolean;
1124
+ fit?: "auto" | "fit" | "scroll";
1125
+ freezeFirst?: boolean;
1126
+ /**
1127
+ * THE SUMMARY BAR (TABLE-PARITY F1): Field key → the store measure shown under that column
1128
+ * (`count`, `sum`, `avg`, `min`, `max`, `median`, `filled`, `empty`, `unique`), worked out
1129
+ * by `custom.record_aggregate` over the whole table.
1130
+ */
1131
+ summaries?: Record<string, string>;
1058
1132
  };
1059
1133
  declare const EMPTY_PRESENTATION: GridPresentation;
1060
1134
  /** A frozen column needs a known width, or the table declines to freeze at all. */
@@ -1103,6 +1177,42 @@ declare function currencyCodeFor(unit: string | null | undefined): string;
1103
1177
  * that changes and every screen follows.
1104
1178
  */
1105
1179
  declare const colorFromTheValue: ChoiceColorLookup;
1180
+ /**
1181
+ * G1's TABLE-LEVEL COLORS (`custom.table_decorations` / `client.tableDecorations`),
1182
+ * TRANSLATED INTO A `TableStyle` — the same document a saved view's own `presentation.style`
1183
+ * is, so one resolver (`resolveTableStyle`, below) can treat "the table's colors" and "this
1184
+ * view's colors" as two layers of the SAME thing instead of two unrelated systems.
1185
+ *
1186
+ * THE TRANSLATION IS NECESSARY AND IT IS THE ONLY ONE. G1 addresses a Field by its ID
1187
+ * (REC-17 — a column renamed keeps its color), because it is the STORE's own door; a
1188
+ * `TableStyle` addresses a Field by its KEY, because it reads straight off `row.document`,
1189
+ * which is keyed by Field key. A rule or a color-by whose Field has been deleted (its id no
1190
+ * longer resolves to a key) is dropped rather than crashing the whole style — a defect in
1191
+ * one rule costs that rule, never the read.
1192
+ */
1193
+ declare function styleFromDecorations(decorations: TableDecorations | null | undefined, fields: readonly Field[]): TableStyle;
1194
+ /**
1195
+ * THE ONE PRESENTATION RESOLVER every colored surface in this package reads —
1196
+ * `Grid`, and (via `Card`) the kanban board, the calendar and the gallery.
1197
+ *
1198
+ * THE CLASS THIS CLOSES (lane UI-QUICK-1, TABLE-PARITY review, 2026-09-24). Threading
1199
+ * `view.presentation.style` into `Card` closed the instance the CALENDAR-GALLERY bench
1200
+ * found — a VIEW that had its own color-by looked right everywhere — but it left the
1201
+ * class open: a table whose colors are the ORGANIZATION's decorations (G1's
1202
+ * `custom.table_decorations` — "color rows by Account Type", "MAXED and NEAR rules" on
1203
+ * Arman's own Coding Accounts table) and whose views never set a `presentation.style` of
1204
+ * their own drew NOTHING, on the grid exactly as much as on every other layout, because
1205
+ * nothing in this package had ever read G1's door at all.
1206
+ *
1207
+ * TWO LAYERS, ONE DOCUMENT. The table's decorations are the base coat — what every view
1208
+ * of this table shows until a view says otherwise. A view's OWN `presentation.style` is
1209
+ * an override, piece by piece: a view that only ever set manual row highlights still
1210
+ * inherits the table's color-by and rules for everything it never touched, and a view
1211
+ * that fully redecorated (its own `colorBy` AND its own `rules`) is not haunted by a
1212
+ * table rule it meant to replace. Per-piece, never all-or-nothing, because a view is a
1213
+ * LOOK on top of the table, not a wholesale substitute for it.
1214
+ */
1215
+ declare function resolveTableStyle(decorations: TableDecorations | null | undefined, fields: readonly Field[], viewStyle: TableStyle | undefined): TableStyle;
1106
1216
 
1107
1217
  /**
1108
1218
  * WHAT A TABLE WITH NO COLUMNS SAYS. Named here because the gate asserts on it:
@@ -1122,8 +1232,11 @@ interface GridProps {
1122
1232
  * own query. Never filter `rows` here: this grid only ever holds one page,
1123
1233
  * so filtering in the browser would drop every matching record on page two
1124
1234
  * and call the result the answer.
1235
+ *
1236
+ * S2-PRIME: either shape — the flat map, or a view's own nested question (the Rule shape);
1237
+ * the store compiles both into the one WHERE clause.
1125
1238
  */
1126
- filter?: RecordFilter$1 | undefined;
1239
+ filter?: StoreFilter$1 | undefined;
1127
1240
  /** Opened when a row is clicked. A host that has a record page passes its own. */
1128
1241
  onOpenRecord?: ((recordId: Uuid) => void) | undefined;
1129
1242
  /** SCR-2. Called when an admin clicks the "+" at the end of the headers. */
@@ -1200,6 +1313,36 @@ enrich?: {
1200
1313
  onPin?: ((recordId: Uuid, fieldKey: string, pinned: boolean) => void | Promise<void>) | undefined;
1201
1314
  }): MatrxColumnDef<ReadRow$1>;
1202
1315
 
1316
+ /** Answers "what is the record with this id called", for one Field's values. */
1317
+ type LabelLookup = (field: Field$1, id: string) => string | null;
1318
+ /**
1319
+ * HOW LONG A CELL MAY SAY "Loading…" BEFORE IT HAS TO SAY WHAT IT IS WAITING
1320
+ * FOR. One second is the span at which a person stops reading a word as "this
1321
+ * is about to happen" and starts reading it as "this is stuck" — the same line
1322
+ * Nielsen's response-time work draws and the one Linear and Stripe design to.
1323
+ */
1324
+ declare const SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS = 1000;
1325
+ /** Which ids a Field's stored value refers to. */
1326
+ declare function idsOf(value: unknown): string[];
1327
+ declare function isId(value: unknown): boolean;
1328
+ /** True when this Field's values are ids of other records rather than values. */
1329
+ declare function pointsAtRecords(field: Field$1): boolean;
1330
+ declare function RecordLabelProvider({ children }: {
1331
+ children: ReactNode;
1332
+ }): react.JSX.Element;
1333
+ /**
1334
+ * The hook a surface uses: it declares the Fields it is about to draw, and gets
1335
+ * back the lookup. Declaring is what makes one request per Field instead of one
1336
+ * per cell, and it is why a grid of 200 rows asks the store twice.
1337
+ */
1338
+ declare function useRecordLabels(fields: readonly Field$1[] | undefined): LabelLookup;
1339
+ /**
1340
+ * WHAT THIS COLUMN IS STILL WAITING FOR, or null while "Loading…" is still an
1341
+ * honest word. A cell draws this INSTEAD of "Loading…" once the resolver has
1342
+ * been looking for a second — see `SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS`.
1343
+ */
1344
+ declare function useLabelWait(field: Field$1 | undefined): string | null;
1345
+
1203
1346
  interface ExportMenuProps {
1204
1347
  tableId: Uuid;
1205
1348
  /** The rows on screen. Absent means "this table's first page", read the same way. */
@@ -1314,7 +1457,18 @@ type RelationFieldType = "relation";
1314
1457
  * `FIELD_TYPE_CHOICES`'s coverage and as a red `kindsWithNoChoice()` below — never as a
1315
1458
  * silence.
1316
1459
  */
1317
- type PickableFieldType = DeclarableFieldKind;
1460
+ type PickableFieldType = DeclarableFieldKind | SystemFieldKind | "entity_reference";
1461
+ /**
1462
+ * THE STORE'S OWN STAMPS AS COLUMNS (GRID-PRIMITIVES G5; TABLE-PARITY H2 H3, lane
1463
+ * DEFAULT-GRID-PARITY). `custom.field_declare` takes these three WORDS and makes each a formula
1464
+ * Field whose expression is the system node (`fx.autonumber`, `fx.created_time`,
1465
+ * `fx.modified_time`, `config.system` naming which), so nobody types into them and every reader
1466
+ * that serves a worked-out value serves them. `custom.field_kinds()` does not publish them,
1467
+ * because each is a formula, not a behaviour of its own. So they are named here, sent as their
1468
+ * word through the `{ type }` arm, and a new autonumber column numbers the records already in
1469
+ * the table through `custom.autonumber_backfill`.
1470
+ */
1471
+ type SystemFieldKind = "autonumber" | "created_time" | "modified_time";
1318
1472
  interface FieldTypeChoice {
1319
1473
  id: PickableFieldType;
1320
1474
  /** The word on the menu. */
@@ -1412,6 +1566,8 @@ declare function whatIsMissing(state: {
1412
1566
  formulaFields: string[];
1413
1567
  /** Only a link asks for one, so a caller about any other kind leaves it out. */
1414
1568
  relationTarget?: string;
1569
+ /** Only an entity-reference column asks for these (SC-R). */
1570
+ allowedTypes?: readonly string[];
1415
1571
  }): string | null;
1416
1572
 
1417
1573
  declare const NO_RULES_YET = "Nothing has to be true to get here yet.";
@@ -1499,29 +1655,37 @@ declare function ConditionRow({ lead, expr, fields, onChange, emptyLabel, classN
1499
1655
  * CAN THE BUILDER DRAW THIS CONDITION? — the question every caller asks before it renders,
1500
1656
  * and the reason a rule somebody cannot see is never silently saved over.
1501
1657
  *
1502
- * Drawable means: nothing; one clause; or an ALL/ANY of clauses, where a member may itself
1503
- * be one ALL/ANY of clauses and no deeper. `conditionIsSimple` is still the leaf test and
1504
- * still exported — `ConditionRow` alone is a legitimate mount (the form builder's one row).
1658
+ * Drawable means: nothing; one clause; or a group of drawable members, to any depth. `depth`
1659
+ * still limits it for a caller that wants a shallower builder (0 = one level of clauses and no
1660
+ * nested group). `conditionIsSimple` is still the leaf test and still exported.
1505
1661
  */
1506
1662
  declare function conditionIsDrawable(expr: RuleExpression | Record<string, unknown> | null | undefined, depth?: number): boolean;
1507
1663
  interface ConditionGroupProps {
1508
- /** The words before the condition: "When", "Ask only when". */
1664
+ /** The words before the condition: "When", "Ask only when", "Show jobs where". */
1509
1665
  lead: string;
1510
1666
  expr: RuleExpression | Record<string, unknown> | null | undefined;
1511
1667
  fields: ConditionField[];
1512
1668
  onChange: (next: RuleExpression | null) => void;
1513
1669
  /** What the empty option says: "always", "every card". */
1514
1670
  emptyLabel?: string;
1515
- /** false inside a nested group — one level of nesting, and the screen says so by omission. */
1671
+ /**
1672
+ * false draws one level of clauses and no "Add a group". Left out, groups nest as deep as a
1673
+ * person builds them — the depth the store compiles.
1674
+ */
1516
1675
  allowNesting?: boolean;
1676
+ /** How deep this group sits (0 = the whole condition). Set by the builder itself. */
1677
+ depth?: number;
1678
+ /** A nested group can take itself away; the outermost one cannot. */
1679
+ onRemove?: (() => void) | undefined;
1517
1680
  className?: string | undefined;
1518
1681
  }
1519
1682
  /**
1520
1683
  * THE ONE CONDITION BUILDER. One clause reads exactly as it always has — a single row, no
1521
- * joiner, no chrome — and the joiner appears only once there is something to join, so a
1522
- * person writing one condition never meets a control for a problem they do not have.
1684
+ * joiner, no chrome — and the joiner appears once there is something to join, so a person
1685
+ * writing one condition never meets a control for a problem they do not have. A nested group
1686
+ * always shows its joiner: it is a box with its own and / or, and that is the whole point of it.
1523
1687
  */
1524
- declare function ConditionGroup({ lead, expr, fields, onChange, emptyLabel, allowNesting, className, }: ConditionGroupProps): react.JSX.Element;
1688
+ declare function ConditionGroup({ lead, expr, fields, onChange, emptyLabel, allowNesting, depth, onRemove, className, }: ConditionGroupProps): react.JSX.Element;
1525
1689
 
1526
1690
  interface FieldProposalRow {
1527
1691
  id: string;
@@ -1594,6 +1758,40 @@ interface RelationPickerProps {
1594
1758
  }
1595
1759
  declare function RelationPicker({ field, value, onChange, disabled, id, className, allowCreate }: RelationPickerProps): react.JSX.Element;
1596
1760
 
1761
+ /** What the panel says while the chosen list is empty. */
1762
+ declare const ENTITY_REFERENCE_KINDS_MISSING = "Choose at least one kind of thing this column points at.";
1763
+ /**
1764
+ * The declaration an entity-reference column is sent as — the words `custom.field_declare`
1765
+ * reads (`type: "entity_reference"`, `allowed_types`, `multi`). One place builds it, so the field
1766
+ * editor, a table template and an agent never disagree on the shape.
1767
+ */
1768
+ declare function entityReferenceSpec(input: {
1769
+ label: string;
1770
+ allowedTypes: readonly string[];
1771
+ multi?: boolean;
1772
+ required?: boolean;
1773
+ }): {
1774
+ label: string;
1775
+ type: "entity_reference";
1776
+ allowed_types: string[];
1777
+ multi: boolean;
1778
+ required: boolean;
1779
+ };
1780
+ /** The sentence the panel shows before it lets a person save, or `null` when nothing is missing. */
1781
+ declare function whatIsMissingForEntityReference(allowedTypes: readonly string[]): string | null;
1782
+ interface EntityReferenceKindPickerProps {
1783
+ /** The chosen entity tokens (`config.allowed_types`). */
1784
+ value: readonly string[];
1785
+ onChange: (next: string[]) => void;
1786
+ /**
1787
+ * An existing column: the store keeps its kinds and this panel sends no change to them,
1788
+ * so the list is shown read-only rather than as a control that silently does nothing.
1789
+ */
1790
+ locked?: boolean;
1791
+ className?: string;
1792
+ }
1793
+ declare function EntityReferenceKindPicker({ value, onChange, locked, className }: EntityReferenceKindPickerProps): react.JSX.Element;
1794
+
1597
1795
  interface FieldEditorControlProps {
1598
1796
  field: Field;
1599
1797
  value: unknown;
@@ -1615,36 +1813,6 @@ declare function RecordChip({ title, onRemove, className, }: {
1615
1813
  className?: string | undefined;
1616
1814
  }): react.JSX.Element;
1617
1815
 
1618
- /** Answers "what is the record with this id called", for one Field's values. */
1619
- type LabelLookup = (field: Field$1, id: string) => string | null;
1620
- /**
1621
- * HOW LONG A CELL MAY SAY "Loading…" BEFORE IT HAS TO SAY WHAT IT IS WAITING
1622
- * FOR. One second is the span at which a person stops reading a word as "this
1623
- * is about to happen" and starts reading it as "this is stuck" — the same line
1624
- * Nielsen's response-time work draws and the one Linear and Stripe design to.
1625
- */
1626
- declare const SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS = 1000;
1627
- /** Which ids a Field's stored value refers to. */
1628
- declare function idsOf(value: unknown): string[];
1629
- declare function isId(value: unknown): boolean;
1630
- /** True when this Field's values are ids of other records rather than values. */
1631
- declare function pointsAtRecords(field: Field$1): boolean;
1632
- declare function RecordLabelProvider({ children }: {
1633
- children: ReactNode;
1634
- }): react.JSX.Element;
1635
- /**
1636
- * The hook a surface uses: it declares the Fields it is about to draw, and gets
1637
- * back the lookup. Declaring is what makes one request per Field instead of one
1638
- * per cell, and it is why a grid of 200 rows asks the store twice.
1639
- */
1640
- declare function useRecordLabels(fields: readonly Field$1[] | undefined): LabelLookup;
1641
- /**
1642
- * WHAT THIS COLUMN IS STILL WAITING FOR, or null while "Loading…" is still an
1643
- * honest word. A cell draws this INSTEAD of "Loading…" once the resolver has
1644
- * been looking for a second — see `SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS`.
1645
- */
1646
- declare function useLabelWait(field: Field$1 | undefined): string | null;
1647
-
1648
1816
  /** The envelope for one key, when the document carries one. */
1649
1817
  declare function envelopeFor(document: RecordDocument | undefined, key: string): ValueEnvelope | undefined;
1650
1818
  declare function renderValue(field: Field, value: unknown, document?: RecordDocument, labels?: LabelLookup, stillWaitingFor?: string | null): react.JSX.Element;
@@ -1682,7 +1850,7 @@ declare function ProvenanceBadge({ document, fieldKey }: {
1682
1850
  * export, a chat line) keeps calling `renderValue` with no resolver and says
1683
1851
  * "Loading…" rather than printing an id.
1684
1852
  */
1685
- declare function RecordValue({ field, value, document, format, }: {
1853
+ declare function RecordValue({ field, value, document, format, withheld, }: {
1686
1854
  field: Field;
1687
1855
  value: unknown;
1688
1856
  document?: RecordDocument | undefined;
@@ -1699,12 +1867,35 @@ declare function RecordValue({ field, value, document, format, }: {
1699
1867
  * blank.
1700
1868
  */
1701
1869
  format?: FieldFormatConfig | undefined;
1870
+ /**
1871
+ * THE STORE'S REASON, when it withheld this value from the reader (`ReadRow.hidden[key]`).
1872
+ * A withheld value reads "Withheld" with the store's sentence on hover — never "—", which
1873
+ * means the cell is empty (`withheld.tsx`).
1874
+ */
1875
+ withheld?: HiddenFieldNotice | null | undefined;
1702
1876
  }): react.JSX.Element;
1877
+ /**
1878
+ * WHAT ONE CARD SAYS — the kanban's, the calendar's, the gallery's and the pipeline's alike, so
1879
+ * no card can read a record differently from another. `field` is the card's title column
1880
+ * (`cardTitleField`); a value the store withheld reads "Withheld" and carries the store's reason
1881
+ * for the card's hover (`withheld.tsx`), never a bare "—".
1882
+ */
1883
+ declare function cardWords(record: {
1884
+ document?: RecordDocument | null;
1885
+ hidden?: Record<string, HiddenFieldNotice> | null;
1886
+ } & Parameters<typeof rowName>[0], field: Field | undefined, labels?: LabelLookup): {
1887
+ text: string;
1888
+ withheld: string | null;
1889
+ };
1703
1890
 
1704
1891
  declare const WORK_DUE_STATES: readonly ["overdue", "due_today", "scheduled", "undated", "finished"];
1705
1892
  declare const DUE_STATE_LABEL: Record<WorkDueState, string>;
1706
1893
  declare const WORK_INBOX_KINDS: readonly ["assignment", "approval", "proposal"];
1707
1894
  declare const WORK_INBOX_KIND_LABEL: Record<WorkInboxKind, string>;
1895
+ /** The heading an inbox grouped by kind reads (lane S5-PRIME) — plural, the way Linear groups. */
1896
+ declare const WORK_INBOX_KIND_GROUP_LABEL: Record<WorkInboxKind, string>;
1897
+ declare const WORK_APPROVAL_STATES: readonly ["pending", "approved", "declined", "withdrawn"];
1898
+ declare const WORK_APPROVAL_STATE_LABEL: Record<WorkApprovalState, string>;
1708
1899
  declare const CHECKLIST_REQUIREMENT_KINDS: readonly ["none", "note", "answer", "record_field", "form", "document"];
1709
1900
  declare const CHECKLIST_REQUIREMENT_LABEL: Record<ChecklistRequirementKind, string>;
1710
1901
  declare const FIELD_SENSITIVITY_LABEL: Record<FieldSensitivity, string>;
@@ -1870,6 +2061,14 @@ interface SavedViewSpec {
1870
2061
  * reading is a fact about the records.
1871
2062
  */
1872
2063
  measure?: string | null;
2064
+ /**
2065
+ * Kanban: the Field whose values cut the board into SWIMLANES across the columns — a
2066
+ * dispatcher's board by Status, one lane per Technician (S1-PRIME VIEW-KEYS). Never the
2067
+ * column Field itself; the store refuses that.
2068
+ */
2069
+ swimlaneField?: string | null;
2070
+ /** Kanban: the columns this view keeps shut to a strip, by the column's stored value. */
2071
+ collapsedColumns?: string[];
1873
2072
  /** Calendar: the Field that places a record in the month. */
1874
2073
  dateField?: string | null;
1875
2074
  /** Gallery: the Field shown large on the card. */
@@ -1880,6 +2079,22 @@ interface SavedViewSpec {
1880
2079
  * reference to its Rule record, never a predicate this package evaluates.
1881
2080
  */
1882
2081
  ruleId?: Uuid$1 | null;
2082
+ /**
2083
+ * THE FLAT FILTER a digest or a notify rule wrote the view with — the one shape
2084
+ * `custom.record_filter_sql` compiles, by Field KEY. A view saved in the bar has
2085
+ * none; a view saved by `DigestScheduler` ("where Status is Open") does, and the
2086
+ * grid and the board show exactly the records it names.
2087
+ */
2088
+ filters?: RecordFilter;
2089
+ /**
2090
+ * S2-PRIME — THE VIEW'S OWN QUESTION, as the condition builder writes it: the store's Rule
2091
+ * shape `{op, args}`, ALL / ANY / NOT groups nested to any depth, Fields by id. Kept in the
2092
+ * definition as `where` and asked of the store unchanged — the grid's list door, the board's
2093
+ * headings and the dashboard's numbers compile it into the one WHERE clause
2094
+ * (`custom.record_filter_sql`). Never stored under `filters`: that key is the flat map the
2095
+ * digests and the notifier read, and they would refuse it by name.
2096
+ */
2097
+ where?: RuleExpression | null;
1883
2098
  isDefault?: boolean;
1884
2099
  /**
1885
2100
  * HOW THIS VIEW LOOKS — its colors, its per-column formats and its frozen
@@ -1892,19 +2107,67 @@ interface SavedViewSpec {
1892
2107
  */
1893
2108
  presentation?: GridPresentation;
1894
2109
  }
1895
- /** A saved view as it comes back out of the store, with its record's own id. */
2110
+ /**
2111
+ * A saved view as it comes back out of the store, with its row's own id.
2112
+ *
2113
+ * It carries no version: `custom.view_declare` MERGES one key at a time, so two
2114
+ * tabs pressing two different controls on one view both stand, and one control
2115
+ * pressed in both keeps the latest — how Airtable and Notion keep a view change.
2116
+ */
1896
2117
  interface SavedView extends SavedViewSpec {
1897
2118
  id: Uuid$1;
2119
+ /** Where the view came from when it was moved in (the mover, the S0 repair), else null. */
2120
+ movedFrom: Record<string, unknown> | null;
1898
2121
  /**
1899
- * The record's version AT LOAD, read from `custom.io_revisions` for the one
1900
- * record being edited. The read door answers documents and not versions, so
1901
- * this is null until it has been read — and a save with a null version is an
1902
- * ordinary last-writer-wins write, exactly as the store defines it.
2122
+ * THE WAY THIS TABLE IS MEANT TO BE LOOKED AT, when somebody decided one — a layout id the
2123
+ * host draws (`sheet`), read off the stored kind before `layout` folds it to the four the
2124
+ * package draws. Null when nobody designated one. See `designatedLayoutOf`.
1903
2125
  */
1904
- version: number | null;
2126
+ designatedLayout?: string | null;
1905
2127
  }
1906
- /** The package-owned Table every saved view is a record of. */
1907
- declare const VIEW_TABLE: SystemTableSpec;
2128
+ /**
2129
+ * WHICH LAYOUT A VIEW WAS DESIGNATED, OR NULL (lane DATA-V2-FACE, owner 2026-09-24).
2130
+ *
2131
+ * "For something like my data tables, which are predetermined with a default view of 'Sheet'
2132
+ * I want to see … it just shows them the way it should in the default view. That's how you take
2133
+ * custom systems and fake like they're hard-coded builtin systems."
2134
+ *
2135
+ * A designation is a DELIBERATE write, never a click: a view whose stored kind is a layout the
2136
+ * HOST draws (`sheet` — a layout the store's view-keys registry declares, and one the layout
2137
+ * buttons never write onto a view). That is the ONE way a table is designated (lane
2138
+ * VIEW-KEYS-SHEET): the mover and the repair write `layout: "sheet"` on a copied older table's
2139
+ * default view; `moved_from` says only where a view came from and designates nothing. A package
2140
+ * kind (`grid`, `kanban`, …) is not a designation: picking Kanban writes `layout: "kanban"` onto
2141
+ * the view, and a click must never take the layout chooser away.
2142
+ */
2143
+ declare function designatedLayoutOf(definition: Record<string, unknown> | null | undefined): string | null;
2144
+ /**
2145
+ * HOW THE TABLE OPENS, decided once from its default view and the layouts the host draws.
2146
+ *
2147
+ * · `designated` — the default view names a host layout this host registered: the page opens
2148
+ * IN it and offers no other layout by default (the others sit in the page's one menu);
2149
+ * · `chooser` — nothing designated (or the host does not draw what was designated): the
2150
+ * page opens on the view's own layout and shows the layout chooser.
2151
+ *
2152
+ * Only the DEFAULT view designates: a person who opens another saved view is choosing, and the
2153
+ * chooser is theirs.
2154
+ */
2155
+ type TableOpening = {
2156
+ kind: "designated";
2157
+ hostLayout: string;
2158
+ } | {
2159
+ kind: "chooser";
2160
+ };
2161
+ declare function tableOpening(view: Pick<SavedView, "isDefault" | "designatedLayout"> | null | undefined, hostLayoutIds: readonly string[]): TableOpening;
2162
+ /**
2163
+ * THE TABLE'S DEFAULT VIEW WHEN MORE THAN ONE SAYS IT IS (lane DATA-V2-FACE-2).
2164
+ *
2165
+ * Two views can both claim the default: the mover's designated one (the older table's own, the
2166
+ * Sheet) and a page seed that a later move of the view bar's older store brings in beside it —
2167
+ * both named "All records", so the store's name order cannot tell them apart. A designation is a
2168
+ * deliberate write and a seed is not, so the designated default wins; then the first default.
2169
+ */
2170
+ declare function defaultViewOf<V extends Pick<SavedView, "isDefault" | "designatedLayout">>(views: readonly V[]): V | undefined;
1908
2171
  /**
1909
2172
  * WHICH FIELD EACH LAYOUT CAN BE DRAWN FROM, decided from the FIELD'S OWN
1910
2173
  * DECLARATION and never from the values it happens to hold.
@@ -1968,33 +2231,106 @@ declare function pageViewFromParam(raw: string | null | undefined): PageView | n
1968
2231
  declare function unknownViewLine(raw: string): string;
1969
2232
  /** The one sentence a layout says when the table holds no Field it could use. */
1970
2233
  declare const LAYOUT_NO_FIELD: Record<ViewLayout, string>;
1971
- /** The spec as the one document the store holds. */
2234
+ /**
2235
+ * THE SPEC AS THE ONE DEFINITION `platform.saved_view` HOLDS — the keys
2236
+ * `custom.view_declare` documents, by Field KEY. `subject` is not in it: the door
2237
+ * takes the Table as its own argument and writes `table_id` itself.
2238
+ */
1972
2239
  declare function viewDocument(spec: SavedViewSpec): Record<string, unknown>;
1973
- /** One stored record back into the spec a screen and an agent both read. */
1974
- declare function viewFromRecord(row: ReadRow): SavedView;
1975
2240
  /**
1976
- * WRITE A CHANGE ONTO A SAVED VIEW, AND KEEP IT (lane RECORDS-UI-FIX, VERIFIER-15 M4).
2241
+ * One row of `custom.views` back into the spec a screen and an agent both read — THROUGH THE ONE
2242
+ * ACCESSOR (`viewSettings`, viewKeys.ts), so every layout sees every declared key the same way.
2243
+ */
2244
+ declare function viewFromRow(row: SavedViewRow): SavedView;
2245
+ /**
2246
+ * SAVE ONE NEW VIEW of a Table — the bar's "New view" and an agent's seed spec.
2247
+ * One `view_declare` with no `view_id`; the answer is the new view's id.
2248
+ */
2249
+ declare function declareView(client: Pick<RecordsClient, "viewDeclare">, spec: SavedViewSpec): Promise<RecordsResult<Uuid$1>>;
2250
+ /**
2251
+ * WRITE A CHANGE ONTO A SAVED VIEW, AND KEEP IT.
1977
2252
  *
1978
- * The version a screen holds for a view is read from the view's history, and the
1979
- * history can be SHORT of the record — measured on the dev clone 2026-09-23: 68 live
1980
- * records whose version is ahead of their newest history row, among them the
1981
- * Birchwood quote board's view (record at 4, history stopping at 3). Every layout
1982
- * press carried 3 and was refused `stale_write`, forever, and nothing said so.
2253
+ * `custom.view_declare` with the view's id MERGES: only the keys in `patch` are
2254
+ * written, a key cleared to null is removed, and everything the patch did not
2255
+ * name — the grid's own choices, a hand-set order, where the view was moved from,
2256
+ * a colour set in another tab — stays exactly as it was (S0, 2026-09-23: the door
2257
+ * used to rebuild the whole definition from what one press sent).
1983
2258
  *
1984
- * So a conflict is answered with the version the refusal itself names as the winner,
1985
- * and the change is sent once more on it. A saved view is a person's own arrangement
1986
- * of a table: their latest press is the one that should stand, the way Airtable and
1987
- * Notion keep the last view change. Anything still refused is handed back, for the
1988
- * page to say through the one notice.
2259
+ * There is no version to be stale against (VERIFIER-15 M4 is closed by the shape,
2260
+ * not by a retry): a saved view is a person's own arrangement of a table, and
2261
+ * their latest press on a control is the one that stands. A refusal — the view
2262
+ * was removed, or belongs to a table this person cannot open — is handed back for
2263
+ * the page to say through the one notice.
1989
2264
  */
1990
- declare function saveViewPatch(client: Pick<RecordsClient, "recordUpdate">, viewId: Uuid$1, document: Record<string, unknown>, expectedVersion: number | null): Promise<RecordsResult<number>>;
2265
+ declare function saveViewPatch(client: Pick<RecordsClient, "viewDeclare">, tableId: Uuid$1, viewId: Uuid$1, patch: Partial<SavedViewSpec>): Promise<RecordsResult<Uuid$1>>;
1991
2266
  /**
1992
- * A PARTIAL change to a saved view, as the patch the store takes. Only the keys
1993
- * the caller actually changed are written — a full document would re-write a
1994
- * name or a rule the person edited in another tab.
2267
+ * A PARTIAL change to a saved view, as the definition keys the door merges. Only
2268
+ * the keys the caller actually changed are sent; a Field cleared (a board with no
2269
+ * "Group by") is sent as `null`, which the door removes.
1995
2270
  */
1996
2271
  declare function viewPatchDocument(patch: Partial<SavedViewSpec>): Record<string, unknown>;
1997
2272
 
2273
+ /** Every surface a saved view is drawn by. `sheet` is the spreadsheet surface (G-lanes). */
2274
+ type ViewKeyLayout = "grid" | "kanban" | "calendar" | "gallery" | "sheet";
2275
+ /** Who may write a key: anyone who may save the view, an input the door rewrites, or the server only. */
2276
+ type ViewKeyWriter = "caller" | "input" | "server";
2277
+ interface ViewKeyDeclaration {
2278
+ /** Where it lives in `platform.saved_view.definition` (dotted under `presentation`). */
2279
+ path: string;
2280
+ /** What the store's guard checks (`custom._view_key_value`). */
2281
+ shape: string;
2282
+ /** The layouts that read it. */
2283
+ layouts: readonly ViewKeyLayout[];
2284
+ writer: ViewKeyWriter;
2285
+ }
2286
+ /**
2287
+ * THE REGISTRY, as `custom.view_keys()` declares it (uichamp_s1_a_view_keeps_every_setting_it_is_given.sql).
2288
+ * Order and content are compared with the store by the live walk.
2289
+ */
2290
+ declare const VIEW_KEYS: readonly ViewKeyDeclaration[];
2291
+ /** The keys one layout reads, by path. */
2292
+ declare function viewKeysFor(layout: ViewKeyLayout): string[];
2293
+ /** One sort clause: a Field key and a direction. */
2294
+ interface ViewSortKey {
2295
+ field: string;
2296
+ direction: "asc" | "desc";
2297
+ }
2298
+ /**
2299
+ * EVERY DECLARED KEY OF A VIEW, TYPED. Absent keys are `null` / empty, never guessed.
2300
+ * `presentation` is the parsed look (colour field, pinned fields, row height, grouping with its
2301
+ * sub-groups and shut sections, hidden fields, gallery size, summaries).
2302
+ */
2303
+ interface ViewSettings {
2304
+ layout: "grid" | "kanban" | "calendar" | "gallery";
2305
+ filters: RecordFilter | null;
2306
+ where: RuleExpression | null;
2307
+ groupField: string | null;
2308
+ swimlaneField: string | null;
2309
+ collapsedColumns: string[];
2310
+ measure: string | null;
2311
+ dateField: string | null;
2312
+ imageField: string | null;
2313
+ sorts: ViewSortKey[];
2314
+ ruleId: string | null;
2315
+ isDefault: boolean;
2316
+ presentation: GridPresentation;
2317
+ movedFrom: Record<string, unknown> | null;
2318
+ }
2319
+ /** THE READER. A stored `definition` (and the row's flat `filters`) in, every declared key out. */
2320
+ declare function viewSettings(definition: Record<string, unknown> | null | undefined, rowFilters?: RecordFilter | null): ViewSettings;
2321
+ /** The settings as the spec names them — what `viewSettingsPatch` takes. */
2322
+ type ViewSettingsPatch = Partial<Omit<ViewSettings, "movedFrom">>;
2323
+ /**
2324
+ * THE KEYS ONE LAYOUT READS, and nothing else. A layout that does not use a key never sees it:
2325
+ * a calendar is not told the board's swimlanes, a board is not told the grid's pinned fields.
2326
+ */
2327
+ declare function viewSettingsFor(settings: ViewSettings, layout: ViewKeyLayout): Partial<ViewSettings>;
2328
+ /**
2329
+ * THE WRITER'S SHAPE. Only the keys a press changed; a cleared Field is `null` (the door removes
2330
+ * it); lists are sent whole. `presentation` is sent whole because the door judges it as one key.
2331
+ */
2332
+ declare function viewSettingsPatch(patch: ViewSettingsPatch): Record<string, unknown>;
2333
+
1998
2334
  interface ViewSwitcherProps {
1999
2335
  /**
2000
2336
  * THE DECLARATIVE SPEC — an agent writes the whole thing, a person tweaks it.
@@ -2024,13 +2360,23 @@ interface ViewSwitcherProps {
2024
2360
  /** "Who changed this?" from a grid cell — the host opens that column's timeline. */
2025
2361
  onAskWhoChanged?: ((fieldKey: string, recordId: Uuid) => void) | undefined;
2026
2362
  pageSize?: number | undefined;
2363
+ /**
2364
+ * THE TABLE'S OWN TITLE COLUMN (`title_field`, REC-2), from the table the host already holds.
2365
+ * Every card is named by it (`cardTitleField`); the switcher never reads the table a second
2366
+ * time to find it. Left out, a card is titled by a conventional name column, then the first
2367
+ * text column — never a checkbox or the column the board is grouped by.
2368
+ */
2369
+ titleField?: string | null | undefined;
2027
2370
  /**
2028
2371
  * THE QUESTION THE ADDRESS ASKED, in the store's one filter shape — the same
2029
2372
  * object the chart counted with. It narrows the grid AND the board through
2030
2373
  * the store, so switching layout after a drill-through keeps the same rows
2031
2374
  * instead of quietly widening back to the whole table.
2375
+ *
2376
+ * S2-PRIME: either shape — a flat map, or the view's own nested question (`where`, the
2377
+ * store's Rule shape). The grid, the board's headings and the numbers all ask it.
2032
2378
  */
2033
- filter?: RecordFilter | undefined;
2379
+ filter?: StoreFilter | undefined;
2034
2380
  /**
2035
2381
  * The HOST layout showing now (`RecordsUiHost.layouts`, by id), or null for the
2036
2382
  * package's own. Controlled by the page, because the address names it.
@@ -2038,10 +2384,18 @@ interface ViewSwitcherProps {
2038
2384
  hostLayout?: string | null | undefined;
2039
2385
  /** The person picked a host layout (its id), or went back to one of the four (null). */
2040
2386
  onHostLayoutChange?: ((id: string | null) => void) | undefined;
2387
+ /**
2388
+ * Whether this component draws its own row — the view's name and the layout buttons. `false`
2389
+ * when the page that mounts it draws the layout choice itself (`TablePage` keeps one control
2390
+ * cluster for the whole table, lane DATA-V2-FACE). Default `true`, for every other host.
2391
+ */
2392
+ chooser?: boolean | undefined;
2393
+ /** Handed to a host layout's `render` — the page's own export. */
2394
+ openExport?: (() => void) | undefined;
2041
2395
  className?: string | undefined;
2042
2396
  }
2043
2397
  /** The records this view holds: its Rule's members when it names one, the table otherwise. */
2044
- declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?: RecordFilter): {
2398
+ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?: StoreFilter): {
2045
2399
  rows: ReadRow$1[];
2046
2400
  loading: boolean;
2047
2401
  error: RecordsError | null;
@@ -2059,7 +2413,7 @@ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?:
2059
2413
  */
2060
2414
  membership: string;
2061
2415
  };
2062
- declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize, filter, hostLayout, onHostLayoutChange, className, }: ViewSwitcherProps): react.JSX.Element;
2416
+ declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize, titleField, filter, hostLayout, onHostLayoutChange, chooser, openExport, className, }: ViewSwitcherProps): react.JSX.Element;
2063
2417
 
2064
2418
  /** What the screen says above the list, so nobody has to be told twice that nothing was destroyed. */
2065
2419
  declare const ARCHIVE_MEANS = "Archiving never destroys anything. A record you remove from the grid waits here until somebody brings it back.";
@@ -2142,15 +2496,28 @@ interface ViewBarProps {
2142
2496
  * The person tweaks them afterwards like any other view.
2143
2497
  */
2144
2498
  seed?: SavedViewSpec[] | undefined;
2499
+ /**
2500
+ * Draw nothing while the table has at most one saved view (lane DATA-V2-FACE). One view is not
2501
+ * a choice, and a row of one tab is chrome over the table; the page offers "Saved views" in its
2502
+ * menu instead. Two or more views are a real choice and the bar draws.
2503
+ */
2504
+ quietWhenAlone?: boolean | undefined;
2505
+ /** Every time the list is read: the views, or null when they could not be read. */
2506
+ onViews?: ((views: SavedView[] | null) => void) | undefined;
2145
2507
  className?: string | undefined;
2146
2508
  }
2147
2509
  /**
2148
- * What the bar says when this organization's saved-view Table cannot be levelled. It
2149
- * names the ONE thing that is missing (the remembered layouts) and nothing else, because
2150
- * everything else on the page still works and a longer sentence would suggest otherwise.
2510
+ * What the bar says when the saved views cannot be read. It names the ONE thing that is
2511
+ * missing (the remembered layouts) and nothing else, because everything else on the page
2512
+ * still works and a longer sentence would suggest otherwise.
2151
2513
  */
2152
2514
  declare const SAVED_VIEWS_UNAVAILABLE: string;
2153
- declare function ViewBar({ tableId, activeViewId, onActiveView, seed, className }: ViewBarProps): react.JSX.Element;
2515
+ /**
2516
+ * WHETHER A SEED IS ALREADY THERE. A view by the seed's name always satisfies it; a DEFAULT seed
2517
+ * is also satisfied by any view the table already marks as its default, whatever it is called.
2518
+ */
2519
+ declare function seedIsSatisfied(seed: SavedViewSpec, views: readonly SavedView[]): boolean;
2520
+ declare function ViewBar({ tableId, activeViewId, onActiveView, seed, quietWhenAlone, onViews, className }: ViewBarProps): react.JSX.Element | null;
2154
2521
 
2155
2522
  /** One proposed change, in the proposer's words plus the exact act it asks for. */
2156
2523
  interface ProposedChange {
@@ -2207,19 +2574,31 @@ declare function ProposalRow({ change, outcome, onApply, onReject, readOnlyReaso
2207
2574
  /** The three things that land in the queue, exactly as the door names them. */
2208
2575
  declare const ACTION_KINDS: readonly ["approval", "assignment", "proposal"];
2209
2576
  type ActionKind = WorkInboxKind;
2577
+ /** How the rows are gathered under headings. `g` cycles kind → table → none. */
2578
+ type InboxGrouping = "kind" | "table" | "none";
2579
+ declare const INBOX_GROUPINGS: readonly InboxGrouping[];
2580
+ interface InboxGroup {
2581
+ key: string;
2582
+ label: string | null;
2583
+ items: WorkInboxItem[];
2584
+ }
2585
+ /** THE grouping, pure: the headings and, flattened, the order the keys walk. */
2586
+ declare function groupInbox(items: readonly WorkInboxItem[], by: InboxGrouping): InboxGroup[];
2210
2587
  interface ActionInboxProps {
2211
2588
  /**
2212
- * Narrow to one table's work. The door answers the organization; this filters
2213
- * the assignments to the table a person is looking at, and leaves approvals
2214
- * and proposals alone because those are about a change, not about a table.
2589
+ * Narrow to one table's work. Every row now carries the table it is about
2590
+ * (lane S5-PRIME), so this narrows approvals, proposals and assignments alike;
2591
+ * when the table has nothing, the inbox says how many wait elsewhere and offers them.
2215
2592
  */
2216
2593
  tableId?: Uuid | null | undefined;
2217
- /** Show decided rows too. The default is what is still waiting. */
2594
+ /** Show decided rows too, from the start. `h` (or the button) toggles it. */
2218
2595
  includeSettled?: boolean | undefined;
2596
+ /** How the rows start out grouped. Default: by kind. */
2597
+ defaultGroupBy?: InboxGrouping | undefined;
2219
2598
  onOpenRecord?: ((recordId: Uuid, tableId: Uuid) => void) | undefined;
2220
2599
  className?: string | undefined;
2221
2600
  }
2222
- declare function ActionInbox({ tableId, includeSettled, onOpenRecord, className }: ActionInboxProps): react.JSX.Element;
2601
+ declare function ActionInbox({ tableId, includeSettled, defaultGroupBy, onOpenRecord, className, }: ActionInboxProps): react.JSX.Element;
2223
2602
 
2224
2603
  interface HistoryPanelProps {
2225
2604
  tableId: Uuid;
@@ -2285,6 +2664,13 @@ interface FormTheme {
2285
2664
  accent?: string | null;
2286
2665
  align?: "left" | "center" | null;
2287
2666
  }
2667
+ /** The screen after sending: the form's words, and optionally where to go next. */
2668
+ interface FormThankYou {
2669
+ title?: string | null;
2670
+ body?: string | null;
2671
+ /** A secure page on one of the organization's own sites. The store judges it. */
2672
+ redirectUrl?: string | null;
2673
+ }
2288
2674
  /** THE COMPLETE DECLARATIVE SPEC. One `record_write` and the form exists. */
2289
2675
  interface FormSpec {
2290
2676
  name: string;
@@ -2294,10 +2680,15 @@ interface FormSpec {
2294
2680
  questions: FormQuestionSpec[];
2295
2681
  flow?: FormFlow | null;
2296
2682
  theme?: FormTheme | null;
2297
- thankYou?: {
2298
- title: string;
2299
- body?: string | null;
2300
- } | null;
2683
+ /**
2684
+ * WHAT THE PERSON SEES AFTER SENDING. `title` and `body` are the form's own
2685
+ * words for the next step ("You are all set" / "Next, book your first visit").
2686
+ * `redirectUrl` optionally sends them on to a page instead — and only ever to
2687
+ * one of the organization's own sites: `custom.form_declare` refuses anything
2688
+ * else by name, and `custom.form_public` stops handing it out the moment its
2689
+ * site leaves the organization's list (lane S7-PRIME).
2690
+ */
2691
+ thankYou?: FormThankYou | null;
2301
2692
  submitLabel?: string | null;
2302
2693
  /**
2303
2694
  * Is this form meant to be answerable by someone who is not signed in? The
@@ -2453,6 +2844,8 @@ interface PortalCardViewProps {
2453
2844
  onPreview: (person: PortalPrincipal, tableId: Uuid) => Promise<PortalAnswer<PortalPreviewRow[]>>;
2454
2845
  /** The invite control, which needs a client of its own. Absent means none is offered. */
2455
2846
  invite?: ReactNode;
2847
+ /** S6 — the look-and-forms editor, which needs a client of its own. Absent means none is offered. */
2848
+ look?: ReactNode;
2456
2849
  /**
2457
2850
  * Where this app is served from, so a person's own invitation link can be copied whole.
2458
2851
  * Omit it and the view falls back to the browser's origin, which keeps this component
@@ -2461,7 +2854,16 @@ interface PortalCardViewProps {
2461
2854
  origin?: string | undefined;
2462
2855
  className?: string | undefined;
2463
2856
  }
2464
- declare function PortalCardView({ card, tableId, onRevoke, onPreview, invite, origin, className, }: PortalCardViewProps): react.JSX.Element;
2857
+ declare function PortalCardView({ card, tableId, onRevoke, onPreview, invite, look, origin, className, }: PortalCardViewProps): react.JSX.Element;
2858
+
2859
+ interface PortalLookEditorProps {
2860
+ /** Exactly what `custom.portal_card` answered. */
2861
+ card: PortalCard;
2862
+ /** Called after the store took the new look; the host re-reads the card. */
2863
+ onSaved: () => void;
2864
+ className?: string | undefined;
2865
+ }
2866
+ declare function PortalLookEditor({ card, onSaved, className }: PortalLookEditorProps): react.JSX.Element;
2465
2867
 
2466
2868
  interface DigestSchedulerProps {
2467
2869
  /** The Table the digest is about. A saved view is a view OF something. */
@@ -2622,6 +3024,10 @@ interface ChartSpec {
2622
3024
  stateKey?: string;
2623
3025
  /** `stuck` only: how long a record may sit on the same value. */
2624
3026
  days?: number;
3027
+ /** S3 — the comparison this block makes, as the store stores it. */
3028
+ compare?: AggregateCompare | null;
3029
+ /** S3 — the number this block aims for. */
3030
+ target?: DashboardTarget | null;
2625
3031
  }
2626
3032
  /** A dashboard as `custom.dashboards` reports it, in the screen's own words. */
2627
3033
  interface SavedDashboard {
@@ -2794,9 +3200,17 @@ interface NotifyRuleEditorProps {
2794
3200
  tableId: Uuid;
2795
3201
  /** COMPLETE declarative subscriptions an agent wrote. Saved once, never overwritten. */
2796
3202
  seed?: NotifyRuleSpec[] | undefined;
3203
+ /**
3204
+ * CHOOSE MODE — the subscription something else points at (a form's notify
3205
+ * Rule). Given with `onChoose`, each subscription offers to be the one, and a
3206
+ * subscription made here becomes the one the moment the store has it.
3207
+ */
3208
+ chosenRuleId?: Uuid | null | undefined;
3209
+ /** CHOOSE MODE — called with the chosen subscription's Rule id, or null to choose none. */
3210
+ onChoose?: ((ruleId: Uuid | null) => void) | undefined;
2797
3211
  className?: string | undefined;
2798
3212
  }
2799
- declare function NotifyRuleEditor({ tableId, seed, className }: NotifyRuleEditorProps): react.JSX.Element;
3213
+ declare function NotifyRuleEditor({ tableId, seed, chosenRuleId, onChoose, className }: NotifyRuleEditorProps): react.JSX.Element;
2800
3214
 
2801
3215
  interface ChartBlockProps {
2802
3216
  /** One block out of the canvas's single run — answered, or refused. */
@@ -2832,6 +3246,24 @@ interface FormsPanelProps {
2832
3246
  declare const FORM_NOT_HERE_LINE: string;
2833
3247
  declare function FormsPanel({ tableId, activeFormId, className }: FormsPanelProps): react.JSX.Element;
2834
3248
 
3249
+ /**
3250
+ * What the public arm's `whichAsked` answers: for each question, whether the
3251
+ * STORE says it is asked given the answers so far. `said` is the store's own
3252
+ * sentence when it could not work a condition out — that question is asked, and
3253
+ * the sentence is shown, never a silent hide.
3254
+ */
3255
+ type FormAsked = {
3256
+ ok: true;
3257
+ asks: ReadonlyArray<{
3258
+ field: string;
3259
+ asked: boolean;
3260
+ said?: string | null;
3261
+ }>;
3262
+ } | {
3263
+ ok: false;
3264
+ message: string;
3265
+ error?: RecordsError | undefined;
3266
+ };
2835
3267
  /** What the public arm's `onSubmit` answers. A refusal carries the door's words. */
2836
3268
  type FormSubmitOutcome = {
2837
3269
  ok: true;
@@ -2858,11 +3290,31 @@ interface FormRunnerProps {
2858
3290
  fields?: readonly Field[] | undefined;
2859
3291
  /** PUBLIC ARM — where an answer goes. Server action or route handler. */
2860
3292
  onSubmit?: ((values: Record<string, unknown>) => Promise<FormSubmitOutcome>) | undefined;
3293
+ /**
3294
+ * PUBLIC ARM — which questions are asked next, answered by the STORE on the
3295
+ * server (`custom.form_public_asks`). Asked again as answers change. Left out
3296
+ * on a form with conditions, every question is shown and the form says why.
3297
+ */
3298
+ whichAsked?: ((values: Record<string, unknown>) => Promise<FormAsked>) | undefined;
2861
3299
  /**
2862
3300
  * PUBLIC ARM — the name of a decoy input. A person never fills it; a script
2863
3301
  * fills everything. The door decides what a filled one means, not this screen.
2864
3302
  */
2865
3303
  honeypotKey?: string | null | undefined;
3304
+ /**
3305
+ * Answers the form starts with — a prefilled link, or a saved place being
3306
+ * resumed. They are ordinary answers: shown in their questions, changeable,
3307
+ * and handed to `whichAsked` like any typed answer, so branching follows.
3308
+ */
3309
+ initialAnswers?: Readonly<Record<string, unknown>> | undefined;
3310
+ /** Every change to the answers, after the first paint. The host keeps the place. */
3311
+ onAnswersChange?: ((answers: Record<string, unknown>) => void) | undefined;
3312
+ /**
3313
+ * `initialAnswers` is a saved place the person is coming back to, so the form
3314
+ * opens on the first question still waiting for an answer. Without it a
3315
+ * prefilled form opens on question one, showing the prefilled answer in place.
3316
+ */
3317
+ resumed?: boolean | undefined;
2866
3318
  /** Preview mode answers the questions but writes nothing, and says so. */
2867
3319
  preview?: boolean | undefined;
2868
3320
  onSubmitted?: ((recordId: Uuid | null) => void) | undefined;
@@ -3233,11 +3685,48 @@ interface TablesHomeProps {
3233
3685
  * did before, rather than on a screen it does not know how to address.
3234
3686
  */
3235
3687
  onOpenTable?: ((tableId: Uuid$1, dashboardId?: Uuid$1) => void) | undefined;
3688
+ /**
3689
+ * THE ORGANIZATION EVERY ROW HERE LIVES IN, BY NAME (lane SC-1-TAILS; access-is-personal: a
3690
+ * list filtered by one organization says which). Each row carries a quiet "Lives in <name>"
3691
+ * chip that, pressed, asks the store where that table lives and — for its owner — where else
3692
+ * it can go. Absent: the list asks the store once, for its first table. When the store cannot
3693
+ * name it, the chips are absent rather than a row of "unknown".
3694
+ */
3695
+ organizationName?: string | null | undefined;
3696
+ /**
3697
+ * ONLY THE WAYS TO MAKE A TABLE — New table, Start from an example, and the import that
3698
+ * follows — and none of the lists (lane UI-FIX-18, VERIFIER-18 M3). A host page that already
3699
+ * lists the organization's tables, dashboards and booking pages (matrx-frontend's
3700
+ * organization hub) passes this, so one page never draws two full lists of the same tables.
3701
+ * Default false: the package's own home, lists and all.
3702
+ */
3703
+ makingOnly?: boolean | undefined;
3236
3704
  className?: string | undefined;
3237
3705
  }
3238
- declare function TablesHome({ onOpenTable, className }: TablesHomeProps): react.JSX.Element;
3706
+ declare function TablesHome({ onOpenTable, organizationName, makingOnly, className }: TablesHomeProps): react.JSX.Element;
3239
3707
 
3240
- type Rail = "none" | "settings" | "inbox" | "import" | "field" | "record" | "new-record" | "forms" | "bookings" | "checklists" | "notifications" | "portals" | "who-changed";
3708
+ interface WhereItLivesProps {
3709
+ tableId: Uuid$1;
3710
+ /**
3711
+ * The name the screen already holds (a list whose rows all live in one organization), shown
3712
+ * until the store answers — and, on a row, instead of asking at all until the chip is pressed:
3713
+ * forty rows are not forty reads.
3714
+ */
3715
+ knownOrganizationName?: string | null | undefined;
3716
+ /** After a move lands: the host re-reads (the list, its rows, the page). */
3717
+ onMoved?: ((to: {
3718
+ id: Uuid$1;
3719
+ name: string;
3720
+ }) => void) | undefined;
3721
+ /**
3722
+ * `row` is quieter, for a list; `header` for an object page's own row; `title` rides the page
3723
+ * header beside the object's name (Linear's team beside the issue title) — no frame, muted.
3724
+ */
3725
+ variant?: "header" | "row" | "title" | undefined;
3726
+ }
3727
+ declare function WhereItLives({ tableId, knownOrganizationName, onMoved, variant }: WhereItLivesProps): react.JSX.Element;
3728
+
3729
+ type Rail = "none" | "settings" | "inbox" | "import" | "field" | "record" | "new-record" | "forms" | "bookings" | "checklists" | "notifications" | "portals" | "who-changed" | "export";
3241
3730
  interface TablePageProps {
3242
3731
  tableId: Uuid$1;
3243
3732
  /** Rows per page for every layout. */
@@ -3371,6 +3860,20 @@ interface TablePageProps {
3371
3860
  * said out loud by the rail, never replaced by its first row.
3372
3861
  */
3373
3862
  activeItemId?: Uuid$1 | null | undefined;
3863
+ /**
3864
+ * What the HOST puts at the start of the table's one row — the organization the table lives
3865
+ * in, named quietly (the app's where-it-lives chip). One row: never a second bar above it.
3866
+ */
3867
+ leading?: ReactNode | undefined;
3868
+ /**
3869
+ * What the HOST adds to the table's one menu — a capability the package cannot know about (the
3870
+ * app's "When a row changes, run an agent…"). Drawn after the package's own entries.
3871
+ */
3872
+ menuExtras?: ReadonlyArray<{
3873
+ key: string;
3874
+ label: string;
3875
+ onSelect: () => void;
3876
+ }> | undefined;
3374
3877
  className?: string | undefined;
3375
3878
  }
3376
3879
  /**
@@ -3517,7 +4020,22 @@ declare function openingView(activeView: string | null | undefined, activeDashbo
3517
4020
  layout: ViewLayout | null;
3518
4021
  unknown: string | null;
3519
4022
  };
3520
- declare function TablePage({ tableId, pageSize, seedViews, onLeave, leaveLabel, activeDashboardId, activeRecordId, activeView, onViewChanged, activeGroupField, cameFrom, filter, activeRail, activeItemId, className, }: TablePageProps): react.JSX.Element;
4023
+ /**
4024
+ * EVERYTHING A TABLE CAN DO THAT IS NOT LOOKING AT IT — in the table's ONE menu (lane
4025
+ * DATA-V2-FACE). They were fourteen buttons in a row above the records, which is a toolbar
4026
+ * describing the platform rather than the table; the owner met it on his own table and asked
4027
+ * whether somebody was copying Notion and failing. Groups: the records themselves, what is
4028
+ * built on them, and bringing things in and out.
4029
+ */
4030
+ interface MenuEntryDef {
4031
+ key: string;
4032
+ label: string;
4033
+ press: SurfacePress;
4034
+ group: 1 | 2 | 3;
4035
+ shown: (rights: ReturnType<typeof useTableRights>) => boolean;
4036
+ }
4037
+ declare const TABLE_MENU: readonly MenuEntryDef[];
4038
+ declare function TablePage({ tableId, pageSize, seedViews, onLeave, leaveLabel, activeDashboardId, activeRecordId, activeView, onViewChanged, activeGroupField, cameFrom, filter, activeRail, activeItemId, leading, menuExtras, className, }: TablePageProps): react.JSX.Element;
3521
4039
 
3522
4040
  /** What the roster can tell us about a user id. `null` when it cannot. */
3523
4041
  type ResolveName = (userId: Uuid$1) => string | null;
@@ -3568,95 +4086,6 @@ declare function WhoChangedSource({ tableId, labelOf, children, }: {
3568
4086
  /** What this cell can say about who last changed it. */
3569
4087
  declare function useWhoChanged(fieldKey: string, recordId: Uuid$1): WhoChanged;
3570
4088
 
3571
- /** One Field a person asked for, in the words a person uses (FLD-1 / FLD-11). */
3572
- interface NewFieldSpec {
3573
- key: string;
3574
- label: string;
3575
- /**
3576
- * The word for what this column holds. One of the thirteen parity types, one
3577
- * of the five behaviours, or a plain synonym (`text`, `long_text`, `number`)
3578
- * — `custom._field_document_for` resolves all three and refuses a word that
3579
- * means nothing, by name, with the list.
3580
- */
3581
- type: FieldTypeWord;
3582
- sort?: number;
3583
- required?: boolean;
3584
- multi?: boolean;
3585
- config?: Record<string, unknown>;
3586
- /** A choice list's choices, as words. The store keeps them as a Table (FLD-5). */
3587
- options?: string[];
3588
- /** A column that points at another Table of this organization (FLD-11 / REL-8). */
3589
- relationTarget?: Uuid$1;
3590
- /** A currency column's symbol; a date column's day-or-day-and-time. */
3591
- unit?: string;
3592
- kind?: "date" | "datetime";
3593
- }
3594
- interface NewTableSpec {
3595
- name: string;
3596
- /** The token the Table is addressed by. Derived from the name when absent. */
3597
- slug?: string;
3598
- labelSingular?: string;
3599
- labelPlural?: string;
3600
- /** The Field whose value is the record's title (REC-2). Defaults to the first Field. */
3601
- titleField?: string;
3602
- fields?: NewFieldSpec[];
3603
- }
3604
- type DeclareResult =
3605
- /**
3606
- * The Table's id — and its HOME's, because REC-14 gives the Table exactly one
3607
- * and the caller that made it is the only one that can tidy it up again. A
3608
- * caller reading `data` alone is unaffected.
3609
- */
3610
- {
3611
- ok: true;
3612
- data: Uuid$1;
3613
- homeId: Uuid$1;
3614
- } | {
3615
- ok: false;
3616
- error: RecordsError;
3617
- };
3618
- /** `My Sales Pipeline` → `my_sales_pipeline`. A token, never a sentence. */
3619
- declare function tokenFor(name: string): string;
3620
- /** The one Field a Table cannot be declared without: something to call a record. */
3621
- /**
3622
- * WHY THE FIRST FIELD IS NOT REQUIRED.
3623
- *
3624
- * It was, and the cost showed up the moment the grid could add a row: "New
3625
- * record" writes an empty record and puts you in the first cell, and the store
3626
- * correctly refused every one of them — `REC-51: Title is required` — so the
3627
- * one gesture that makes a grid feel like a grid never worked on a table a
3628
- * person had just made. A title is what makes a record a CHIP (REC-2), which is
3629
- * a fact about how it is shown, not a promise it can never be written without;
3630
- * an organization that wants it demanded says so in the field editor, and the
3631
- * store then enforces it for everyone.
3632
- */
3633
- declare const DEFAULT_FIELDS: NewFieldSpec[];
3634
- /**
3635
- * One column, in the shape `custom.field_declare` takes — and EVERYTHING a
3636
- * person said about it. The keys after the type are not decoration: without
3637
- * `options` the door refuses a choice list outright ("A list of choices needs
3638
- * its choices"), without `unit` a money column is dollars whatever the person
3639
- * picked, and without `relation_target` a column that points at another of this
3640
- * organization's own tables cannot be declared at all.
3641
- */
3642
- declare function fieldDeclarationFor(field: NewFieldSpec): NewFieldDeclaration;
3643
- declare function declareTable(client: RecordsClient, spec: NewTableSpec): Promise<DeclareResult>;
3644
- /**
3645
- * Columns for an existing Table, through the door that declares one. Used by
3646
- * the create path and by import.
3647
- *
3648
- * A column the store refused STOPS the sequence and hands back the store's own
3649
- * sentence: a Table that quietly lost a column is the silent failure this
3650
- * package exists to prevent.
3651
- */
3652
- declare function addFields(client: RecordsClient, tableId: Uuid$1, fields: NewFieldSpec[]): Promise<{
3653
- ok: true;
3654
- data: Uuid$1;
3655
- } | {
3656
- ok: false;
3657
- error: RecordsError;
3658
- }>;
3659
-
3660
4089
  interface ShareControlProps {
3661
4090
  kind: ShareSubject["kind"];
3662
4091
  organizationId: Uuid$1;
@@ -3687,18 +4116,113 @@ declare function useCanShare(): boolean;
3687
4116
  declare function shareUnavailableReason(): string;
3688
4117
  declare function ShareControl({ kind, organizationId, subjectId, name, may, initiallyOpen, size, variant, className, }: ShareControlProps): ReactNode;
3689
4118
 
4119
+ /**
4120
+ * 🚨 THE ONE DATE HELPER EVERY LAYOUT READS (lane UI-FIX-18, VERIFIER-18 H2 / M1).
4121
+ *
4122
+ * MEASURED 2026-09-24 on production, browser in America/Los_Angeles: Kitchen's start date,
4123
+ * stored `2026-04-01`, read **Apr 1** in the grid, **Mar 31** on the calendar, **3/31** in
4124
+ * the gallery, and Backyard Deck's May 1 read **4/30** in the record panel. The grid was right
4125
+ * because it formats through the design system's registry (`formatFieldValue`), which reads a
4126
+ * bare `YYYY-MM-DD` as a day on a calendar. Every other surface called `new Date("2026-04-01")`
4127
+ * itself — which JavaScript parses as UTC MIDNIGHT — and then printed it in the viewer's zone,
4128
+ * so everybody west of Greenwich saw the day before.
4129
+ *
4130
+ * THE CLASS, NOT THE INSTANCE. No component in this package parses or prints a date on its
4131
+ * own any more; it asks this file, and this file asks the SAME registry the grid asks. The
4132
+ * calendar's day key is the one thing the registry does not answer, and it is answered here
4133
+ * by the same rule: a bare calendar date IS its own day (read the characters), an instant
4134
+ * (`…Z`, `…+hh:mm`) is placed on the viewer's own calendar.
4135
+ *
4136
+ * The store's own stamps — Created time and Last changed time (`fx.created_time`,
4137
+ * `fx.modified_time`) — are instants, and are printed like every other date-and-time cell
4138
+ * (VERIFIER-18 M1 found `2026-09-25T00:13:34.564Z` in the grid, the gallery and the panel).
4139
+ */
4140
+
4141
+ /**
4142
+ * Does this value (or, with no value, this Field) carry a TIME OF DAY as well as a date?
4143
+ *
4144
+ * A DATE IS A DATE (chair ruling, 2026-09-24). The control and the text follow the STORED
4145
+ * VALUE's shape, never `config.kind` alone: a value with no time part — `1988-06-14`, a date
4146
+ * of birth on a `kind: "datetime"` Field — gets a date-only control and a date-only reading
4147
+ * everywhere (grid, form, panel, calendar). With no value yet, only a Field that says so
4148
+ * outright carries a time: the older `format: "datetime"`, or the store's own Created / Last
4149
+ * changed stamps (instants by construction).
4150
+ */
4151
+ declare function carriesTimeOfDay(field: Pick<Field, "type" | "config" | "format">, value?: unknown): boolean;
4152
+ /** A value that names a moment in the day, not just the day. */
4153
+ declare function hasTimePart(value: unknown): boolean;
4154
+ /** Is this Field a date column at all — a dated range, or the store's own time stamp? */
4155
+ declare function isDateField(field: Pick<Field, "type" | "config">): boolean;
4156
+ /**
4157
+ * The format a date-ish Field draws with, or `undefined` for a Field that is not one. With a
4158
+ * value, it is that value's own shape; without, the Field's (`carriesTimeOfDay`).
4159
+ * `presentation.formatForField` answers dates through this, so the grid and every card agree.
4160
+ */
4161
+ declare function dateFormatFor(field: Pick<Field, "type" | "config" | "format">, value?: unknown): FieldFormatConfig | undefined;
4162
+ /**
4163
+ * THE TEXT OF ONE DATE VALUE, in the viewer's language — through the design system's
4164
+ * registry, exactly as the grid prints it, in the value's own shape. `null` when the value is
4165
+ * not a date at all, so the caller can fall back to its own reading (THE FALLBACK LAW).
4166
+ */
4167
+ declare function dateText(field: Pick<Field, "type" | "config" | "format">, value: unknown): string | null;
4168
+ /**
4169
+ * THE CALENDAR DAY a value falls on, as `YYYY-MM-DD` — the key a calendar files a card under.
4170
+ *
4171
+ * A bare calendar date is its own day. An instant is placed on the VIEWER's calendar: a visit
4172
+ * logged at 5:13 PM Pacific on 24 September is on the 24th for the person in Pacific time,
4173
+ * even though it is already the 25th in UTC.
4174
+ */
4175
+ declare function calendarDayOf(value: unknown): string | null;
4176
+ /** The heading of one calendar day — `Apr 1, 2026` — built on local midnight, never UTC. */
4177
+ declare function calendarDayLabel(day: string): string;
4178
+
4179
+ /** The word a withheld cell shows in place of a value. Never "—", which means empty. */
4180
+ declare const WITHHELD_WORD = "Withheld";
4181
+ type Hidden = Readonly<Record<string, HiddenFieldNotice | undefined>> | null | undefined;
4182
+ /** The store's notice for this column of this row, when the store withheld it. */
4183
+ declare function withheldNoticeOf(hidden: Hidden, key: string): HiddenFieldNotice | null;
4184
+ /**
4185
+ * THE SENTENCE, in the store's own words: the notice's `says` when the store wrote one (a
4186
+ * worked-out column names what it reads), else the notice's reason, the level it needs and the
4187
+ * other way in.
4188
+ */
4189
+ declare function withheldSentence(field: Pick<Field, "key" | "label" | "name">, notice: HiddenFieldNotice): string;
4190
+ /** A withheld cell as a person reads it: the word, with the store's reason on hover. */
4191
+ declare function WithheldValue({ field, notice }: {
4192
+ field: Field;
4193
+ notice: HiddenFieldNotice;
4194
+ }): react.JSX.Element;
4195
+
3690
4196
  interface PipelineBoardProps {
3691
4197
  tableId: Uuid;
3692
4198
  /** The rows the view holds — the SAME rows every other layout of this view draws. */
3693
4199
  rows: ReadRow$1[];
4200
+ /**
4201
+ * The table's own title column (`title_field`), from the table the host already holds — each
4202
+ * card is named by it through `cardTitleField`. The board never reads the table again for it.
4203
+ */
4204
+ titleKey?: string | null | undefined;
3694
4205
  /** A number column to total under each heading. The person picks it; nothing is guessed. */
3695
4206
  measure?: string | null;
4207
+ /**
4208
+ * S2-PRIME — the question the cards under this board were read with, either shape. The
4209
+ * headings are counted by the store with THE SAME question (`pipelineBoard({filter})`), so a
4210
+ * column never says 16 over the 4 cards a view put in it.
4211
+ */
4212
+ filter?: StoreFilter | null | undefined;
3696
4213
  onMeasureChange?: ((key: string | null) => void) | undefined;
3697
4214
  onOpenRecord?: ((recordId: Uuid) => void) | undefined;
3698
4215
  /** Called after a move lands, so the host re-reads the rows it owns. */
3699
4216
  onMoved?: (() => void) | undefined;
4217
+ /**
4218
+ * THE COLORS THE REST OF THE VIEW PAINTS WITH (lane UI-QUICK-1) — `resolveTableStyle`'s answer,
4219
+ * the table's G1 decorations under the view's own look. `ViewSwitcher`'s board passes the one it
4220
+ * already resolved; left out, the board resolves the table's own decorations itself, so a host
4221
+ * that mounts the board alone still tints its cards exactly as the grid tints the rows.
4222
+ */
4223
+ style?: TableStyle | undefined;
3700
4224
  className?: string | undefined;
3701
4225
  }
3702
- declare function PipelineBoard({ tableId, rows, measure, onMeasureChange, onOpenRecord, onMoved, className, }: PipelineBoardProps): react.JSX.Element;
4226
+ declare function PipelineBoard({ tableId, rows, titleKey, measure, filter, onMeasureChange, onOpenRecord, onMoved, style, className, }: PipelineBoardProps): react.JSX.Element;
3703
4227
 
3704
- export { ABSENCE_WORD_LABEL, ABSENCE_WORD_VALUES, ACTION_KINDS, ARCHIVED_NEVER_DESTROYED, ARCHIVE_MEANS, type AbsenceWord, ActionInbox, type ActionInboxProps, type ActionKind, type AgentBuildAsk, ArchivedDisclosure, type ArchivedDisclosureProps, ArchivedPortals, type ArchivedPortalsProps, ArchivedView, type ArchivedViewProps, 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, CAPTURE_MODES, CHART_KINDS, CHART_KIND_LABEL, CHART_NEEDS, CHECKLIST_REQUIREMENT_KINDS, CHECKLIST_REQUIREMENT_LABEL, CONDITION_OPS, CONTEXT_POLICY_LABEL, type Capability, 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 ChartSpec, ChartTooltipContent, ChecklistRunner, type ChecklistRunnerProps, ChecklistTemplateEditor, ChecklistsPanel, type ChecklistsPanelProps, CommentThread, type CommentThreadProps, type ConditionField, ConditionGroup, type ConditionGroupProps, ConditionRow, type ConditionRowProps, CustomFieldsSection, type CustomFieldsSectionProps, DEFAULT_FIELDS, DEFAULT_VIEW_NAME, DUE_STATE_LABEL, DashboardCanvas, type DashboardCanvasProps, type DeclareResult, DigestScheduler, type DigestSchedulerProps, DocRender, type DocRenderProps, DocTemplate, type DocTemplateProps, type DocTemplateSpec, EMPTY_PRESENTATION, ENGINEER_TEXT, type EditorKind, EmbedFrame, type EmbedFrameProps, type EnrichAsk, EnrichBadge, type EnrichBadgeProps, type EnrichOutcome, EnrichPanel, type EnrichPanelProps, ExportMenu, type ExportMenuProps, FIELD_RULE_KIND_LABEL, FIELD_RULE_KIND_VALUES, FIELD_SENSITIVITY_LABEL, FIELD_TYPE_CHOICES, FIELD_TYPE_GROUPS, 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, FormBuilder, type FormBuilderProps, type FormFlow, type FormQuestionSpec, FormRunner, type FormRunnerProps, type FormSpec, type FormSubmitOutcome, type FormTheme, FormsPanel, type FormsPanelProps, type FormulaOp, Grid, GridCell, type GridEditing, type GridGrouping, type GridPresentation, type GridProps, HistoryPanel, type HistoryPanelProps, type HostLayout, IN_MEMORY_QUEUE_REASON, ImportWizard, type ImportWizardProps, KERNEL_REASON, LANE_EMPTY, LANE_TITLE, LAYOUT_FIELD_KIND, LAYOUT_LABEL, LAYOUT_NEEDS, LAYOUT_NO_FIELD, LEVEL_WORD, type LabelLookup, type LinkRail, MACHINE_IDENTITY, MAX_ROW_HEIGHT, MIN_ROW_HEIGHT, type MainView, MyChecklistSteps, NEEDS_A_SENTENCE, NOT_ANSWERED_YET, NOT_DRAWN_HERE, NO_AGENT_PORT, NO_CHAT_REASON, NO_COLUMNS_WHY, 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 NewFieldSpec, type NewTableSpec, NotifyRuleEditor, type NotifyRuleEditorProps, type NotifyRuleSpec, type OpenRecordsAsk, type OrganizationMember, PAGE_VIEWS, PAGE_VIEW_LABEL, PARITY_LABEL, PARITY_MADE_OF, PORTAL_NOT_HERE_LINE, PROPOSED_CHANGE_ACT_LABEL, PROPOSED_CHANGE_ACT_VALUES, type PageView, Peek, type PeekProps, type PendingCapture, PersonPicker, type PersonPickerProps, type PickableFieldType, PipelineBoard, type PipelineBoardProps, type PlainFieldType, type PlainRefusal, type PortalAnswer, PortalBuilder, type PortalBuilderProps, PortalCardView, type PortalCardViewProps, PortalShell, type PortalShellProps, PortalsPanel, type PortalsPanelProps, type ProposalOutcome, ProposalRow, type ProposalRowProps, type ProposedChange, type ProposedChangeAct, ProvenanceBadge, PublicViewPage, type PublicViewPageProps, ROLLUP_AGG_LABEL, ROLLUP_AGG_VALUES, RULE_NOT_HERE_LINE, type ReaskContext, RecordChat, type RecordChatContext, type RecordChatEntry, type RecordChatProps, type RecordChatWithheld, RecordChip, RecordForm, type RecordFormProps, RecordLabelProvider, RecordValue, RecordsMount, type RecordsMountProps, type RecordsUiHost, RecordsUiProvider, ReferenceBuilder, type ReferenceBuilderProps, type ReferenceChoice, RefusalLine, RefusalNotice, type RelationFieldType, RelationPicker, type RelationPickerProps, type ResolveName, type RollupAgg, SAVED_VIEWS_UNAVAILABLE, SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS, SECTIONS_UNKNOWN, SERIES_COLORS, SHARE_NOT_YOURS_LINE, SOMEBODY, STAGE_RULE_ON_FAIL_LABEL, STORE_ANSWERS_THESE, STORE_DECIDES_REASON, SUBSCRIPTION_CADENCES, SUBSCRIPTION_CADENCE_LABEL, SUBSCRIPTION_CHANNEL_LABEL, SUBSCRIPTION_CHANNEL_VALUES, type SavedDashboard, type SavedForm, type SavedView, type SavedViewSpec, ShareControl, type ShareControlProps, type ShareSubject, SignBlock, type SignBlockProps, StageRulesSection, type StageRulesSectionProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_NOT_REACHABLE, THE_SYSTEM, type TableLane, TablePage, type TablePageProps, type TableRights, TableSettings, type TableSettingsProps, TablesHome, type TablesHomeProps, type TrackedVersion, type UseSystemTableState, VIEW_LAYOUTS, VIEW_NOT_SAVED_YET, VIEW_TABLE, VISIBILITY_LANES, VISIBILITY_LANE_TITLE, ViewBar, type ViewBarProps, type ViewLayout, type ViewSort, ViewSwitcher, type ViewSwitcherProps, type VisibilityLane, WITHHELD_RECORD_LABEL, WORK_DUE_STATES, WORK_INBOX_KINDS, WORK_INBOX_KIND_LABEL, type WhatYouMayDo, type WhoChanged, WhoChangedSource, actorBadge, actorWords, addFields, archivedRowLine, asRefusal, askableFields, blockFromSpec, bodyForReading, bodyFromKeys, cameFromLine, cellState, chooseSurface, colorFromTheValue, columnForField, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, currencyCodeFor, dashboardDeclareArgs, dashboardFromSummary, declareTable, editorKindFor, ensureSystemTable, envelopeFor, fieldDeclarationFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, formDeclareArgs, formFromSummary, formPresentation, formatForField, groupLabel, hintForAPerson, hintIsMachineIdentity, humanize, idsOf, isEngineerText, isId, isMachineIdentity, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, keptByTheApp, keyFor, kindsWithNoChoice, laneFor, lastChangeSentence, looksLikeId, machineIdentityIn, mayNotRestoreLine, memberName, nextInWords, nextSummaryAt, openingRail, openingView, pageViewFromParam, parityTypesWithNoExplanation, parseGridPresentation, personActor, personRecordForMember, pointsAtRecords, presentationDocument, presentationIsEmpty, previewLine, previewWords, publiclyAnswerable, railFromParam, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, renderValue, revokeConsequence, rowName, rowNameIn, saveViewPatch, scalarText, shareUnavailableReason, specFromBlock, storeDecidesRights, submissionStamp, surfaceChosen, tableName, tableRightsAt, tokenFor, unknownRailLine, unknownViewLine, useCanShare, useEmbedHandshake, useEnrichCells, useGridEditing, useLabelWait, useMeasuredWidth, useMyChecklistSteps, useRecordLabels, useRecordRights, useRecordsUi, useRowRights, useSystemTable, useTableRights, useViewRecords, useWhoChanged, viewDocument, viewFromRecord, viewPatchDocument, visibilityLaneFor, whatIsMissing, whatYouMayDo, whatYouMayDoWithTable, whenWords, whyNotAskable };
4228
+ export { ABSENCE_WORD_LABEL, ABSENCE_WORD_VALUES, ACTION_KINDS, ARCHIVED_NEVER_DESTROYED, ARCHIVE_MEANS, type AbsenceWord, ActionInbox, type ActionInboxProps, type ActionKind, type AgentBuildAsk, ArchivedDisclosure, type ArchivedDisclosureProps, ArchivedPortals, type ArchivedPortalsProps, ArchivedView, type ArchivedViewProps, 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, CAPTURE_MODES, CHART_KINDS, CHART_KIND_LABEL, CHART_NEEDS, CHECKLIST_REQUIREMENT_KINDS, CHECKLIST_REQUIREMENT_LABEL, CONDITION_OPS, CONTEXT_POLICY_LABEL, type Capability, 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 ChartSpec, ChartTooltipContent, ChecklistRunner, type ChecklistRunnerProps, ChecklistTemplateEditor, ChecklistsPanel, type ChecklistsPanelProps, CommentThread, type CommentThreadProps, type ConditionField, ConditionGroup, type ConditionGroupProps, ConditionRow, type ConditionRowProps, CustomFieldsSection, type CustomFieldsSectionProps, 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, EntityReferenceKindPicker, type EntityReferenceKindPickerProps, ExportMenu, type ExportMenuProps, FIELD_RULE_KIND_LABEL, FIELD_RULE_KIND_VALUES, FIELD_SENSITIVITY_LABEL, FIELD_TYPE_CHOICES, FIELD_TYPE_GROUPS, 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 FormAsked, FormBuilder, type FormBuilderProps, type FormFlow, type FormQuestionSpec, FormRunner, type FormRunnerProps, type FormSpec, type FormSubmitOutcome, type FormTheme, FormsPanel, type FormsPanelProps, type FormulaOp, Grid, GridCell, type GridEditing, type GridGrouping, type GridPresentation, type GridProps, HistoryPanel, type HistoryPanelProps, type HostLayout, INBOX_GROUPINGS, IN_MEMORY_QUEUE_REASON, ImportWizard, type ImportWizardProps, type InboxGroup, type InboxGrouping, KERNEL_REASON, LANE_EMPTY, LANE_TITLE, LAYOUT_FIELD_KIND, LAYOUT_LABEL, LAYOUT_NEEDS, LAYOUT_NO_FIELD, LEVEL_WORD, type LabelLookup, type LinkRail, MACHINE_IDENTITY, MAX_ROW_HEIGHT, MIN_ROW_HEIGHT, type MainView, MyChecklistSteps, NEEDS_A_SENTENCE, NOT_ANSWERED_YET, NOT_DRAWN_HERE, NO_AGENT_PORT, NO_CHAT_REASON, NO_COLUMNS_WHY, 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, NotifyRuleEditor, type NotifyRuleEditorProps, type NotifyRuleSpec, type OpenRecordsAsk, type OrganizationMember, PAGE_VIEWS, PAGE_VIEW_LABEL, PARITY_LABEL, PARITY_MADE_OF, PORTAL_NOT_HERE_LINE, PROPOSED_CHANGE_ACT_LABEL, PROPOSED_CHANGE_ACT_VALUES, type PageView, Peek, type PeekProps, type PendingCapture, PersonPicker, type PersonPickerProps, type PickableFieldType, 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, PublicViewPage, type PublicViewPageProps, ROLLUP_AGG_LABEL, ROLLUP_AGG_VALUES, RULE_NOT_HERE_LINE, type ReaskContext, RecordChat, type RecordChatContext, type RecordChatEntry, type RecordChatProps, type RecordChatWithheld, RecordChip, RecordForm, type RecordFormProps, RecordLabelProvider, RecordValue, RecordsMount, type RecordsMountProps, type RecordsUiHost, RecordsUiProvider, ReferenceBuilder, type ReferenceBuilderProps, type ReferenceChoice, RefusalLine, RefusalNotice, type RelationFieldType, RelationPicker, type RelationPickerProps, type ResolveName, type RollupAgg, SAVED_VIEWS_UNAVAILABLE, SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS, SECTIONS_UNKNOWN, SERIES_COLORS, SHARE_NOT_YOURS_LINE, SOMEBODY, STAGE_RULE_ON_FAIL_LABEL, STORE_ANSWERS_THESE, STORE_DECIDES_REASON, SUBSCRIPTION_CADENCES, SUBSCRIPTION_CADENCE_LABEL, SUBSCRIPTION_CHANNEL_LABEL, SUBSCRIPTION_CHANNEL_VALUES, type SavedDashboard, type SavedForm, type SavedView, type SavedViewSpec, ShareControl, type ShareControlProps, type ShareSubject, SignBlock, type SignBlockProps, StageRulesSection, type StageRulesSectionProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_MENU, TABLE_NOT_REACHABLE, THE_SYSTEM, type TableLane, type TableOpening, TablePage, type TablePageProps, type TableRights, TableSettings, type TableSettingsProps, TablesHome, type TablesHomeProps, type TrackedVersion, type UseSystemTableState, VIEW_KEYS, VIEW_LAYOUTS, VIEW_NOT_SAVED_YET, VISIBILITY_LANES, VISIBILITY_LANE_TITLE, ViewBar, type ViewBarProps, type ViewKeyDeclaration, type ViewKeyLayout, type ViewKeyWriter, type ViewLayout, 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, type WhatYouMayDo, WhereItLives, type WhereItLivesProps, type WhoChanged, WhoChangedSource, WithheldValue, actorBadge, actorWords, archivedRowLine, asRefusal, askableFields, blockFromSpec, bodyForReading, bodyFromKeys, calendarDayLabel, calendarDayOf, cameFromLine, cardTitleField, cardWords, carriesTimeOfDay, cellState, chooseSurface, colorFromTheValue, columnForField, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, currencyCodeFor, dashboardDeclareArgs, dashboardFromSummary, dateFormatFor, dateText, declareView, defaultViewOf, designatedLayoutOf, editorKindFor, ensureSystemTable, entityReferenceSpec, envelopeFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, formDeclareArgs, formFromSummary, formPresentation, formatForField, groupInbox, groupLabel, hasTimePart, hintForAPerson, hintIsMachineIdentity, humanize, idsOf, isDateField, isEngineerText, isId, isMachineIdentity, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, keptByTheApp, keyFor, kindsWithNoChoice, laneFor, lastChangeSentence, looksLikeId, machineIdentityIn, mayNotRestoreLine, memberName, nextInWords, nextSummaryAt, openingRail, openingView, pageViewFromParam, parityTypesWithNoExplanation, parseGridPresentation, personActor, personRecordForMember, pointsAtRecords, presentationDocument, presentationIsEmpty, previewLine, previewWords, publiclyAnswerable, railFromParam, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, renderValue, resolveTableStyle, revokeConsequence, rowName, rowNameIn, saveViewPatch, scalarText, seedIsSatisfied, shareUnavailableReason, specFromBlock, storeDecidesRights, styleFromDecorations, submissionStamp, surfaceChosen, tableName, tableOpening, tableRightsAt, unknownRailLine, unknownViewLine, useCanShare, useEmbedHandshake, useEnrichCells, useGridEditing, useLabelWait, useMeasuredWidth, useMyChecklistSteps, useRecordLabels, useRecordRights, useRecordsUi, useRowRights, useSystemTable, useTableRights, useViewRecords, useWhoChanged, viewDocument, viewFromRow, viewKeysFor, viewPatchDocument, viewSettings, viewSettingsFor, viewSettingsPatch, visibilityLaneFor, whatIsMissing, whatIsMissingForEntityReference, whatYouMayDo, whatYouMayDoWithTable, whenWords, whyNotAskable, withheldNoticeOf, withheldSentence };