@ai-matrx/records-ui 0.85.18 → 0.86.0

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.cts CHANGED
@@ -1,13 +1,13 @@
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, StoreFilter, AggregateFilter, Field, RecordDocument, ReadRow, RelationDisplay, WriteConflict, RecordsErrorCode, TableDecorations, RecordFilter, RuleExpression, RecordsResult, SavedViewRow, DeclarableFieldKind, ParityFieldType, NewFieldDeclaration, HiddenFieldNotice, ValueEnvelope, ChecklistRequirementKind, ContextPolicy, WorkDueState, FieldSensitivity, StageRuleOnFail, SubscriptionCadence, WorkApprovalState, WorkInboxKind, FieldKind, ArchiveLane, ArchivedRow, WorkInboxView, WorkInboxItem, FormSummary, PortalCard, PortalPrincipal, PortalPreviewRow, MySubscription, DashboardBlockKind, AggregateBucket, AggregateMeasure, AggregateCompare, DashboardTarget, DashboardBlock, DashboardSummary, DocTemplateRow, DocRenderRow, QuietHours, DashboardBlockResult, ChecklistRunStep, BookingSummary, CaptureSheetFace, CaptureField, AnonTokenBinding, RecordsConfig, RecordsActor, RecordsDataSource, HistoryActor, FieldHistoryEntry } from '@ai-matrx/records';
4
+ import { PermissionLevel, Table, RecordScopeContext, EnrichCell, RecordsError, Field, TableDecorations, Uuid as Uuid$1, StoreFilter, AggregateFilter, RecordDocument, ReadRow, RelationDisplay, WriteConflict, RecordsErrorCode, RecordFilter, RuleExpression, RecordsResult, SavedViewRow, DeclarableFieldKind, ParityFieldType, NewFieldDeclaration, HiddenFieldNotice, ValueEnvelope, ChecklistRequirementKind, ContextPolicy, WorkDueState, FieldSensitivity, StageRuleOnFail, SubscriptionCadence, WorkApprovalState, WorkInboxKind, FieldKind, ArchiveLane, ArchivedRow, WorkInboxView, WorkInboxItem, FormSummary, PortalCard, PortalPrincipal, PortalPreviewRow, MySubscription, DashboardBlockKind, AggregateBucket, AggregateMeasure, AggregateCompare, DashboardTarget, DashboardBlock, DashboardSummary, DocTemplateRow, DocRenderRow, QuietHours, DashboardBlockResult, ChecklistRunStep, BookingSummary, CaptureSheetFace, CaptureField, AnonTokenBinding, RecordsConfig, RecordsActor, RecordsDataSource, HistoryActor, FieldHistoryEntry } from '@ai-matrx/records';
5
5
  import { Uuid, StoreFilter as StoreFilter$1, Field as Field$1, ReadRow as ReadRow$1 } from '@ai-matrx/records/react';
6
+ import { TableStyle, GroupAggregateSpec, GroupOrder, ChoiceColorLookup } from '@ai-matrx/design-system/data-table';
7
+ import { FieldFormatConfig } from '@ai-matrx/design-system/field-formats';
6
8
  import { RecordsClient } from '@ai-matrx/records/core';
7
9
  export { DEFAULT_FIELDS, DeclareResult, NewFieldSpec, NewTableSpec, addFields, declareTable, fieldDeclarationFor, tokenFor } from '@ai-matrx/records/core';
8
- import { FieldFormatConfig } from '@ai-matrx/design-system/field-formats';
9
10
  import { MatrxColumnDef } from '@ai-matrx/design-system/data-table/types';
10
- import { TableStyle, GroupAggregateSpec, GroupOrder, ChoiceColorLookup } from '@ai-matrx/design-system/data-table';
11
11
 
12
12
  /** The six things a person does to a record or a table, as the screens offer them. */
13
13
  type Capability = "read" | "comment" | "write" | "remove" | "share" | "structure";
@@ -197,6 +197,216 @@ interface EnrichPanelProps {
197
197
  */
198
198
  declare function EnrichPanel({ tableId, fieldId, className }: EnrichPanelProps): react.JSX.Element;
199
199
 
200
+ /**
201
+ * HOW A TABLE LOOKS — colors, formats and the frozen column.
202
+ *
203
+ * THE SPLIT, AND WHY IT IS THIS ONE. A Field declares WHAT it holds: a
204
+ * currency, a percent, a date, a person. A VIEW declares HOW that reads and
205
+ * what it is worth looking at: two decimal places or none, tint the row when
206
+ * Status is Blocked, keep Name in place while the rest scrolls. Airtable draws
207
+ * the line in exactly this place, and it has to be here: two people read one
208
+ * table two different ways, and neither reading is a fact about the records.
209
+ *
210
+ * So nothing in this module is a new column on a Field and nothing here needed
211
+ * a migration. A presentation lives on the saved-view record (`views.ts`), which
212
+ * is an ordinary record of an ordinary Table — which means an agent sets it
213
+ * through the same `records` tool it uses for everything else, and it travels
214
+ * with the table the way every other record does.
215
+ *
216
+ * A FIELD STILL GETS ITS MONEY RIGHT WITH NO CONFIGURATION. `formatForField`
217
+ * reads the Field's OWN declaration — a `currency` parity type with unit `$`, a
218
+ * `percent`, a `datetime` with `config.kind` — and returns the format that
219
+ * follows from it. The view's `formats` map only OVERRIDES that. A table nobody
220
+ * has ever styled still shows `$1,250.50` and `45%`.
221
+ */
222
+
223
+ /**
224
+ * SECTIONS BY A FIELD — the view's own grouping.
225
+ *
226
+ * `field` is a Field KEY, exactly like `frozen` and the keys of `formats`,
227
+ * because a view is written against the Table's declaration and never against
228
+ * whatever id a screen happened to build its columns with.
229
+ *
230
+ * `aggregates` is keyed by Field key too, and `collapsed` holds the data
231
+ * table's own group keys (`s:Blocked`, `n:3`, `empty`), which is what the
232
+ * primitive emits and the only thing that survives a value rendering the same
233
+ * text as another.
234
+ *
235
+ * NOTHING HERE IS EVER CALLED `valueOf`, `toString` or `hasOwnProperty`: every
236
+ * object in JavaScript already has all three, so an optional field by one of
237
+ * those names is NEVER absent and a `config.valueOf ? … : …` check silently
238
+ * reads `Object.prototype`. It cost the primitive a whole grouping once.
239
+ */
240
+ type GridGrouping = {
241
+ /** The Field key whose value makes the sections. */
242
+ field: string;
243
+ /** Per-Field-key subtotal on every section header. */
244
+ aggregates?: Record<string, GroupAggregateSpec>;
245
+ /** Section order. The primitive's default is `value-asc`; blanks sort last. */
246
+ order?: GroupOrder;
247
+ /** The sections this view keeps shut, by the primitive's own group key. */
248
+ collapsed?: string[];
249
+ /**
250
+ * SUB-GROUPS (lane S1-PRIME VIEW-KEYS; ui-bench LISTS "sub-grouping"): up to two more levels
251
+ * inside each section, by Field key. At most three levels in all — the store refuses a fourth
252
+ * (`custom.view_declare`). A layout that draws one level ignores the rest; it never drops them,
253
+ * because this list is parsed and written back whole with the rest of the look.
254
+ */
255
+ then?: GridSubGroup[];
256
+ };
257
+ /** One sub-group level: a Field key and its section order. */
258
+ type GridSubGroup = {
259
+ field: string;
260
+ order?: GroupOrder;
261
+ };
262
+ /** Everything a view says about how its table LOOKS. */
263
+ type GridPresentation = {
264
+ /** Color-by-a-column, rules and manual highlights. */
265
+ style?: TableStyle;
266
+ /** Per-column format overrides, by the Field's key. */
267
+ formats?: Record<string, FieldFormatConfig>;
268
+ /**
269
+ * The columns that stay in place while the table scrolls sideways, by Field
270
+ * key. Only the LEADING run of the view's column order can actually freeze —
271
+ * the data table decides that, and declines rather than pinning a column at a
272
+ * guessed offset.
273
+ */
274
+ frozen?: string[];
275
+ /** Collapsible sections by one Field, with subtotals on each header. */
276
+ grouping?: GridGrouping;
277
+ /**
278
+ * The width a person dragged a column to, by Field key. SPARSE on purpose —
279
+ * a view saved before widths existed carries none and still parses, and a
280
+ * column nobody resized is left to the table's own measurement.
281
+ */
282
+ widths?: Record<string, number>;
283
+ /** The body row height this view remembers, in px. */
284
+ rowHeight?: number;
285
+ /**
286
+ * Field keys hidden from this view — the SAME hidden-column list the grid's
287
+ * own column picker holds, now given a place on the view so it survives a
288
+ * reload and a layout switch reads the identical set gallery and grid agree
289
+ * on, rather than a second "fields shown" list nobody kept in sync.
290
+ */
291
+ hiddenFields?: string[];
292
+ /**
293
+ * The gallery's card size, remembered the same way the grid remembers its
294
+ * row height — a per-view look, not a global default.
295
+ */
296
+ gallerySize?: "small" | "medium" | "large";
297
+ /**
298
+ * THIS VIEW'S OWN LAYOUT CHOICES, over the organization's `custom/grid_layout` knob (lane
299
+ * DEFAULT-GRID-PARITY, TABLE-PARITY D1 D5 D6). Absent means "whatever the organization
300
+ * says"; present is the view's word. `freezeFirst: false` is an explicit NO over an
301
+ * organization that freezes the first column — an empty `frozen` cannot say that.
302
+ */
303
+ wrap?: boolean;
304
+ fit?: "auto" | "fit" | "scroll";
305
+ freezeFirst?: boolean;
306
+ /**
307
+ * THE SUMMARY BAR (TABLE-PARITY F1): Field key → the store measure shown under that column
308
+ * (`count`, `sum`, `avg`, `min`, `max`, `median`, `filled`, `empty`, `unique`), worked out
309
+ * by `custom.record_aggregate` over the whole table.
310
+ */
311
+ summaries?: Record<string, string>;
312
+ /**
313
+ * WHERE THE FOOTER SITS (lane TABLE-PAGE-CHROME, owner 2026-09-25) — the row count and the
314
+ * pages: `sticky`, pinned to the bottom of the screen while the rows scroll (the older grid's
315
+ * way, and the default when a view says nothing), or `inline`, right after the last row with
316
+ * the page scrolling. Read by the Grid and a host's Sheet.
317
+ */
318
+ footer?: FooterPlacement;
319
+ };
320
+ /** Where a grid's footer sits. */
321
+ type FooterPlacement = "sticky" | "inline";
322
+ /** What a view that says nothing gets — the older grid's pinned footer. */
323
+ declare const DEFAULT_FOOTER: FooterPlacement;
324
+ /** Where THIS view's footer sits, said or defaulted. */
325
+ declare function footerOf(p: GridPresentation | null | undefined): FooterPlacement;
326
+ declare const EMPTY_PRESENTATION: GridPresentation;
327
+ /** A frozen column needs a known width, or the table declines to freeze at all. */
328
+ declare const FROZEN_COLUMN_WIDTH = 200;
329
+ /**
330
+ * WHAT A ROW HEIGHT IS ALLOWED TO BE. Below the floor the text is clipped and
331
+ * no editor fits; above the ceiling one record fills the screen. A view asking
332
+ * for anything outside it is DROPPED rather than obeyed, because a saved look
333
+ * must not be able to make a table unreadable — and the Fields' own heights
334
+ * still draw, which is the tolerant half.
335
+ */
336
+ declare const MIN_ROW_HEIGHT = 24;
337
+ declare const MAX_ROW_HEIGHT = 96;
338
+ /**
339
+ * Read a presentation out of whatever the view record holds — an object, or the
340
+ * JSON string a text field stores.
341
+ *
342
+ * Tolerant in exactly the way `parseTableStyle` is: an unreadable half is
343
+ * dropped and the rest still applies, because a table must keep drawing when
344
+ * one piece of its styling goes out of date.
345
+ */
346
+ declare function parseGridPresentation(raw: unknown): GridPresentation;
347
+ /** True when nothing here would change how anything looks. */
348
+ declare function presentationIsEmpty(p: GridPresentation): boolean;
349
+ /** The string a view record stores. Empty string for "this view styles nothing". */
350
+ declare function presentationDocument(p: GridPresentation): string;
351
+ /**
352
+ * The format a Field's OWN declaration implies, before any view says anything.
353
+ *
354
+ * Returns `undefined` for a Field whose value the record renderer already draws
355
+ * better than a formatter could — a relation chip, a person, an attachment, a
356
+ * choice — because handing those to a text formatter would REPLACE a working
357
+ * control with a string.
358
+ */
359
+ declare function formatForField(field: Field): FieldFormatConfig | undefined;
360
+ declare function currencyCodeFor(unit: string | null | undefined): string;
361
+ /**
362
+ * The color a value paints with when a view colors BY a column.
363
+ *
364
+ * NOTHING FAILS SILENTLY, so this never returns "no color" for a value that
365
+ * exists. The store keeps a list column's choices as records of another Table,
366
+ * and this grid has not read that Table's option colors, so the color is
367
+ * derived from the value's own text: the same word always gets the same color,
368
+ * different words get different ones, and `true` is green the way every
369
+ * checklist reads. When those option colors do land, this is the ONE function
370
+ * that changes and every screen follows.
371
+ */
372
+ declare const colorFromTheValue: ChoiceColorLookup;
373
+ /**
374
+ * G1's TABLE-LEVEL COLORS (`custom.table_decorations` / `client.tableDecorations`),
375
+ * TRANSLATED INTO A `TableStyle` — the same document a saved view's own `presentation.style`
376
+ * is, so one resolver (`resolveTableStyle`, below) can treat "the table's colors" and "this
377
+ * view's colors" as two layers of the SAME thing instead of two unrelated systems.
378
+ *
379
+ * THE TRANSLATION IS NECESSARY AND IT IS THE ONLY ONE. G1 addresses a Field by its ID
380
+ * (REC-17 — a column renamed keeps its color), because it is the STORE's own door; a
381
+ * `TableStyle` addresses a Field by its KEY, because it reads straight off `row.document`,
382
+ * which is keyed by Field key. A rule or a color-by whose Field has been deleted (its id no
383
+ * longer resolves to a key) is dropped rather than crashing the whole style — a defect in
384
+ * one rule costs that rule, never the read.
385
+ */
386
+ declare function styleFromDecorations(decorations: TableDecorations | null | undefined, fields: readonly Field[]): TableStyle;
387
+ /**
388
+ * THE ONE PRESENTATION RESOLVER every colored surface in this package reads —
389
+ * `Grid`, and (via `Card`) the kanban board, the calendar and the gallery.
390
+ *
391
+ * THE CLASS THIS CLOSES (lane UI-QUICK-1, TABLE-PARITY review, 2026-09-24). Threading
392
+ * `view.presentation.style` into `Card` closed the instance the CALENDAR-GALLERY bench
393
+ * found — a VIEW that had its own color-by looked right everywhere — but it left the
394
+ * class open: a table whose colors are the ORGANIZATION's decorations (G1's
395
+ * `custom.table_decorations` — "color rows by Account Type", "MAXED and NEAR rules" on
396
+ * Arman's own Coding Accounts table) and whose views never set a `presentation.style` of
397
+ * their own drew NOTHING, on the grid exactly as much as on every other layout, because
398
+ * nothing in this package had ever read G1's door at all.
399
+ *
400
+ * TWO LAYERS, ONE DOCUMENT. The table's decorations are the base coat — what every view
401
+ * of this table shows until a view says otherwise. A view's OWN `presentation.style` is
402
+ * an override, piece by piece: a view that only ever set manual row highlights still
403
+ * inherits the table's color-by and rules for everything it never touched, and a view
404
+ * that fully redecorated (its own `colorBy` AND its own `rules`) is not haunted by a
405
+ * table rule it meant to replace. Per-piece, never all-or-nothing, because a view is a
406
+ * LOOK on top of the table, not a wholesale substitute for it.
407
+ */
408
+ declare function resolveTableStyle(decorations: TableDecorations | null | undefined, fields: readonly Field[], viewStyle: TableStyle | undefined): TableStyle;
409
+
200
410
  /**
201
411
  * What a person may do to one table. The four words and the ladder are the
202
412
  * store's (`rights.ts`), not ours.
@@ -254,6 +464,17 @@ interface HostLayout {
254
464
  * Absent on a page that draws no export.
255
465
  */
256
466
  openExport?: (() => void) | undefined;
467
+ /**
468
+ * Where the view's footer sits (lane TABLE-PAGE-CHROME): `sticky` — fill the height given and
469
+ * keep the counts and pages on the bottom edge; `inline` — after the last row.
470
+ */
471
+ footer?: FooterPlacement | undefined;
472
+ /**
473
+ * THE PAGE'S ONE TOOLBAR ROW (lane TABLE-PAGE-CHROME). A host layout with controls of its own
474
+ * (search, columns, sort) draws them INTO this element — never a second bar under the page's.
475
+ * `null`: the row is mounting (draw nothing yet). Absent: no page row, draw in place.
476
+ */
477
+ toolbarSlot?: HTMLElement | null | undefined;
257
478
  }) => ReactNode;
258
479
  }
259
480
  /** The authored-text slots `renderText` is asked to draw. */
@@ -1063,203 +1284,6 @@ declare function refusalOr(error: RecordsError | null | undefined, code: Records
1063
1284
  */
1064
1285
  declare function asRefusal(thrown: unknown, sentence: string, remedy?: string | null, code?: RecordsErrorCode): RecordsError;
1065
1286
 
1066
- /**
1067
- * HOW A TABLE LOOKS — colors, formats and the frozen column.
1068
- *
1069
- * THE SPLIT, AND WHY IT IS THIS ONE. A Field declares WHAT it holds: a
1070
- * currency, a percent, a date, a person. A VIEW declares HOW that reads and
1071
- * what it is worth looking at: two decimal places or none, tint the row when
1072
- * Status is Blocked, keep Name in place while the rest scrolls. Airtable draws
1073
- * the line in exactly this place, and it has to be here: two people read one
1074
- * table two different ways, and neither reading is a fact about the records.
1075
- *
1076
- * So nothing in this module is a new column on a Field and nothing here needed
1077
- * a migration. A presentation lives on the saved-view record (`views.ts`), which
1078
- * is an ordinary record of an ordinary Table — which means an agent sets it
1079
- * through the same `records` tool it uses for everything else, and it travels
1080
- * with the table the way every other record does.
1081
- *
1082
- * A FIELD STILL GETS ITS MONEY RIGHT WITH NO CONFIGURATION. `formatForField`
1083
- * reads the Field's OWN declaration — a `currency` parity type with unit `$`, a
1084
- * `percent`, a `datetime` with `config.kind` — and returns the format that
1085
- * follows from it. The view's `formats` map only OVERRIDES that. A table nobody
1086
- * has ever styled still shows `$1,250.50` and `45%`.
1087
- */
1088
-
1089
- /**
1090
- * SECTIONS BY A FIELD — the view's own grouping.
1091
- *
1092
- * `field` is a Field KEY, exactly like `frozen` and the keys of `formats`,
1093
- * because a view is written against the Table's declaration and never against
1094
- * whatever id a screen happened to build its columns with.
1095
- *
1096
- * `aggregates` is keyed by Field key too, and `collapsed` holds the data
1097
- * table's own group keys (`s:Blocked`, `n:3`, `empty`), which is what the
1098
- * primitive emits and the only thing that survives a value rendering the same
1099
- * text as another.
1100
- *
1101
- * NOTHING HERE IS EVER CALLED `valueOf`, `toString` or `hasOwnProperty`: every
1102
- * object in JavaScript already has all three, so an optional field by one of
1103
- * those names is NEVER absent and a `config.valueOf ? … : …` check silently
1104
- * reads `Object.prototype`. It cost the primitive a whole grouping once.
1105
- */
1106
- type GridGrouping = {
1107
- /** The Field key whose value makes the sections. */
1108
- field: string;
1109
- /** Per-Field-key subtotal on every section header. */
1110
- aggregates?: Record<string, GroupAggregateSpec>;
1111
- /** Section order. The primitive's default is `value-asc`; blanks sort last. */
1112
- order?: GroupOrder;
1113
- /** The sections this view keeps shut, by the primitive's own group key. */
1114
- collapsed?: string[];
1115
- /**
1116
- * SUB-GROUPS (lane S1-PRIME VIEW-KEYS; ui-bench LISTS "sub-grouping"): up to two more levels
1117
- * inside each section, by Field key. At most three levels in all — the store refuses a fourth
1118
- * (`custom.view_declare`). A layout that draws one level ignores the rest; it never drops them,
1119
- * because this list is parsed and written back whole with the rest of the look.
1120
- */
1121
- then?: GridSubGroup[];
1122
- };
1123
- /** One sub-group level: a Field key and its section order. */
1124
- type GridSubGroup = {
1125
- field: string;
1126
- order?: GroupOrder;
1127
- };
1128
- /** Everything a view says about how its table LOOKS. */
1129
- type GridPresentation = {
1130
- /** Color-by-a-column, rules and manual highlights. */
1131
- style?: TableStyle;
1132
- /** Per-column format overrides, by the Field's key. */
1133
- formats?: Record<string, FieldFormatConfig>;
1134
- /**
1135
- * The columns that stay in place while the table scrolls sideways, by Field
1136
- * key. Only the LEADING run of the view's column order can actually freeze —
1137
- * the data table decides that, and declines rather than pinning a column at a
1138
- * guessed offset.
1139
- */
1140
- frozen?: string[];
1141
- /** Collapsible sections by one Field, with subtotals on each header. */
1142
- grouping?: GridGrouping;
1143
- /**
1144
- * The width a person dragged a column to, by Field key. SPARSE on purpose —
1145
- * a view saved before widths existed carries none and still parses, and a
1146
- * column nobody resized is left to the table's own measurement.
1147
- */
1148
- widths?: Record<string, number>;
1149
- /** The body row height this view remembers, in px. */
1150
- rowHeight?: number;
1151
- /**
1152
- * Field keys hidden from this view — the SAME hidden-column list the grid's
1153
- * own column picker holds, now given a place on the view so it survives a
1154
- * reload and a layout switch reads the identical set gallery and grid agree
1155
- * on, rather than a second "fields shown" list nobody kept in sync.
1156
- */
1157
- hiddenFields?: string[];
1158
- /**
1159
- * The gallery's card size, remembered the same way the grid remembers its
1160
- * row height — a per-view look, not a global default.
1161
- */
1162
- gallerySize?: "small" | "medium" | "large";
1163
- /**
1164
- * THIS VIEW'S OWN LAYOUT CHOICES, over the organization's `custom/grid_layout` knob (lane
1165
- * DEFAULT-GRID-PARITY, TABLE-PARITY D1 D5 D6). Absent means "whatever the organization
1166
- * says"; present is the view's word. `freezeFirst: false` is an explicit NO over an
1167
- * organization that freezes the first column — an empty `frozen` cannot say that.
1168
- */
1169
- wrap?: boolean;
1170
- fit?: "auto" | "fit" | "scroll";
1171
- freezeFirst?: boolean;
1172
- /**
1173
- * THE SUMMARY BAR (TABLE-PARITY F1): Field key → the store measure shown under that column
1174
- * (`count`, `sum`, `avg`, `min`, `max`, `median`, `filled`, `empty`, `unique`), worked out
1175
- * by `custom.record_aggregate` over the whole table.
1176
- */
1177
- summaries?: Record<string, string>;
1178
- };
1179
- declare const EMPTY_PRESENTATION: GridPresentation;
1180
- /** A frozen column needs a known width, or the table declines to freeze at all. */
1181
- declare const FROZEN_COLUMN_WIDTH = 200;
1182
- /**
1183
- * WHAT A ROW HEIGHT IS ALLOWED TO BE. Below the floor the text is clipped and
1184
- * no editor fits; above the ceiling one record fills the screen. A view asking
1185
- * for anything outside it is DROPPED rather than obeyed, because a saved look
1186
- * must not be able to make a table unreadable — and the Fields' own heights
1187
- * still draw, which is the tolerant half.
1188
- */
1189
- declare const MIN_ROW_HEIGHT = 24;
1190
- declare const MAX_ROW_HEIGHT = 96;
1191
- /**
1192
- * Read a presentation out of whatever the view record holds — an object, or the
1193
- * JSON string a text field stores.
1194
- *
1195
- * Tolerant in exactly the way `parseTableStyle` is: an unreadable half is
1196
- * dropped and the rest still applies, because a table must keep drawing when
1197
- * one piece of its styling goes out of date.
1198
- */
1199
- declare function parseGridPresentation(raw: unknown): GridPresentation;
1200
- /** True when nothing here would change how anything looks. */
1201
- declare function presentationIsEmpty(p: GridPresentation): boolean;
1202
- /** The string a view record stores. Empty string for "this view styles nothing". */
1203
- declare function presentationDocument(p: GridPresentation): string;
1204
- /**
1205
- * The format a Field's OWN declaration implies, before any view says anything.
1206
- *
1207
- * Returns `undefined` for a Field whose value the record renderer already draws
1208
- * better than a formatter could — a relation chip, a person, an attachment, a
1209
- * choice — because handing those to a text formatter would REPLACE a working
1210
- * control with a string.
1211
- */
1212
- declare function formatForField(field: Field): FieldFormatConfig | undefined;
1213
- declare function currencyCodeFor(unit: string | null | undefined): string;
1214
- /**
1215
- * The color a value paints with when a view colors BY a column.
1216
- *
1217
- * NOTHING FAILS SILENTLY, so this never returns "no color" for a value that
1218
- * exists. The store keeps a list column's choices as records of another Table,
1219
- * and this grid has not read that Table's option colors, so the color is
1220
- * derived from the value's own text: the same word always gets the same color,
1221
- * different words get different ones, and `true` is green the way every
1222
- * checklist reads. When those option colors do land, this is the ONE function
1223
- * that changes and every screen follows.
1224
- */
1225
- declare const colorFromTheValue: ChoiceColorLookup;
1226
- /**
1227
- * G1's TABLE-LEVEL COLORS (`custom.table_decorations` / `client.tableDecorations`),
1228
- * TRANSLATED INTO A `TableStyle` — the same document a saved view's own `presentation.style`
1229
- * is, so one resolver (`resolveTableStyle`, below) can treat "the table's colors" and "this
1230
- * view's colors" as two layers of the SAME thing instead of two unrelated systems.
1231
- *
1232
- * THE TRANSLATION IS NECESSARY AND IT IS THE ONLY ONE. G1 addresses a Field by its ID
1233
- * (REC-17 — a column renamed keeps its color), because it is the STORE's own door; a
1234
- * `TableStyle` addresses a Field by its KEY, because it reads straight off `row.document`,
1235
- * which is keyed by Field key. A rule or a color-by whose Field has been deleted (its id no
1236
- * longer resolves to a key) is dropped rather than crashing the whole style — a defect in
1237
- * one rule costs that rule, never the read.
1238
- */
1239
- declare function styleFromDecorations(decorations: TableDecorations | null | undefined, fields: readonly Field[]): TableStyle;
1240
- /**
1241
- * THE ONE PRESENTATION RESOLVER every colored surface in this package reads —
1242
- * `Grid`, and (via `Card`) the kanban board, the calendar and the gallery.
1243
- *
1244
- * THE CLASS THIS CLOSES (lane UI-QUICK-1, TABLE-PARITY review, 2026-09-24). Threading
1245
- * `view.presentation.style` into `Card` closed the instance the CALENDAR-GALLERY bench
1246
- * found — a VIEW that had its own color-by looked right everywhere — but it left the
1247
- * class open: a table whose colors are the ORGANIZATION's decorations (G1's
1248
- * `custom.table_decorations` — "color rows by Account Type", "MAXED and NEAR rules" on
1249
- * Arman's own Coding Accounts table) and whose views never set a `presentation.style` of
1250
- * their own drew NOTHING, on the grid exactly as much as on every other layout, because
1251
- * nothing in this package had ever read G1's door at all.
1252
- *
1253
- * TWO LAYERS, ONE DOCUMENT. The table's decorations are the base coat — what every view
1254
- * of this table shows until a view says otherwise. A view's OWN `presentation.style` is
1255
- * an override, piece by piece: a view that only ever set manual row highlights still
1256
- * inherits the table's color-by and rules for everything it never touched, and a view
1257
- * that fully redecorated (its own `colorBy` AND its own `rules`) is not haunted by a
1258
- * table rule it meant to replace. Per-piece, never all-or-nothing, because a view is a
1259
- * LOOK on top of the table, not a wholesale substitute for it.
1260
- */
1261
- declare function resolveTableStyle(decorations: TableDecorations | null | undefined, fields: readonly Field[], viewStyle: TableStyle | undefined): TableStyle;
1262
-
1263
1287
  /** The four ways one saved view can be looked at (SCR-6). */
1264
1288
  declare const VIEW_LAYOUTS: readonly ["grid", "kanban", "calendar", "gallery"];
1265
1289
  type ViewLayout = (typeof VIEW_LAYOUTS)[number];
@@ -1515,6 +1539,58 @@ interface ColumnSort {
1515
1539
  field: string;
1516
1540
  direction: "asc" | "desc";
1517
1541
  }
1542
+ /** THE SORT CONTROL'S WORDS, the Sheet's, so the grid and the Sheet never read differently. */
1543
+ declare const MANUAL_SORT: {
1544
+ readonly label: "Manual";
1545
+ readonly detail: "· set by hand";
1546
+ readonly title: "The rows are in an order someone set by hand. Sorting by a column sets it aside; saving that sort replaces it.";
1547
+ readonly setAside: "· hand-set order set aside";
1548
+ readonly back: "Back to manual";
1549
+ readonly backTitle: "Go back to the order set by hand";
1550
+ readonly instead: "Use this sort instead";
1551
+ readonly insteadTitle: "Keep this sort as the view's order. It replaces the hand-set order.";
1552
+ readonly replacedToast: "This sort replaced the hand-set order. Reorder puts the rows in an order by hand again.";
1553
+ };
1554
+ /**
1555
+ * THE SORT, AS TOOLBAR STATE (lane TABLE-PAGE-CHROME, owner 2026-09-25: "replace with canonical
1556
+ * toolbar icons and compact controls"). The view's order used to be a full-width sentence row —
1557
+ * "Sorted by Reset Date ↑ · hand-set order set aside Back to manual Use this sort instead" —
1558
+ * above the table's own toolbar. It is now one compact control in the one toolbar row: a sort
1559
+ * icon, the order in a word ("Manual", "Reset Date ↑"), a badge when a column sort is setting a
1560
+ * hand-set order aside, and a popover that says the state in ONE line and offers the actions.
1561
+ * Airtable's sort button carries its state the same way. The grid and the Sheet both draw it.
1562
+ */
1563
+ interface SortStateAction {
1564
+ key: string;
1565
+ label: string;
1566
+ title?: string | undefined;
1567
+ onPress: () => void;
1568
+ /** The one action that keeps what the person is looking at. */
1569
+ primary?: boolean | undefined;
1570
+ disabled?: boolean | undefined;
1571
+ }
1572
+ interface SortStateControlProps {
1573
+ /** The order in a word or two: "Manual", "Reset Date ↑". */
1574
+ label: string;
1575
+ /** The state in one line, said in the popover. */
1576
+ line: string;
1577
+ /** A column sort is setting a hand-set order aside: the badge shows. */
1578
+ attention?: boolean | undefined;
1579
+ actions?: readonly SortStateAction[] | undefined;
1580
+ /** `manual` / `column` / `saved` — for tests and the walk. */
1581
+ mode: string;
1582
+ }
1583
+ declare function SortStateControl({ label, line, attention, actions, mode }: SortStateControlProps): react.JSX.Element;
1584
+ /** The sentence the popover says for a hand-ordered view, with or without a column sort over it. */
1585
+ declare function handOrderLine(sortName: string | null, direction: "asc" | "desc" | null): string;
1586
+ /** The control's props for a hand-ordered view — the grid's and the Sheet's words, once. */
1587
+ declare function handOrderSortState(args: {
1588
+ sortName: string | null;
1589
+ direction: "asc" | "desc" | null;
1590
+ onBack: () => void;
1591
+ onUseSort?: (() => void) | undefined;
1592
+ saving?: boolean | undefined;
1593
+ }): SortStateControlProps;
1518
1594
 
1519
1595
  /**
1520
1596
  * WHAT A TABLE WITH NO COLUMNS SAYS. Named here because the gate asserts on it:
@@ -1616,9 +1692,16 @@ interface GridProps {
1616
1692
  onPresentationChange?: ((next: GridPresentation) => void) | undefined;
1617
1693
  /** The open view's order — its hand-set order or its sort (`GridViewOrder`). */
1618
1694
  viewOrder?: GridViewOrder | undefined;
1695
+ /**
1696
+ * WHERE THE FOOTER SITS (lane TABLE-PAGE-CHROME): `sticky` — the grid fills the height its page
1697
+ * gives it and the rows scroll inside, so the counts and the pages stay on the bottom edge (the
1698
+ * older grid's way); `inline` — the grid is as tall as its rows and the footer follows the last
1699
+ * one. Left out: the grid is as tall as its rows, as it always was outside a table page.
1700
+ */
1701
+ footer?: FooterPlacement | undefined;
1619
1702
  className?: string | undefined;
1620
1703
  }
1621
- declare function Grid({ tableId, pageSize, filter, onOpenRecord, onAddField, onNewRecordForm, toolbarActions, editable, presentation, onPresentationChange, viewOrder, className, onAskWhoChanged, }: GridProps): react.JSX.Element;
1704
+ declare function Grid({ tableId, pageSize, filter, onOpenRecord, onAddField, onNewRecordForm, toolbarActions, editable, presentation, onPresentationChange, viewOrder, footer, className, onAskWhoChanged, }: GridProps): react.JSX.Element;
1622
1705
  /**
1623
1706
  * One Field becomes one column. The header is the Field's own NAME — never its
1624
1707
  * key (`names.ts`) — and the cell is the value, rendered by its parity type and
@@ -2529,6 +2612,12 @@ interface ViewSwitcherProps {
2529
2612
  * updates the view it holds (nothing is written — the store already did).
2530
2613
  */
2531
2614
  onOrderPlaced?: (() => void) | undefined;
2615
+ /**
2616
+ * Where the grid's footer sits (lane TABLE-PAGE-CHROME) — `sticky`: the layout fills the height
2617
+ * the page gives it and the footer stays on the bottom edge; `inline`: after the last row. Handed
2618
+ * to the Grid and to a host layout (the Sheet). Left out: natural height, as always.
2619
+ */
2620
+ footer?: FooterPlacement | undefined;
2532
2621
  className?: string | undefined;
2533
2622
  }
2534
2623
  /** The records this view holds: its Rule's members when it names one, the table otherwise. */
@@ -2551,7 +2640,7 @@ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?:
2551
2640
  */
2552
2641
  membership: string;
2553
2642
  };
2554
- declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize, titleField, filter, hostLayout, onHostLayoutChange, chooser, openExport, viewId, onOrderPlaced, className, }: ViewSwitcherProps): react.JSX.Element;
2643
+ declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize, titleField, filter, hostLayout, onHostLayoutChange, chooser, openExport, viewId, onOrderPlaced, footer, className, }: ViewSwitcherProps): react.JSX.Element;
2555
2644
 
2556
2645
  /** What the screen says above the list, so nobody has to be told twice that nothing was destroyed. */
2557
2646
  declare const ARCHIVE_MEANS = "Archiving never destroys anything. A record you remove from the grid waits here until somebody brings it back.";
@@ -2635,11 +2724,10 @@ interface ViewBarProps {
2635
2724
  */
2636
2725
  seed?: SavedViewSpec[] | undefined;
2637
2726
  /**
2638
- * Draw nothing while the table has at most one saved view (lane DATA-V2-FACE). One view is not
2639
- * a choice, and a row of one tab is chrome over the table; the page offers "Saved views" in its
2640
- * menu instead. Two or more views are a real choice and the bar draws.
2727
+ * THE VIEW'S OWN SETTINGS, drawn at the foot of the picker (lane TABLE-PAGE-CHROME): where the
2728
+ * footer sits, and whatever else belongs to the view rather than to one column.
2641
2729
  */
2642
- quietWhenAlone?: boolean | undefined;
2730
+ settings?: ReactNode | undefined;
2643
2731
  /** Every time the list is read: the views, or null when they could not be read. */
2644
2732
  onViews?: ((views: SavedView[] | null) => void) | undefined;
2645
2733
  className?: string | undefined;
@@ -2655,7 +2743,7 @@ declare const SAVED_VIEWS_UNAVAILABLE: string;
2655
2743
  * is also satisfied by any view the table already marks as its default, whatever it is called.
2656
2744
  */
2657
2745
  declare function seedIsSatisfied(seed: SavedViewSpec, views: readonly SavedView[]): boolean;
2658
- declare function ViewBar({ tableId, activeViewId, onActiveView, seed, quietWhenAlone, onViews, className }: ViewBarProps): react.JSX.Element | null;
2746
+ declare function ViewBar({ tableId, activeViewId, onActiveView, seed, settings, onViews, className }: ViewBarProps): react.JSX.Element;
2659
2747
 
2660
2748
  /** One proposed change, in the proposer's words plus the exact act it asks for. */
2661
2749
  interface ProposedChange {
@@ -4021,10 +4109,14 @@ interface TablePageProps {
4021
4109
  */
4022
4110
  activeItemId?: Uuid$1 | null | undefined;
4023
4111
  /**
4024
- * What the HOST puts at the start of the table's one row — the organization the table lives
4025
- * in, named quietly (the app's where-it-lives chip). One row: never a second bar above it.
4112
+ * THE PAGE'S HEADER, handed the table's own page-level controls (lane TABLE-PAGE-CHROME, owner
4113
+ * 2026-09-25: "align with the app's top-tier pages"). Called with `actions` — Share and the
4114
+ * table's one menu — so a host draws them in ITS page header (the app's back button and title
4115
+ * switcher beside them) and the table page draws no row of its own for them. Left out, the
4116
+ * actions sit at the end of the table's one toolbar row. Never a second toolbar: the host gets
4117
+ * the page's actions, not a slot for its own.
4026
4118
  */
4027
- leading?: ReactNode | undefined;
4119
+ header?: ((chrome: TablePageHeaderChrome) => ReactNode) | undefined;
4028
4120
  /**
4029
4121
  * What the HOST adds to the table's one menu — a capability the package cannot know about (the
4030
4122
  * app's "When a row changes, run an agent…"). Drawn after the package's own entries.
@@ -4043,6 +4135,13 @@ interface TablePageProps {
4043
4135
  onShownViewChange?: ((shown: ShownViewReport) => void) | undefined;
4044
4136
  className?: string | undefined;
4045
4137
  }
4138
+ /** What `TablePage.header` is handed. */
4139
+ interface TablePageHeaderChrome {
4140
+ /** Share and the table's one menu, for the host's header. Null while the table is not open. */
4141
+ actions: ReactNode;
4142
+ /** The table's name once it is read; null before. */
4143
+ tableName: string | null;
4144
+ }
4046
4145
  /** The view as the page draws it right now (`TablePage.onShownViewChange`). */
4047
4146
  interface ShownViewReport {
4048
4147
  /** The saved view under the look; null while the views are read or when there are none. */
@@ -4095,6 +4194,12 @@ declare const TABLE_NOT_REACHABLE: string;
4095
4194
  * second kind of view that every feature after it has to know about.
4096
4195
  */
4097
4196
  declare const DEFAULT_VIEW_NAME = "All records";
4197
+ /** The view setting that says where the grid's footer sits (lane TABLE-PAGE-CHROME). */
4198
+ declare const FOOTER_WORDS: {
4199
+ readonly label: "Footer";
4200
+ readonly sticky: "Pinned to the bottom";
4201
+ readonly inline: "After the last row";
4202
+ };
4098
4203
  /**
4099
4204
  * What the page says while it is running on the unsaved default. It is a
4100
4205
  * STAND-IN and it announces itself, with the one thing a person can do about
@@ -4219,7 +4324,19 @@ interface MenuEntryDef {
4219
4324
  shown: (rights: ReturnType<typeof useTableRights>) => boolean;
4220
4325
  }
4221
4326
  declare const TABLE_MENU: readonly MenuEntryDef[];
4222
- declare function TablePage({ tableId, pageSize, seedViews, onLeave, leaveLabel, activeDashboardId, activeRecordId, activeView, onViewChanged, activeGroupField, cameFrom, filter, activeRail, activeItemId, leading, menuExtras, onShownViewChange, className, }: TablePageProps): react.JSX.Element;
4327
+ declare function TablePage({ tableId, pageSize, seedViews, onLeave, leaveLabel, activeDashboardId, activeRecordId, activeView, onViewChanged, activeGroupField, cameFrom, filter, activeRail, activeItemId, header, menuExtras, onShownViewChange, className, }: TablePageProps): react.JSX.Element;
4328
+
4329
+ /**
4330
+ * The page's toolbar slot: an element (controls go there), `null` (the row is mounting — draw
4331
+ * nothing yet, never a flash of a second row), or `undefined` (no page row: draw in place).
4332
+ */
4333
+ declare const TableToolbarSlotContext: react.Context<HTMLElement | null | undefined>;
4334
+ /** The slot a layout's controls belong in, as `TableToolbarSlotContext` says. */
4335
+ declare function useTableToolbarSlot(): HTMLElement | null | undefined;
4336
+ /** A layout's own controls, placed in the page's one toolbar row when there is one. */
4337
+ declare function InTableToolbar({ children }: {
4338
+ children: ReactNode;
4339
+ }): react.JSX.Element | null;
4223
4340
 
4224
4341
  /** What the roster can tell us about a user id. `null` when it cannot. */
4225
4342
  type ResolveName = (userId: Uuid$1) => string | null;
@@ -4414,4 +4531,4 @@ interface PipelineBoardProps {
4414
4531
  }
4415
4532
  declare function PipelineBoard({ tableId, rows, titleKey, measure, filter, onMeasureChange, onOpenRecord, onMoved, style, dateFields, className, }: PipelineBoardProps): react.JSX.Element;
4416
4533
 
4417
- export { ABSENCE_WORD_LABEL, ABSENCE_WORD_VALUES, ACTION_KINDS, ARCHIVED_NEVER_DESTROYED, ARCHIVE_MEANS, type AbsenceWord, ActionInbox, type ActionInboxProps, type ActionKind, type AgentBuildAsk, ArchivedDisclosure, type ArchivedDisclosureProps, ArchivedPortals, type ArchivedPortalsProps, ArchivedView, type ArchivedViewProps, BOOKING_NOT_HERE_LINE, BOOKING_PAGE_STATE_LABEL, BOOKING_PAGE_STATE_VALUES, BookingBuilder, type BookingBuilderProps, type BookingPageState, BookingSlots, type BookingSlotsProps, BuildOrAsk, type BuildOrAskProps, type BuildableKind, CAPTURE_MODES, CHART_KINDS, CHART_KIND_LABEL, CHART_NEEDS, CHECKLIST_REQUIREMENT_KINDS, CHECKLIST_REQUIREMENT_LABEL, CONDITION_OPS, CONTEXT_POLICY_LABEL, type Capability, type CaptureMode, type CaptureQueuePort, CaptureRun, type CaptureRunProps, CaptureSheet, type CaptureSheetProps, type CellAddress, type CellRefusal, type CellState, ChartBlock, type ChartBlockProps, type ChartConfig, ChartFrame, type ChartKind, ChartLegendContent, type ChartSpec, ChartTooltipContent, ChecklistRunner, type ChecklistRunnerProps, ChecklistTemplateEditor, ChecklistsPanel, type ChecklistsPanelProps, CommentThread, type CommentThreadProps, type ConditionField, ConditionGroup, type ConditionGroupProps, ConditionRow, type ConditionRowProps, CustomFieldsSection, type CustomFieldsSectionProps, DEFAULT_VIEW_NAME, DUE_STATE_LABEL, DashboardCanvas, type DashboardCanvasProps, DigestScheduler, type DigestSchedulerProps, DocRender, type DocRenderProps, DocTemplate, type DocTemplateProps, type DocTemplateSpec, EMPTY_PRESENTATION, ENGINEER_TEXT, ENTITY_REFERENCE_KINDS_MISSING, type EditorKind, EmbedFrame, type EmbedFrameProps, type EnrichAsk, EnrichBadge, type EnrichBadgeProps, type EnrichOutcome, EnrichPanel, type EnrichPanelProps, EntityReferenceKindPicker, type EntityReferenceKindPickerProps, ExportMenu, type ExportMenuProps, FIELD_RULE_KIND_LABEL, FIELD_RULE_KIND_VALUES, FIELD_SENSITIVITY_LABEL, FIELD_TYPE_CHOICES, FIELD_TYPE_GROUPS, FORMULA_OP_JOINS, FORMULA_OP_LABEL, FORMULA_OP_VALUES, FORM_FLOWS, FORM_NOT_HERE_LINE, FROZEN_COLUMN_WIDTH, FieldControl, FieldEditor, type FieldEditorControlProps, type FieldEditorProps, FieldHistoryPanel, type FieldHistoryPanelProps, FieldLabel, type FieldProposalRow, type FieldRuleKindValue, type FieldTypeChoice, FilePicker, type FilePickerProps, type FormAsked, FormBuilder, type FormBuilderProps, type FormFlow, type FormQuestionSpec, FormRunner, type FormRunnerProps, type FormSpec, type FormSubmitOutcome, type FormTheme, FormsPanel, type FormsPanelProps, type FormulaOp, Grid, GridCell, type GridEditing, type GridGrouping, type GridPresentation, type GridProps, HistoryPanel, type HistoryPanelProps, type HostLayout, INBOX_GROUPINGS, INBOX_VIEWS, IN_MEMORY_QUEUE_REASON, ImportWizard, type ImportWizardProps, type InboxGroup, type InboxGrouping, KERNEL_REASON, LANE_EMPTY, LANE_TITLE, LAYOUT_FIELD_KIND, LAYOUT_LABEL, LAYOUT_NEEDS, LAYOUT_NO_FIELD, LEVEL_WORD, LOOK_WORDS, 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 RenderTextSlot, 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, type ShownViewReport, SignBlock, type SignBlockProps, type SnoozeChoice, StageRulesSection, type StageRulesSectionProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_MENU, TABLE_NOT_REACHABLE, THE_SYSTEM, type TableLane, type TableOpening, TablePage, type TablePageProps, type TableRights, TableSettings, type TableSettingsProps, TablesHome, type TablesHomeProps, type TrackedVersion, type UseSystemTableState, VIEW_KEYS, VIEW_LAYOUTS, VIEW_NOT_SAVED_YET, VISIBILITY_LANES, VISIBILITY_LANE_TITLE, ViewBar, type ViewBarProps, type ViewKeyDeclaration, type ViewKeyLayout, type ViewKeyWriter, type ViewLayout, type ViewLook, type ViewSettings, type ViewSettingsPatch, type ViewSort, type ViewSortKey, ViewSwitcher, type ViewSwitcherProps, type VisibilityLane, WITHHELD_RECORD_LABEL, WITHHELD_WORD, WORK_APPROVAL_STATES, WORK_APPROVAL_STATE_LABEL, WORK_DUE_STATES, WORK_INBOX_KINDS, WORK_INBOX_KIND_GROUP_LABEL, WORK_INBOX_KIND_LABEL, type WhatYouMayDo, WhereItLives, type WhereItLivesProps, type WhoChanged, WhoChangedSource, WithheldValue, actorBadge, actorWords, applyLook, archivedRowLine, asRefusal, askableFields, blockFromSpec, bodyForReading, bodyFromKeys, calendarDayLabel, calendarDayOf, cameFromLine, cardTitleField, cardWords, carriesTimeOfDay, cellState, chooseSurface, colorFromTheValue, columnForField, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, currencyCodeFor, dashboardDeclareArgs, dashboardFromSummary, dateFormatFor, dateText, declareView, defaultViewOf, designatedLayoutOf, editorKindFor, ensureSystemTable, entityReferenceSpec, envelopeFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, formDeclareArgs, formFromSummary, formPresentation, formatForField, groupInbox, groupLabel, hasTimePart, hintForAPerson, hintIsMachineIdentity, humanize, idsOf, isDateField, isEngineerText, isId, isMachineIdentity, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, keepLook, keptByTheApp, keyFor, kindsWithNoChoice, laneFor, lastChangeSentence, lookDiffers, lookDocument, lookFromDocument, lookPart, looksLikeId, machineIdentityIn, mayNotRestoreLine, memberName, nextInWords, nextSummaryAt, openingRail, openingView, pageViewFromParam, parityTypesWithNoExplanation, parseGridPresentation, personActor, personRecordForMember, pointsAtRecords, presentationDocument, presentationIsEmpty, previewLine, previewWords, publiclyAnswerable, railFromParam, readLooks, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, renderValue, resolveTableStyle, revokeConsequence, rowName, rowNameIn, saveToViewPlan, saveViewPatch, scalarText, seedIsSatisfied, shareUnavailableReason, snoozeChoices, specFromBlock, storeDecidesRights, styleFromDecorations, submissionStamp, surfaceChosen, tableName, tableOpening, tableRightsAt, unknownRailLine, unknownViewLine, useCanShare, useEmbedHandshake, useEnrichCells, useGridEditing, useLabelWait, useMeasuredWidth, useMyChecklistSteps, useRecordLabels, useRecordRights, useRecordsUi, useRowRights, useSystemTable, useTableRights, useViewRecords, useWhoChanged, viewDocument, viewFromRow, viewKeysFor, viewPatchDocument, viewSettings, viewSettingsFor, viewSettingsPatch, visibilityLaneFor, whatIsMissing, whatIsMissingForEntityReference, whatYouMayDo, whatYouMayDoWithTable, whenWords, whyNotAskable, withheldNoticeOf, withheldSentence };
4534
+ 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_FOOTER, DEFAULT_VIEW_NAME, DUE_STATE_LABEL, DashboardCanvas, type DashboardCanvasProps, DigestScheduler, type DigestSchedulerProps, DocRender, type DocRenderProps, DocTemplate, type DocTemplateProps, type DocTemplateSpec, EMPTY_PRESENTATION, ENGINEER_TEXT, ENTITY_REFERENCE_KINDS_MISSING, type EditorKind, EmbedFrame, type EmbedFrameProps, type EnrichAsk, EnrichBadge, type EnrichBadgeProps, type EnrichOutcome, EnrichPanel, type EnrichPanelProps, EntityReferenceKindPicker, type EntityReferenceKindPickerProps, ExportMenu, type ExportMenuProps, FIELD_RULE_KIND_LABEL, FIELD_RULE_KIND_VALUES, FIELD_SENSITIVITY_LABEL, FIELD_TYPE_CHOICES, FIELD_TYPE_GROUPS, FOOTER_WORDS, 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 FooterPlacement, type FormAsked, FormBuilder, type FormBuilderProps, type FormFlow, type FormQuestionSpec, FormRunner, type FormRunnerProps, type FormSpec, type FormSubmitOutcome, type FormTheme, FormsPanel, type FormsPanelProps, type FormulaOp, Grid, GridCell, type GridEditing, type GridGrouping, type GridPresentation, type GridProps, HistoryPanel, type HistoryPanelProps, type HostLayout, INBOX_GROUPINGS, INBOX_VIEWS, IN_MEMORY_QUEUE_REASON, ImportWizard, type ImportWizardProps, InTableToolbar, type InboxGroup, type InboxGrouping, KERNEL_REASON, LANE_EMPTY, LANE_TITLE, LAYOUT_FIELD_KIND, LAYOUT_LABEL, LAYOUT_NEEDS, LAYOUT_NO_FIELD, LEVEL_WORD, LOOK_WORDS, type LabelLookup, type LinkRail, MACHINE_IDENTITY, MANUAL_SORT, 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 RenderTextSlot, 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, type ShownViewReport, SignBlock, type SignBlockProps, type SnoozeChoice, type SortStateAction, SortStateControl, type SortStateControlProps, StageRulesSection, type StageRulesSectionProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_MENU, TABLE_NOT_REACHABLE, THE_SYSTEM, type TableLane, type TableOpening, TablePage, type TablePageHeaderChrome, type TablePageProps, type TableRights, TableSettings, type TableSettingsProps, TableToolbarSlotContext, 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 ViewLook, type ViewSettings, type ViewSettingsPatch, type ViewSort, type ViewSortKey, ViewSwitcher, type ViewSwitcherProps, type VisibilityLane, WITHHELD_RECORD_LABEL, WITHHELD_WORD, WORK_APPROVAL_STATES, WORK_APPROVAL_STATE_LABEL, WORK_DUE_STATES, WORK_INBOX_KINDS, WORK_INBOX_KIND_GROUP_LABEL, WORK_INBOX_KIND_LABEL, type WhatYouMayDo, WhereItLives, type WhereItLivesProps, type WhoChanged, WhoChangedSource, WithheldValue, actorBadge, actorWords, applyLook, archivedRowLine, asRefusal, askableFields, blockFromSpec, bodyForReading, bodyFromKeys, calendarDayLabel, calendarDayOf, cameFromLine, cardTitleField, cardWords, carriesTimeOfDay, cellState, chooseSurface, colorFromTheValue, columnForField, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, currencyCodeFor, dashboardDeclareArgs, dashboardFromSummary, dateFormatFor, dateText, declareView, defaultViewOf, designatedLayoutOf, editorKindFor, ensureSystemTable, entityReferenceSpec, envelopeFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, footerOf, formDeclareArgs, formFromSummary, formPresentation, formatForField, groupInbox, groupLabel, handOrderLine, handOrderSortState, hasTimePart, hintForAPerson, hintIsMachineIdentity, humanize, idsOf, isDateField, isEngineerText, isId, isMachineIdentity, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, keepLook, keptByTheApp, keyFor, kindsWithNoChoice, laneFor, lastChangeSentence, lookDiffers, lookDocument, lookFromDocument, lookPart, looksLikeId, machineIdentityIn, mayNotRestoreLine, memberName, nextInWords, nextSummaryAt, openingRail, openingView, pageViewFromParam, parityTypesWithNoExplanation, parseGridPresentation, personActor, personRecordForMember, pointsAtRecords, presentationDocument, presentationIsEmpty, previewLine, previewWords, publiclyAnswerable, railFromParam, readLooks, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, renderValue, resolveTableStyle, revokeConsequence, rowName, rowNameIn, saveToViewPlan, saveViewPatch, scalarText, seedIsSatisfied, shareUnavailableReason, snoozeChoices, specFromBlock, storeDecidesRights, styleFromDecorations, submissionStamp, surfaceChosen, tableName, tableOpening, tableRightsAt, unknownRailLine, unknownViewLine, useCanShare, useEmbedHandshake, useEnrichCells, useGridEditing, useLabelWait, useMeasuredWidth, useMyChecklistSteps, useRecordLabels, useRecordRights, useRecordsUi, useRowRights, useSystemTable, useTableRights, useTableToolbarSlot, useViewRecords, useWhoChanged, viewDocument, viewFromRow, viewKeysFor, viewPatchDocument, viewSettings, viewSettingsFor, viewSettingsPatch, visibilityLaneFor, whatIsMissing, whatIsMissingForEntityReference, whatYouMayDo, whatYouMayDoWithTable, whenWords, whyNotAskable, withheldNoticeOf, withheldSentence };