@ai-matrx/records-ui 0.102.16 → 0.102.19

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
@@ -7131,29 +7131,6 @@ type EntityRow = Record<string, unknown> & {
7131
7131
  id: string;
7132
7132
  };
7133
7133
 
7134
- /**
7135
- * THE LOADING FRAME OF EVERY RECORDS SURFACE (lane STABLE-TABLES).
7136
- *
7137
- * Arman, 2026-10-06: "The tables do not properly show a loading state so they are jumpy … They
7138
- * must properly show skeletons and they should not cause shifts … all must have proper loading,
7139
- * empty state, etc." Measured before this file: a table page went route placeholder → a line of
7140
- * text → a 160px grey box → a grid frame with 23px rows and its footer under them → the real grid
7141
- * with 35px rows and its footer 580px lower. Four frames, four geometries.
7142
- *
7143
- * ONE skeleton per surface, chosen by a named option, drawn in the frame the loaded surface uses:
7144
- * · the toolbar row is the page's own toolbar row (`TABLE_TOOLBAR_ROW_CLASS`), at its height;
7145
- * · `grid` is the data table itself in its loading state — the same header, the same row
7146
- * height, the same pinned footer — so its geometry is the loaded grid's by construction;
7147
- * · `kanban`, `gallery`, `list`, `calendar`, `timeline` paint their columns, cards, rows or
7148
- * cells where the loaded layout puts them;
7149
- * · `form` and `record` paint the field stack and the body; `chart` reserves the chart's box.
7150
- *
7151
- * THE COUNT WHEN NOBODY KNOWS IT. A page frame fills to its edge (Airtable's rule: the grid never
7152
- * starts short and grows); an embedded frame paints the rows the table had last time, else five
7153
- * (Notion's inline database paints a short run) — see `rememberedRows.ts`.
7154
- *
7155
- * Hosts never style a placeholder of their own: they render this, with a layout.
7156
- */
7157
7134
  /** Every place a records surface shows while its first read is out. */
7158
7135
  type RecordsSkeletonLayout = "grid" | "kanban" | "gallery" | "list" | "calendar" | "timeline" | "form" | "record" | "chart" | "home";
7159
7136
  declare const RECORDS_SKELETON_LAYOUTS: readonly RecordsSkeletonLayout[];
@@ -7174,6 +7151,8 @@ interface RecordsSkeletonProps {
7174
7151
  embedded?: boolean;
7175
7152
  /** Rows to paint; default — page: to the frame's edge, embedded: five. */
7176
7153
  rows?: number | "fill";
7154
+ /** The table this page is for: a page frame then paints the rows that table showed last visit. */
7155
+ tableId?: string;
7177
7156
  className?: string;
7178
7157
  }
7179
7158
  /** The body of a layout while its first read is out — where the loaded layout's body will be. */
@@ -7183,6 +7162,6 @@ declare function RecordsSkeleton({ layout, embedded, rows, className }: RecordsS
7183
7162
  * at its height (the view, the layout, filter, then the search and the add buttons at the end),
7184
7163
  * and the layout's body skeleton below — the boxes the loaded page fills, nothing else.
7185
7164
  */
7186
- declare function TablePageSkeleton({ layout, embedded, rows, className, }: RecordsSkeletonProps): react.JSX.Element;
7165
+ declare function TablePageSkeleton({ layout, embedded, rows, tableId, className, }: RecordsSkeletonProps): react.JSX.Element;
7187
7166
 
7188
7167
  export { ABSENCE_WORD_LABEL, ABSENCE_WORD_VALUES, ACTION_KINDS, ARCHIVED_NEVER_DESTROYED, ARCHIVE_MEANS, ASK_EXAMPLE, type AbsenceWord, AccentSwatches, type AccentSwatchesProps, ActionInbox, type ActionInboxProps, type ActionKind, type AgentBuildAsk, type AnnounceTableArchived, type AppletPageBlock, ArchiveDeliberatelyDialog, type ArchiveDeliberatelyDialogProps, ArchivedDisclosure, type ArchivedDisclosureProps, ArchivedPortals, type ArchivedPortalsProps, ArchivedView, type ArchivedViewProps, type AskRead, BODY_COLUMN_NAME, BODY_SAVE_PAUSE_MS, 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, type CombinedRows, 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, EntityBoard, type EntityBoardProps, EntityChartBlock, type EntityChartBlockProps, type EntityColumn, EntityDataScope, EntityGrid, type EntityLayout, EntityReferenceKindPicker, type EntityReferenceKindPickerProps, type EntityRow, type EntitySource, type EntityTable, EntityTablePage, type EntityTablePageProps, 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, ImportNotice, type ImportNoticeProps, 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, MOST_NEW_COLUMNS, type MainView, type MoveWritten, MyChecklistSteps, NEEDS_A_SENTENCE, NEW_COLUMN_TYPES, NOT_DRAWN_HERE, NO_AGENT_PORT, NO_CHAT_REASON, NO_COLUMNS_YET, NO_ENRICH_REASON, NO_MEMBERS_REASON, NO_OPEN_RECORDS_REASON, NO_REASK_REASON, NO_RIGHTS, NO_RULES_YET, NO_SAVED_VIEWS_REASON, NO_SHARE_REASON, NO_UPLOAD_REASON, type NewColumn, type NewColumnType, 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, QuestionAnswerView, type QuestionGroup, type QuestionMeasure, type QuestionOp, QuestionPanel, type QuestionPanelProps, type QuestionRow, type QuestionShow, type QuestionSpec, RECORDS_GRID_ROW_PX, RECORDS_SKELETON_LAYOUTS, ROLLUP_AGG_LABEL, ROLLUP_AGG_VALUES, RULE_NOT_HERE_LINE, type ReaskContext, type ReasonGroup, type RecordActionHost, RecordActionMenu, type RecordActionMenuProps, type RecordActionSubject, type RecordActionsInput, RecordBody, 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, RecordsSkeleton, type RecordsSkeletonLayout, type RecordsSkeletonProps, RecordsTableCard, type RecordsTableCardProps, type RecordsUiHost, RecordsUiProvider, ReferenceBuilder, type ReferenceBuilderProps, type ReferenceChoice, RefusalLine, RefusalNotice, type RefusedRow, type RelationFieldType, RelationPicker, type RelationPickerProps, type RenderTextSlot, type ResolveName, type RichTextEditProps, 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, type StandardColumn, StandardRecordForm, type StandardRecordFormProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_NAME_MAX, TABLE_NOT_REACHABLE, TABLE_TOOLBAR_ROW_CLASS, THE_SYSTEM, TIMELINE_ZOOMS, TableActionHost, TableAsk, type TableAskProps, TableDetails, TableDuplicateDialog, type TableDuplicateDialogProps, TableFoundationSwitch, type TableLane, type TableOpening, TablePage, type TablePageActionHost, type TablePageHeaderChrome, type TablePageProps, TablePageSkeleton, type TablePageSource, type TablePickerEntries, type TablePickerEntry, TableReferenceDialog, TableRenameDialog, TableRestoreRefused, type TableRights, TableSettings, type TableSettingsProps, TableShape, TableToolbarSlotContext, TablesHome, type TablesHomeProps, TemplatePreview, type TemplatePreviewProps, type TextPageBlock, type ThroughCondition, type TimelineSettings, TimelineView, type TimelineViewProps, type TimelineZoom, type TitleRepeats, type TrackedVersion, UNREAD_RECORD_LABEL, type UseSystemTableState, VIEW_ADDRESS_KEYS, VIEW_KEYS, VIEW_LAYOUTS, VIEW_NEEDS, VIEW_NOT_SAVED_YET, VISIBILITY_LANES, VISIBILITY_LANE_TITLE, type ViewAddressSort, type ViewAddressState, 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, askExampleFor, askQuestion, askableFields, blockFromSpec, bodyFieldOf, bodyForReading, bodyFromKeys, calendarDayLabel, calendarDayOf, cameFromLine, cardTitleField, cardWords, carriesTimeOfDay, cellState, choiceAddition, choiceAskSentence, choiceListPatch, choiceNudgeOf, choiceRowsFrom, chooseSurface, codeDependsRefusal, colorFromTheValue, columnDeclarationFor, columnForField, columnFromName, columnNamesFrom, columnsFrom, combineFilter, combineRows, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, copyNameFor, currencyCodeFor, customFieldRequestProblems, dashboardDeclareArgs, dashboardFromSummary, dateFormatFor, dateText, dayAt, dayKeyOf, daysBetween, declareView, defaultViewOf, descriptionPatch, designatedLayoutOf, drawnBelowOnPage, drawnSignatureOf, drillDimensionsOf, drillMeasuresOf, drillPathsOf, drillWhere, duplicateProgressWords, editorKindFor, ensureSystemTable, entityCellValue, entityChoiceColumns, entityNameColumn, entityReferenceSpec, entityShownColumns, entityTableColumns, entityTitleColumn, entityValueText, envelopeFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, fieldsForNewColumns, filterTargets, flatWhere, footerOf, formDeclareArgs, formFromSummary, formLookDocument, formLookFromDocument, formLookView, formPresentation, formatForField, freeColumnName, freshFormName, gridContextKey, gridContextSnapshot, groupInbox, groupLabel, groupReasons, groupableFields, handOrderLine, handOrderSortState, hasTimePart, hintForAPerson, hintIsMachineIdentity, idsOf, isChoiceAddition, isDateField, isEngineerText, isFoundationTable, isId, isKeptTable, isMachineIdentity, isPage, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, isValueSet, isViewAddressEmpty, 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, questionFromWords, questionSave, questionsOf, railFromParam, readLooks, recordActions, recordLink, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, refusedFileName, refusedRowsCsv, renderValue, rescheduledValue, resolveTableStyle, revokeConsequence, rowLabelChoices, rowName, rowNameIn, runToNotice, sameRecordLikely, sameViewAddress, saveToViewPlan, saveViewPatch, scalarText, seedIsSatisfied, shapesOfSource, shareUnavailableReason, signatureFileIn, signatureFileOf, signatureWords, singularNoun, skeletonLayoutFor, snoozeChoices, specFromBlock, standardTokenOf, starterPageBlocks, storeDecidesRights, storeKeepsLayout, storePublishesKind, styleFromDecorations, submissionStamp, surfaceChosen, tableName, tableNameProblem, tableOpening, tablePickerEntries, tableReferenceChoices, tableRightsAt, titleRepeats, unknownRailLine, unknownViewLine, unreadableKeys, useCanShare, useChoiceNudge, useDrill, useDrillAnswers, useDrillDefinition, useEmbedHandshake, useEnrichCells, useEntityTable, useGridEditing, useLabelWait, useMeasuredWidth, useMyChecklistSteps, usePickerTables, useRecordActionHost, useRecordLabels, useRecordMoves, useRecordRights, useRecordsUi, useRowColorBy, useRowRights, useSystemTable, useTableRights, useTableToolbarSlot, useTemplatePreview, useViewRecords, useWhoChanged, viewActions, viewAddressFromParams, viewAddressToParams, viewDocument, viewFromRow, viewKeysFor, viewNeedFor, viewPatchDocument, viewSettings, viewSettingsFor, viewSettingsPatch, visibilityLaneFor, whatIsMissing, whatIsMissingForEntityReference, whatTheChoiceListIsMissing, whenWords, whyNotAskable, withheldNoticeOf, withheldSentence, withoutAddition, wordsList };
package/dist/index.d.ts CHANGED
@@ -7131,29 +7131,6 @@ type EntityRow = Record<string, unknown> & {
7131
7131
  id: string;
7132
7132
  };
7133
7133
 
7134
- /**
7135
- * THE LOADING FRAME OF EVERY RECORDS SURFACE (lane STABLE-TABLES).
7136
- *
7137
- * Arman, 2026-10-06: "The tables do not properly show a loading state so they are jumpy … They
7138
- * must properly show skeletons and they should not cause shifts … all must have proper loading,
7139
- * empty state, etc." Measured before this file: a table page went route placeholder → a line of
7140
- * text → a 160px grey box → a grid frame with 23px rows and its footer under them → the real grid
7141
- * with 35px rows and its footer 580px lower. Four frames, four geometries.
7142
- *
7143
- * ONE skeleton per surface, chosen by a named option, drawn in the frame the loaded surface uses:
7144
- * · the toolbar row is the page's own toolbar row (`TABLE_TOOLBAR_ROW_CLASS`), at its height;
7145
- * · `grid` is the data table itself in its loading state — the same header, the same row
7146
- * height, the same pinned footer — so its geometry is the loaded grid's by construction;
7147
- * · `kanban`, `gallery`, `list`, `calendar`, `timeline` paint their columns, cards, rows or
7148
- * cells where the loaded layout puts them;
7149
- * · `form` and `record` paint the field stack and the body; `chart` reserves the chart's box.
7150
- *
7151
- * THE COUNT WHEN NOBODY KNOWS IT. A page frame fills to its edge (Airtable's rule: the grid never
7152
- * starts short and grows); an embedded frame paints the rows the table had last time, else five
7153
- * (Notion's inline database paints a short run) — see `rememberedRows.ts`.
7154
- *
7155
- * Hosts never style a placeholder of their own: they render this, with a layout.
7156
- */
7157
7134
  /** Every place a records surface shows while its first read is out. */
7158
7135
  type RecordsSkeletonLayout = "grid" | "kanban" | "gallery" | "list" | "calendar" | "timeline" | "form" | "record" | "chart" | "home";
7159
7136
  declare const RECORDS_SKELETON_LAYOUTS: readonly RecordsSkeletonLayout[];
@@ -7174,6 +7151,8 @@ interface RecordsSkeletonProps {
7174
7151
  embedded?: boolean;
7175
7152
  /** Rows to paint; default — page: to the frame's edge, embedded: five. */
7176
7153
  rows?: number | "fill";
7154
+ /** The table this page is for: a page frame then paints the rows that table showed last visit. */
7155
+ tableId?: string;
7177
7156
  className?: string;
7178
7157
  }
7179
7158
  /** The body of a layout while its first read is out — where the loaded layout's body will be. */
@@ -7183,6 +7162,6 @@ declare function RecordsSkeleton({ layout, embedded, rows, className }: RecordsS
7183
7162
  * at its height (the view, the layout, filter, then the search and the add buttons at the end),
7184
7163
  * and the layout's body skeleton below — the boxes the loaded page fills, nothing else.
7185
7164
  */
7186
- declare function TablePageSkeleton({ layout, embedded, rows, className, }: RecordsSkeletonProps): react.JSX.Element;
7165
+ declare function TablePageSkeleton({ layout, embedded, rows, tableId, className, }: RecordsSkeletonProps): react.JSX.Element;
7187
7166
 
7188
7167
  export { ABSENCE_WORD_LABEL, ABSENCE_WORD_VALUES, ACTION_KINDS, ARCHIVED_NEVER_DESTROYED, ARCHIVE_MEANS, ASK_EXAMPLE, type AbsenceWord, AccentSwatches, type AccentSwatchesProps, ActionInbox, type ActionInboxProps, type ActionKind, type AgentBuildAsk, type AnnounceTableArchived, type AppletPageBlock, ArchiveDeliberatelyDialog, type ArchiveDeliberatelyDialogProps, ArchivedDisclosure, type ArchivedDisclosureProps, ArchivedPortals, type ArchivedPortalsProps, ArchivedView, type ArchivedViewProps, type AskRead, BODY_COLUMN_NAME, BODY_SAVE_PAUSE_MS, 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, type CombinedRows, 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, EntityBoard, type EntityBoardProps, EntityChartBlock, type EntityChartBlockProps, type EntityColumn, EntityDataScope, EntityGrid, type EntityLayout, EntityReferenceKindPicker, type EntityReferenceKindPickerProps, type EntityRow, type EntitySource, type EntityTable, EntityTablePage, type EntityTablePageProps, 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, ImportNotice, type ImportNoticeProps, 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, MOST_NEW_COLUMNS, type MainView, type MoveWritten, MyChecklistSteps, NEEDS_A_SENTENCE, NEW_COLUMN_TYPES, NOT_DRAWN_HERE, NO_AGENT_PORT, NO_CHAT_REASON, NO_COLUMNS_YET, NO_ENRICH_REASON, NO_MEMBERS_REASON, NO_OPEN_RECORDS_REASON, NO_REASK_REASON, NO_RIGHTS, NO_RULES_YET, NO_SAVED_VIEWS_REASON, NO_SHARE_REASON, NO_UPLOAD_REASON, type NewColumn, type NewColumnType, 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, QuestionAnswerView, type QuestionGroup, type QuestionMeasure, type QuestionOp, QuestionPanel, type QuestionPanelProps, type QuestionRow, type QuestionShow, type QuestionSpec, RECORDS_GRID_ROW_PX, RECORDS_SKELETON_LAYOUTS, ROLLUP_AGG_LABEL, ROLLUP_AGG_VALUES, RULE_NOT_HERE_LINE, type ReaskContext, type ReasonGroup, type RecordActionHost, RecordActionMenu, type RecordActionMenuProps, type RecordActionSubject, type RecordActionsInput, RecordBody, 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, RecordsSkeleton, type RecordsSkeletonLayout, type RecordsSkeletonProps, RecordsTableCard, type RecordsTableCardProps, type RecordsUiHost, RecordsUiProvider, ReferenceBuilder, type ReferenceBuilderProps, type ReferenceChoice, RefusalLine, RefusalNotice, type RefusedRow, type RelationFieldType, RelationPicker, type RelationPickerProps, type RenderTextSlot, type ResolveName, type RichTextEditProps, 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, type StandardColumn, StandardRecordForm, type StandardRecordFormProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_NAME_MAX, TABLE_NOT_REACHABLE, TABLE_TOOLBAR_ROW_CLASS, THE_SYSTEM, TIMELINE_ZOOMS, TableActionHost, TableAsk, type TableAskProps, TableDetails, TableDuplicateDialog, type TableDuplicateDialogProps, TableFoundationSwitch, type TableLane, type TableOpening, TablePage, type TablePageActionHost, type TablePageHeaderChrome, type TablePageProps, TablePageSkeleton, type TablePageSource, type TablePickerEntries, type TablePickerEntry, TableReferenceDialog, TableRenameDialog, TableRestoreRefused, type TableRights, TableSettings, type TableSettingsProps, TableShape, TableToolbarSlotContext, TablesHome, type TablesHomeProps, TemplatePreview, type TemplatePreviewProps, type TextPageBlock, type ThroughCondition, type TimelineSettings, TimelineView, type TimelineViewProps, type TimelineZoom, type TitleRepeats, type TrackedVersion, UNREAD_RECORD_LABEL, type UseSystemTableState, VIEW_ADDRESS_KEYS, VIEW_KEYS, VIEW_LAYOUTS, VIEW_NEEDS, VIEW_NOT_SAVED_YET, VISIBILITY_LANES, VISIBILITY_LANE_TITLE, type ViewAddressSort, type ViewAddressState, 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, askExampleFor, askQuestion, askableFields, blockFromSpec, bodyFieldOf, bodyForReading, bodyFromKeys, calendarDayLabel, calendarDayOf, cameFromLine, cardTitleField, cardWords, carriesTimeOfDay, cellState, choiceAddition, choiceAskSentence, choiceListPatch, choiceNudgeOf, choiceRowsFrom, chooseSurface, codeDependsRefusal, colorFromTheValue, columnDeclarationFor, columnForField, columnFromName, columnNamesFrom, columnsFrom, combineFilter, combineRows, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, copyNameFor, currencyCodeFor, customFieldRequestProblems, dashboardDeclareArgs, dashboardFromSummary, dateFormatFor, dateText, dayAt, dayKeyOf, daysBetween, declareView, defaultViewOf, descriptionPatch, designatedLayoutOf, drawnBelowOnPage, drawnSignatureOf, drillDimensionsOf, drillMeasuresOf, drillPathsOf, drillWhere, duplicateProgressWords, editorKindFor, ensureSystemTable, entityCellValue, entityChoiceColumns, entityNameColumn, entityReferenceSpec, entityShownColumns, entityTableColumns, entityTitleColumn, entityValueText, envelopeFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, fieldsForNewColumns, filterTargets, flatWhere, footerOf, formDeclareArgs, formFromSummary, formLookDocument, formLookFromDocument, formLookView, formPresentation, formatForField, freeColumnName, freshFormName, gridContextKey, gridContextSnapshot, groupInbox, groupLabel, groupReasons, groupableFields, handOrderLine, handOrderSortState, hasTimePart, hintForAPerson, hintIsMachineIdentity, idsOf, isChoiceAddition, isDateField, isEngineerText, isFoundationTable, isId, isKeptTable, isMachineIdentity, isPage, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, isValueSet, isViewAddressEmpty, 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, questionFromWords, questionSave, questionsOf, railFromParam, readLooks, recordActions, recordLink, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, refusedFileName, refusedRowsCsv, renderValue, rescheduledValue, resolveTableStyle, revokeConsequence, rowLabelChoices, rowName, rowNameIn, runToNotice, sameRecordLikely, sameViewAddress, saveToViewPlan, saveViewPatch, scalarText, seedIsSatisfied, shapesOfSource, shareUnavailableReason, signatureFileIn, signatureFileOf, signatureWords, singularNoun, skeletonLayoutFor, snoozeChoices, specFromBlock, standardTokenOf, starterPageBlocks, storeDecidesRights, storeKeepsLayout, storePublishesKind, styleFromDecorations, submissionStamp, surfaceChosen, tableName, tableNameProblem, tableOpening, tablePickerEntries, tableReferenceChoices, tableRightsAt, titleRepeats, unknownRailLine, unknownViewLine, unreadableKeys, useCanShare, useChoiceNudge, useDrill, useDrillAnswers, useDrillDefinition, useEmbedHandshake, useEnrichCells, useEntityTable, useGridEditing, useLabelWait, useMeasuredWidth, useMyChecklistSteps, usePickerTables, useRecordActionHost, useRecordLabels, useRecordMoves, useRecordRights, useRecordsUi, useRowColorBy, useRowRights, useSystemTable, useTableRights, useTableToolbarSlot, useTemplatePreview, useViewRecords, useWhoChanged, viewActions, viewAddressFromParams, viewAddressToParams, viewDocument, viewFromRow, viewKeysFor, viewNeedFor, viewPatchDocument, viewSettings, viewSettingsFor, viewSettingsPatch, visibilityLaneFor, whatIsMissing, whatIsMissingForEntityReference, whatTheChoiceListIsMissing, whenWords, whyNotAskable, withheldNoticeOf, withheldSentence, withoutAddition, wordsList };
package/dist/index.js CHANGED
@@ -2116,7 +2116,7 @@ function fieldOptionsOnce(client, fieldId) {
2116
2116
  }
2117
2117
 
2118
2118
  // src/editors.tsx
2119
- import { useCallback as useCallback6, useEffect as useEffect11, useRef as useRef11, useState as useState16 } from "react";
2119
+ import { useCallback as useCallback6, useEffect as useEffect11, useLayoutEffect, useRef as useRef11, useState as useState16 } from "react";
2120
2120
  import { allowsOtherValues, choiceValuesOf, coerceTypedAnswer, newerKindOf as newerKindOf4, decideTypedChoice, isTheChosen, optionKey as optionKey2, rankTypedMatches as rankTypedMatches3, readTypedTime as readTypedTime2, typedDateText as typedDateText2, typedTimeText as typedTimeText2 } from "@ai-matrx/records";
2121
2121
  import { useOptionalRecordsClient as useOptionalRecordsClient7 } from "@ai-matrx/records/react";
2122
2122
  import {
@@ -4109,7 +4109,13 @@ function ClockGlyph() {
4109
4109
  /* @__PURE__ */ jsx18("path", { d: "M12 6v6l4 2" })
4110
4110
  ] });
4111
4111
  }
4112
- function TypedDateHelper({ kind, text, onText, label }) {
4112
+ function TypedDateHelper({
4113
+ kind,
4114
+ text,
4115
+ onText,
4116
+ label,
4117
+ onPicked
4118
+ }) {
4113
4119
  const [open, setOpen] = useState14(false);
4114
4120
  const held = readBox(text, kind);
4115
4121
  const today = /* @__PURE__ */ new Date();
@@ -4124,12 +4130,16 @@ function TypedDateHelper({ kind, text, onText, label }) {
4124
4130
  const pickDay = (d) => {
4125
4131
  const day = `${shown4.y}-${pad2(shown4.m + 1)}-${pad2(d)}`;
4126
4132
  onText(wordsFor(kind, day, held.time));
4127
- if (kind === "date") setOpen(false);
4133
+ if (kind === "date") {
4134
+ setOpen(false);
4135
+ onPicked?.();
4136
+ }
4128
4137
  };
4129
4138
  const pickTime = (t) => {
4130
4139
  const day = kind === "datetime" ? held.day ?? todayKey : null;
4131
4140
  onText(wordsFor(kind, day, t));
4132
4141
  setOpen(false);
4142
+ onPicked?.();
4133
4143
  };
4134
4144
  const turn = (by) => {
4135
4145
  const at = new Date(shown4.y, shown4.m + by, 1);
@@ -4418,6 +4428,17 @@ function draftFromTyping(field2, seed) {
4418
4428
  if (opens === "words") return seed;
4419
4429
  return { typedDraft: true, text: seed, judged: judgeTyped(field2, seed) };
4420
4430
  }
4431
+ function ReadsAsNote({ typed: typed2, always, children }) {
4432
+ const note = useRef11(null);
4433
+ const [repeats, setRepeats] = useState16(false);
4434
+ useLayoutEffect(() => {
4435
+ if (always) return;
4436
+ const words2 = (t) => (t ?? "").replace(/^Reads as/, "").replace(/\s+/g, "").toLowerCase();
4437
+ setRepeats(words2(note.current?.textContent) === words2(typed2));
4438
+ }, [typed2, always]);
4439
+ if (repeats) return null;
4440
+ return /* @__PURE__ */ jsx19("span", { ref: note, "data-records-typed-reads-as": "", "data-records-cell-note": "", className: "text-[10px] text-muted-foreground", children });
4441
+ }
4421
4442
  function TypedTextControl({ field: field2, value, onChange, disabled, id, onCommit, onCancel }) {
4422
4443
  const client = useOptionalRecordsClient7();
4423
4444
  const kind = String(editorKindFor(field2));
@@ -4461,7 +4482,7 @@ function TypedTextControl({ field: field2, value, onChange, disabled, id, onComm
4461
4482
  return /* @__PURE__ */ jsxs17("span", { className: "flex flex-col gap-0.5", children: [
4462
4483
  helper && !disabled ? /* @__PURE__ */ jsxs17("span", { className: "flex min-w-0 items-center gap-0.5", children: [
4463
4484
  box,
4464
- /* @__PURE__ */ jsx19(TypedDateHelper, { kind: helper, text: value.text, onText: retype, label: fieldName(field2) })
4485
+ /* @__PURE__ */ jsx19(TypedDateHelper, { kind: helper, text: value.text, onText: retype, label: fieldName(field2), onPicked: onCommit })
4465
4486
  ] }) : box,
4466
4487
  judged === null ? /* @__PURE__ */ jsxs17("span", { "data-records-cell-note": "", className: "text-[10px] text-muted-foreground", children: [
4467
4488
  "Reading ",
@@ -4495,7 +4516,7 @@ function TypedTextControl({ field: field2, value, onChange, disabled, id, onComm
4495
4516
  }
4496
4517
  ),
4497
4518
  judged.cancelOnly && onCancel ? /* @__PURE__ */ jsx19("span", { "data-records-choice-ask": "", children: /* @__PURE__ */ jsx19(Button8, { type: "button", size: "sm", variant: "ghost", className: "h-6 px-2 text-xs", onClick: () => onCancel(), children: "Cancel" }) }) : null
4498
- ] }) : judged.value === null || judged.value === void 0 ? null : /* @__PURE__ */ jsxs17("span", { "data-records-typed-reads-as": "", "data-records-cell-note": "", className: "text-[10px] text-muted-foreground", children: [
4519
+ ] }) : judged.value === null || judged.value === void 0 ? null : /* @__PURE__ */ jsxs17(ReadsAsNote, { typed: value.text, always: isChoiceAddition(judged.value), children: [
4499
4520
  isChoiceAddition(judged.value) ? `Adds ${quoted(judged.value.add)} to the choices for ${fieldName(field2)}. ` : null,
4500
4521
  "Reads as",
4501
4522
  " ",
@@ -4508,7 +4529,7 @@ function TypedTextControl({ field: field2, value, onChange, disabled, id, onComm
4508
4529
  const shown4 = format ?? (kind === "datetime" ? { id: carriesTimeOfDay(field2, judged.value) ? "datetime" : "date" } : void 0);
4509
4530
  return shown4 ? /* @__PURE__ */ jsx19(FormattedValue, { value: judged.value, format: shown4 }) : String(judged.value);
4510
4531
  })()
4511
- ] })
4532
+ ] }, value.text)
4512
4533
  ] });
4513
4534
  }
4514
4535
  function isPersonsName(field2) {
@@ -5750,7 +5771,7 @@ function KindValueCell({
5750
5771
  }
5751
5772
 
5752
5773
  // src/ClampedChips.tsx
5753
- import { useCallback as useCallback8, useLayoutEffect, useRef as useRef13, useState as useState19 } from "react";
5774
+ import { useCallback as useCallback8, useLayoutEffect as useLayoutEffect2, useRef as useRef13, useState as useState19 } from "react";
5754
5775
  import { Popover as Popover4, PopoverContent as PopoverContent4, PopoverTrigger as PopoverTrigger4, cn as cn17 } from "@ai-matrx/design-system";
5755
5776
  import { jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
5756
5777
  var GAP = 4;
@@ -5791,13 +5812,13 @@ function ClampedChips({
5791
5812
  setMeasuring(false);
5792
5813
  }, [stands]);
5793
5814
  const key = items.map((i) => i.key).join("|");
5794
- useLayoutEffect(() => {
5815
+ useLayoutEffect2(() => {
5795
5816
  setMeasuring(true);
5796
5817
  }, [key, total]);
5797
- useLayoutEffect(() => {
5818
+ useLayoutEffect2(() => {
5798
5819
  if (measuring) measure();
5799
5820
  }, [measuring, measure]);
5800
- useLayoutEffect(() => {
5821
+ useLayoutEffect2(() => {
5801
5822
  const el = box.current;
5802
5823
  if (!el || typeof ResizeObserver === "undefined") return;
5803
5824
  let last = el.clientWidth;
@@ -7225,18 +7246,23 @@ function GridCell({
7225
7246
  const editable = Boolean(editing) && canWrite && fieldIsEditable(field2);
7226
7247
  if (open && editing) {
7227
7248
  return /* @__PURE__ */ jsxs23("span", { "data-records-open-cell": "", className: "relative block w-full min-w-0", children: [
7228
- /* @__PURE__ */ jsx28("span", { "aria-hidden": "true", "data-records-cell-ghost": "", className: "pointer-events-none invisible block select-none truncate px-1 py-0.5", children: /* @__PURE__ */ jsx28(
7229
- RecordValue,
7230
- {
7231
- inCell: true,
7232
- field: field2,
7233
- value: row.document?.[field2.key],
7234
- document: row.document,
7235
- recordId: row.id,
7236
- withheld: withheldNoticeOf(row.hidden, field2.key),
7237
- ...format ? { format } : {}
7238
- }
7239
- ) }),
7249
+ /* @__PURE__ */ jsxs23("span", { "aria-hidden": "true", inert: true, "data-records-cell-ghost": "", className: "pointer-events-none invisible flex w-full min-w-0 select-none items-center gap-1", children: [
7250
+ /* @__PURE__ */ jsx28("span", { className: "block min-w-0 flex-1 truncate px-1 py-0.5", children: /* @__PURE__ */ jsx28(
7251
+ RecordValue,
7252
+ {
7253
+ inCell: true,
7254
+ field: field2,
7255
+ value: row.document?.[field2.key],
7256
+ document: row.document,
7257
+ recordId: row.id,
7258
+ withheld: withheldNoticeOf(row.hidden, field2.key),
7259
+ ...format ? { format } : {}
7260
+ }
7261
+ ) }),
7262
+ onAskWhoChanged ? /* @__PURE__ */ jsx28(WhoBadge, { field: field2, row, onAskWhoChanged: () => {
7263
+ }, onPressedTwice: () => {
7264
+ } }) : null
7265
+ ] }),
7240
7266
  /* @__PURE__ */ jsx28(
7241
7267
  OpenCell,
7242
7268
  {
@@ -7267,7 +7293,7 @@ function GridCell({
7267
7293
  }
7268
7294
  if (editorKindFor(field2) === "checkbox") {
7269
7295
  const answered = value === true || value === false;
7270
- return /* @__PURE__ */ jsxs23("span", { "data-matrx-cell-control": "", className: "flex w-full flex-wrap items-center gap-1.5", children: [
7296
+ return /* @__PURE__ */ jsxs23("span", { "data-matrx-cell-control": "", className: "relative flex w-full flex-wrap items-center gap-1.5", children: [
7271
7297
  /* @__PURE__ */ jsx28(
7272
7298
  Checkbox4,
7273
7299
  {
@@ -7284,9 +7310,9 @@ function GridCell({
7284
7310
  ] });
7285
7311
  }
7286
7312
  if (editable && format?.id === "rating") {
7287
- return /* @__PURE__ */ jsxs23("span", { "data-matrx-cell-control": "", className: "flex w-full flex-wrap items-center gap-1.5", children: [
7313
+ return /* @__PURE__ */ jsxs23("span", { "data-matrx-cell-control": "", className: "relative flex w-full flex-wrap items-center gap-1.5", children: [
7288
7314
  /* @__PURE__ */ jsx28(FormattedValue, { value, format, onRate: (next) => editing?.setCell(row.id, field2.key, next), selectFirst: true }),
7289
- state === "saving" ? /* @__PURE__ */ jsx28("span", { className: "text-[10px] text-muted-foreground", children: "Saving\u2026" }) : null,
7315
+ state === "saving" ? /* @__PURE__ */ jsx28("span", { "data-records-cell-saving": "", className: "pointer-events-none absolute right-1 top-1/2 z-10 -translate-y-1/2 rounded bg-card/90 px-1 text-[10px] text-muted-foreground", children: "Saving\u2026" }) : null,
7290
7316
  refusal4 ? /* @__PURE__ */ jsx28(CellRefusalNotice, { refusal: refusal4, field: field2, row, editing, typed: false }) : null
7291
7317
  ] });
7292
7318
  }
@@ -7399,7 +7425,7 @@ function GridCell({
7399
7425
  }
7400
7426
  ) : null
7401
7427
  ] }),
7402
- state === "saving" ? /* @__PURE__ */ jsx28("span", { className: "px-1 text-[10px] text-muted-foreground", children: "Saving\u2026" }) : null,
7428
+ state === "saving" ? /* @__PURE__ */ jsx28("span", { "data-records-cell-saving": "", className: "pointer-events-none absolute right-1 top-1/2 z-10 -translate-y-1/2 rounded bg-card/90 px-1 text-[10px] text-muted-foreground", children: "Saving\u2026" }) : null,
7403
7429
  refusal4 ? /* @__PURE__ */ jsx28(CellRefusalNotice, { refusal: refusal4, field: field2, row, editing, typed: true }) : null
7404
7430
  ]
7405
7431
  }
@@ -7447,8 +7473,9 @@ function CellRefusalNotice({
7447
7473
  type: "button",
7448
7474
  "data-records-cell-refusal-line": "",
7449
7475
  title: line,
7450
- className: "block max-w-full truncate text-left text-[11px] text-destructive underline decoration-dotted underline-offset-2",
7451
- children: line
7476
+ "aria-label": line,
7477
+ className: "absolute right-1 top-1/2 z-10 flex h-4 w-4 -translate-y-1/2 items-center justify-center rounded-full bg-destructive text-[10px] font-bold leading-none text-destructive-foreground",
7478
+ children: "!"
7452
7479
  }
7453
7480
  ) }),
7454
7481
  /* @__PURE__ */ jsx28(
@@ -7483,12 +7510,12 @@ function WhoBadge({
7483
7510
  {
7484
7511
  type: "button",
7485
7512
  "data-records-who-badge": "",
7486
- "data-who-text": who.badge ?? "who?",
7513
+ "data-who-text": who.badge ?? "",
7487
7514
  "aria-hidden": "true",
7488
7515
  tabIndex: -1,
7489
7516
  "aria-label": `Who changed ${fieldName(field2)}?`,
7490
7517
  title: who.sentence ?? `Who changed ${fieldName(field2)}? (Option-Shift-H)`,
7491
- className: "hidden max-w-[9rem] shrink-0 select-none truncate rounded px-1 text-[10px] leading-4 text-muted-foreground before:content-[attr(data-who-text)] hover:bg-muted in-data-[matrx-cell-active=true]:inline-flex",
7518
+ className: "hidden max-w-[9rem] shrink-0 select-none items-center truncate rounded px-1 text-[10px] leading-4 text-muted-foreground before:content-[attr(data-who-text)] hover:bg-muted in-data-[matrx-cell-active=true]:inline-flex",
7492
7519
  onMouseEnter: ask,
7493
7520
  onClick: (event) => {
7494
7521
  event.preventDefault();
@@ -7500,7 +7527,11 @@ function WhoBadge({
7500
7527
  event.preventDefault();
7501
7528
  event.stopPropagation();
7502
7529
  onPressedTwice();
7503
- }
7530
+ },
7531
+ children: who.badge ? null : /* @__PURE__ */ jsxs23("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", width: "12", height: "12", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "data-records-who-glyph": "", children: [
7532
+ /* @__PURE__ */ jsx28("circle", { cx: "12", cy: "12", r: "9" }),
7533
+ /* @__PURE__ */ jsx28("path", { d: "M12 7v5l3 2" })
7534
+ ] })
7504
7535
  }
7505
7536
  )
7506
7537
  );
@@ -7675,7 +7706,7 @@ function OpenCell({
7675
7706
  }
7676
7707
  ),
7677
7708
  /* @__PURE__ */ jsxs23("span", { "data-records-cell-tray": "", className: FLOATING_CELL_TRAY_CLASS, children: [
7678
- picker || asksAboutAChoice(draft) ? null : blurCommits ? /* @__PURE__ */ jsx28("span", { className: cn19("pointer-events-none text-[10px] text-muted-foreground", FLOATING_CELL_TRAY_PIECE_CLASS), "data-records-editor-hint": "", children: multiline ? "\u23CE saves \xB7 \u21E7\u23CE new line \xB7 Esc cancels \xB7 Tab next" : "\u23CE saves \xB7 Esc cancels \xB7 Tab next" }) : /* @__PURE__ */ jsxs23("span", { className: cn19("flex items-center gap-1", FLOATING_CELL_TRAY_PIECE_CLASS), children: [
7709
+ picker || asksAboutAChoice(draft) ? null : blurCommits ? null : /* @__PURE__ */ jsxs23("span", { className: cn19("flex items-center gap-1", FLOATING_CELL_TRAY_PIECE_CLASS), children: [
7679
7710
  /* @__PURE__ */ jsx28(Button10, { size: "sm", onClick: () => once(() => onCommit(null, "pick")), children: "Save" }),
7680
7711
  /* @__PURE__ */ jsx28(Button10, { size: "sm", variant: "ghost", onClick: () => once(() => onCancel("pick")), children: "Cancel" })
7681
7712
  ] }),
@@ -7710,9 +7741,19 @@ function rememberRowCount(key, count) {
7710
7741
  }
7711
7742
 
7712
7743
  // src/RecordsSkeleton.tsx
7744
+ import { useSyncExternalStore } from "react";
7713
7745
  import { cn as cn20, Skeleton as Skeleton2 } from "@ai-matrx/design-system";
7714
7746
  import { MatrxDataTable } from "@ai-matrx/design-system/data-table";
7715
7747
  import { Fragment as Fragment8, jsx as jsx29, jsxs as jsxs24 } from "react/jsx-runtime";
7748
+ var NEVER = () => () => {
7749
+ };
7750
+ function useRememberedPageRows(tableId) {
7751
+ return useSyncExternalStore(
7752
+ NEVER,
7753
+ () => tableId ? rememberedRowCount(`${tableId}:page:last`, 100, "fill") : "fill",
7754
+ () => "fill"
7755
+ );
7756
+ }
7716
7757
  var RECORDS_SKELETON_LAYOUTS = [
7717
7758
  "grid",
7718
7759
  "kanban",
@@ -7850,8 +7891,11 @@ function TablePageSkeleton({
7850
7891
  layout = "grid",
7851
7892
  embedded = false,
7852
7893
  rows,
7894
+ tableId,
7853
7895
  className
7854
7896
  }) {
7897
+ const remembered = useRememberedPageRows(embedded ? void 0 : tableId);
7898
+ const painted = rows ?? (remembered === "fill" ? void 0 : remembered);
7855
7899
  return /* @__PURE__ */ jsx29("div", { className: cn20(TABLE_PAGE_FRAME_CLASS, className), "data-records-skeleton-page": layout, children: /* @__PURE__ */ jsxs24("div", { className: TABLE_PAGE_COLUMN_CLASS, children: [
7856
7900
  /* @__PURE__ */ jsxs24("div", { className: TABLE_TOOLBAR_ROW_CLASS, "data-table-toolbar": "", "data-records-skeleton-part": "toolbar", "aria-hidden": "true", children: [
7857
7901
  /* @__PURE__ */ jsx29(Skeleton2, { shape: "control", width: "sm", className: "w-28" }),
@@ -7862,7 +7906,7 @@ function TablePageSkeleton({
7862
7906
  /* @__PURE__ */ jsx29(Skeleton2, { shape: "control", className: "w-24" })
7863
7907
  ] })
7864
7908
  ] }),
7865
- /* @__PURE__ */ jsx29("div", { className: "flex min-h-0 flex-1 flex-col gap-2", "data-table-records": "", children: /* @__PURE__ */ jsx29(RecordsSkeleton, { layout, embedded, ...rows !== void 0 ? { rows } : {} }) })
7909
+ /* @__PURE__ */ jsx29("div", { className: "flex min-h-0 flex-1 flex-col gap-2", "data-table-records": "", children: /* @__PURE__ */ jsx29(RecordsSkeleton, { layout, embedded, ...painted !== void 0 ? { rows: painted } : {} }) })
7866
7910
  ] }) });
7867
7911
  }
7868
7912
 
@@ -16318,7 +16362,7 @@ function useEnrichCells(tableId, recordIds) {
16318
16362
  }, [refresh]);
16319
16363
  return { cells, refresh, error };
16320
16364
  }
16321
- var NEVER = "Fill it in once and leave it alone";
16365
+ var NEVER2 = "Fill it in once and leave it alone";
16322
16366
  function EnrichPanel({ tableId, fieldId, className }) {
16323
16367
  const client = useRecordsClient30();
16324
16368
  const host = useRecordsUi();
@@ -16441,7 +16485,7 @@ function EnrichPanel({ tableId, fieldId, className }) {
16441
16485
  {
16442
16486
  id: "new-every",
16443
16487
  value: setup.every,
16444
- placeholder: NEVER,
16488
+ placeholder: NEVER2,
16445
16489
  onChange: (e) => setDraft((prev) => ({ ...prev, [fieldId]: { ...setup, every: e.target.value } }))
16446
16490
  }
16447
16491
  )
@@ -16536,14 +16580,14 @@ function EnrichPanel({ tableId, fieldId, className }) {
16536
16580
  id: `every-${row.field_id}`,
16537
16581
  value: d.every,
16538
16582
  disabled: !rights.admin,
16539
- placeholder: NEVER,
16583
+ placeholder: NEVER2,
16540
16584
  onChange: (e) => setDraft((prev) => ({
16541
16585
  ...prev,
16542
16586
  [row.field_id]: { ...d, every: e.target.value }
16543
16587
  }))
16544
16588
  }
16545
16589
  ),
16546
- /* @__PURE__ */ jsx57("p", { className: "text-[11px] text-muted-foreground", children: d.every ? `${d.every} days` : NEVER })
16590
+ /* @__PURE__ */ jsx57("p", { className: "text-[11px] text-muted-foreground", children: d.every ? `${d.every} days` : NEVER2 })
16547
16591
  ] })
16548
16592
  ] }),
16549
16593
  /* @__PURE__ */ jsxs52("p", { className: "text-xs text-muted-foreground", children: [
@@ -16889,7 +16933,7 @@ function withTypeMark(field2, header) {
16889
16933
  }
16890
16934
 
16891
16935
  // src/ReverseColumns.tsx
16892
- import { useCallback as useCallback21, useEffect as useEffect40, useMemo as useMemo27, useRef as useRef26, useState as useState49, useSyncExternalStore } from "react";
16936
+ import { useCallback as useCallback21, useEffect as useEffect40, useMemo as useMemo27, useRef as useRef26, useState as useState49, useSyncExternalStore as useSyncExternalStore2 } from "react";
16893
16937
  import { useFields as useFields6, useReverseColumns as useReverseColumns3, useReverseLinks, useTable as useTable4 } from "@ai-matrx/records/react";
16894
16938
  import { Button as Button34, Dialog as Dialog10, DialogContent as DialogContent10, DialogHeader as DialogHeader10, DialogTitle as DialogTitle10, Separator as Separator4, Skeleton as Skeleton5, cn as cn33 } from "@ai-matrx/design-system";
16895
16939
  import { Fragment as Fragment17, jsx as jsx59, jsxs as jsxs54 } from "react/jsx-runtime";
@@ -17009,8 +17053,8 @@ function ReverseCell({ held, column, rowId, tableId }) {
17009
17053
  },
17010
17054
  [held]
17011
17055
  );
17012
- const answer = useSyncExternalStore(subscribe, () => held.answers?.[column.key]?.[rowId]);
17013
- const reading = useSyncExternalStore(subscribe, () => held.reading);
17056
+ const answer = useSyncExternalStore2(subscribe, () => held.answers?.[column.key]?.[rowId]);
17057
+ const reading = useSyncExternalStore2(subscribe, () => held.reading);
17014
17058
  return /* @__PURE__ */ jsx59(ReverseLinkChips, { column, answer, loading: reading, clamp: { tableId, recordId: rowId } });
17015
17059
  }
17016
17060
  var EMPTY_COLUMNS = [];
@@ -19976,7 +20020,7 @@ function useGroupLabel(fields, groupKey) {
19976
20020
  }
19977
20021
 
19978
20022
  // src/gridUndo.tsx
19979
- import { useCallback as useCallback23, useEffect as useEffect44, useLayoutEffect as useLayoutEffect2, useMemo as useMemo31, useRef as useRef28, useState as useState54, useSyncExternalStore as useSyncExternalStore2 } from "react";
20023
+ import { useCallback as useCallback23, useEffect as useEffect44, useLayoutEffect as useLayoutEffect3, useMemo as useMemo31, useRef as useRef28, useState as useState54, useSyncExternalStore as useSyncExternalStore3 } from "react";
19980
20024
  import { tableShapeChanged as tableShapeChanged5, useRecordsClient as useRecordsClient34 } from "@ai-matrx/records/react";
19981
20025
  import { announceRecordChanged as announceRecordChanged2 } from "@ai-matrx/records/core";
19982
20026
  import { Button as Button38 } from "@ai-matrx/design-system";
@@ -20131,7 +20175,7 @@ function useUndoSource(undo) {
20131
20175
  );
20132
20176
  const { back, forward } = undo.depth;
20133
20177
  const busy = undo.busy;
20134
- useLayoutEffect2(() => {
20178
+ useLayoutEffect3(() => {
20135
20179
  const held = box.current.face;
20136
20180
  if (held.back === back && held.forward === forward && held.busy === busy) return;
20137
20181
  box.current.face = { back, forward, busy };
@@ -20140,7 +20184,7 @@ function useUndoSource(undo) {
20140
20184
  return source;
20141
20185
  }
20142
20186
  function UndoRedoLive({ source }) {
20143
- const face = useSyncExternalStore2(source.subscribe, source.face, source.face);
20187
+ const face = useSyncExternalStore3(source.subscribe, source.face, source.face);
20144
20188
  return /* @__PURE__ */ jsx66(UndoRedoPair, { face, onUndo: source.undo, onRedo: source.redo });
20145
20189
  }
20146
20190
  function UndoRedoPair({ face, onUndo, onRedo }) {
@@ -23043,8 +23087,11 @@ function GridBody({
23043
23087
  const rowMemoryKey = `${tableId}:${embedded ? "embedded" : "page"}:${openingKey}`;
23044
23088
  const rowsAnswered = Boolean(records.data) && !records.loading && !table.loading && !fields.loading;
23045
23089
  useEffect47(() => {
23046
- if (rowsAnswered) rememberRowCount(rowMemoryKey, rows.length);
23047
- }, [rowsAnswered, rowMemoryKey, rows.length]);
23090
+ if (rowsAnswered) {
23091
+ rememberRowCount(rowMemoryKey, rows.length);
23092
+ if (!embedded) rememberRowCount(`${tableId}:page:last`, rows.length);
23093
+ }
23094
+ }, [rowsAnswered, rowMemoryKey, rows.length, embedded, tableId]);
23048
23095
  if (table.error) return /* @__PURE__ */ jsx70(RefusalNotice, { error: table.error, className });
23049
23096
  if (fields.error) return /* @__PURE__ */ jsx70(RefusalNotice, { error: fields.error, className });
23050
23097
  const nothingToShowYet = table.loading || fields.loading || !rights.known || records.loading && rows.length === 0 || // The page read has neither answered nor refused: nothing has been said yet, so nothing is empty.
@@ -24818,6 +24865,7 @@ import { BasicInput as BasicInput16, Button as Button50, Select as Select10, Sel
24818
24865
 
24819
24866
  // src/newTableColumns.ts
24820
24867
  import { RESOLVABLE_FIELD_TYPE_WORDS } from "@ai-matrx/records/templates";
24868
+ import { parseDelimited as parseDelimited2 } from "@ai-matrx/kit/delimited";
24821
24869
  var NEW_COLUMN_TYPES = [
24822
24870
  { type: "text", words: "Text" },
24823
24871
  { type: "rich_text", words: "Formatted text" },
@@ -24914,7 +24962,7 @@ function specsFrom(text) {
24914
24962
  let parts;
24915
24963
  const firstLine = trimmed.split(/\r?\n/)[0];
24916
24964
  if (firstLine.includes(" ")) {
24917
- parts = firstLine.split(" ");
24965
+ parts = parseDelimited2(trimmed, { delimiter: " ", strayQuotes: "literal" }).data[0] ?? [];
24918
24966
  } else if (/\r?\n/.test(trimmed)) {
24919
24967
  parts = trimmed.split(/\r?\n/).map((line) => line.replace(BULLET, ""));
24920
24968
  } else {
@@ -47302,6 +47350,13 @@ var RAIL_TITLE = {
47302
47350
  "who-changed": "Who changed this",
47303
47351
  export: "Export"
47304
47352
  };
47353
+ function LookGlyph() {
47354
+ return /* @__PURE__ */ jsxs144("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", width: "14", height: "14", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
47355
+ /* @__PURE__ */ jsx155("path", { d: "M4 7h10M18 7h2M4 17h2M10 17h10" }),
47356
+ /* @__PURE__ */ jsx155("circle", { cx: "16", cy: "7", r: "2" }),
47357
+ /* @__PURE__ */ jsx155("circle", { cx: "8", cy: "17", r: "2" })
47358
+ ] });
47359
+ }
47305
47360
  function RailFrame({
47306
47361
  phone,
47307
47362
  title,
@@ -48133,7 +48188,7 @@ function TablePage({
48133
48188
  if (table.loading && !table.data) {
48134
48189
  return /* @__PURE__ */ jsxs144(Fragment64, { children: [
48135
48190
  headerNode,
48136
- /* @__PURE__ */ jsx155(TablePageSkeleton, { layout: skeletonLayoutFor(hostLayout ? "grid" : shownLayout), embedded, ...className ? { className } : {} })
48191
+ /* @__PURE__ */ jsx155(TablePageSkeleton, { layout: skeletonLayoutFor(hostLayout ? "grid" : shownLayout), embedded, tableId, ...className ? { className } : {} })
48137
48192
  ] });
48138
48193
  }
48139
48194
  if (!table.data) {
@@ -48247,16 +48302,11 @@ function TablePage({
48247
48302
  ) : null,
48248
48303
  main === "records" && !hostLayout && !(controlsInSheet && shownLayout === "grid") ? /* @__PURE__ */ jsx155(ViewFilter, { tableId, view: shown4, onApply: (where) => void patchView({ where }) }) : null,
48249
48304
  lookShowing && main === "records" && !namingLook ? /* @__PURE__ */ jsx155("span", { className: "flex shrink-0 items-center", "data-view-look": "", "data-view-look-folded": "", "data-toolbar-fit": "look", children: /* @__PURE__ */ jsxs144(DropdownMenu9, { children: [
48250
- /* @__PURE__ */ jsx155(DropdownMenuTrigger9, { asChild: true, children: /* @__PURE__ */ jsxs144(Button105, { size: "sm", variant: "outline", className: "h-8 gap-1.5 px-2 text-xs", title: LOOK_WORDS.yours, "data-view-look-menu": "", children: [
48251
- /* @__PURE__ */ jsx155("span", { "aria-hidden": "true", className: "h-1.5 w-1.5 shrink-0 rounded-full bg-primary" }),
48252
- LOOK_WORDS.folded,
48253
- /* @__PURE__ */ jsxs144("span", { className: "sr-only", children: [
48254
- ": ",
48255
- LOOK_WORDS.yours
48256
- ] })
48305
+ /* @__PURE__ */ jsx155(DropdownMenuTrigger9, { asChild: true, children: /* @__PURE__ */ jsxs144(Button105, { size: "sm", variant: "outline", className: "relative h-8 w-8 shrink-0 px-0", title: LOOK_WORDS.folded, "aria-label": LOOK_WORDS.folded, "data-view-look-menu": "", children: [
48306
+ /* @__PURE__ */ jsx155(LookGlyph, {}),
48307
+ /* @__PURE__ */ jsx155("span", { "aria-hidden": "true", className: "absolute right-1 top-1 h-1.5 w-1.5 rounded-full bg-primary" })
48257
48308
  ] }) }),
48258
48309
  /* @__PURE__ */ jsxs144(DropdownMenuContent9, { align: "start", className: "w-60", "data-view-look-menu-content": "", children: [
48259
- /* @__PURE__ */ jsx155(DropdownMenuLabel3, { className: "text-xs font-normal text-muted-foreground", title: LOOK_WORDS.yours, children: LOOK_WORDS.yoursLabel }),
48260
48310
  lookSavable ? /* @__PURE__ */ jsx155(DropdownMenuItem7, { onSelect: () => void saveLookToView(), "data-view-look-save": "", children: LOOK_WORDS.saveToView }) : null,
48261
48311
  rights.write ? /* @__PURE__ */ jsx155(DropdownMenuItem7, { onSelect: () => setNamingLook(true), "data-view-look-save-new": "", children: LOOK_WORDS.saveAsNew }) : null,
48262
48312
  /* @__PURE__ */ jsx155(DropdownMenuItem7, { onSelect: () => void resetLook(), "data-view-look-reset": "", children: LOOK_WORDS.reset })
@@ -48265,10 +48315,7 @@ function TablePage({
48265
48315
  /* The reserved place keeps its full width at every row width (STABLE-TABLES): when it
48266
48316
  shrank on a narrow row, the look arriving on a sort pushed every control after it.
48267
48317
  A row too narrow for it scrolls sideways, as the row already does. */
48268
- /* @__PURE__ */ jsx155("span", { "aria-hidden": "true", className: "invisible flex shrink-0 items-center overflow-hidden", "data-view-look-place": "", "data-toolbar-fit-gives": "", children: /* @__PURE__ */ jsxs144(Button105, { size: "sm", variant: "outline", className: "h-8 gap-1.5 px-2 text-xs", tabIndex: -1, children: [
48269
- /* @__PURE__ */ jsx155("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full" }),
48270
- LOOK_WORDS.folded
48271
- ] }) })
48318
+ /* @__PURE__ */ jsx155("span", { "aria-hidden": "true", className: "invisible flex shrink-0 items-center overflow-hidden", "data-view-look-place": "", "data-toolbar-fit-gives": "", children: /* @__PURE__ */ jsx155(Button105, { size: "sm", variant: "outline", className: "h-8 w-8 shrink-0 px-0", tabIndex: -1, children: /* @__PURE__ */ jsx155(LookGlyph, {}) }) })
48272
48319
  ) : lookShowing && main === "records" ? /* @__PURE__ */ jsxs144("span", { className: "flex shrink-0 items-center gap-1", "data-view-look": "", "data-toolbar-fit": "look", title: LOOK_WORDS.yours, children: [
48273
48320
  /* @__PURE__ */ jsx155("span", { className: "sr-only", children: LOOK_WORDS.yours }),
48274
48321
  /* @__PURE__ */ jsx155("span", { "aria-hidden": "true", className: "h-1.5 w-1.5 shrink-0 rounded-full bg-primary" }),
@@ -48422,7 +48469,17 @@ function TablePage({
48422
48469
  children: cameFromLine(cameFrom, activeGroupField ?? null, askedInWords)
48423
48470
  }
48424
48471
  ) : null,
48425
- faceUnknown ? /* @__PURE__ */ jsx155(RecordsSkeleton, { layout: skeletonLayoutFor(shownLayout), embedded }) : /* @__PURE__ */ jsx155(
48472
+ faceUnknown ? (
48473
+ /* REVIEW-FIX 10: a full page paints the rows this table showed last time (else fills). */
48474
+ /* @__PURE__ */ jsx155(
48475
+ RecordsSkeleton,
48476
+ {
48477
+ layout: skeletonLayoutFor(shownLayout),
48478
+ embedded,
48479
+ ...embedded ? {} : { rows: rememberedRowCount(`${tableId}:page:last`, 100, "fill") }
48480
+ }
48481
+ )
48482
+ ) : /* @__PURE__ */ jsx155(
48426
48483
  ViewSwitcher,
48427
48484
  {
48428
48485
  chooser: false,