@ai-matrx/records-ui 0.93.146 → 0.95.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode, KeyboardEvent, ReactElement, ComponentType, RefObject, SVGAttributes } from 'react';
3
3
  import * as _ai_matrx_records from '@ai-matrx/records';
4
- import { RecordScopeContext, EnrichCell, RecordsError, Field, TableDecorations, Uuid as Uuid$1, RowAction, RecordDocument, Table, ReadRow, StoreFilter, PermissionLevel, AggregateFilter, RelationDisplay, WriteConflict, RecordsErrorCode, RecordFilter, RuleExpression, RecordsResult, SavedViewRow, DeclarableFieldKind, NewerFieldKind, ParityFieldType, NewFieldDeclaration, ChoiceRehome, FieldOptionEdit, StoredRecord, ChoiceNudge, HiddenFieldNotice, ValueEnvelope, ChecklistRequirementKind, ContextPolicy, WorkDueState, FieldSensitivity, StageRuleOnFail, SubscriptionCadence, WorkApprovalState, WorkInboxKind, FieldKind, ArchiveLane, ArchivedRow, WorkInboxView, WorkInboxItem, PortalAccent, FormSummary, PortalCard, PortalPrincipal, PortalPreviewRow, MySubscription, DashboardBlockKind, AggregateBucket, AggregateMeasure, AggregateCompare, DashboardTarget, DashboardBlock, DashboardSummary, DocTemplateRow, DocRenderRow, QuietHours, DashboardBlockResult, ChecklistRunStep, BookingSummary, CaptureSheetFace, CaptureField, AnonTokenBinding, RecordsConfig, RecordsActor, RecordsDataSource, HistoryActor, FieldHistoryEntry, DrillDefinition, DrillSource } from '@ai-matrx/records';
4
+ import { RecordScopeContext, EnrichCell, RecordsError, Field, TableDecorations, Uuid as Uuid$1, RowAction, RecordDocument, Table, ReadRow, StoreFilter, PermissionLevel, AggregateFilter, RelationDisplay, WriteConflict, RecordsErrorCode, RecordFilter, RuleExpression, RecordsResult, SavedViewRow, DeclarableFieldKind, NewerFieldKind, ParityFieldType, NewFieldDeclaration, ChoiceRehome, FieldOptionEdit, StoredRecord, ChoiceNudge, HiddenFieldNotice, ValueEnvelope, ChecklistRequirementKind, ContextPolicy, WorkDueState, FieldSensitivity, StageRuleOnFail, SubscriptionCadence, WorkApprovalState, WorkInboxKind, FieldKind, ArchiveLane, ArchivedRow, WorkInboxView, WorkInboxItem, PortalAccent, FormSummary, PortalCard, PortalPrincipal, PortalPreviewRow, PublicPicture, PortalStyle, MySubscription, DashboardBlockKind, AggregateBucket, AggregateMeasure, AggregateCompare, DashboardTarget, DashboardBlock, DashboardSummary, DocTemplateRow, DocRenderRow, QuietHours, DashboardBlockResult, ChecklistRunStep, BookingSummary, CaptureSheetFace, CaptureField, AnonTokenBinding, RecordsConfig, RecordsActor, RecordsDataSource, HistoryActor, FieldHistoryEntry, DrillDefinition, DrillSource } from '@ai-matrx/records';
5
5
  import { ReversibleAnnouncement } from '@ai-matrx/kit/reversible';
6
- import { W as WhatYouMayDo, T as TableActionHost, O as ObjectAction, a as ObjectActionIcon } from './objectActions-Dgdr0E4b.js';
7
- export { A as ACTION_CHECKING_ACCESS_REASON, b as ACTION_NOT_HERE_REASON, c as ACTION_NO_ACCESS_REASON, d as ACTION_PLATFORM_TABLE_REASON, B as BuiltOnDestination, C as Capability, D as DEFAULT_ACTION_ORIGIN, K as KERNEL_REASON, L as LEVEL_WORD, N as NOT_ANSWERED_YET, e as OBJECT_ACTION_GROUPS, f as ObjectActionDropdownEntry, g as ObjectActionGroup, h as ObjectActionGroupDef, i as ObjectActionSection, S as STANDARD_VERBS, j as STRIP_FEATURE_ROWS, k as StandardVerbId, l as StripAndRows, m as TableActionSubject, n as TableActionsInput, o as dropdownActionIds, p as dropdownActions, q as groupObjectActions, r as levelNeededFor, s as rightsReason, t as tableActions, u as tableLink, v as toDropdownEntries, w as toStripAndRows, x as whatYouMayDo, y as whatYouMayDoWithTable, z as withExtensions } from './objectActions-Dgdr0E4b.js';
6
+ import { W as WhatYouMayDo, T as TableActionHost, O as ObjectAction, a as ObjectActionIcon } from './objectActions-DozKWxks.js';
7
+ export { A as ACTION_CHECKING_ACCESS_REASON, b as ACTION_NOT_HERE_REASON, c as ACTION_NO_ACCESS_REASON, d as ACTION_PLATFORM_TABLE_REASON, B as BuiltOnDestination, C as Capability, D as DEFAULT_ACTION_ORIGIN, K as KERNEL_REASON, L as LEVEL_WORD, N as NOT_ANSWERED_YET, e as OBJECT_ACTION_GROUPS, f as ObjectActionDropdownEntry, g as ObjectActionGroup, h as ObjectActionGroupDef, i as ObjectActionSection, S as STANDARD_VERBS, j as STRIP_FEATURE_ROWS, k as StandardVerbId, l as StripAndRows, m as TableActionSubject, n as TableActionsInput, o as dropdownActionIds, p as dropdownActions, q as groupObjectActions, r as levelNeededFor, s as rightsReason, t as tableActions, u as tableLink, v as toDropdownEntries, w as toStripAndRows, x as whatYouMayDo, y as whatYouMayDoWithTable, z as withExtensions } from './objectActions-DozKWxks.js';
8
8
  import { Uuid, Field as Field$1, ReadRow as ReadRow$1, StoreFilter as StoreFilter$1, useRecordsClient } from '@ai-matrx/records/react';
9
9
  import { TableStyle, GroupAggregateSpec, GroupOrder, ChoiceColorLookup, MatrxTableCardProps, StyleColor, MatrxDrillDimension, MatrxDrillMeasure, MatrxDrillFilter, MatrxDrillQuestion, MatrxDataTableDrillConfig, MatrxDrillAnswers } from '@ai-matrx/design-system/data-table';
10
10
  import { FieldFormatConfig } from '@ai-matrx/design-system/field-formats';
@@ -781,6 +781,15 @@ interface RecordsUiHost {
781
781
  * nowhere.
782
782
  */
783
783
  chat?: (context: RecordChatContext) => ReactNode;
784
+ /**
785
+ * OPTIONAL. MORE SECTIONS ON AN OPEN RECORD — drawn in the record rail after its history,
786
+ * one host-owned block about THIS record (e.g. "What ran on this record": the Workflow runs
787
+ * stamped with it). Unbound, nothing is drawn.
788
+ */
789
+ recordSections?: (target: {
790
+ tableId: Uuid$1;
791
+ recordId: Uuid$1;
792
+ }) => ReactNode;
784
793
  /**
785
794
  * OPTIONAL. "TALK TO THIS RECORD" — the HOST opens its own one chat surface
786
795
  * (AGT-N-9, PRODUCTS row 11).
@@ -890,6 +899,17 @@ interface RecordsUiHost {
890
899
  * nothing is the dead control this package does not ship.
891
900
  */
892
901
  openRecords?: (ask: OpenRecordsAsk) => void;
902
+ /**
903
+ * OPTIONAL. WHERE A PAGE OPENS (v6 lane 11, wave D). A Page is a dashboard record whose
904
+ * `presentation.kind` is `"page"` (`pages.ts`); the host owns its route, so this hands back the
905
+ * address of an existing page, or of the screen that makes a new one on a Table. Unbound, the
906
+ * Dashboards area lists no pages and offers no "New page" — absent, never dead.
907
+ */
908
+ pageHref?: (target: {
909
+ pageId: Uuid$1;
910
+ } | {
911
+ newOnTable: Uuid$1;
912
+ }) => string;
893
913
  /**
894
914
  * OPTIONAL. ASK THE AGENT TO CHANGE THIS DASHBOARD (SCR-16).
895
915
  *
@@ -1300,6 +1320,22 @@ declare function personRecordForMember(client: RecordsClient, personTableId: Uui
1300
1320
  }>;
1301
1321
  declare function PersonPicker({ field, value, onChange, disabled, id, className, autoOpen, onClose, initialSearch }: PersonPickerProps): react.JSX.Element;
1302
1322
 
1323
+ interface RecordVersions {
1324
+ /** The version the person saw this record at; waits for the read of freshly drawn rows. `null` = unread. */
1325
+ seen: (id: Uuid$1) => Promise<number | null>;
1326
+ /** The same, for many records at once. */
1327
+ seenMany: (ids: readonly Uuid$1[]) => Promise<Map<Uuid$1, number | null>>;
1328
+ /** A write this screen made moved the record on (a version only goes up). */
1329
+ wrote: (id: Uuid$1, version: number) => void;
1330
+ /**
1331
+ * Read these records' versions again now: the person pressed Reload, or the store refused a write
1332
+ * because somebody else won (`PT409`) — the rows are re-read too, so the next write is against what
1333
+ * the person then sees. A change that moved only the version (who sees the row) never re-reads by
1334
+ * content, so without this the row stayed refused until the screen was opened again (verifier V10).
1335
+ */
1336
+ refresh: (ids: readonly Uuid$1[]) => void;
1337
+ }
1338
+
1303
1339
  /** Which cell is open. A grid opens exactly one at a time, like every other grid. */
1304
1340
  interface CellAddress {
1305
1341
  rowId: Uuid$1;
@@ -1424,6 +1460,11 @@ interface Options {
1424
1460
  * A CELL THE STORE ACCEPTED, with what it held before and what it holds now (merge tranche 6d):
1425
1461
  * the merged grid's undo pushes one step per accepted cell. Unbound, nothing is told.
1426
1462
  */
1463
+ /**
1464
+ * The grid's one versions-at-load source (`useRecordVersions`), shared with its paste, fill, bulk and
1465
+ * undo. Unbound, the session keeps its own over `rows`.
1466
+ */
1467
+ versions?: RecordVersions | undefined;
1427
1468
  /** One cell the store took: its value before and after, and the record version that write made. */
1428
1469
  onWritten?: ((write: {
1429
1470
  rowId: Uuid$1;
@@ -1443,7 +1484,7 @@ interface Options {
1443
1484
  }
1444
1485
  /** How an open cell was closed: a key (Enter, Tab, Escape), the picker's own close, or a blur. */
1445
1486
  type EditVia = "key" | "pick" | "blur";
1446
- declare function useGridEditing({ tableId, fields, rows, reload, canWrite, mayWriteRow, onWritten, onEnded }: Options): GridEditing;
1487
+ declare function useGridEditing({ tableId, fields, rows, reload, canWrite, mayWriteRow, onWritten, onEnded, versions: shared }: Options): GridEditing;
1447
1488
  /**
1448
1489
  * ONE CELL. Read, until somebody asks to change it; then the Field's own
1449
1490
  * editor, in place, with the keys a person expects from a grid.
@@ -1595,7 +1636,7 @@ interface ViewSortKey {
1595
1636
  * sub-groups and shut sections, hidden fields, gallery size, summaries).
1596
1637
  */
1597
1638
  interface ViewSettings {
1598
- layout: "grid" | "kanban" | "calendar" | "gallery";
1639
+ layout: "grid" | "kanban" | "calendar" | "gallery" | "timeline";
1599
1640
  filters: RecordFilter | null;
1600
1641
  where: RuleExpression | null;
1601
1642
  groupField: string | null;
@@ -2077,6 +2118,12 @@ interface GridProps {
2077
2118
  * with the arrows), so the panel always shows the row the person is on.
2078
2119
  */
2079
2120
  openRecordId?: Uuid | null | undefined;
2121
+ /**
2122
+ * CLOSE THE RECORD PANEL (grids review 3, lane H item 5): Escape on the grid, and Space on the row
2123
+ * that is already open, put it away — Airtable's expanded record toggles the same way. Unbound,
2124
+ * Space only opens.
2125
+ */
2126
+ onCloseRecord?: (() => void) | undefined;
2080
2127
  /** SCR-2. Called when an admin clicks the "+" at the end of the headers. */
2081
2128
  onAddField?: (() => void) | undefined;
2082
2129
  /**
@@ -2417,7 +2464,7 @@ interface CustomFieldsAgentDoor {
2417
2464
  addField: (request: CustomFieldAddRequest) => Promise<CustomFieldAddResult>;
2418
2465
  /** Every problem with a values request, all at once, or `[]`. Nothing is written. */
2419
2466
  checkValues: (values: CustomFieldValuesRequest) => string[];
2420
- /** Writes this record's values in ONE `custom.entity_value_write` (a key left out is left alone). */
2467
+ /** Writes this record's values in ONE `custom.entity_row_write` (a key left out is left alone). */
2421
2468
  setValues: (values: CustomFieldValuesRequest) => Promise<CustomFieldSetResult>;
2422
2469
  }
2423
2470
  /**
@@ -2428,8 +2475,9 @@ interface CustomFieldsAgentDoor {
2428
2475
  * not get a Choice, a Yes / no or a link to another record, and none of the column's governance —
2429
2476
  * while `custom.entity_field_declare` resolves its spec through the very `custom._field_document_for`
2430
2477
  * a custom table's column goes through. A standard table and a custom table are one primitive, so
2431
- * the record page opens the table's own `FieldEditor` and offers `fieldTypes.ts`'s pickable set,
2432
- * nothing more and nothing less. `a-record-page-adds-a-field-with-the-tables-own-palette.test.tsx`
2478
+ * the record page opens the table's own `FieldEditor` and offers `fieldTypes.ts`'s pickable set
2479
+ * less the kinds that cannot hold a value on a standard row (`STANDARD_TABLE_FIELD_CHOICES`, read
2480
+ * from the store's kind registry). `a-record-page-adds-a-field-with-the-tables-own-palette.test.tsx`
2433
2481
  * fails the moment this list and that set differ.
2434
2482
  */
2435
2483
  declare const ADDABLE_TYPES: {
@@ -2481,7 +2529,16 @@ type RelationFieldType = "relation";
2481
2529
  * `FIELD_TYPE_CHOICES`'s coverage and as a red `kindsWithNoChoice()` below — never as a
2482
2530
  * silence.
2483
2531
  */
2484
- type PickableFieldType = DeclarableFieldKind | SystemFieldKind | "entity_reference" | NewerFieldKind;
2532
+ type PickableFieldType = DeclarableFieldKind | SystemFieldKind | "entity_reference" | NewerFieldKind | LookFieldKind;
2533
+ /**
2534
+ * A KIND THAT IS A PLAIN COLUMN WEARING A LOOK (grids review 3, lane H item 5). The store keeps a
2535
+ * column's "Shows as" on the Field (`display_format`, `custom.display_format_ids()` has `rating` and
2536
+ * `time`), so a Rating is a whole number shown as stars and a Time is a time of day kept as its
2537
+ * 24-hour text — declared through the ordinary door (`{ plain, display_format }`) the same way the
2538
+ * "Shows as" picker makes one. Offered whenever the store does not yet publish the kind as its own
2539
+ * word (`custom.field_kinds()`): a Rating the store publishes goes as `{ type: "rating", max }`.
2540
+ */
2541
+ type LookFieldKind = "time";
2485
2542
  /**
2486
2543
  * LANE 10 P4: THE NINE NEWER KINDS (rating, duration, created by, last changed by, status, address,
2487
2544
  * barcode, formatted text, count). Each is listed in `FIELD_TYPE_CATALOGUE` below, so every reader
@@ -2624,6 +2681,8 @@ declare function whatIsMissing(state: {
2624
2681
  relationTarget?: string;
2625
2682
  /** Only an entity-reference column asks for these (SC-R). */
2626
2683
  allowedTypes?: readonly string[];
2684
+ /** What the thing being made is called where it is made: a table's "column", a record page's "field". */
2685
+ noun?: "column" | "field";
2627
2686
  }): string | null;
2628
2687
 
2629
2688
  declare const NO_RULES_YET = "Nothing has to be true to get here yet.";
@@ -2793,13 +2852,24 @@ interface TableSettingsProps {
2793
2852
  }
2794
2853
  declare function TableSettings({ tableId, proposals, onAcceptProposal, onRejectProposal, onDeleted, archiveAsked, className, }: TableSettingsProps): react.JSX.Element;
2795
2854
 
2855
+ /** Whether a Table document marks the table as Foundation. Absent is no — the store's own rule. */
2856
+ declare function isFoundationTable(table: Pick<Table, "foundation"> | {
2857
+ foundation?: unknown;
2858
+ } | null | undefined): boolean;
2859
+ declare function TableFoundationSwitch({ tableId, table }: {
2860
+ tableId: Uuid$1;
2861
+ table: Table;
2862
+ }): react.JSX.Element;
2863
+
2796
2864
  interface PeekProps {
2797
2865
  tableId: Uuid;
2798
2866
  recordId: Uuid;
2799
2867
  onClose?: (() => void) | undefined;
2800
2868
  className?: string | undefined;
2869
+ /** Drawn ON the record's own page: no "Open" link to the page it is already on. */
2870
+ onPage?: boolean | undefined;
2801
2871
  }
2802
- declare function Peek({ tableId, recordId, onClose, className }: PeekProps): react.JSX.Element;
2872
+ declare function Peek({ tableId, recordId, onClose, className, onPage }: PeekProps): react.JSX.Element;
2803
2873
 
2804
2874
  interface RecordFormProps {
2805
2875
  tableId: Uuid;
@@ -2810,8 +2880,13 @@ interface RecordFormProps {
2810
2880
  onSaved?: ((recordId: Uuid) => void) | undefined;
2811
2881
  onCancel?: (() => void) | undefined;
2812
2882
  className?: string | undefined;
2883
+ /**
2884
+ * A NEW record's starting values (create only; an edit starts from the stored record). How a
2885
+ * linked table's "+" opens this form with the link already made (VIEWS-AND-FIELDS BL).
2886
+ */
2887
+ initial?: Record<string, unknown> | undefined;
2813
2888
  }
2814
- declare function RecordForm({ tableId, recordId, recordType, onSaved, onCancel, className, }: RecordFormProps): react.JSX.Element;
2889
+ declare function RecordForm({ tableId, recordId, recordType, onSaved, onCancel, className, initial, }: RecordFormProps): react.JSX.Element;
2815
2890
 
2816
2891
  interface RelationPickerProps {
2817
2892
  field: Field;
@@ -3102,10 +3177,16 @@ declare function ProvenanceBadge({ document, fieldKey }: {
3102
3177
  * export, a chat line) keeps calling `renderValue` with no resolver and says
3103
3178
  * "Loading…" rather than printing an id.
3104
3179
  */
3105
- declare function RecordValue({ field, value, document, format, withheld, inCell, }: {
3180
+ declare function RecordValue({ field, value, document, format, withheld, inCell, recordId, }: {
3106
3181
  field: Field;
3107
3182
  value: unknown;
3108
3183
  document?: RecordDocument | undefined;
3184
+ /**
3185
+ * WHOSE VALUE THIS IS. A drawn signature a form sent is kept as a File the value's source names,
3186
+ * and the read doors give the value without its source — so the signature reader asks for it by
3187
+ * the record (`signature.tsx`). Every other kind ignores it.
3188
+ */
3189
+ recordId?: string | null | undefined;
3109
3190
  /**
3110
3191
  * The column's DECLARED format (`presentation.ts`), when it has one.
3111
3192
  *
@@ -3260,10 +3341,25 @@ declare function drawnSignatureOf(value: unknown): string | null;
3260
3341
  declare const SIGNED_WORD = "Signed";
3261
3342
  /** A signature value in words: a drawing is "Signed"; a sealed name stays the name. */
3262
3343
  declare function signatureWords(value: unknown): string | null;
3263
- /** A signature as it reads anywhere a value is shown: the drawing, or the signer's name. */
3264
- declare function SignatureValue({ value, inCell }: {
3344
+ /** The File a signature value's source names (`custom.form_submit`, `custom.sign_request_sign`). */
3345
+ declare function signatureFileOf(source: unknown): string | null;
3346
+ /**
3347
+ * The File a stored document's envelope names for one key, when the document carries its envelope
3348
+ * (`_values.<key>.src`, inline or a pointer into `_sources`). The read doors strip both, so a
3349
+ * screen usually has to ask (`SignatureDrawing`); a document that has them is answered here.
3350
+ */
3351
+ declare function signatureFileIn(document: RecordDocument | null | undefined, key: string): string | null;
3352
+ /**
3353
+ * A signature as it reads anywhere a value is shown: the drawing, or the signer's name. A drawing
3354
+ * kept as a File (a form's, `custom.form_submit`) needs to know whose value this is: `recordId` and
3355
+ * `fieldKey`, or the `document` when it carries its envelope.
3356
+ */
3357
+ declare function SignatureValue({ value, inCell, recordId, fieldKey, document, }: {
3265
3358
  value: unknown;
3266
3359
  inCell?: boolean | undefined;
3360
+ recordId?: string | null | undefined;
3361
+ fieldKey?: string | null | undefined;
3362
+ document?: RecordDocument | null | undefined;
3267
3363
  }): react.JSX.Element;
3268
3364
  /**
3269
3365
  * THE ONE SIGNATURE PAD. Draw with a finger, a pen or a mouse; Clear starts again. `onChange`
@@ -3327,6 +3423,7 @@ declare function tablePickerEntries<T extends PickerTable>(tables: readonly T[],
3327
3423
  declare function usePickerTables(): {
3328
3424
  loading: boolean;
3329
3425
  data: Array<Table & PickerTable>;
3426
+ reload: () => void;
3330
3427
  };
3331
3428
  /** The "Show lists" control beside a table picker. Drawn only when there are lists to show. */
3332
3429
  declare function ShowListsToggle({ count, on, onChange, className, }: {
@@ -3411,7 +3508,7 @@ declare function archiveConfirmSentence(what: string): string;
3411
3508
 
3412
3509
  interface AnnounceTableArchived {
3413
3510
  notify: RecordsUiHost["notify"];
3414
- client: Pick<RecordsClient, "recordRestore">;
3511
+ client: Pick<RecordsClient, "tableRestoreWhole">;
3415
3512
  tableId: Uuid$1;
3416
3513
  /** The table's name as the store gave it. */
3417
3514
  name: string;
@@ -3466,6 +3563,9 @@ declare const LOOK_WORDS: {
3466
3563
  readonly newName: "Name for the new view";
3467
3564
  };
3468
3565
 
3566
+ /** The far table's Fields, by table id — what a lookup's picked column is judged against. */
3567
+ type FarFields = ReadonlyMap<string, readonly Field[]>;
3568
+
3469
3569
  interface ViewSwitcherProps {
3470
3570
  /**
3471
3571
  * THE DECLARATIVE SPEC — an agent writes the whole thing, a person tweaks it.
@@ -3486,6 +3586,8 @@ interface ViewSwitcherProps {
3486
3586
  onOpenRecord?: ((recordId: Uuid) => void) | undefined;
3487
3587
  /** The record the host has open beside a grid, which the grid's panel then follows (`Grid.openRecordId`). */
3488
3588
  openRecordId?: Uuid | null | undefined;
3589
+ /** Put the record panel away (Escape, or Space on the open row): `Grid.onCloseRecord`. */
3590
+ onCloseRecord?: (() => void) | undefined;
3489
3591
  /**
3490
3592
  * Called after a card moves between columns, so the host re-reads the rows it owns. A
3491
3593
  * board that moved a card and left the row list alone would show the card in two places
@@ -3562,6 +3664,8 @@ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?:
3562
3664
  total: number | null;
3563
3665
  /** Show one more page of them. */
3564
3666
  loadMore: () => void;
3667
+ /** Read them again — a card's menu copied or archived one. */
3668
+ reload: () => void;
3565
3669
  pageSize: number;
3566
3670
  loading: boolean;
3567
3671
  error: RecordsError | null;
@@ -3579,7 +3683,7 @@ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?:
3579
3683
  */
3580
3684
  membership: string;
3581
3685
  };
3582
- declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, openRecordId, onMoved, onNewRecordForm, onAskWhoChanged, pageSize, titleField, filter, onClearFilter, hostLayout, onHostLayoutChange, chooser, openExport, viewId, onOrderPlaced, footer, className, }: ViewSwitcherProps): react.JSX.Element;
3686
+ declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, openRecordId, onCloseRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize, titleField, filter, onClearFilter, hostLayout, onHostLayoutChange, chooser, openExport, viewId, onOrderPlaced, footer, className, }: ViewSwitcherProps): react.JSX.Element;
3583
3687
 
3584
3688
  type CalendarMode = "month" | "week" | "day" | "list";
3585
3689
  interface CalendarViewProps {
@@ -3590,6 +3694,8 @@ interface CalendarViewProps {
3590
3694
  dateField: Field$1;
3591
3695
  /** The table's columns, for the End and Colour by pickers and the default colour. */
3592
3696
  fields?: readonly Field$1[] | undefined;
3697
+ /** The far tables' columns, so a lookup of one date is offered as an End (`useFarFields`). */
3698
+ farFields?: FarFields | undefined;
3593
3699
  /**
3594
3700
  * THE END COLUMN THE VIEW KEEPS (`end_field`). Left out or null: the table's ONE other date column
3595
3701
  * when it has exactly one, else none until the person picks.
@@ -3637,7 +3743,7 @@ declare function packOverlaps<T extends {
3637
3743
  col: number;
3638
3744
  cols: number;
3639
3745
  }>;
3640
- declare function CalendarView({ tableId, rows, dateField, fields, endKey, onEndFieldChange, endKept, titleField, onOpenRecord, onMoved, onColorFieldChange, canCreate, note, style, defaultMinutes, snapMinutes, initialDate, initialMode, className, }: CalendarViewProps): react.JSX.Element;
3746
+ declare function CalendarView({ tableId, rows, dateField, fields, farFields, endKey, onEndFieldChange, endKept, titleField, onOpenRecord, onMoved, onColorFieldChange, canCreate, note, style, defaultMinutes, snapMinutes, initialDate, initialMode, className, }: CalendarViewProps): react.JSX.Element;
3641
3747
 
3642
3748
  type TimelineZoom = "day" | "week" | "month" | "quarter";
3643
3749
  declare const TIMELINE_ZOOMS: readonly TimelineZoom[];
@@ -3654,6 +3760,8 @@ interface TimelineViewProps {
3654
3760
  rows: readonly ReadRow$1[];
3655
3761
  /** The table's columns: the pickers, the lanes and the colours read them. */
3656
3762
  fields: readonly Field$1[];
3763
+ /** The far tables' columns, so a lookup of one date is offered as a Start or End (`useFarFields`). */
3764
+ farFields?: FarFields | undefined;
3657
3765
  /** The column that names each bar (`cardTitleField`). */
3658
3766
  titleField: Field$1 | undefined;
3659
3767
  /** The view's Start column (`date_field`). Left out: the table's one date column, else asked. */
@@ -3684,7 +3792,7 @@ interface TimelineViewProps {
3684
3792
  declare function onlyCandidate(candidates: readonly Field$1[]): string | null;
3685
3793
  /** The columns a timeline can lay lanes out by: a choice, a person, a link, yes / no, or a worked-out column. */
3686
3794
  declare function groupableFields(all: readonly Field$1[]): Field$1[];
3687
- declare function TimelineView({ tableId, rows, fields, titleField, startKey, endKey, groupKey, colorKey, onSettingsChange, layoutKept, onOpenRecord, onMoved, note, style, initialZoom, initialDate, className, }: TimelineViewProps): react.JSX.Element;
3795
+ declare function TimelineView({ tableId, rows, fields, farFields, titleField, startKey, endKey, groupKey, colorKey, onSettingsChange, layoutKept, onOpenRecord, onMoved, note, style, initialZoom, initialDate, className, }: TimelineViewProps): react.JSX.Element;
3688
3796
 
3689
3797
  /** The colour of each record's card under `colorKey` (null: the table's own decorations only). */
3690
3798
  declare function useRowColorBy(all: readonly Field$1[], colorKey: string | null, style?: TableStyle | undefined): (row: ReadRow$1) => StyleColor | null;
@@ -3762,7 +3870,7 @@ type MoveWritten = {
3762
3870
  * means the caller does not know it — the write is then NOT sent, because a write with no version
3763
3871
  * is a write that can overwrite a colleague (said as a refusal, never silently).
3764
3872
  */
3765
- declare function moveRecordValue(client: Pick<ReturnType<typeof useRecordsClient>, "recordUpdate">, recordId: Uuid$1, patch: Record<string, unknown>, expectedVersion: number | null): Promise<MoveWritten>;
3873
+ declare function moveRecordValue(client: Pick<ReturnType<typeof useRecordsClient>, "recordUpdate" | "recordUpdateAddingChoices">, recordId: Uuid$1, patch: Record<string, unknown>, expectedVersion: number | null): Promise<MoveWritten>;
3766
3874
  interface RecordMoves {
3767
3875
  /**
3768
3876
  * Move one record: `patch` is the new values by Field key, `before` the values it held (read from
@@ -3786,6 +3894,7 @@ interface RecordMoves {
3786
3894
  recordId: Uuid$1;
3787
3895
  error: RecordsError;
3788
3896
  changedElsewhere: boolean;
3897
+ unread?: boolean | undefined;
3789
3898
  } | null;
3790
3899
  /** Say a sentence in the notice without a step (`sticky`: stays until dismissed). */
3791
3900
  say: (says: string, sticky?: boolean) => void;
@@ -3924,6 +4033,12 @@ interface ProposedChange {
3924
4033
  record?: Uuid | undefined;
3925
4034
  /** The document for `add`, or the patch for `update`. */
3926
4035
  data?: Record<string, unknown> | undefined;
4036
+ /**
4037
+ * The version of `record` the proposer read before proposing an `update`. Accept is written against
4038
+ * it, so a change somebody made since is refused, never overwritten. Left out, the version the
4039
+ * record held when this row was first drawn stands in (lane VW).
4040
+ */
4041
+ version?: number | undefined;
3927
4042
  /** What this change is, in one line a person reads. */
3928
4043
  label: string;
3929
4044
  /** Why the proposer asks for it. Optional, and shown when it is there. */
@@ -4290,6 +4405,52 @@ interface AccentSwatchesProps {
4290
4405
  }
4291
4406
  declare function AccentSwatches({ value, onChange, options, noneLabel }: AccentSwatchesProps): react.JSX.Element;
4292
4407
 
4408
+ interface PublicPicturePickerProps {
4409
+ /** What is being chosen ("Logo", "Cover"). It names the group for a screen reader. */
4410
+ label: string;
4411
+ /** The organization's public pictures, as the store listed them. */
4412
+ pictures: readonly PublicPicture[];
4413
+ value: Uuid$1 | "" | null | undefined;
4414
+ onChange: (fileId: Uuid$1 | "") => void;
4415
+ /** The words on the empty choice ("Organization logo", "No cover"). */
4416
+ noneLabel: string;
4417
+ className?: string | undefined;
4418
+ }
4419
+ declare function PublicPicturePicker({ label, pictures, value, onChange, noneLabel, className }: PublicPicturePickerProps): react.JSX.Element;
4420
+
4421
+ /** What the frame draws, read from the store's look. Pure. */
4422
+ interface FormLookView {
4423
+ name: string;
4424
+ logoUrl: string | null;
4425
+ coverUrl: string | null;
4426
+ bandClass: string | null;
4427
+ monogramClass: string;
4428
+ primaryVars: Record<string, string> | null;
4429
+ footerLinks: Array<{
4430
+ label: string;
4431
+ href: string;
4432
+ external: boolean;
4433
+ }>;
4434
+ }
4435
+ declare function formLookView(style: Partial<PortalStyle> | null | undefined, fallbackName: string): FormLookView;
4436
+ /** The logo tile: the business's picture, or its first letter on its colour. */
4437
+ declare function FormLookLogo({ view, size }: {
4438
+ view: FormLookView;
4439
+ size?: "sm" | "md";
4440
+ }): react.JSX.Element;
4441
+ interface FormLookFrameProps {
4442
+ /** The look the store resolved (`presentation.look` from `custom.form_public`, or `formLookOptions().look`). */
4443
+ look: Partial<PortalStyle> | null | undefined;
4444
+ /** The form's title, the page's one heading. */
4445
+ title: string;
4446
+ /** The runner. */
4447
+ children: ReactNode;
4448
+ /** The builder's preview pane: the accent band sits on the pane, not across the window. */
4449
+ contained?: boolean | undefined;
4450
+ className?: string | undefined;
4451
+ }
4452
+ declare function FormLookFrame({ look, title, children, contained, className }: FormLookFrameProps): react.JSX.Element;
4453
+
4293
4454
  interface DigestSchedulerProps {
4294
4455
  /** The Table the digest is about. A saved view is a view OF something. */
4295
4456
  tableId: Uuid;
@@ -4480,6 +4641,8 @@ declare const CHART_KINDS: ChartKind[];
4480
4641
  declare const CHART_NEEDS: Record<ChartKind, string | null>;
4481
4642
  /** ONE BLOCK, in the words a screen edits. */
4482
4643
  interface ChartSpec {
4644
+ /** The block's own id, kept across saves, resizes and moves; minted when absent (`withBlockIds`). */
4645
+ id?: string;
4483
4646
  title: string;
4484
4647
  /** The Table this block asks about. */
4485
4648
  subject: Uuid$1;
@@ -4547,8 +4710,15 @@ declare function dashboardDeclareArgs(board: SavedDashboard, subject: Uuid$1): {
4547
4710
  * without a hex code anywhere in this package.
4548
4711
  */
4549
4712
  declare const SERIES_COLORS: readonly ["hsl(var(--primary))", "hsl(var(--info))", "hsl(var(--success))", "hsl(var(--warning))", "hsl(var(--destructive))", "hsl(var(--accent-foreground))"];
4713
+ /**
4714
+ * The words for a group value a screen can name better than the store's raw value — a link
4715
+ * column's linked record (`ChartBlock`'s `custom.relation_words_many`). A string is the name;
4716
+ * `null` means "this column is named, and this value has no name this reader may see" (—);
4717
+ * `undefined` means "not a named column", and the value is shown as the store gave it.
4718
+ */
4719
+ type GroupNamer = (key: string, value: string) => string | null | undefined;
4550
4720
  /** The label one aggregate row carries — its groups, joined the way a person reads them. */
4551
- declare function groupLabel(groups: Record<string, string | null>): string;
4721
+ declare function groupLabel(groups: Record<string, string | null>, named?: GroupNamer): string;
4552
4722
 
4553
4723
  /** The same shape `components/ui/chart.tsx` takes: one entry per series key. */
4554
4724
  type ChartConfig = Record<string, {
@@ -4671,9 +4841,11 @@ interface ChartBlockProps {
4671
4841
  block: DashboardBlockResult;
4672
4842
  /** The dashboard's subject Table, for a block that names none of its own. */
4673
4843
  subject: Uuid$1;
4844
+ /** The table this chart reads, named in its header on a dashboard across tables. */
4845
+ tableName?: string | undefined;
4674
4846
  className?: string | undefined;
4675
4847
  }
4676
- declare function ChartBlock({ block, subject, className }: ChartBlockProps): react.JSX.Element;
4848
+ declare function ChartBlock({ block, subject, tableName, className }: ChartBlockProps): react.JSX.Element;
4677
4849
 
4678
4850
  interface DashboardCanvasProps {
4679
4851
  /** The Table these blocks are about. */
@@ -4692,6 +4864,253 @@ interface DashboardCanvasProps {
4692
4864
  }
4693
4865
  declare function DashboardCanvas({ tableId, activeDashboardId, filter, createOnMount, onCreated, className }: DashboardCanvasProps): react.JSX.Element;
4694
4866
 
4867
+ interface QuestionPanelProps {
4868
+ tableId: Uuid;
4869
+ /** A saved Question the address named (`?view=questions&item=<id>`). */
4870
+ activeQuestionId?: Uuid | null | undefined;
4871
+ className?: string | undefined;
4872
+ }
4873
+ declare function QuestionPanel({ tableId, activeQuestionId, className }: QuestionPanelProps): react.JSX.Element;
4874
+
4875
+ type QuestionOp = "count" | "sum" | "avg" | "min" | "max";
4876
+ declare const QUESTION_OPS: readonly QuestionOp[];
4877
+ interface QuestionMeasure {
4878
+ op: QuestionOp;
4879
+ /** The Field measured; absent for `count`. */
4880
+ key?: string | undefined;
4881
+ }
4882
+ /** What the answer is cut into. */
4883
+ type QuestionGroup = {
4884
+ kind: "field";
4885
+ key: string;
4886
+ } | {
4887
+ kind: "bucket";
4888
+ key: string;
4889
+ by: AggregateBucket;
4890
+ }
4891
+ /** A column of the table a relation points at: `Patient.Referring physician`. */
4892
+ | {
4893
+ kind: "through";
4894
+ relation: string;
4895
+ key: string;
4896
+ };
4897
+ /** A condition on a column of the table a relation points at ("Patient.Referring physician is …"). */
4898
+ interface ThroughCondition {
4899
+ relation: string;
4900
+ key: string;
4901
+ value: string | number | boolean | null;
4902
+ }
4903
+ type QuestionShow = "table" | "bar" | "column" | "line" | "donut" | "number";
4904
+ interface QuestionSpec {
4905
+ v: 1;
4906
+ measures: QuestionMeasure[];
4907
+ /** The grid's condition builder's Rule, on this table's own Fields (by id). */
4908
+ where: RuleExpression | null;
4909
+ /** Conditions across a relation, ANDed with `where`. */
4910
+ through: ThroughCondition[];
4911
+ group: QuestionGroup | null;
4912
+ /** An ISO moment: the table as the store held it then. Null = now. */
4913
+ asOf: string | null;
4914
+ /** Groups sorted by the FIRST measure (`measure`) or by how many records each holds. Null = the store's default. */
4915
+ order: {
4916
+ by: "measure" | "count";
4917
+ direction: "desc" | "asc";
4918
+ } | null;
4919
+ /** How many groups are shown. */
4920
+ limit: number;
4921
+ show: QuestionShow;
4922
+ }
4923
+ declare function newQuestion(): QuestionSpec;
4924
+ /** A kept definition read back: anything malformed becomes the empty question, never a throw. */
4925
+ declare function questionFromDefinition(definition: unknown): QuestionSpec;
4926
+ interface QuestionRow {
4927
+ /** The group's stored value (a relation's record id, a period's local moment, a word), or null. */
4928
+ group: string | null;
4929
+ /** By measure key (`count`, `sum_copay`). Null = no value (never 0 passed off as one). */
4930
+ values: Record<string, number | null>;
4931
+ /** A measure over a column this reader may not read: the store's own notice, by measure key. */
4932
+ withheld: Record<string, HiddenFieldNotice & {
4933
+ says?: string;
4934
+ }>;
4935
+ /** How many records the group was measured over. */
4936
+ n: number;
4937
+ }
4938
+ interface QuestionAnswer {
4939
+ rows: QuestionRow[];
4940
+ /** The measure keys, in the order asked. */
4941
+ measures: string[];
4942
+ /** The key the group values are under (a bucket's is `<key>_<by>`), or null. */
4943
+ groupKey: string | null;
4944
+ /** How many groups exist; `groupsExact` false when it is "at least". */
4945
+ groupsTotal: number | null;
4946
+ groupsExact: boolean;
4947
+ truncated: boolean;
4948
+ asOf: string | null;
4949
+ }
4950
+ /**
4951
+ * The Rule as a FLAT map (Field key → value) when it is only "is" conditions joined by ALL — the
4952
+ * one shape the as-of door and a condition across a relation can carry. Null when it is more.
4953
+ */
4954
+ declare function flatWhere(where: RuleExpression | null, fields: readonly Field[]): Record<string, unknown> | null;
4955
+ /**
4956
+ * ASK THE STORE. `fields` are this table's Fields (the condition builder writes Fields by id, and a
4957
+ * formula column cannot be asked "as of"). Every number in the answer is a door's.
4958
+ */
4959
+ declare function askQuestion(client: RecordsClient, tableId: Uuid$1, spec: QuestionSpec, fields: readonly Field[]): Promise<RecordsResult<QuestionAnswer>>;
4960
+ /**
4961
+ * THE COLUMNS THIS READER MAY NOT READ, asked of the store: one aggregate measuring how many
4962
+ * records fill each column that carries a sensitivity, and every measure the store WITHHOLDS is a
4963
+ * column never offered. Nothing is guessed from levels here; the store decides, as it does for the
4964
+ * grid's cells.
4965
+ */
4966
+ declare function unreadableKeys(client: RecordsClient, tableId: Uuid$1, fields: readonly Field[]): Promise<Set<string>>;
4967
+ /** The columns a measure other than count may read: numbers (formula arithmetic included); min/max also dates. */
4968
+ declare function measurableFields(fields: readonly Field[], op: QuestionOp): Field[];
4969
+ /** The saved-view surface a Question is kept under, beside the table's views (`custom/records`). */
4970
+ declare const QUESTION_SURFACE = "custom/records/question";
4971
+ interface SavedQuestion {
4972
+ id: Uuid$1;
4973
+ name: string;
4974
+ spec: QuestionSpec;
4975
+ /** Shared with the organization (`internal`) or kept for its maker (`personal`). */
4976
+ shared: boolean;
4977
+ version: number;
4978
+ createdBy: Uuid$1 | null;
4979
+ }
4980
+ /** The table's Questions this person may read (the row's own access decides). */
4981
+ declare function questionsOf(client: RecordsClient, tableId: Uuid$1): Promise<RecordsResult<SavedQuestion[]>>;
4982
+ /** Keep a Question (new when `id` is absent). `null` data = somebody changed it first. */
4983
+ declare function questionSave(client: RecordsClient, args: {
4984
+ id?: Uuid$1 | null;
4985
+ tableId: Uuid$1;
4986
+ name: string;
4987
+ spec: QuestionSpec;
4988
+ shared: boolean;
4989
+ expectedVersion?: number;
4990
+ }): Promise<RecordsResult<SavedQuestion | null>>;
4991
+ /** Archive a Question (its maker, or an admin of it). */
4992
+ declare function questionArchive(client: RecordsClient, id: Uuid$1, version?: number): Promise<RecordsResult<boolean>>;
4993
+
4994
+ interface PageScreenProps {
4995
+ /** The page to open. */
4996
+ pageId?: Uuid | null | undefined;
4997
+ /** Make a new page on this Table instead (its starter: a list and a record panel), then open it. */
4998
+ newOnTable?: Uuid | null | undefined;
4999
+ /** The signed-in person: "Assigned to me" is her own Person record. */
5000
+ viewerUserId?: string | null | undefined;
5001
+ /** Told the id of the page `newOnTable` made. */
5002
+ onCreated?: ((pageId: Uuid) => void) | undefined;
5003
+ /** The page was archived: the host leaves it. */
5004
+ onArchived?: (() => void) | undefined;
5005
+ /** Open in edit mode (a page just made). */
5006
+ startEditing?: boolean | undefined;
5007
+ /** The host's header, handed the page's name and its controls. Left out, a plain row is drawn. */
5008
+ header?: ((args: {
5009
+ name: string;
5010
+ actions: ReactNode;
5011
+ }) => ReactNode) | undefined;
5012
+ className?: string | undefined;
5013
+ }
5014
+ declare function PageScreen({ pageId, newOnTable, viewerUserId, onCreated, onArchived, startEditing, header, className, }: PageScreenProps): react.JSX.Element;
5015
+
5016
+ /** Every kind of block a page holds. `chart` points at a block in the dashboard's own `blocks`. */
5017
+ declare const PAGE_BLOCK_KINDS: readonly ["list", "record", "button", "form", "filter", "chart", "heading", "text"];
5018
+ type PageBlockKind = (typeof PAGE_BLOCK_KINDS)[number];
5019
+ /** What "Add block" reads for each kind. */
5020
+ declare const PAGE_BLOCK_LABEL: Record<PageBlockKind, string>;
5021
+ interface PageBlockBase {
5022
+ /** Stable across saves, moves and resizes. */
5023
+ id: string;
5024
+ /** Width in twelfths from 640 px up (`dashboardLayout.ts`); full width on a phone. */
5025
+ span?: number;
5026
+ title?: string;
5027
+ }
5028
+ interface ListPageBlock extends PageBlockBase {
5029
+ kind: "list";
5030
+ table_id: Uuid$1;
5031
+ /** A saved view of the table: its filter and sort shape the list. */
5032
+ view_id?: Uuid$1 | null;
5033
+ /** The block's own question, the store's flat filter (field key → value). */
5034
+ filter?: RecordFilter;
5035
+ /** The columns shown, by field key; left out, the first few the table declares. */
5036
+ columns?: string[];
5037
+ /** A person column. Offers "Assigned to me": the viewer's own Person record against it. */
5038
+ me_field?: string | null;
5039
+ /** Whether "Assigned to me" starts on. */
5040
+ me_default?: boolean;
5041
+ limit?: number;
5042
+ }
5043
+ interface RecordPageBlock extends PageBlockBase {
5044
+ kind: "record";
5045
+ /** The list block whose selected row this panel shows. */
5046
+ source: string;
5047
+ }
5048
+ interface ButtonPageBlock extends PageBlockBase {
5049
+ kind: "button";
5050
+ /** The list block whose selected row the action runs on. */
5051
+ source: string;
5052
+ table_id: Uuid$1;
5053
+ /** An existing row action of that table (`custom.row_actions`). */
5054
+ action_id: Uuid$1;
5055
+ }
5056
+ interface FormPageBlock extends PageBlockBase {
5057
+ kind: "form";
5058
+ table_id: Uuid$1;
5059
+ form_id: Uuid$1;
5060
+ }
5061
+ interface FilterPageBlock extends PageBlockBase {
5062
+ kind: "filter";
5063
+ table_id: Uuid$1;
5064
+ /** A choice (or yes/no) column of that table. */
5065
+ field: string;
5066
+ /** The list blocks it narrows. Empty = every list on the page over the same table. */
5067
+ targets?: string[];
5068
+ }
5069
+ interface ChartPageBlock extends PageBlockBase {
5070
+ kind: "chart";
5071
+ }
5072
+ interface HeadingPageBlock extends PageBlockBase {
5073
+ kind: "heading";
5074
+ text: string;
5075
+ }
5076
+ interface TextPageBlock extends PageBlockBase {
5077
+ kind: "text";
5078
+ text: string;
5079
+ }
5080
+ type PageBlock = ListPageBlock | RecordPageBlock | ButtonPageBlock | FormPageBlock | FilterPageBlock | ChartPageBlock | HeadingPageBlock | TextPageBlock;
5081
+ /** The `presentation.kind` that makes a dashboard record a Page. */
5082
+ declare const PAGE_KIND = "page";
5083
+ /** Is this dashboard row a Page? Every row with no kind is a dashboard (the store's default). */
5084
+ declare function isPage(row: Pick<DashboardSummary, "presentation"> | {
5085
+ presentation?: unknown;
5086
+ }): boolean;
5087
+ /**
5088
+ * The page's blocks in reading order, read strictly out of `presentation`. A chart the store holds
5089
+ * in `blocks` but the order does not name is appended (it was added by an agent or the old canvas),
5090
+ * and a `chart` entry whose block is gone is dropped — the page never draws a block it cannot answer.
5091
+ */
5092
+ declare function pageBlocksOf(presentation: Record<string, unknown> | null | undefined, chartIds: readonly string[]): PageBlock[];
5093
+ /** The presentation a page is saved with: its kind and its blocks, everything else it held kept. */
5094
+ declare function pagePresentation(presentation: Record<string, unknown> | null | undefined, blocks: readonly PageBlock[]): Record<string, unknown>;
5095
+ /**
5096
+ * THE STARTER PAGE on one table, the way Airtable's record-review layout starts: the table's records
5097
+ * on the left, the chosen one on the right. One press makes a page that already works.
5098
+ */
5099
+ declare function starterPageBlocks(tableId: Uuid$1): PageBlock[];
5100
+ /** The list blocks a filter block narrows: those it names, or every list over its table. */
5101
+ declare function filterTargets(filter: FilterPageBlock, blocks: readonly PageBlock[]): string[];
5102
+ /**
5103
+ * ONE QUESTION FOR A LIST BLOCK, in the store's own filter shapes. `base` is the view's question —
5104
+ * its `where` Rule or its flat `filters` — and `extra` the page's own (the block's filter, the
5105
+ * filter blocks, "Assigned to me"), all equalities by key. Both flat: one merged map (the page's
5106
+ * value wins). The view asks a Rule: the extras join it under `and`, by field id, which is the only
5107
+ * way the Rule shape names a column (REC-17). An extra whose key has no id is left out and named.
5108
+ */
5109
+ declare function combineFilter(base: StoreFilter | null | undefined, extra: RecordFilter, fieldIdOf: (key: string) => string | undefined): {
5110
+ filter: StoreFilter | null;
5111
+ dropped: string[];
5112
+ };
5113
+
4695
5114
  interface FormsPanelProps {
4696
5115
  tableId: Uuid;
4697
5116
  /**
@@ -4870,10 +5289,16 @@ declare function ChecklistsPanel({ tableId, onOpenRecord, className }: Checklist
4870
5289
  * sentence arrives BEFORE the save rather than after it. There is no second
4871
5290
  * validator here: a rule written twice is a rule that will disagree with itself.
4872
5291
  */
4873
- declare function ChecklistTemplateEditor({ aboutTableId, templateId, onDone, className, }: {
5292
+ declare function ChecklistTemplateEditor({ aboutTableId, templateId, onDone, onSaved, className, }: {
4874
5293
  aboutTableId: Uuid;
4875
5294
  templateId?: Uuid | null | undefined;
5295
+ /** Cancel; and, when the host passes no `onSaved`, a finished Save. */
4876
5296
  onDone?: (() => void) | undefined;
5297
+ /**
5298
+ * A Save landed: the checklist's id. Passed, the editor STAYS open and says it is saved (the
5299
+ * host decides where to go); every later Save re-states that same checklist.
5300
+ */
5301
+ onSaved?: ((templateId: Uuid) => void) | undefined;
4877
5302
  className?: string | undefined;
4878
5303
  }): react.JSX.Element;
4879
5304
 
@@ -5064,40 +5489,6 @@ interface RecordsMountProps {
5064
5489
  }
5065
5490
  declare function RecordsMount({ config, host, letTheStoreDecideRights, children, }: RecordsMountProps): react.JSX.Element;
5066
5491
  declare function personActor(userId: Uuid$1 | null | undefined): RecordsActor;
5067
- /**
5068
- * A supabase-js client AS this package's data seam.
5069
- *
5070
- * `RecordsDataSource` is deliberately a small structural subset of
5071
- * `SupabaseClient` — the package holds no key and opens no connection, the host
5072
- * hands it a client that already carries the person's session.
5073
- *
5074
- * IT IS NOT AN IDENTITY CAST, and it cost a live screen to learn why
5075
- * (2026-09-19, /data-v2's first load): the port's `rpc(fn, args, { schema })`
5076
- * says the schema OUT LOUD, because every door of this store is `custom.<name>`
5077
- * and every door of the trust layer is `iam.<name>`. supabase-js's own
5078
- * `rpc(fn, args, options)` has no `schema` option at all — its third argument is
5079
- * `{ head, get, count }` — so a client passed straight through silently asked
5080
- * its default PostgREST profile and the store answered, correctly and uselessly,
5081
- * "Could not find the function public.table_kernel_id ... PGRST202". The schema
5082
- * is chosen the one way supabase-js offers: `client.schema(name).rpc(...)`.
5083
- *
5084
- * `schema(name).from(table)` already agrees structurally and is passed through.
5085
- *
5086
- * `fallbackSchema` is the profile a call that says NOTHING is sent to. No caller
5087
- * in `@ai-matrx/records` omits the option — `callDoor` always says `custom` and
5088
- * `trustDoor` always says `iam` — so it never fires today; it exists so that a
5089
- * call which one day forgets lands on the store rather than silently on
5090
- * `public`. It is a FALLBACK and not the answer: a version of this adapter that
5091
- * sent EVERY door to one fixed schema would route the `iam` trust doors (the
5092
- * external principal, the publish binding) into `custom` and get a PGRST202
5093
- * naming the wrong schema.
5094
- *
5095
- * The cast itself stays HERE, once, where it is explained: a generated
5096
- * `Database` type makes `schema().from().select()` enormous, and a host app that
5097
- * passes its client straight into `config` gets `TS2589: Type instantiation is
5098
- * excessively deep and possibly infinite` in its own build (matrx-frontend,
5099
- * 2026-09-18, on all three campaign routes at once).
5100
- */
5101
5492
  declare function recordsDataSource(client: object, fallbackSchema?: string): RecordsDataSource;
5102
5493
 
5103
5494
  type TableLane = "mine" | "organization" | "system" | "community" | "app";
@@ -5137,7 +5528,8 @@ declare function laneFor(table: Table): TableLane;
5137
5528
  * filter over these four leaves it out rather than inventing a lane for it.
5138
5529
  *
5139
5530
  * From the record's own `visibility`, the store's closed four:
5140
- * personal → Mine · internal → My organization · link → World · public → World.
5531
+ * Only me → Only me · the default → Everyone · Everyone on AI Matrx → Everyone on AI Matrx ·
5532
+ * Published to the web → Published to the web (an older store: its `visibility` word).
5141
5533
  *
5142
5534
  * 🚨 WHY `link` IS WORLD (chair ruling, 2026-09-23). A link anyone can open
5143
5535
  * WITHOUT signing in is reachable by the world; being unlisted does not make it
@@ -5148,6 +5540,12 @@ declare function laneFor(table: Table): TableLane;
5148
5540
  */
5149
5541
  type VisibilityLane = "mine" | "organization" | "community" | "world";
5150
5542
  declare const VISIBILITY_LANES: readonly VisibilityLane[];
5543
+ /**
5544
+ * THE LAW'S WORDS (access ladder Words table), and no other lane names: "Shown to" Only me /
5545
+ * Everyone / Everyone on AI Matrx, and "Published to the web" for anyone on the internet.
5546
+ * "Everyone on AI Matrx" is offered only on a Public table; a store Table is Organization, so
5547
+ * nothing lands there today.
5548
+ */
5151
5549
  declare const VISIBILITY_LANE_TITLE: Record<VisibilityLane, string>;
5152
5550
  /** Which visibility lane one Table is in, or `null` when no person chose one for it. */
5153
5551
  declare function visibilityLaneFor(table: Table): VisibilityLane | null;
@@ -5370,6 +5768,12 @@ interface TablePageProps {
5370
5768
  * disabled, with its reason.
5371
5769
  */
5372
5770
  actionHost?: TablePageActionHost | undefined;
5771
+ /**
5772
+ * THE TABLE'S ACTIONS, HANDED TO THE HOST (lane TABLE-ACTIONS wave 4, T4.1): called with the
5773
+ * very list the header ⋯ draws, after every render, so a host's command bar runs exactly what the
5774
+ * menu runs (the same `run`). The page itself answers the ⌥⇧ chords (`TABLE_ACTION_KEYS`).
5775
+ */
5776
+ onActions?: ((actions: readonly ObjectAction[]) => void) | undefined;
5373
5777
  /**
5374
5778
  * WHAT THE PERSON IS ACTUALLY LOOKING AT (lane V24-TAILS, VERIFIER-24 item 6): the saved view
5375
5779
  * with her look laid over it and the address's overrides, exactly as the page draws it — so a
@@ -5472,7 +5876,7 @@ declare const VIEW_NOT_SAVED_YET: string;
5472
5876
  * one of the ways to look at this table, not a Trash area of the app somebody
5473
5877
  * has to know exists.
5474
5878
  */
5475
- type MainView = "records" | "dashboards" | "archived";
5879
+ type MainView = "records" | "dashboards" | "archived" | "questions";
5476
5880
  /**
5477
5881
  * WHAT THE PAGE IS SHOWING — the middle and the right-hand panel, as ONE answer.
5478
5882
  *
@@ -5558,7 +5962,7 @@ declare function openingView(activeView: string | null | undefined, activeDashbo
5558
5962
  layout: ViewLayout | null;
5559
5963
  unknown: string | null;
5560
5964
  };
5561
- declare function TablePage({ tableId, pageSize, seedViews, onLeave, leaveLabel, activeDashboardId, activeRecordId, activeView, onViewChanged, activeGroupField, cameFrom, filter, activeRail, activeItemId, header, actionHost, onShownViewChange, className, }: TablePageProps): react.JSX.Element;
5965
+ declare function TablePage({ tableId, pageSize, seedViews, onLeave, leaveLabel, activeDashboardId, activeRecordId, activeView, onViewChanged, activeGroupField, cameFrom, filter, activeRail, activeItemId, header, actionHost, onActions, onShownViewChange, className, }: TablePageProps): react.JSX.Element;
5562
5966
 
5563
5967
  /**
5564
5968
  * The page's toolbar slot: an element (controls go there), `null` (the row is mounting — draw
@@ -5758,6 +6162,8 @@ interface PipelineBoardProps {
5758
6162
  onOpenRecord?: ((recordId: Uuid) => void) | undefined;
5759
6163
  /** Called after a move lands, so the host re-reads the rows it owns. */
5760
6164
  onMoved?: (() => void) | undefined;
6165
+ /** A card's menu copied or archived a record: the host re-reads the rows it owns. */
6166
+ onChanged?: (() => void) | undefined;
5761
6167
  /**
5762
6168
  * THE COLORS THE REST OF THE VIEW PAINTS WITH (lane UI-QUICK-1) — `resolveTableStyle`'s answer,
5763
6169
  * the table's G1 decorations under the view's own look. `ViewSwitcher`'s board passes the one it
@@ -5772,7 +6178,7 @@ interface PipelineBoardProps {
5772
6178
  dateFields?: readonly Field$1[] | undefined;
5773
6179
  className?: string | undefined;
5774
6180
  }
5775
- declare function PipelineBoard({ tableId, rows, titleKey, measure, filter, onMeasureChange, onOpenRecord, onMoved, style, dateFields, className, }: PipelineBoardProps): react.JSX.Element;
6181
+ declare function PipelineBoard({ tableId, rows, titleKey, measure, filter, onMeasureChange, onOpenRecord, onMoved, onChanged, style, dateFields, className, }: PipelineBoardProps): react.JSX.Element;
5776
6182
 
5777
6183
  /** The source's Dimensions, as the door says them; a choice and a relation read by their words. */
5778
6184
  declare function drillDimensionsOf(def: DrillDefinition | null, labels: ReadonlyMap<string, ReadonlyMap<string, string>>): MatrxDrillDimension[];
@@ -5843,4 +6249,92 @@ declare function ObjectActionGlyph({ name, ...props }: {
5843
6249
  name: ObjectActionIcon;
5844
6250
  } & SVGAttributes<SVGSVGElement>): react.JSX.Element;
5845
6251
 
5846
- export { ABSENCE_WORD_LABEL, ABSENCE_WORD_VALUES, ACTION_KINDS, ARCHIVED_NEVER_DESTROYED, ARCHIVE_MEANS, type AbsenceWord, AccentSwatches, type AccentSwatchesProps, ActionInbox, type ActionInboxProps, type ActionKind, type AgentBuildAsk, type AnnounceTableArchived, 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, ADDABLE_TYPES as CUSTOM_FIELD_ADDABLE_TYPES, type CalendarMode, CalendarView, type CalendarViewProps, type CaptureMode, type CaptureQueuePort, CaptureRun, type CaptureRunProps, CaptureSheet, type CaptureSheetProps, type CellAddress, type CellRefusal, type CellState, ChartBlock, type ChartBlockProps, type ChartConfig, ChartFrame, type ChartKind, ChartLegendContent, type ChartSpec, ChartTooltipContent, ChecklistRunner, type ChecklistRunnerProps, ChecklistTemplateEditor, ChecklistsPanel, type ChecklistsPanelProps, type ChoiceAddition, type ChoiceAsk, ChoiceAskButtons, ChoiceListEditor, type ChoiceListRow, CommentThread, type CommentThreadProps, type ConditionField, ConditionGroup, type ConditionGroupProps, ConditionRow, type ConditionRowProps, type CustomFieldAddRequest, type CustomFieldAddResult, type CustomFieldSetResult, type CustomFieldValuesRequest, type CustomFieldsAgentDoor, type CustomFieldsAgentState, CustomFieldsSection, type CustomFieldsSectionProps, DEFAULT_FOOTER, DEFAULT_VIEW_NAME, DUE_STATE_LABEL, DashboardCanvas, type DashboardCanvasProps, DigestScheduler, type DigestSchedulerProps, DocRender, type DocRenderProps, DocTemplate, type DocTemplateProps, type DocTemplateSpec, EMPTY_PRESENTATION, ENGINEER_TEXT, ENTITY_REFERENCE_KINDS_MISSING, type EditorKind, EmbedFrame, type EmbedFrameProps, type EnrichAsk, EnrichBadge, type EnrichBadgeProps, type EnrichOutcome, EnrichPanel, type EnrichPanelProps, EntityReferenceKindPicker, type EntityReferenceKindPickerProps, ExampleTables, ExportMenu, type ExportMenuProps, FIELD_RULE_KIND_LABEL, FIELD_RULE_KIND_VALUES, FIELD_SENSITIVITY_LABEL, FIELD_TYPE_CATALOGUE, FIELD_TYPE_CHOICES, FIELD_TYPE_GROUPS, FOOTER_WORDS, FORMULA_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 FormLook, type FormQuestionSpec, FormRunner, type FormRunnerProps, type FormSpec, type FormSubmitOutcome, type FormTheme, FormsPanel, type FormsPanelProps, type FormulaOp, Grid, GridCell, type GridContextRecord, type GridContextSnapshot, type GridEditing, type GridGrouping, type GridPresentation, type GridProps, GuessedFieldType, HistoryPanel, type HistoryPanelProps, type HostLayout, INBOX_GROUPINGS, INBOX_VIEWS, IN_MEMORY_QUEUE_REASON, type ImportSource, ImportWizard, type ImportWizardProps, InTableToolbar, type InboxGroup, type InboxGrouping, LANE_EMPTY, LANE_TITLE, LAYOUT_FIELD_KIND, LAYOUT_LABEL, LOOK_WORDS, type LabelLookup, type LinkRail, MACHINE_IDENTITY, MANUAL_SORT, MAX_ROW_HEIGHT, MIN_ROW_HEIGHT, type MainView, type MoveWritten, MyChecklistSteps, NEEDS_A_SENTENCE, 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, ObjectAction, ObjectActionGlyph, ObjectActionIcon, ObjectActionMenuItems, type ObjectActionMenuItemsProps, 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, PickOrAdd, type PickOrAddItem, type PickOrAddProps, type PickableFieldType, type PickerTable, PipelineBoard, type PipelineBoardProps, type PlainFieldType, type PlainRefusal, type PortalAnswer, PortalBuilder, type PortalBuilderProps, PortalCardView, type PortalCardViewProps, PortalLookEditor, type PortalLookEditorProps, PortalShell, type PortalShellProps, PortalsPanel, type PortalsPanelProps, type ProposalOutcome, ProposalRow, type ProposalRowProps, type ProposedChange, type ProposedChangeAct, ProvenanceBadge, 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, type RecordMoves, RecordValue, RecordsMount, type RecordsMountProps, RecordsTableCard, type RecordsTableCardProps, type RecordsUiHost, RecordsUiProvider, ReferenceBuilder, type ReferenceBuilderProps, type ReferenceChoice, RefusalLine, RefusalNotice, type RelationFieldType, RelationPicker, type RelationPickerProps, type RenderTextSlot, type ResolveName, type RollupAgg, SAVED_VIEWS_UNAVAILABLE, SAVE_TO_TABLE_TYPES, SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS, SECTIONS_UNKNOWN, SERIES_COLORS, SHARE_NOT_YOURS_LINE, SIGNED_WORD, SOMEBODY, STAGE_RULE_ON_FAIL_LABEL, STORE_ANSWERS_THESE, STORE_DECIDES_REASON, STORE_KEEPS_TIMELINE, STORE_KEPT_LAYOUTS, SUBSCRIPTION_CADENCES, SUBSCRIPTION_CADENCE_LABEL, SUBSCRIPTION_CHANNEL_LABEL, SUBSCRIPTION_CHANNEL_VALUES, SaveToTable, type SaveToTableProps, type SaveToTableSource, type SavedDashboard, type SavedForm, type SavedView, type SavedViewSpec, ShareControl, type ShareControlProps, type ShareSubject, ShowListsToggle, type ShownViewReport, SignBlock, type SignBlockProps, SignaturePad, SignatureValue, type SnoozeChoice, type SortStateAction, SortStateControl, type SortStateControlProps, StageRulesSection, type StageRulesSectionProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_NAME_MAX, TABLE_NOT_REACHABLE, THE_SYSTEM, TIMELINE_ZOOMS, TableActionHost, type TableLane, type TableOpening, TablePage, type TablePageActionHost, type TablePageHeaderChrome, type TablePageProps, type TablePickerEntries, type TablePickerEntry, TableRenameDialog, TableRestoreRefused, type TableRights, TableSettings, type TableSettingsProps, TableShape, TableToolbarSlotContext, TablesHome, type TablesHomeProps, type TimelineSettings, TimelineView, type TimelineViewProps, type TimelineZoom, type TrackedVersion, UNREAD_RECORD_LABEL, type UseSystemTableState, VIEW_KEYS, VIEW_LAYOUTS, VIEW_NEEDS, VIEW_NOT_SAVED_YET, VISIBILITY_LANES, VISIBILITY_LANE_TITLE, ViewBar, type ViewBarProps, type ViewKeyDeclaration, type ViewKeyLayout, type ViewKeyWriter, type ViewLayout, type ViewLook, type ViewNeed, type ViewNeedKind, ViewNeeds, type ViewNeedsProps, type ViewSettings, type ViewSettingsPatch, type ViewSort, type ViewSortKey, ViewSwitcher, type ViewSwitcherProps, type VisibilityLane, WITHHELD_RECORD_LABEL, WITHHELD_WORD, WORK_APPROVAL_STATES, WORK_APPROVAL_STATE_LABEL, WORK_DUE_STATES, WORK_INBOX_KINDS, WORK_INBOX_KIND_GROUP_LABEL, WORK_INBOX_KIND_LABEL, WhatYouMayDo, WhereItLives, type WhereItLivesProps, type WhoChanged, WhoChangedSource, WithheldValue, actorBadge, actorWords, addDays, announceTableArchived, applyLook, archiveConfirmSentence, archivedRowLine, asRefusal, askableFields, blockFromSpec, bodyForReading, bodyFromKeys, calendarDayLabel, calendarDayOf, cameFromLine, cardTitleField, cardWords, carriesTimeOfDay, cellState, choiceAddition, choiceAskSentence, choiceListPatch, choiceNudgeOf, choiceRowsFrom, chooseSurface, colorFromTheValue, columnDeclarationFor, columnForField, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, currencyCodeFor, customFieldRequestProblems, dashboardDeclareArgs, dashboardFromSummary, dateFormatFor, dateText, dayAt, dayKeyOf, daysBetween, declareView, defaultViewOf, designatedLayoutOf, drawnSignatureOf, drillDimensionsOf, drillMeasuresOf, drillPathsOf, drillWhere, editorKindFor, ensureSystemTable, entityReferenceSpec, envelopeFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, footerOf, formDeclareArgs, formFromSummary, formLookDocument, formLookFromDocument, formPresentation, formatForField, freeColumnName, freshFormName, gridContextKey, gridContextSnapshot, groupInbox, groupLabel, groupableFields, handOrderLine, handOrderSortState, hasTimePart, hintForAPerson, hintIsMachineIdentity, idsOf, isChoiceAddition, isDateField, isEngineerText, isId, isKeptTable, isMachineIdentity, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, isValueSet, keepLook, keptByTheApp, keyFor, kindsWithNoChoice, laneFor, lastChangeSentence, lookDiffers, lookDocument, lookFromDocument, lookPart, looksLikeId, machineIdentityIn, mayNotRestoreLine, memberName, moveRecordValue, nextInWords, nextSummaryAt, notAChoiceSentence, onlyCandidate, openingRail, openingView, packOverlaps, pageViewFromParam, parityTypesWithNoExplanation, parseGridPresentation, personActor, personRecordForMember, pickableTypeOf, pointsAtRecords, presentationDocument, presentationIsEmpty, previewLine, previewWords, publiclyAnswerable, railFromParam, readLooks, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, renderValue, rescheduledValue, resolveTableStyle, revokeConsequence, rowName, rowNameIn, saveToViewPlan, saveViewPatch, scalarText, seedIsSatisfied, shapesOfSource, shareUnavailableReason, signatureWords, singularNoun, snoozeChoices, specFromBlock, storeDecidesRights, storeKeepsLayout, storePublishesKind, styleFromDecorations, submissionStamp, surfaceChosen, tableName, tableNameProblem, tableOpening, tablePickerEntries, tableRightsAt, unknownRailLine, unknownViewLine, useCanShare, useChoiceNudge, useDrill, useDrillAnswers, useDrillDefinition, useEmbedHandshake, useEnrichCells, useGridEditing, useLabelWait, useMeasuredWidth, useMyChecklistSteps, usePickerTables, useRecordLabels, useRecordMoves, useRecordRights, useRecordsUi, useRowColorBy, useRowRights, useSystemTable, useTableRights, useTableToolbarSlot, useViewRecords, useWhoChanged, viewDocument, viewFromRow, viewKeysFor, viewNeedFor, viewPatchDocument, viewSettings, viewSettingsFor, viewSettingsPatch, visibilityLaneFor, whatIsMissing, whatIsMissingForEntityReference, whatTheChoiceListIsMissing, whenWords, whyNotAskable, withheldNoticeOf, withheldSentence, withoutAddition, wordsList };
6252
+ /** What the list needs to know about the record. */
6253
+ interface RecordActionSubject {
6254
+ id: Uuid$1;
6255
+ tableId: Uuid$1;
6256
+ /** The record's name as every card reads it (`recordNameIn` / `cardWords`). */
6257
+ name: string;
6258
+ }
6259
+ type RecordHandler = (record: RecordActionSubject) => void | Promise<void>;
6260
+ /** THE SIDE EFFECTS THIS LIST CANNOT OWN. A handler left out keeps its action, disabled. */
6261
+ interface RecordActionHost {
6262
+ /** Origin for Copy link and Open in new tab. Default `https://www.aimatrx.com`. */
6263
+ origin?: string;
6264
+ /**
6265
+ * The record's own page (the host's `hrefForRecord`), absolute or root-relative. When given, Copy
6266
+ * link and Open in new tab carry it instead of the table page with `?record=`.
6267
+ */
6268
+ href?: string;
6269
+ open?: RecordHandler;
6270
+ openInNewTab?: (url: string, record: RecordActionSubject) => void;
6271
+ /** Runs inside the click (the clipboard needs the gesture). */
6272
+ copyText?: (text: string, record: RecordActionSubject) => void | Promise<void>;
6273
+ duplicate?: RecordHandler;
6274
+ history?: RecordHandler;
6275
+ archive?: RecordHandler;
6276
+ /** Why an action whose handler is left out is unavailable here, by id (≤ 60 chars). */
6277
+ unavailableReasons?: Readonly<Record<string, string>>;
6278
+ /** Another lane's record entries; same rules as `TableActionHost.extend`. */
6279
+ extend?: (record: RecordActionSubject, rights: WhatYouMayDo) => readonly ObjectAction[];
6280
+ }
6281
+ interface RecordActionsInput {
6282
+ record: RecordActionSubject;
6283
+ /** The person's rights on the record (its row level), or on the table when that is all there is. */
6284
+ rights: WhatYouMayDo;
6285
+ host: RecordActionHost;
6286
+ }
6287
+ /** The one link to a record: the table page with the record open, `<origin>/data-v2/<table>?record=<id>`. */
6288
+ declare function recordLink(tableId: string, recordId: string, origin?: string): string;
6289
+ /**
6290
+ * THE RECORD'S ACTIONS, in the one order. Same ids, same order, same verbs for every seat and every
6291
+ * host — only `disabledReason` varies.
6292
+ */
6293
+ declare function recordActions(input: RecordActionsInput): ObjectAction[];
6294
+
6295
+ interface RecordActionHostArgs {
6296
+ tableId: Uuid;
6297
+ row: ReadRow$1;
6298
+ onOpenRecord?: ((recordId: Uuid) => void) | undefined;
6299
+ /** Re-read the surface after a copy or an archive. */
6300
+ onChanged?: (() => void) | undefined;
6301
+ }
6302
+ /** The handlers a record card's menu runs, bound to this package's client and the host's ports. */
6303
+ declare function useRecordActionHost({ tableId, row, onOpenRecord, onChanged }: RecordActionHostArgs): RecordActionHost;
6304
+ declare function ObjectActionContextMenuItems({ actions }: {
6305
+ actions: readonly ObjectAction[];
6306
+ }): react.JSX.Element;
6307
+ interface RecordActionMenuProps extends RecordActionHostArgs {
6308
+ /** The record's name as the card reads it. */
6309
+ name: string;
6310
+ /** The card itself. */
6311
+ children: ReactNode;
6312
+ className?: string | undefined;
6313
+ }
6314
+ /** A record card with its ⋯ and its right-click, both drawing `recordActions()`. */
6315
+ declare function RecordActionMenu({ tableId, row, name, onOpenRecord, onChanged, children, className }: RecordActionMenuProps): react.JSX.Element;
6316
+
6317
+ interface ViewActionHost {
6318
+ rename?: () => void;
6319
+ duplicate?: () => void | Promise<void>;
6320
+ archive?: () => void | Promise<void>;
6321
+ }
6322
+ /** `whyNot`: the person's reason they may not change this table's views, or null when they may. */
6323
+ declare function viewActions(whyNot: string | null, host: ViewActionHost): ObjectAction[];
6324
+
6325
+ interface RecordPanelProps {
6326
+ tableId: Uuid;
6327
+ recordId: Uuid;
6328
+ /** Put the record away (the rail's close). Absent on a page of its own. */
6329
+ onClose?: (() => void) | undefined;
6330
+ /**
6331
+ * "Who changed this column?" — the rail opens its own panel. Absent, the panel answers in place,
6332
+ * under the history.
6333
+ */
6334
+ onAskAboutField?: ((fieldKey: string) => void) | undefined;
6335
+ /** Drawn as the record's own page (no "Open" link to itself). */
6336
+ onPage?: boolean | undefined;
6337
+ }
6338
+ declare function RecordPanel({ tableId, recordId, onClose, onAskAboutField, onPage }: RecordPanelProps): react.JSX.Element;
6339
+
6340
+ export { ABSENCE_WORD_LABEL, ABSENCE_WORD_VALUES, ACTION_KINDS, ARCHIVED_NEVER_DESTROYED, ARCHIVE_MEANS, type AbsenceWord, AccentSwatches, type AccentSwatchesProps, ActionInbox, type ActionInboxProps, type ActionKind, type AgentBuildAsk, type AnnounceTableArchived, 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, type ButtonPageBlock, CAPTURE_MODES, CHART_KINDS, CHART_KIND_LABEL, CHART_NEEDS, CHECKLIST_REQUIREMENT_KINDS, CHECKLIST_REQUIREMENT_LABEL, CONDITION_OPS, CONTEXT_POLICY_LABEL, ADDABLE_TYPES as CUSTOM_FIELD_ADDABLE_TYPES, type CalendarMode, CalendarView, type CalendarViewProps, type CaptureMode, type CaptureQueuePort, CaptureRun, type CaptureRunProps, CaptureSheet, type CaptureSheetProps, type CellAddress, type CellRefusal, type CellState, ChartBlock, type ChartBlockProps, type ChartConfig, ChartFrame, type ChartKind, ChartLegendContent, type ChartPageBlock, type ChartSpec, ChartTooltipContent, ChecklistRunner, type ChecklistRunnerProps, ChecklistTemplateEditor, ChecklistsPanel, type ChecklistsPanelProps, type ChoiceAddition, type ChoiceAsk, ChoiceAskButtons, ChoiceListEditor, type ChoiceListRow, CommentThread, type CommentThreadProps, type ConditionField, ConditionGroup, type ConditionGroupProps, ConditionRow, type ConditionRowProps, type CustomFieldAddRequest, type CustomFieldAddResult, type CustomFieldSetResult, type CustomFieldValuesRequest, type CustomFieldsAgentDoor, type CustomFieldsAgentState, CustomFieldsSection, type CustomFieldsSectionProps, DEFAULT_FOOTER, DEFAULT_VIEW_NAME, DUE_STATE_LABEL, DashboardCanvas, type DashboardCanvasProps, DigestScheduler, type DigestSchedulerProps, DocRender, type DocRenderProps, DocTemplate, type DocTemplateProps, type DocTemplateSpec, EMPTY_PRESENTATION, ENGINEER_TEXT, ENTITY_REFERENCE_KINDS_MISSING, type EditorKind, EmbedFrame, type EmbedFrameProps, type EnrichAsk, EnrichBadge, type EnrichBadgeProps, type EnrichOutcome, EnrichPanel, type EnrichPanelProps, EntityReferenceKindPicker, type EntityReferenceKindPickerProps, ExampleTables, ExportMenu, type ExportMenuProps, FIELD_RULE_KIND_LABEL, FIELD_RULE_KIND_VALUES, FIELD_SENSITIVITY_LABEL, FIELD_TYPE_CATALOGUE, FIELD_TYPE_CHOICES, FIELD_TYPE_GROUPS, FOOTER_WORDS, FORMULA_OP_JOINS, FORMULA_OP_LABEL, FORMULA_OP_VALUES, FORM_FLOWS, FORM_NOT_HERE_LINE, FROZEN_COLUMN_WIDTH, FieldControl, FieldEditor, type FieldEditorControlProps, type FieldEditorProps, FieldHistoryPanel, type FieldHistoryPanelProps, FieldLabel, type FieldProposalRow, type FieldRuleKindValue, type FieldTypeChoice, FilePicker, type FilePickerProps, type FilterPageBlock, type FooterPlacement, type FormAsked, FormBuilder, type FormBuilderProps, type FormFlow, type FormLook, FormLookFrame, type FormLookFrameProps, FormLookLogo, type FormLookView, type FormPageBlock, type FormQuestionSpec, FormRunner, type FormRunnerProps, type FormSpec, type FormSubmitOutcome, type FormTheme, FormsPanel, type FormsPanelProps, type FormulaOp, Grid, GridCell, type GridContextRecord, type GridContextSnapshot, type GridEditing, type GridGrouping, type GridPresentation, type GridProps, GuessedFieldType, type HeadingPageBlock, HistoryPanel, type HistoryPanelProps, type HostLayout, INBOX_GROUPINGS, INBOX_VIEWS, IN_MEMORY_QUEUE_REASON, type ImportSource, ImportWizard, type ImportWizardProps, InTableToolbar, type InboxGroup, type InboxGrouping, LANE_EMPTY, LANE_TITLE, LAYOUT_FIELD_KIND, LAYOUT_LABEL, LOOK_WORDS, type LabelLookup, type LinkRail, type ListPageBlock, MACHINE_IDENTITY, MANUAL_SORT, MAX_ROW_HEIGHT, MIN_ROW_HEIGHT, type MainView, type MoveWritten, MyChecklistSteps, NEEDS_A_SENTENCE, 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, ObjectAction, ObjectActionContextMenuItems, ObjectActionGlyph, ObjectActionIcon, ObjectActionMenuItems, type ObjectActionMenuItemsProps, type OpenRecordsAsk, type OrganizationMember, PAGE_BLOCK_KINDS, PAGE_BLOCK_LABEL, PAGE_KIND, PAGE_VIEWS, PAGE_VIEW_LABEL, PARITY_LABEL, PARITY_MADE_OF, PORTAL_NOT_HERE_LINE, PROPOSED_CHANGE_ACT_LABEL, PROPOSED_CHANGE_ACT_VALUES, type PageBlock, type PageBlockKind, PageScreen, type PageScreenProps, type PageView, Peek, type PeekProps, type PendingCapture, PersonPicker, type PersonPickerProps, PickOrAdd, type PickOrAddItem, type PickOrAddProps, type PickableFieldType, type PickerTable, PipelineBoard, type PipelineBoardProps, type PlainFieldType, type PlainRefusal, type PortalAnswer, PortalBuilder, type PortalBuilderProps, PortalCardView, type PortalCardViewProps, PortalLookEditor, type PortalLookEditorProps, PortalShell, type PortalShellProps, PortalsPanel, type PortalsPanelProps, type ProposalOutcome, ProposalRow, type ProposalRowProps, type ProposedChange, type ProposedChangeAct, ProvenanceBadge, PublicPicturePicker, type PublicPicturePickerProps, PublicViewPage, type PublicViewPageProps, QUESTION_OPS, QUESTION_SURFACE, type QuestionAnswer, type QuestionGroup, type QuestionMeasure, type QuestionOp, QuestionPanel, type QuestionPanelProps, type QuestionRow, type QuestionShow, type QuestionSpec, ROLLUP_AGG_LABEL, ROLLUP_AGG_VALUES, RULE_NOT_HERE_LINE, type ReaskContext, type RecordActionHost, RecordActionMenu, type RecordActionMenuProps, type RecordActionSubject, type RecordActionsInput, RecordChat, type RecordChatContext, type RecordChatEntry, type RecordChatProps, type RecordChatWithheld, RecordChip, RecordForm, type RecordFormProps, RecordLabelProvider, type RecordMoves, type RecordPageBlock, RecordPanel, type RecordPanelProps, RecordValue, RecordsMount, type RecordsMountProps, RecordsTableCard, type RecordsTableCardProps, type RecordsUiHost, RecordsUiProvider, ReferenceBuilder, type ReferenceBuilderProps, type ReferenceChoice, RefusalLine, RefusalNotice, type RelationFieldType, RelationPicker, type RelationPickerProps, type RenderTextSlot, type ResolveName, type RollupAgg, SAVED_VIEWS_UNAVAILABLE, SAVE_TO_TABLE_TYPES, SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS, SECTIONS_UNKNOWN, SERIES_COLORS, SHARE_NOT_YOURS_LINE, SIGNED_WORD, SOMEBODY, STAGE_RULE_ON_FAIL_LABEL, STORE_ANSWERS_THESE, STORE_DECIDES_REASON, STORE_KEEPS_TIMELINE, STORE_KEPT_LAYOUTS, SUBSCRIPTION_CADENCES, SUBSCRIPTION_CADENCE_LABEL, SUBSCRIPTION_CHANNEL_LABEL, SUBSCRIPTION_CHANNEL_VALUES, SaveToTable, type SaveToTableProps, type SaveToTableSource, type SavedDashboard, type SavedForm, type SavedQuestion, type SavedView, type SavedViewSpec, ShareControl, type ShareControlProps, type ShareSubject, ShowListsToggle, type ShownViewReport, SignBlock, type SignBlockProps, SignaturePad, SignatureValue, type SnoozeChoice, type SortStateAction, SortStateControl, type SortStateControlProps, StageRulesSection, type StageRulesSectionProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_NAME_MAX, TABLE_NOT_REACHABLE, THE_SYSTEM, TIMELINE_ZOOMS, TableActionHost, TableFoundationSwitch, type TableLane, type TableOpening, TablePage, type TablePageActionHost, type TablePageHeaderChrome, type TablePageProps, type TablePickerEntries, type TablePickerEntry, TableRenameDialog, TableRestoreRefused, type TableRights, TableSettings, type TableSettingsProps, TableShape, TableToolbarSlotContext, TablesHome, type TablesHomeProps, type TextPageBlock, type ThroughCondition, type TimelineSettings, TimelineView, type TimelineViewProps, type TimelineZoom, type TrackedVersion, UNREAD_RECORD_LABEL, type UseSystemTableState, VIEW_KEYS, VIEW_LAYOUTS, VIEW_NEEDS, VIEW_NOT_SAVED_YET, VISIBILITY_LANES, VISIBILITY_LANE_TITLE, ViewBar, type ViewBarProps, type ViewKeyDeclaration, type ViewKeyLayout, type ViewKeyWriter, type ViewLayout, type ViewLook, type ViewNeed, type ViewNeedKind, ViewNeeds, type ViewNeedsProps, type ViewSettings, type ViewSettingsPatch, type ViewSort, type ViewSortKey, ViewSwitcher, type ViewSwitcherProps, type VisibilityLane, WITHHELD_RECORD_LABEL, WITHHELD_WORD, WORK_APPROVAL_STATES, WORK_APPROVAL_STATE_LABEL, WORK_DUE_STATES, WORK_INBOX_KINDS, WORK_INBOX_KIND_GROUP_LABEL, WORK_INBOX_KIND_LABEL, WhatYouMayDo, WhereItLives, type WhereItLivesProps, type WhoChanged, WhoChangedSource, WithheldValue, actorBadge, actorWords, addDays, announceTableArchived, applyLook, archiveConfirmSentence, archivedRowLine, asRefusal, askQuestion, askableFields, blockFromSpec, bodyForReading, bodyFromKeys, calendarDayLabel, calendarDayOf, cameFromLine, cardTitleField, cardWords, carriesTimeOfDay, cellState, choiceAddition, choiceAskSentence, choiceListPatch, choiceNudgeOf, choiceRowsFrom, chooseSurface, colorFromTheValue, columnDeclarationFor, columnForField, combineFilter, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, currencyCodeFor, customFieldRequestProblems, dashboardDeclareArgs, dashboardFromSummary, dateFormatFor, dateText, dayAt, dayKeyOf, daysBetween, declareView, defaultViewOf, designatedLayoutOf, drawnSignatureOf, drillDimensionsOf, drillMeasuresOf, drillPathsOf, drillWhere, editorKindFor, ensureSystemTable, entityReferenceSpec, envelopeFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, filterTargets, flatWhere, footerOf, formDeclareArgs, formFromSummary, formLookDocument, formLookFromDocument, formLookView, formPresentation, formatForField, freeColumnName, freshFormName, gridContextKey, gridContextSnapshot, groupInbox, groupLabel, groupableFields, handOrderLine, handOrderSortState, hasTimePart, hintForAPerson, hintIsMachineIdentity, idsOf, isChoiceAddition, isDateField, isEngineerText, isFoundationTable, isId, isKeptTable, isMachineIdentity, isPage, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, isValueSet, keepLook, keptByTheApp, keyFor, kindsWithNoChoice, laneFor, lastChangeSentence, lookDiffers, lookDocument, lookFromDocument, lookPart, looksLikeId, machineIdentityIn, mayNotRestoreLine, measurableFields, memberName, moveRecordValue, newQuestion, nextInWords, nextSummaryAt, notAChoiceSentence, onlyCandidate, openingRail, openingView, packOverlaps, pageBlocksOf, pagePresentation, pageViewFromParam, parityTypesWithNoExplanation, parseGridPresentation, personActor, personRecordForMember, pickableTypeOf, pointsAtRecords, presentationDocument, presentationIsEmpty, previewLine, previewWords, publiclyAnswerable, questionArchive, questionFromDefinition, questionSave, questionsOf, railFromParam, readLooks, recordActions, recordLink, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, renderValue, rescheduledValue, resolveTableStyle, revokeConsequence, rowName, rowNameIn, saveToViewPlan, saveViewPatch, scalarText, seedIsSatisfied, shapesOfSource, shareUnavailableReason, signatureFileIn, signatureFileOf, signatureWords, singularNoun, snoozeChoices, specFromBlock, starterPageBlocks, storeDecidesRights, storeKeepsLayout, storePublishesKind, styleFromDecorations, submissionStamp, surfaceChosen, tableName, tableNameProblem, tableOpening, tablePickerEntries, tableRightsAt, unknownRailLine, unknownViewLine, unreadableKeys, useCanShare, useChoiceNudge, useDrill, useDrillAnswers, useDrillDefinition, useEmbedHandshake, useEnrichCells, useGridEditing, useLabelWait, useMeasuredWidth, useMyChecklistSteps, usePickerTables, useRecordActionHost, useRecordLabels, useRecordMoves, useRecordRights, useRecordsUi, useRowColorBy, useRowRights, useSystemTable, useTableRights, useTableToolbarSlot, useViewRecords, useWhoChanged, viewActions, viewDocument, viewFromRow, viewKeysFor, viewNeedFor, viewPatchDocument, viewSettings, viewSettingsFor, viewSettingsPatch, visibilityLaneFor, whatIsMissing, whatIsMissingForEntityReference, whatTheChoiceListIsMissing, whenWords, whyNotAskable, withheldNoticeOf, withheldSentence, withoutAddition, wordsList };