@ai-matrx/records-ui 0.84.7 → 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, AggregateFilter, Field, RecordDocument, ReadRow, RelationDisplay, WriteConflict, RecordsErrorCode, DeclarableFieldKind, ParityFieldType, NewFieldDeclaration, RuleExpression, ValueEnvelope, ChecklistRequirementKind, ContextPolicy, WorkDueState, FieldSensitivity, StageRuleOnFail, SubscriptionCadence, WorkInboxKind, FieldKind, RecordsResult, RecordFilter as RecordFilter$1, 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, 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';
@@ -227,7 +228,37 @@ declare const NO_RIGHTS: TableRights;
227
228
  * ladder cannot produce (write without read, share without edit).
228
229
  */
229
230
  declare function tableRightsAt(level: PermissionLevel | null): TableRights;
231
+ /**
232
+ * A LAYOUT THE HOST DRAWS, beside the package's own four (Grid, Kanban, Calendar,
233
+ * Gallery) in the SAME layout row of every table page. The host owns what it
234
+ * draws; the package owns where it sits, its button, and its address (`?view=<id>`).
235
+ *
236
+ * WHY A PORT: an app with a richer surface for one kind of looking at a table —
237
+ * AI Matrx's spreadsheet-feel Sheet, the older /data grid ported onto the record
238
+ * store — must be a layout of the one table page, never a second page for the
239
+ * same table. It is page-level, not saved onto the view record: the store's
240
+ * layout words are the four the package draws.
241
+ */
242
+ interface HostLayout {
243
+ /** The address word (`?view=sheet`). Lowercase; must not be one of the package's own. */
244
+ id: string;
245
+ /** The button's words. */
246
+ label: string;
247
+ /** Draw it for this table, with the question the address asked when there is one. */
248
+ render: (args: {
249
+ tableId: Uuid$1;
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;
257
+ }) => ReactNode;
258
+ }
230
259
  interface RecordsUiHost {
260
+ /** Layouts the host draws beside the package's own. See `HostLayout`. */
261
+ layouts?: HostLayout[];
231
262
  /** Answer the rights question for one table. Synchronous: a screen renders now. */
232
263
  rights?: (table: Table) => TableRights;
233
264
  /** Where a record's own page lives, when the host has one. A peek is used when it does not. */
@@ -335,6 +366,25 @@ interface RecordsUiHost {
335
366
  recordId: Uuid$1;
336
367
  title: string;
337
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;
338
388
  /**
339
389
  * OPTIONAL. THE SERVER'S `records` TOOL (SCR-27).
340
390
  *
@@ -1007,6 +1057,18 @@ type GridGrouping = {
1007
1057
  order?: GroupOrder;
1008
1058
  /** The sections this view keeps shut, by the primitive's own group key. */
1009
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;
1010
1072
  };
1011
1073
  /** Everything a view says about how its table LOOKS. */
1012
1074
  type GridPresentation = {
@@ -1031,6 +1093,33 @@ type GridPresentation = {
1031
1093
  widths?: Record<string, number>;
1032
1094
  /** The body row height this view remembers, in px. */
1033
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>;
1034
1123
  };
1035
1124
  declare const EMPTY_PRESENTATION: GridPresentation;
1036
1125
  /** A frozen column needs a known width, or the table declines to freeze at all. */
@@ -1098,8 +1187,11 @@ interface GridProps {
1098
1187
  * own query. Never filter `rows` here: this grid only ever holds one page,
1099
1188
  * so filtering in the browser would drop every matching record on page two
1100
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.
1101
1193
  */
1102
- filter?: RecordFilter | undefined;
1194
+ filter?: StoreFilter$1 | undefined;
1103
1195
  /** Opened when a row is clicked. A host that has a record page passes its own. */
1104
1196
  onOpenRecord?: ((recordId: Uuid) => void) | undefined;
1105
1197
  /** SCR-2. Called when an admin clicks the "+" at the end of the headers. */
@@ -1176,6 +1268,36 @@ enrich?: {
1176
1268
  onPin?: ((recordId: Uuid, fieldKey: string, pinned: boolean) => void | Promise<void>) | undefined;
1177
1269
  }): MatrxColumnDef<ReadRow$1>;
1178
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
+
1179
1301
  interface ExportMenuProps {
1180
1302
  tableId: Uuid;
1181
1303
  /** The rows on screen. Absent means "this table's first page", read the same way. */
@@ -1290,7 +1412,18 @@ type RelationFieldType = "relation";
1290
1412
  * `FIELD_TYPE_CHOICES`'s coverage and as a red `kindsWithNoChoice()` below — never as a
1291
1413
  * silence.
1292
1414
  */
1293
- 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";
1294
1427
  interface FieldTypeChoice {
1295
1428
  id: PickableFieldType;
1296
1429
  /** The word on the menu. */
@@ -1388,6 +1521,8 @@ declare function whatIsMissing(state: {
1388
1521
  formulaFields: string[];
1389
1522
  /** Only a link asks for one, so a caller about any other kind leaves it out. */
1390
1523
  relationTarget?: string;
1524
+ /** Only an entity-reference column asks for these (SC-R). */
1525
+ allowedTypes?: readonly string[];
1391
1526
  }): string | null;
1392
1527
 
1393
1528
  declare const NO_RULES_YET = "Nothing has to be true to get here yet.";
@@ -1475,29 +1610,37 @@ declare function ConditionRow({ lead, expr, fields, onChange, emptyLabel, classN
1475
1610
  * CAN THE BUILDER DRAW THIS CONDITION? — the question every caller asks before it renders,
1476
1611
  * and the reason a rule somebody cannot see is never silently saved over.
1477
1612
  *
1478
- * Drawable means: nothing; one clause; or an ALL/ANY of clauses, where a member may itself
1479
- * be one ALL/ANY of clauses and no deeper. `conditionIsSimple` is still the leaf test and
1480
- * 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.
1481
1616
  */
1482
1617
  declare function conditionIsDrawable(expr: RuleExpression | Record<string, unknown> | null | undefined, depth?: number): boolean;
1483
1618
  interface ConditionGroupProps {
1484
- /** The words before the condition: "When", "Ask only when". */
1619
+ /** The words before the condition: "When", "Ask only when", "Show jobs where". */
1485
1620
  lead: string;
1486
1621
  expr: RuleExpression | Record<string, unknown> | null | undefined;
1487
1622
  fields: ConditionField[];
1488
1623
  onChange: (next: RuleExpression | null) => void;
1489
1624
  /** What the empty option says: "always", "every card". */
1490
1625
  emptyLabel?: string;
1491
- /** 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
+ */
1492
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;
1493
1635
  className?: string | undefined;
1494
1636
  }
1495
1637
  /**
1496
1638
  * THE ONE CONDITION BUILDER. One clause reads exactly as it always has — a single row, no
1497
- * joiner, no chrome — and the joiner appears only once there is something to join, so a
1498
- * 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.
1499
1642
  */
1500
- 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;
1501
1644
 
1502
1645
  interface FieldProposalRow {
1503
1646
  id: string;
@@ -1570,6 +1713,40 @@ interface RelationPickerProps {
1570
1713
  }
1571
1714
  declare function RelationPicker({ field, value, onChange, disabled, id, className, allowCreate }: RelationPickerProps): react.JSX.Element;
1572
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
+
1573
1750
  interface FieldEditorControlProps {
1574
1751
  field: Field;
1575
1752
  value: unknown;
@@ -1591,36 +1768,6 @@ declare function RecordChip({ title, onRemove, className, }: {
1591
1768
  className?: string | undefined;
1592
1769
  }): react.JSX.Element;
1593
1770
 
1594
- /** Answers "what is the record with this id called", for one Field's values. */
1595
- type LabelLookup = (field: Field$1, id: string) => string | null;
1596
- /**
1597
- * HOW LONG A CELL MAY SAY "Loading…" BEFORE IT HAS TO SAY WHAT IT IS WAITING
1598
- * FOR. One second is the span at which a person stops reading a word as "this
1599
- * is about to happen" and starts reading it as "this is stuck" — the same line
1600
- * Nielsen's response-time work draws and the one Linear and Stripe design to.
1601
- */
1602
- declare const SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS = 1000;
1603
- /** Which ids a Field's stored value refers to. */
1604
- declare function idsOf(value: unknown): string[];
1605
- declare function isId(value: unknown): boolean;
1606
- /** True when this Field's values are ids of other records rather than values. */
1607
- declare function pointsAtRecords(field: Field$1): boolean;
1608
- declare function RecordLabelProvider({ children }: {
1609
- children: ReactNode;
1610
- }): react.JSX.Element;
1611
- /**
1612
- * The hook a surface uses: it declares the Fields it is about to draw, and gets
1613
- * back the lookup. Declaring is what makes one request per Field instead of one
1614
- * per cell, and it is why a grid of 200 rows asks the store twice.
1615
- */
1616
- declare function useRecordLabels(fields: readonly Field$1[] | undefined): LabelLookup;
1617
- /**
1618
- * WHAT THIS COLUMN IS STILL WAITING FOR, or null while "Loading…" is still an
1619
- * honest word. A cell draws this INSTEAD of "Loading…" once the resolver has
1620
- * been looking for a second — see `SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS`.
1621
- */
1622
- declare function useLabelWait(field: Field$1 | undefined): string | null;
1623
-
1624
1771
  /** The envelope for one key, when the document carries one. */
1625
1772
  declare function envelopeFor(document: RecordDocument | undefined, key: string): ValueEnvelope | undefined;
1626
1773
  declare function renderValue(field: Field, value: unknown, document?: RecordDocument, labels?: LabelLookup, stillWaitingFor?: string | null): react.JSX.Element;
@@ -1846,6 +1993,14 @@ interface SavedViewSpec {
1846
1993
  * reading is a fact about the records.
1847
1994
  */
1848
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[];
1849
2004
  /** Calendar: the Field that places a record in the month. */
1850
2005
  dateField?: string | null;
1851
2006
  /** Gallery: the Field shown large on the card. */
@@ -1856,6 +2011,22 @@ interface SavedViewSpec {
1856
2011
  * reference to its Rule record, never a predicate this package evaluates.
1857
2012
  */
1858
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;
1859
2030
  isDefault?: boolean;
1860
2031
  /**
1861
2032
  * HOW THIS VIEW LOOKS — its colors, its per-column formats and its frozen
@@ -1868,19 +2039,24 @@ interface SavedViewSpec {
1868
2039
  */
1869
2040
  presentation?: GridPresentation;
1870
2041
  }
1871
- /** 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
+ */
1872
2049
  interface SavedView extends SavedViewSpec {
1873
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;
1874
2053
  /**
1875
- * The record's version AT LOAD, read from `custom.io_revisions` for the one
1876
- * record being edited. The read door answers documents and not versions, so
1877
- * this is null until it has been read — and a save with a null version is an
1878
- * 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`.
1879
2057
  */
1880
- version: number | null;
2058
+ designatedLayout?: string | null;
1881
2059
  }
1882
- /** The package-owned Table every saved view is a record of. */
1883
- declare const VIEW_TABLE: SystemTableSpec;
1884
2060
  /**
1885
2061
  * WHICH FIELD EACH LAYOUT CAN BE DRAWN FROM, decided from the FIELD'S OWN
1886
2062
  * DECLARATION and never from the values it happens to hold.
@@ -1944,33 +2120,106 @@ declare function pageViewFromParam(raw: string | null | undefined): PageView | n
1944
2120
  declare function unknownViewLine(raw: string): string;
1945
2121
  /** The one sentence a layout says when the table holds no Field it could use. */
1946
2122
  declare const LAYOUT_NO_FIELD: Record<ViewLayout, string>;
1947
- /** 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
+ */
1948
2128
  declare function viewDocument(spec: SavedViewSpec): Record<string, unknown>;
1949
- /** One stored record back into the spec a screen and an agent both read. */
1950
- declare function viewFromRecord(row: ReadRow): SavedView;
1951
2129
  /**
1952
- * 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.
1953
2141
  *
1954
- * The version a screen holds for a view is read from the view's history, and the
1955
- * history can be SHORT of the record — measured on the dev clone 2026-09-23: 68 live
1956
- * records whose version is ahead of their newest history row, among them the
1957
- * Birchwood quote board's view (record at 4, history stopping at 3). Every layout
1958
- * 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).
1959
2147
  *
1960
- * So a conflict is answered with the version the refusal itself names as the winner,
1961
- * and the change is sent once more on it. A saved view is a person's own arrangement
1962
- * of a table: their latest press is the one that should stand, the way Airtable and
1963
- * Notion keep the last view change. Anything still refused is handed back, for the
1964
- * 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.
1965
2153
  */
1966
- 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>>;
1967
2155
  /**
1968
- * A PARTIAL change to a saved view, as the patch the store takes. Only the keys
1969
- * the caller actually changed are written — a full document would re-write a
1970
- * 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.
1971
2159
  */
1972
2160
  declare function viewPatchDocument(patch: Partial<SavedViewSpec>): Record<string, unknown>;
1973
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
+
1974
2223
  interface ViewSwitcherProps {
1975
2224
  /**
1976
2225
  * THE DECLARATIVE SPEC — an agent writes the whole thing, a person tweaks it.
@@ -2005,12 +2254,30 @@ interface ViewSwitcherProps {
2005
2254
  * object the chart counted with. It narrows the grid AND the board through
2006
2255
  * the store, so switching layout after a drill-through keeps the same rows
2007
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.
2260
+ */
2261
+ filter?: StoreFilter | undefined;
2262
+ /**
2263
+ * The HOST layout showing now (`RecordsUiHost.layouts`, by id), or null for the
2264
+ * package's own. Controlled by the page, because the address names it.
2265
+ */
2266
+ hostLayout?: string | null | undefined;
2267
+ /** The person picked a host layout (its id), or went back to one of the four (null). */
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.
2008
2273
  */
2009
- filter?: RecordFilter$1 | undefined;
2274
+ chooser?: boolean | undefined;
2275
+ /** Handed to a host layout's `render` — the page's own export. */
2276
+ openExport?: (() => void) | undefined;
2010
2277
  className?: string | undefined;
2011
2278
  }
2012
2279
  /** The records this view holds: its Rule's members when it names one, the table otherwise. */
2013
- declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?: RecordFilter$1): {
2280
+ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?: StoreFilter): {
2014
2281
  rows: ReadRow$1[];
2015
2282
  loading: boolean;
2016
2283
  error: RecordsError | null;
@@ -2028,7 +2295,7 @@ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?:
2028
2295
  */
2029
2296
  membership: string;
2030
2297
  };
2031
- declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize, filter, 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;
2032
2299
 
2033
2300
  /** What the screen says above the list, so nobody has to be told twice that nothing was destroyed. */
2034
2301
  declare const ARCHIVE_MEANS = "Archiving never destroys anything. A record you remove from the grid waits here until somebody brings it back.";
@@ -2111,15 +2378,28 @@ interface ViewBarProps {
2111
2378
  * The person tweaks them afterwards like any other view.
2112
2379
  */
2113
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;
2114
2389
  className?: string | undefined;
2115
2390
  }
2116
2391
  /**
2117
- * What the bar says when this organization's saved-view Table cannot be levelled. It
2118
- * names the ONE thing that is missing (the remembered layouts) and nothing else, because
2119
- * 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.
2120
2395
  */
2121
2396
  declare const SAVED_VIEWS_UNAVAILABLE: string;
2122
- 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;
2123
2403
 
2124
2404
  /** One proposed change, in the proposer's words plus the exact act it asks for. */
2125
2405
  interface ProposedChange {
@@ -2254,6 +2534,13 @@ interface FormTheme {
2254
2534
  accent?: string | null;
2255
2535
  align?: "left" | "center" | null;
2256
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
+ }
2257
2544
  /** THE COMPLETE DECLARATIVE SPEC. One `record_write` and the form exists. */
2258
2545
  interface FormSpec {
2259
2546
  name: string;
@@ -2263,10 +2550,15 @@ interface FormSpec {
2263
2550
  questions: FormQuestionSpec[];
2264
2551
  flow?: FormFlow | null;
2265
2552
  theme?: FormTheme | null;
2266
- thankYou?: {
2267
- title: string;
2268
- body?: string | null;
2269
- } | 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;
2270
2562
  submitLabel?: string | null;
2271
2563
  /**
2272
2564
  * Is this form meant to be answerable by someone who is not signed in? The
@@ -2422,6 +2714,8 @@ interface PortalCardViewProps {
2422
2714
  onPreview: (person: PortalPrincipal, tableId: Uuid) => Promise<PortalAnswer<PortalPreviewRow[]>>;
2423
2715
  /** The invite control, which needs a client of its own. Absent means none is offered. */
2424
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;
2425
2719
  /**
2426
2720
  * Where this app is served from, so a person's own invitation link can be copied whole.
2427
2721
  * Omit it and the view falls back to the browser's origin, which keeps this component
@@ -2430,7 +2724,16 @@ interface PortalCardViewProps {
2430
2724
  origin?: string | undefined;
2431
2725
  className?: string | undefined;
2432
2726
  }
2433
- 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;
2434
2737
 
2435
2738
  interface DigestSchedulerProps {
2436
2739
  /** The Table the digest is about. A saved view is a view OF something. */
@@ -2456,7 +2759,7 @@ interface DigestSchedulerProps {
2456
2759
  * shape: an unknown here is a subscription that silently notifies about the
2457
2760
  * wrong records.
2458
2761
  */
2459
- filters?: RecordFilter$1 | null | undefined;
2762
+ filters?: RecordFilter | null | undefined;
2460
2763
  onScheduled?: (() => void) | undefined;
2461
2764
  onClose?: (() => void) | undefined;
2462
2765
  className?: string | undefined;
@@ -2591,6 +2894,10 @@ interface ChartSpec {
2591
2894
  stateKey?: string;
2592
2895
  /** `stuck` only: how long a record may sit on the same value. */
2593
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;
2594
2901
  }
2595
2902
  /** A dashboard as `custom.dashboards` reports it, in the screen's own words. */
2596
2903
  interface SavedDashboard {
@@ -2763,9 +3070,17 @@ interface NotifyRuleEditorProps {
2763
3070
  tableId: Uuid;
2764
3071
  /** COMPLETE declarative subscriptions an agent wrote. Saved once, never overwritten. */
2765
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;
2766
3081
  className?: string | undefined;
2767
3082
  }
2768
- declare function NotifyRuleEditor({ tableId, seed, className }: NotifyRuleEditorProps): react.JSX.Element;
3083
+ declare function NotifyRuleEditor({ tableId, seed, chosenRuleId, onChoose, className }: NotifyRuleEditorProps): react.JSX.Element;
2769
3084
 
2770
3085
  interface ChartBlockProps {
2771
3086
  /** One block out of the canvas's single run — answered, or refused. */
@@ -2801,6 +3116,24 @@ interface FormsPanelProps {
2801
3116
  declare const FORM_NOT_HERE_LINE: string;
2802
3117
  declare function FormsPanel({ tableId, activeFormId, className }: FormsPanelProps): react.JSX.Element;
2803
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
+ };
2804
3137
  /** What the public arm's `onSubmit` answers. A refusal carries the door's words. */
2805
3138
  type FormSubmitOutcome = {
2806
3139
  ok: true;
@@ -2827,11 +3160,31 @@ interface FormRunnerProps {
2827
3160
  fields?: readonly Field[] | undefined;
2828
3161
  /** PUBLIC ARM — where an answer goes. Server action or route handler. */
2829
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;
2830
3169
  /**
2831
3170
  * PUBLIC ARM — the name of a decoy input. A person never fills it; a script
2832
3171
  * fills everything. The door decides what a filled one means, not this screen.
2833
3172
  */
2834
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;
2835
3188
  /** Preview mode answers the questions but writes nothing, and says so. */
2836
3189
  preview?: boolean | undefined;
2837
3190
  onSubmitted?: ((recordId: Uuid | null) => void) | undefined;
@@ -3202,11 +3555,37 @@ interface TablesHomeProps {
3202
3555
  * did before, rather than on a screen it does not know how to address.
3203
3556
  */
3204
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;
3205
3566
  className?: string | undefined;
3206
3567
  }
3207
- 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;
3208
3587
 
3209
- 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";
3210
3589
  interface TablePageProps {
3211
3590
  tableId: Uuid$1;
3212
3591
  /** Rows per page for every layout. */
@@ -3271,7 +3650,11 @@ interface TablePageProps {
3271
3650
  * Half a deep link is a link that works when you arrive and lies when you
3272
3651
  * copy it out of the address bar afterwards.
3273
3652
  */
3274
- onViewChanged?: ((view: PageView) => void) | undefined;
3653
+ /**
3654
+ * Called with the view the person moved to — one of `PAGE_VIEWS`, or the id of a
3655
+ * layout the HOST draws (`RecordsUiHost.layouts`), which the address carries too.
3656
+ */
3657
+ onViewChanged?: ((view: PageView | string) => void) | undefined;
3275
3658
  /**
3276
3659
  * WHICH FIELD THE ADDRESS WANTS THE BOARD'S COLUMNS TO BE, for this visit.
3277
3660
  *
@@ -3310,7 +3693,7 @@ interface TablePageProps {
3310
3693
  * It is a QUESTION for this visit, exactly like `activeView` and
3311
3694
  * `activeGroupField`, and is never written onto the saved view.
3312
3695
  */
3313
- filter?: RecordFilter$1 | null | undefined;
3696
+ filter?: RecordFilter | null | undefined;
3314
3697
  /**
3315
3698
  * WHICH RAIL THE ADDRESS OPENS — `forms`, `bookings`, `checklists`,
3316
3699
  * `notifications` (also `digests`), `portals`, `settings`, `import`, `inbox`
@@ -3533,95 +3916,6 @@ declare function WhoChangedSource({ tableId, labelOf, children, }: {
3533
3916
  /** What this cell can say about who last changed it. */
3534
3917
  declare function useWhoChanged(fieldKey: string, recordId: Uuid$1): WhoChanged;
3535
3918
 
3536
- /** One Field a person asked for, in the words a person uses (FLD-1 / FLD-11). */
3537
- interface NewFieldSpec {
3538
- key: string;
3539
- label: string;
3540
- /**
3541
- * The word for what this column holds. One of the thirteen parity types, one
3542
- * of the five behaviours, or a plain synonym (`text`, `long_text`, `number`)
3543
- * — `custom._field_document_for` resolves all three and refuses a word that
3544
- * means nothing, by name, with the list.
3545
- */
3546
- type: FieldTypeWord;
3547
- sort?: number;
3548
- required?: boolean;
3549
- multi?: boolean;
3550
- config?: Record<string, unknown>;
3551
- /** A choice list's choices, as words. The store keeps them as a Table (FLD-5). */
3552
- options?: string[];
3553
- /** A column that points at another Table of this organization (FLD-11 / REL-8). */
3554
- relationTarget?: Uuid$1;
3555
- /** A currency column's symbol; a date column's day-or-day-and-time. */
3556
- unit?: string;
3557
- kind?: "date" | "datetime";
3558
- }
3559
- interface NewTableSpec {
3560
- name: string;
3561
- /** The token the Table is addressed by. Derived from the name when absent. */
3562
- slug?: string;
3563
- labelSingular?: string;
3564
- labelPlural?: string;
3565
- /** The Field whose value is the record's title (REC-2). Defaults to the first Field. */
3566
- titleField?: string;
3567
- fields?: NewFieldSpec[];
3568
- }
3569
- type DeclareResult =
3570
- /**
3571
- * The Table's id — and its HOME's, because REC-14 gives the Table exactly one
3572
- * and the caller that made it is the only one that can tidy it up again. A
3573
- * caller reading `data` alone is unaffected.
3574
- */
3575
- {
3576
- ok: true;
3577
- data: Uuid$1;
3578
- homeId: Uuid$1;
3579
- } | {
3580
- ok: false;
3581
- error: RecordsError;
3582
- };
3583
- /** `My Sales Pipeline` → `my_sales_pipeline`. A token, never a sentence. */
3584
- declare function tokenFor(name: string): string;
3585
- /** The one Field a Table cannot be declared without: something to call a record. */
3586
- /**
3587
- * WHY THE FIRST FIELD IS NOT REQUIRED.
3588
- *
3589
- * It was, and the cost showed up the moment the grid could add a row: "New
3590
- * record" writes an empty record and puts you in the first cell, and the store
3591
- * correctly refused every one of them — `REC-51: Title is required` — so the
3592
- * one gesture that makes a grid feel like a grid never worked on a table a
3593
- * person had just made. A title is what makes a record a CHIP (REC-2), which is
3594
- * a fact about how it is shown, not a promise it can never be written without;
3595
- * an organization that wants it demanded says so in the field editor, and the
3596
- * store then enforces it for everyone.
3597
- */
3598
- declare const DEFAULT_FIELDS: NewFieldSpec[];
3599
- /**
3600
- * One column, in the shape `custom.field_declare` takes — and EVERYTHING a
3601
- * person said about it. The keys after the type are not decoration: without
3602
- * `options` the door refuses a choice list outright ("A list of choices needs
3603
- * its choices"), without `unit` a money column is dollars whatever the person
3604
- * picked, and without `relation_target` a column that points at another of this
3605
- * organization's own tables cannot be declared at all.
3606
- */
3607
- declare function fieldDeclarationFor(field: NewFieldSpec): NewFieldDeclaration;
3608
- declare function declareTable(client: RecordsClient, spec: NewTableSpec): Promise<DeclareResult>;
3609
- /**
3610
- * Columns for an existing Table, through the door that declares one. Used by
3611
- * the create path and by import.
3612
- *
3613
- * A column the store refused STOPS the sequence and hands back the store's own
3614
- * sentence: a Table that quietly lost a column is the silent failure this
3615
- * package exists to prevent.
3616
- */
3617
- declare function addFields(client: RecordsClient, tableId: Uuid$1, fields: NewFieldSpec[]): Promise<{
3618
- ok: true;
3619
- data: Uuid$1;
3620
- } | {
3621
- ok: false;
3622
- error: RecordsError;
3623
- }>;
3624
-
3625
3919
  interface ShareControlProps {
3626
3920
  kind: ShareSubject["kind"];
3627
3921
  organizationId: Uuid$1;
@@ -3658,12 +3952,25 @@ interface PipelineBoardProps {
3658
3952
  rows: ReadRow$1[];
3659
3953
  /** A number column to total under each heading. The person picks it; nothing is guessed. */
3660
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;
3661
3961
  onMeasureChange?: ((key: string | null) => void) | undefined;
3662
3962
  onOpenRecord?: ((recordId: Uuid) => void) | undefined;
3663
3963
  /** Called after a move lands, so the host re-reads the rows it owns. */
3664
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;
3665
3972
  className?: string | undefined;
3666
3973
  }
3667
- 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;
3668
3975
 
3669
- 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, 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 };