@ai-matrx/records-ui 0.84.8 → 0.85.4

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, RecordDocument, ReadRow, RelationDisplay, WriteConflict, RecordsErrorCode, DeclarableFieldKind, ParityFieldType, NewFieldDeclaration, RuleExpression, ValueEnvelope, ChecklistRequirementKind, ContextPolicy, WorkDueState, FieldSensitivity, StageRuleOnFail, SubscriptionCadence, WorkInboxKind, FieldKind, RecordFilter, RecordsResult, SavedViewRow, ArchiveLane, ArchivedRow, 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
  *
@@ -1031,6 +1057,18 @@ type GridGrouping = {
1031
1057
  order?: GroupOrder;
1032
1058
  /** The sections this view keeps shut, by the primitive's own group key. */
1033
1059
  collapsed?: string[];
1060
+ /**
1061
+ * SUB-GROUPS (lane S1-PRIME VIEW-KEYS; ui-bench LISTS "sub-grouping"): up to two more levels
1062
+ * inside each section, by Field key. At most three levels in all — the store refuses a fourth
1063
+ * (`custom.view_declare`). A layout that draws one level ignores the rest; it never drops them,
1064
+ * because this list is parsed and written back whole with the rest of the look.
1065
+ */
1066
+ then?: GridSubGroup[];
1067
+ };
1068
+ /** One sub-group level: a Field key and its section order. */
1069
+ type GridSubGroup = {
1070
+ field: string;
1071
+ order?: GroupOrder;
1034
1072
  };
1035
1073
  /** Everything a view says about how its table LOOKS. */
1036
1074
  type GridPresentation = {
@@ -1055,6 +1093,33 @@ type GridPresentation = {
1055
1093
  widths?: Record<string, number>;
1056
1094
  /** The body row height this view remembers, in px. */
1057
1095
  rowHeight?: number;
1096
+ /**
1097
+ * Field keys hidden from this view — the SAME hidden-column list the grid's
1098
+ * own column picker holds, now given a place on the view so it survives a
1099
+ * reload and a layout switch reads the identical set gallery and grid agree
1100
+ * on, rather than a second "fields shown" list nobody kept in sync.
1101
+ */
1102
+ hiddenFields?: string[];
1103
+ /**
1104
+ * The gallery's card size, remembered the same way the grid remembers its
1105
+ * row height — a per-view look, not a global default.
1106
+ */
1107
+ gallerySize?: "small" | "medium" | "large";
1108
+ /**
1109
+ * THIS VIEW'S OWN LAYOUT CHOICES, over the organization's `custom/grid_layout` knob (lane
1110
+ * DEFAULT-GRID-PARITY, TABLE-PARITY D1 D5 D6). Absent means "whatever the organization
1111
+ * says"; present is the view's word. `freezeFirst: false` is an explicit NO over an
1112
+ * organization that freezes the first column — an empty `frozen` cannot say that.
1113
+ */
1114
+ wrap?: boolean;
1115
+ fit?: "auto" | "fit" | "scroll";
1116
+ freezeFirst?: boolean;
1117
+ /**
1118
+ * THE SUMMARY BAR (TABLE-PARITY F1): Field key → the store measure shown under that column
1119
+ * (`count`, `sum`, `avg`, `min`, `max`, `median`, `filled`, `empty`, `unique`), worked out
1120
+ * by `custom.record_aggregate` over the whole table.
1121
+ */
1122
+ summaries?: Record<string, string>;
1058
1123
  };
1059
1124
  declare const EMPTY_PRESENTATION: GridPresentation;
1060
1125
  /** A frozen column needs a known width, or the table declines to freeze at all. */
@@ -1122,8 +1187,11 @@ interface GridProps {
1122
1187
  * own query. Never filter `rows` here: this grid only ever holds one page,
1123
1188
  * so filtering in the browser would drop every matching record on page two
1124
1189
  * and call the result the answer.
1190
+ *
1191
+ * S2-PRIME: either shape — the flat map, or a view's own nested question (the Rule shape);
1192
+ * the store compiles both into the one WHERE clause.
1125
1193
  */
1126
- filter?: RecordFilter$1 | undefined;
1194
+ filter?: StoreFilter$1 | undefined;
1127
1195
  /** Opened when a row is clicked. A host that has a record page passes its own. */
1128
1196
  onOpenRecord?: ((recordId: Uuid) => void) | undefined;
1129
1197
  /** SCR-2. Called when an admin clicks the "+" at the end of the headers. */
@@ -1200,6 +1268,36 @@ enrich?: {
1200
1268
  onPin?: ((recordId: Uuid, fieldKey: string, pinned: boolean) => void | Promise<void>) | undefined;
1201
1269
  }): MatrxColumnDef<ReadRow$1>;
1202
1270
 
1271
+ /** Answers "what is the record with this id called", for one Field's values. */
1272
+ type LabelLookup = (field: Field$1, id: string) => string | null;
1273
+ /**
1274
+ * HOW LONG A CELL MAY SAY "Loading…" BEFORE IT HAS TO SAY WHAT IT IS WAITING
1275
+ * FOR. One second is the span at which a person stops reading a word as "this
1276
+ * is about to happen" and starts reading it as "this is stuck" — the same line
1277
+ * Nielsen's response-time work draws and the one Linear and Stripe design to.
1278
+ */
1279
+ declare const SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS = 1000;
1280
+ /** Which ids a Field's stored value refers to. */
1281
+ declare function idsOf(value: unknown): string[];
1282
+ declare function isId(value: unknown): boolean;
1283
+ /** True when this Field's values are ids of other records rather than values. */
1284
+ declare function pointsAtRecords(field: Field$1): boolean;
1285
+ declare function RecordLabelProvider({ children }: {
1286
+ children: ReactNode;
1287
+ }): react.JSX.Element;
1288
+ /**
1289
+ * The hook a surface uses: it declares the Fields it is about to draw, and gets
1290
+ * back the lookup. Declaring is what makes one request per Field instead of one
1291
+ * per cell, and it is why a grid of 200 rows asks the store twice.
1292
+ */
1293
+ declare function useRecordLabels(fields: readonly Field$1[] | undefined): LabelLookup;
1294
+ /**
1295
+ * WHAT THIS COLUMN IS STILL WAITING FOR, or null while "Loading…" is still an
1296
+ * honest word. A cell draws this INSTEAD of "Loading…" once the resolver has
1297
+ * been looking for a second — see `SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS`.
1298
+ */
1299
+ declare function useLabelWait(field: Field$1 | undefined): string | null;
1300
+
1203
1301
  interface ExportMenuProps {
1204
1302
  tableId: Uuid;
1205
1303
  /** The rows on screen. Absent means "this table's first page", read the same way. */
@@ -1314,7 +1412,18 @@ type RelationFieldType = "relation";
1314
1412
  * `FIELD_TYPE_CHOICES`'s coverage and as a red `kindsWithNoChoice()` below — never as a
1315
1413
  * silence.
1316
1414
  */
1317
- type PickableFieldType = DeclarableFieldKind;
1415
+ type PickableFieldType = DeclarableFieldKind | SystemFieldKind | "entity_reference";
1416
+ /**
1417
+ * THE STORE'S OWN STAMPS AS COLUMNS (GRID-PRIMITIVES G5; TABLE-PARITY H2 H3, lane
1418
+ * DEFAULT-GRID-PARITY). `custom.field_declare` takes these three WORDS and makes each a formula
1419
+ * Field whose expression is the system node (`fx.autonumber`, `fx.created_time`,
1420
+ * `fx.modified_time`, `config.system` naming which), so nobody types into them and every reader
1421
+ * that serves a worked-out value serves them. `custom.field_kinds()` does not publish them,
1422
+ * because each is a formula, not a behaviour of its own. So they are named here, sent as their
1423
+ * word through the `{ type }` arm, and a new autonumber column numbers the records already in
1424
+ * the table through `custom.autonumber_backfill`.
1425
+ */
1426
+ type SystemFieldKind = "autonumber" | "created_time" | "modified_time";
1318
1427
  interface FieldTypeChoice {
1319
1428
  id: PickableFieldType;
1320
1429
  /** The word on the menu. */
@@ -1412,6 +1521,8 @@ declare function whatIsMissing(state: {
1412
1521
  formulaFields: string[];
1413
1522
  /** Only a link asks for one, so a caller about any other kind leaves it out. */
1414
1523
  relationTarget?: string;
1524
+ /** Only an entity-reference column asks for these (SC-R). */
1525
+ allowedTypes?: readonly string[];
1415
1526
  }): string | null;
1416
1527
 
1417
1528
  declare const NO_RULES_YET = "Nothing has to be true to get here yet.";
@@ -1499,29 +1610,37 @@ declare function ConditionRow({ lead, expr, fields, onChange, emptyLabel, classN
1499
1610
  * CAN THE BUILDER DRAW THIS CONDITION? — the question every caller asks before it renders,
1500
1611
  * and the reason a rule somebody cannot see is never silently saved over.
1501
1612
  *
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).
1613
+ * Drawable means: nothing; one clause; or a group of drawable members, to any depth. `depth`
1614
+ * still limits it for a caller that wants a shallower builder (0 = one level of clauses and no
1615
+ * nested group). `conditionIsSimple` is still the leaf test and still exported.
1505
1616
  */
1506
1617
  declare function conditionIsDrawable(expr: RuleExpression | Record<string, unknown> | null | undefined, depth?: number): boolean;
1507
1618
  interface ConditionGroupProps {
1508
- /** The words before the condition: "When", "Ask only when". */
1619
+ /** The words before the condition: "When", "Ask only when", "Show jobs where". */
1509
1620
  lead: string;
1510
1621
  expr: RuleExpression | Record<string, unknown> | null | undefined;
1511
1622
  fields: ConditionField[];
1512
1623
  onChange: (next: RuleExpression | null) => void;
1513
1624
  /** What the empty option says: "always", "every card". */
1514
1625
  emptyLabel?: string;
1515
- /** false inside a nested group — one level of nesting, and the screen says so by omission. */
1626
+ /**
1627
+ * false draws one level of clauses and no "Add a group". Left out, groups nest as deep as a
1628
+ * person builds them — the depth the store compiles.
1629
+ */
1516
1630
  allowNesting?: boolean;
1631
+ /** How deep this group sits (0 = the whole condition). Set by the builder itself. */
1632
+ depth?: number;
1633
+ /** A nested group can take itself away; the outermost one cannot. */
1634
+ onRemove?: (() => void) | undefined;
1517
1635
  className?: string | undefined;
1518
1636
  }
1519
1637
  /**
1520
1638
  * 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.
1639
+ * joiner, no chrome — and the joiner appears once there is something to join, so a person
1640
+ * writing one condition never meets a control for a problem they do not have. A nested group
1641
+ * always shows its joiner: it is a box with its own and / or, and that is the whole point of it.
1523
1642
  */
1524
- declare function ConditionGroup({ lead, expr, fields, onChange, emptyLabel, allowNesting, className, }: ConditionGroupProps): react.JSX.Element;
1643
+ declare function ConditionGroup({ lead, expr, fields, onChange, emptyLabel, allowNesting, depth, onRemove, className, }: ConditionGroupProps): react.JSX.Element;
1525
1644
 
1526
1645
  interface FieldProposalRow {
1527
1646
  id: string;
@@ -1594,6 +1713,40 @@ interface RelationPickerProps {
1594
1713
  }
1595
1714
  declare function RelationPicker({ field, value, onChange, disabled, id, className, allowCreate }: RelationPickerProps): react.JSX.Element;
1596
1715
 
1716
+ /** What the panel says while the chosen list is empty. */
1717
+ declare const ENTITY_REFERENCE_KINDS_MISSING = "Choose at least one kind of thing this column points at.";
1718
+ /**
1719
+ * The declaration an entity-reference column is sent as — the words `custom.field_declare`
1720
+ * reads (`type: "entity_reference"`, `allowed_types`, `multi`). One place builds it, so the field
1721
+ * editor, a table template and an agent never disagree on the shape.
1722
+ */
1723
+ declare function entityReferenceSpec(input: {
1724
+ label: string;
1725
+ allowedTypes: readonly string[];
1726
+ multi?: boolean;
1727
+ required?: boolean;
1728
+ }): {
1729
+ label: string;
1730
+ type: "entity_reference";
1731
+ allowed_types: string[];
1732
+ multi: boolean;
1733
+ required: boolean;
1734
+ };
1735
+ /** The sentence the panel shows before it lets a person save, or `null` when nothing is missing. */
1736
+ declare function whatIsMissingForEntityReference(allowedTypes: readonly string[]): string | null;
1737
+ interface EntityReferenceKindPickerProps {
1738
+ /** The chosen entity tokens (`config.allowed_types`). */
1739
+ value: readonly string[];
1740
+ onChange: (next: string[]) => void;
1741
+ /**
1742
+ * An existing column: the store keeps its kinds and this panel sends no change to them,
1743
+ * so the list is shown read-only rather than as a control that silently does nothing.
1744
+ */
1745
+ locked?: boolean;
1746
+ className?: string;
1747
+ }
1748
+ declare function EntityReferenceKindPicker({ value, onChange, locked, className }: EntityReferenceKindPickerProps): react.JSX.Element;
1749
+
1597
1750
  interface FieldEditorControlProps {
1598
1751
  field: Field;
1599
1752
  value: unknown;
@@ -1615,36 +1768,6 @@ declare function RecordChip({ title, onRemove, className, }: {
1615
1768
  className?: string | undefined;
1616
1769
  }): react.JSX.Element;
1617
1770
 
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
1771
  /** The envelope for one key, when the document carries one. */
1649
1772
  declare function envelopeFor(document: RecordDocument | undefined, key: string): ValueEnvelope | undefined;
1650
1773
  declare function renderValue(field: Field, value: unknown, document?: RecordDocument, labels?: LabelLookup, stillWaitingFor?: string | null): react.JSX.Element;
@@ -1870,6 +1993,14 @@ interface SavedViewSpec {
1870
1993
  * reading is a fact about the records.
1871
1994
  */
1872
1995
  measure?: string | null;
1996
+ /**
1997
+ * Kanban: the Field whose values cut the board into SWIMLANES across the columns — a
1998
+ * dispatcher's board by Status, one lane per Technician (S1-PRIME VIEW-KEYS). Never the
1999
+ * column Field itself; the store refuses that.
2000
+ */
2001
+ swimlaneField?: string | null;
2002
+ /** Kanban: the columns this view keeps shut to a strip, by the column's stored value. */
2003
+ collapsedColumns?: string[];
1873
2004
  /** Calendar: the Field that places a record in the month. */
1874
2005
  dateField?: string | null;
1875
2006
  /** Gallery: the Field shown large on the card. */
@@ -1880,6 +2011,22 @@ interface SavedViewSpec {
1880
2011
  * reference to its Rule record, never a predicate this package evaluates.
1881
2012
  */
1882
2013
  ruleId?: Uuid$1 | null;
2014
+ /**
2015
+ * THE FLAT FILTER a digest or a notify rule wrote the view with — the one shape
2016
+ * `custom.record_filter_sql` compiles, by Field KEY. A view saved in the bar has
2017
+ * none; a view saved by `DigestScheduler` ("where Status is Open") does, and the
2018
+ * grid and the board show exactly the records it names.
2019
+ */
2020
+ filters?: RecordFilter;
2021
+ /**
2022
+ * S2-PRIME — THE VIEW'S OWN QUESTION, as the condition builder writes it: the store's Rule
2023
+ * shape `{op, args}`, ALL / ANY / NOT groups nested to any depth, Fields by id. Kept in the
2024
+ * definition as `where` and asked of the store unchanged — the grid's list door, the board's
2025
+ * headings and the dashboard's numbers compile it into the one WHERE clause
2026
+ * (`custom.record_filter_sql`). Never stored under `filters`: that key is the flat map the
2027
+ * digests and the notifier read, and they would refuse it by name.
2028
+ */
2029
+ where?: RuleExpression | null;
1883
2030
  isDefault?: boolean;
1884
2031
  /**
1885
2032
  * HOW THIS VIEW LOOKS — its colors, its per-column formats and its frozen
@@ -1892,19 +2039,24 @@ interface SavedViewSpec {
1892
2039
  */
1893
2040
  presentation?: GridPresentation;
1894
2041
  }
1895
- /** A saved view as it comes back out of the store, with its record's own id. */
2042
+ /**
2043
+ * A saved view as it comes back out of the store, with its row's own id.
2044
+ *
2045
+ * It carries no version: `custom.view_declare` MERGES one key at a time, so two
2046
+ * tabs pressing two different controls on one view both stand, and one control
2047
+ * pressed in both keeps the latest — how Airtable and Notion keep a view change.
2048
+ */
1896
2049
  interface SavedView extends SavedViewSpec {
1897
2050
  id: Uuid$1;
2051
+ /** Where the view came from when it was moved in (the mover, the S0 repair), else null. */
2052
+ movedFrom: Record<string, unknown> | null;
1898
2053
  /**
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.
2054
+ * THE WAY THIS TABLE IS MEANT TO BE LOOKED AT, when somebody decided one — a layout id the
2055
+ * host draws (`sheet`), read off the stored kind before `layout` folds it to the four the
2056
+ * package draws. Null when nobody designated one. See `designatedLayoutOf`.
1903
2057
  */
1904
- version: number | null;
2058
+ designatedLayout?: string | null;
1905
2059
  }
1906
- /** The package-owned Table every saved view is a record of. */
1907
- declare const VIEW_TABLE: SystemTableSpec;
1908
2060
  /**
1909
2061
  * WHICH FIELD EACH LAYOUT CAN BE DRAWN FROM, decided from the FIELD'S OWN
1910
2062
  * DECLARATION and never from the values it happens to hold.
@@ -1968,33 +2120,106 @@ declare function pageViewFromParam(raw: string | null | undefined): PageView | n
1968
2120
  declare function unknownViewLine(raw: string): string;
1969
2121
  /** The one sentence a layout says when the table holds no Field it could use. */
1970
2122
  declare const LAYOUT_NO_FIELD: Record<ViewLayout, string>;
1971
- /** The spec as the one document the store holds. */
2123
+ /**
2124
+ * THE SPEC AS THE ONE DEFINITION `platform.saved_view` HOLDS — the keys
2125
+ * `custom.view_declare` documents, by Field KEY. `subject` is not in it: the door
2126
+ * takes the Table as its own argument and writes `table_id` itself.
2127
+ */
1972
2128
  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
2129
  /**
1976
- * WRITE A CHANGE ONTO A SAVED VIEW, AND KEEP IT (lane RECORDS-UI-FIX, VERIFIER-15 M4).
2130
+ * One row of `custom.views` back into the spec a screen and an agent both read — THROUGH THE ONE
2131
+ * ACCESSOR (`viewSettings`, viewKeys.ts), so every layout sees every declared key the same way.
2132
+ */
2133
+ declare function viewFromRow(row: SavedViewRow): SavedView;
2134
+ /**
2135
+ * SAVE ONE NEW VIEW of a Table — the bar's "New view" and an agent's seed spec.
2136
+ * One `view_declare` with no `view_id`; the answer is the new view's id.
2137
+ */
2138
+ declare function declareView(client: Pick<RecordsClient, "viewDeclare">, spec: SavedViewSpec): Promise<RecordsResult<Uuid$1>>;
2139
+ /**
2140
+ * WRITE A CHANGE ONTO A SAVED VIEW, AND KEEP IT.
1977
2141
  *
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.
2142
+ * `custom.view_declare` with the view's id MERGES: only the keys in `patch` are
2143
+ * written, a key cleared to null is removed, and everything the patch did not
2144
+ * name — the grid's own choices, a hand-set order, where the view was moved from,
2145
+ * a colour set in another tab — stays exactly as it was (S0, 2026-09-23: the door
2146
+ * used to rebuild the whole definition from what one press sent).
1983
2147
  *
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.
2148
+ * There is no version to be stale against (VERIFIER-15 M4 is closed by the shape,
2149
+ * not by a retry): a saved view is a person's own arrangement of a table, and
2150
+ * their latest press on a control is the one that stands. A refusal — the view
2151
+ * was removed, or belongs to a table this person cannot open — is handed back for
2152
+ * the page to say through the one notice.
1989
2153
  */
1990
- declare function saveViewPatch(client: Pick<RecordsClient, "recordUpdate">, viewId: Uuid$1, document: Record<string, unknown>, expectedVersion: number | null): Promise<RecordsResult<number>>;
2154
+ declare function saveViewPatch(client: Pick<RecordsClient, "viewDeclare">, tableId: Uuid$1, viewId: Uuid$1, patch: Partial<SavedViewSpec>): Promise<RecordsResult<Uuid$1>>;
1991
2155
  /**
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.
2156
+ * A PARTIAL change to a saved view, as the definition keys the door merges. Only
2157
+ * the keys the caller actually changed are sent; a Field cleared (a board with no
2158
+ * "Group by") is sent as `null`, which the door removes.
1995
2159
  */
1996
2160
  declare function viewPatchDocument(patch: Partial<SavedViewSpec>): Record<string, unknown>;
1997
2161
 
2162
+ /** Every surface a saved view is drawn by. `sheet` is the spreadsheet surface (G-lanes). */
2163
+ type ViewKeyLayout = "grid" | "kanban" | "calendar" | "gallery" | "sheet";
2164
+ /** Who may write a key: anyone who may save the view, an input the door rewrites, or the server only. */
2165
+ type ViewKeyWriter = "caller" | "input" | "server";
2166
+ interface ViewKeyDeclaration {
2167
+ /** Where it lives in `platform.saved_view.definition` (dotted under `presentation`). */
2168
+ path: string;
2169
+ /** What the store's guard checks (`custom._view_key_value`). */
2170
+ shape: string;
2171
+ /** The layouts that read it. */
2172
+ layouts: readonly ViewKeyLayout[];
2173
+ writer: ViewKeyWriter;
2174
+ }
2175
+ /**
2176
+ * THE REGISTRY, as `custom.view_keys()` declares it (uichamp_s1_a_view_keeps_every_setting_it_is_given.sql).
2177
+ * Order and content are compared with the store by the live walk.
2178
+ */
2179
+ declare const VIEW_KEYS: readonly ViewKeyDeclaration[];
2180
+ /** The keys one layout reads, by path. */
2181
+ declare function viewKeysFor(layout: ViewKeyLayout): string[];
2182
+ /** One sort clause: a Field key and a direction. */
2183
+ interface ViewSortKey {
2184
+ field: string;
2185
+ direction: "asc" | "desc";
2186
+ }
2187
+ /**
2188
+ * EVERY DECLARED KEY OF A VIEW, TYPED. Absent keys are `null` / empty, never guessed.
2189
+ * `presentation` is the parsed look (colour field, pinned fields, row height, grouping with its
2190
+ * sub-groups and shut sections, hidden fields, gallery size, summaries).
2191
+ */
2192
+ interface ViewSettings {
2193
+ layout: "grid" | "kanban" | "calendar" | "gallery";
2194
+ filters: RecordFilter | null;
2195
+ where: RuleExpression | null;
2196
+ groupField: string | null;
2197
+ swimlaneField: string | null;
2198
+ collapsedColumns: string[];
2199
+ measure: string | null;
2200
+ dateField: string | null;
2201
+ imageField: string | null;
2202
+ sorts: ViewSortKey[];
2203
+ ruleId: string | null;
2204
+ isDefault: boolean;
2205
+ presentation: GridPresentation;
2206
+ movedFrom: Record<string, unknown> | null;
2207
+ }
2208
+ /** THE READER. A stored `definition` (and the row's flat `filters`) in, every declared key out. */
2209
+ declare function viewSettings(definition: Record<string, unknown> | null | undefined, rowFilters?: RecordFilter | null): ViewSettings;
2210
+ /** The settings as the spec names them — what `viewSettingsPatch` takes. */
2211
+ type ViewSettingsPatch = Partial<Omit<ViewSettings, "movedFrom">>;
2212
+ /**
2213
+ * THE KEYS ONE LAYOUT READS, and nothing else. A layout that does not use a key never sees it:
2214
+ * a calendar is not told the board's swimlanes, a board is not told the grid's pinned fields.
2215
+ */
2216
+ declare function viewSettingsFor(settings: ViewSettings, layout: ViewKeyLayout): Partial<ViewSettings>;
2217
+ /**
2218
+ * THE WRITER'S SHAPE. Only the keys a press changed; a cleared Field is `null` (the door removes
2219
+ * it); lists are sent whole. `presentation` is sent whole because the door judges it as one key.
2220
+ */
2221
+ declare function viewSettingsPatch(patch: ViewSettingsPatch): Record<string, unknown>;
2222
+
1998
2223
  interface ViewSwitcherProps {
1999
2224
  /**
2000
2225
  * THE DECLARATIVE SPEC — an agent writes the whole thing, a person tweaks it.
@@ -2029,8 +2254,11 @@ interface ViewSwitcherProps {
2029
2254
  * object the chart counted with. It narrows the grid AND the board through
2030
2255
  * the store, so switching layout after a drill-through keeps the same rows
2031
2256
  * instead of quietly widening back to the whole table.
2257
+ *
2258
+ * S2-PRIME: either shape — a flat map, or the view's own nested question (`where`, the
2259
+ * store's Rule shape). The grid, the board's headings and the numbers all ask it.
2032
2260
  */
2033
- filter?: RecordFilter | undefined;
2261
+ filter?: StoreFilter | undefined;
2034
2262
  /**
2035
2263
  * The HOST layout showing now (`RecordsUiHost.layouts`, by id), or null for the
2036
2264
  * package's own. Controlled by the page, because the address names it.
@@ -2038,10 +2266,18 @@ interface ViewSwitcherProps {
2038
2266
  hostLayout?: string | null | undefined;
2039
2267
  /** The person picked a host layout (its id), or went back to one of the four (null). */
2040
2268
  onHostLayoutChange?: ((id: string | null) => void) | undefined;
2269
+ /**
2270
+ * Whether this component draws its own row — the view's name and the layout buttons. `false`
2271
+ * when the page that mounts it draws the layout choice itself (`TablePage` keeps one control
2272
+ * cluster for the whole table, lane DATA-V2-FACE). Default `true`, for every other host.
2273
+ */
2274
+ chooser?: boolean | undefined;
2275
+ /** Handed to a host layout's `render` — the page's own export. */
2276
+ openExport?: (() => void) | undefined;
2041
2277
  className?: string | undefined;
2042
2278
  }
2043
2279
  /** 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): {
2280
+ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?: StoreFilter): {
2045
2281
  rows: ReadRow$1[];
2046
2282
  loading: boolean;
2047
2283
  error: RecordsError | null;
@@ -2059,7 +2295,7 @@ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?:
2059
2295
  */
2060
2296
  membership: string;
2061
2297
  };
2062
- declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize, filter, hostLayout, onHostLayoutChange, className, }: ViewSwitcherProps): react.JSX.Element;
2298
+ declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize, filter, hostLayout, onHostLayoutChange, chooser, openExport, className, }: ViewSwitcherProps): react.JSX.Element;
2063
2299
 
2064
2300
  /** What the screen says above the list, so nobody has to be told twice that nothing was destroyed. */
2065
2301
  declare const ARCHIVE_MEANS = "Archiving never destroys anything. A record you remove from the grid waits here until somebody brings it back.";
@@ -2142,15 +2378,28 @@ interface ViewBarProps {
2142
2378
  * The person tweaks them afterwards like any other view.
2143
2379
  */
2144
2380
  seed?: SavedViewSpec[] | undefined;
2381
+ /**
2382
+ * Draw nothing while the table has at most one saved view (lane DATA-V2-FACE). One view is not
2383
+ * a choice, and a row of one tab is chrome over the table; the page offers "Saved views" in its
2384
+ * menu instead. Two or more views are a real choice and the bar draws.
2385
+ */
2386
+ quietWhenAlone?: boolean | undefined;
2387
+ /** Every time the list is read: the views, or null when they could not be read. */
2388
+ onViews?: ((views: SavedView[] | null) => void) | undefined;
2145
2389
  className?: string | undefined;
2146
2390
  }
2147
2391
  /**
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.
2392
+ * What the bar says when the saved views cannot be read. It names the ONE thing that is
2393
+ * missing (the remembered layouts) and nothing else, because everything else on the page
2394
+ * still works and a longer sentence would suggest otherwise.
2151
2395
  */
2152
2396
  declare const SAVED_VIEWS_UNAVAILABLE: string;
2153
- declare function ViewBar({ tableId, activeViewId, onActiveView, seed, className }: ViewBarProps): react.JSX.Element;
2397
+ /**
2398
+ * WHETHER A SEED IS ALREADY THERE. A view by the seed's name always satisfies it; a DEFAULT seed
2399
+ * is also satisfied by any view the table already marks as its default, whatever it is called.
2400
+ */
2401
+ declare function seedIsSatisfied(seed: SavedViewSpec, views: readonly SavedView[]): boolean;
2402
+ declare function ViewBar({ tableId, activeViewId, onActiveView, seed, quietWhenAlone, onViews, className }: ViewBarProps): react.JSX.Element | null;
2154
2403
 
2155
2404
  /** One proposed change, in the proposer's words plus the exact act it asks for. */
2156
2405
  interface ProposedChange {
@@ -2285,6 +2534,13 @@ interface FormTheme {
2285
2534
  accent?: string | null;
2286
2535
  align?: "left" | "center" | null;
2287
2536
  }
2537
+ /** The screen after sending: the form's words, and optionally where to go next. */
2538
+ interface FormThankYou {
2539
+ title?: string | null;
2540
+ body?: string | null;
2541
+ /** A secure page on one of the organization's own sites. The store judges it. */
2542
+ redirectUrl?: string | null;
2543
+ }
2288
2544
  /** THE COMPLETE DECLARATIVE SPEC. One `record_write` and the form exists. */
2289
2545
  interface FormSpec {
2290
2546
  name: string;
@@ -2294,10 +2550,15 @@ interface FormSpec {
2294
2550
  questions: FormQuestionSpec[];
2295
2551
  flow?: FormFlow | null;
2296
2552
  theme?: FormTheme | null;
2297
- thankYou?: {
2298
- title: string;
2299
- body?: string | null;
2300
- } | null;
2553
+ /**
2554
+ * WHAT THE PERSON SEES AFTER SENDING. `title` and `body` are the form's own
2555
+ * words for the next step ("You are all set" / "Next, book your first visit").
2556
+ * `redirectUrl` optionally sends them on to a page instead — and only ever to
2557
+ * one of the organization's own sites: `custom.form_declare` refuses anything
2558
+ * else by name, and `custom.form_public` stops handing it out the moment its
2559
+ * site leaves the organization's list (lane S7-PRIME).
2560
+ */
2561
+ thankYou?: FormThankYou | null;
2301
2562
  submitLabel?: string | null;
2302
2563
  /**
2303
2564
  * Is this form meant to be answerable by someone who is not signed in? The
@@ -2453,6 +2714,8 @@ interface PortalCardViewProps {
2453
2714
  onPreview: (person: PortalPrincipal, tableId: Uuid) => Promise<PortalAnswer<PortalPreviewRow[]>>;
2454
2715
  /** The invite control, which needs a client of its own. Absent means none is offered. */
2455
2716
  invite?: ReactNode;
2717
+ /** S6 — the look-and-forms editor, which needs a client of its own. Absent means none is offered. */
2718
+ look?: ReactNode;
2456
2719
  /**
2457
2720
  * Where this app is served from, so a person's own invitation link can be copied whole.
2458
2721
  * Omit it and the view falls back to the browser's origin, which keeps this component
@@ -2461,7 +2724,16 @@ interface PortalCardViewProps {
2461
2724
  origin?: string | undefined;
2462
2725
  className?: string | undefined;
2463
2726
  }
2464
- declare function PortalCardView({ card, tableId, onRevoke, onPreview, invite, origin, className, }: PortalCardViewProps): react.JSX.Element;
2727
+ declare function PortalCardView({ card, tableId, onRevoke, onPreview, invite, look, origin, className, }: PortalCardViewProps): react.JSX.Element;
2728
+
2729
+ interface PortalLookEditorProps {
2730
+ /** Exactly what `custom.portal_card` answered. */
2731
+ card: PortalCard;
2732
+ /** Called after the store took the new look; the host re-reads the card. */
2733
+ onSaved: () => void;
2734
+ className?: string | undefined;
2735
+ }
2736
+ declare function PortalLookEditor({ card, onSaved, className }: PortalLookEditorProps): react.JSX.Element;
2465
2737
 
2466
2738
  interface DigestSchedulerProps {
2467
2739
  /** The Table the digest is about. A saved view is a view OF something. */
@@ -2622,6 +2894,10 @@ interface ChartSpec {
2622
2894
  stateKey?: string;
2623
2895
  /** `stuck` only: how long a record may sit on the same value. */
2624
2896
  days?: number;
2897
+ /** S3 — the comparison this block makes, as the store stores it. */
2898
+ compare?: AggregateCompare | null;
2899
+ /** S3 — the number this block aims for. */
2900
+ target?: DashboardTarget | null;
2625
2901
  }
2626
2902
  /** A dashboard as `custom.dashboards` reports it, in the screen's own words. */
2627
2903
  interface SavedDashboard {
@@ -2794,9 +3070,17 @@ interface NotifyRuleEditorProps {
2794
3070
  tableId: Uuid;
2795
3071
  /** COMPLETE declarative subscriptions an agent wrote. Saved once, never overwritten. */
2796
3072
  seed?: NotifyRuleSpec[] | undefined;
3073
+ /**
3074
+ * CHOOSE MODE — the subscription something else points at (a form's notify
3075
+ * Rule). Given with `onChoose`, each subscription offers to be the one, and a
3076
+ * subscription made here becomes the one the moment the store has it.
3077
+ */
3078
+ chosenRuleId?: Uuid | null | undefined;
3079
+ /** CHOOSE MODE — called with the chosen subscription's Rule id, or null to choose none. */
3080
+ onChoose?: ((ruleId: Uuid | null) => void) | undefined;
2797
3081
  className?: string | undefined;
2798
3082
  }
2799
- declare function NotifyRuleEditor({ tableId, seed, className }: NotifyRuleEditorProps): react.JSX.Element;
3083
+ declare function NotifyRuleEditor({ tableId, seed, chosenRuleId, onChoose, className }: NotifyRuleEditorProps): react.JSX.Element;
2800
3084
 
2801
3085
  interface ChartBlockProps {
2802
3086
  /** One block out of the canvas's single run — answered, or refused. */
@@ -2832,6 +3116,24 @@ interface FormsPanelProps {
2832
3116
  declare const FORM_NOT_HERE_LINE: string;
2833
3117
  declare function FormsPanel({ tableId, activeFormId, className }: FormsPanelProps): react.JSX.Element;
2834
3118
 
3119
+ /**
3120
+ * What the public arm's `whichAsked` answers: for each question, whether the
3121
+ * STORE says it is asked given the answers so far. `said` is the store's own
3122
+ * sentence when it could not work a condition out — that question is asked, and
3123
+ * the sentence is shown, never a silent hide.
3124
+ */
3125
+ type FormAsked = {
3126
+ ok: true;
3127
+ asks: ReadonlyArray<{
3128
+ field: string;
3129
+ asked: boolean;
3130
+ said?: string | null;
3131
+ }>;
3132
+ } | {
3133
+ ok: false;
3134
+ message: string;
3135
+ error?: RecordsError | undefined;
3136
+ };
2835
3137
  /** What the public arm's `onSubmit` answers. A refusal carries the door's words. */
2836
3138
  type FormSubmitOutcome = {
2837
3139
  ok: true;
@@ -2858,11 +3160,31 @@ interface FormRunnerProps {
2858
3160
  fields?: readonly Field[] | undefined;
2859
3161
  /** PUBLIC ARM — where an answer goes. Server action or route handler. */
2860
3162
  onSubmit?: ((values: Record<string, unknown>) => Promise<FormSubmitOutcome>) | undefined;
3163
+ /**
3164
+ * PUBLIC ARM — which questions are asked next, answered by the STORE on the
3165
+ * server (`custom.form_public_asks`). Asked again as answers change. Left out
3166
+ * on a form with conditions, every question is shown and the form says why.
3167
+ */
3168
+ whichAsked?: ((values: Record<string, unknown>) => Promise<FormAsked>) | undefined;
2861
3169
  /**
2862
3170
  * PUBLIC ARM — the name of a decoy input. A person never fills it; a script
2863
3171
  * fills everything. The door decides what a filled one means, not this screen.
2864
3172
  */
2865
3173
  honeypotKey?: string | null | undefined;
3174
+ /**
3175
+ * Answers the form starts with — a prefilled link, or a saved place being
3176
+ * resumed. They are ordinary answers: shown in their questions, changeable,
3177
+ * and handed to `whichAsked` like any typed answer, so branching follows.
3178
+ */
3179
+ initialAnswers?: Readonly<Record<string, unknown>> | undefined;
3180
+ /** Every change to the answers, after the first paint. The host keeps the place. */
3181
+ onAnswersChange?: ((answers: Record<string, unknown>) => void) | undefined;
3182
+ /**
3183
+ * `initialAnswers` is a saved place the person is coming back to, so the form
3184
+ * opens on the first question still waiting for an answer. Without it a
3185
+ * prefilled form opens on question one, showing the prefilled answer in place.
3186
+ */
3187
+ resumed?: boolean | undefined;
2866
3188
  /** Preview mode answers the questions but writes nothing, and says so. */
2867
3189
  preview?: boolean | undefined;
2868
3190
  onSubmitted?: ((recordId: Uuid | null) => void) | undefined;
@@ -3233,11 +3555,37 @@ interface TablesHomeProps {
3233
3555
  * did before, rather than on a screen it does not know how to address.
3234
3556
  */
3235
3557
  onOpenTable?: ((tableId: Uuid$1, dashboardId?: Uuid$1) => void) | undefined;
3558
+ /**
3559
+ * THE ORGANIZATION EVERY ROW HERE LIVES IN, BY NAME (lane SC-1-TAILS; access-is-personal: a
3560
+ * list filtered by one organization says which). Each row carries a quiet "Lives in <name>"
3561
+ * chip that, pressed, asks the store where that table lives and — for its owner — where else
3562
+ * it can go. Absent: the list asks the store once, for its first table. When the store cannot
3563
+ * name it, the chips are absent rather than a row of "unknown".
3564
+ */
3565
+ organizationName?: string | null | undefined;
3236
3566
  className?: string | undefined;
3237
3567
  }
3238
- declare function TablesHome({ onOpenTable, className }: TablesHomeProps): react.JSX.Element;
3568
+ declare function TablesHome({ onOpenTable, organizationName, className }: TablesHomeProps): react.JSX.Element;
3569
+
3570
+ interface WhereItLivesProps {
3571
+ tableId: Uuid$1;
3572
+ /**
3573
+ * The name the screen already holds (a list whose rows all live in one organization), shown
3574
+ * until the store answers — and, on a row, instead of asking at all until the chip is pressed:
3575
+ * forty rows are not forty reads.
3576
+ */
3577
+ knownOrganizationName?: string | null | undefined;
3578
+ /** After a move lands: the host re-reads (the list, its rows, the page). */
3579
+ onMoved?: ((to: {
3580
+ id: Uuid$1;
3581
+ name: string;
3582
+ }) => void) | undefined;
3583
+ /** `row` is quieter, for a list; `header` for an object page. */
3584
+ variant?: "header" | "row" | undefined;
3585
+ }
3586
+ declare function WhereItLives({ tableId, knownOrganizationName, onMoved, variant }: WhereItLivesProps): react.JSX.Element;
3239
3587
 
3240
- type Rail = "none" | "settings" | "inbox" | "import" | "field" | "record" | "new-record" | "forms" | "bookings" | "checklists" | "notifications" | "portals" | "who-changed";
3588
+ type Rail = "none" | "settings" | "inbox" | "import" | "field" | "record" | "new-record" | "forms" | "bookings" | "checklists" | "notifications" | "portals" | "who-changed" | "export";
3241
3589
  interface TablePageProps {
3242
3590
  tableId: Uuid$1;
3243
3591
  /** Rows per page for every layout. */
@@ -3568,95 +3916,6 @@ declare function WhoChangedSource({ tableId, labelOf, children, }: {
3568
3916
  /** What this cell can say about who last changed it. */
3569
3917
  declare function useWhoChanged(fieldKey: string, recordId: Uuid$1): WhoChanged;
3570
3918
 
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
3919
  interface ShareControlProps {
3661
3920
  kind: ShareSubject["kind"];
3662
3921
  organizationId: Uuid$1;
@@ -3693,12 +3952,25 @@ interface PipelineBoardProps {
3693
3952
  rows: ReadRow$1[];
3694
3953
  /** A number column to total under each heading. The person picks it; nothing is guessed. */
3695
3954
  measure?: string | null;
3955
+ /**
3956
+ * S2-PRIME — the question the cards under this board were read with, either shape. The
3957
+ * headings are counted by the store with THE SAME question (`pipelineBoard({filter})`), so a
3958
+ * column never says 16 over the 4 cards a view put in it.
3959
+ */
3960
+ filter?: StoreFilter | null | undefined;
3696
3961
  onMeasureChange?: ((key: string | null) => void) | undefined;
3697
3962
  onOpenRecord?: ((recordId: Uuid) => void) | undefined;
3698
3963
  /** Called after a move lands, so the host re-reads the rows it owns. */
3699
3964
  onMoved?: (() => void) | undefined;
3965
+ /**
3966
+ * THE COLORS THE REST OF THE VIEW PAINTS WITH (lane UI-QUICK-1) — `resolveTableStyle`'s answer,
3967
+ * the table's G1 decorations under the view's own look. `ViewSwitcher`'s board passes the one it
3968
+ * already resolved; left out, the board resolves the table's own decorations itself, so a host
3969
+ * that mounts the board alone still tints its cards exactly as the grid tints the rows.
3970
+ */
3971
+ style?: TableStyle | undefined;
3700
3972
  className?: string | undefined;
3701
3973
  }
3702
- declare function PipelineBoard({ tableId, rows, measure, onMeasureChange, onOpenRecord, onMoved, className, }: PipelineBoardProps): react.JSX.Element;
3974
+ declare function PipelineBoard({ tableId, rows, measure, filter, onMeasureChange, onOpenRecord, onMoved, style, className, }: PipelineBoardProps): react.JSX.Element;
3703
3975
 
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 };
3976
+ 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, 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, 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_NOT_REACHABLE, THE_SYSTEM, type TableLane, 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, WORK_DUE_STATES, WORK_INBOX_KINDS, WORK_INBOX_KIND_LABEL, type WhatYouMayDo, WhereItLives, type WhereItLivesProps, type WhoChanged, WhoChangedSource, actorBadge, actorWords, archivedRowLine, asRefusal, askableFields, blockFromSpec, bodyForReading, bodyFromKeys, cameFromLine, cellState, chooseSurface, colorFromTheValue, columnForField, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, currencyCodeFor, dashboardDeclareArgs, dashboardFromSummary, declareView, editorKindFor, ensureSystemTable, entityReferenceSpec, envelopeFor, 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, seedIsSatisfied, shareUnavailableReason, specFromBlock, storeDecidesRights, submissionStamp, surfaceChosen, tableName, 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 };