@ai-matrx/records-ui 0.102.17 → 0.102.20

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;
@@ -7272,7 +7293,7 @@ function GridCell({
7272
7293
  }
7273
7294
  if (editorKindFor(field2) === "checkbox") {
7274
7295
  const answered = value === true || value === false;
7275
- 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: [
7276
7297
  /* @__PURE__ */ jsx28(
7277
7298
  Checkbox4,
7278
7299
  {
@@ -7289,9 +7310,9 @@ function GridCell({
7289
7310
  ] });
7290
7311
  }
7291
7312
  if (editable && format?.id === "rating") {
7292
- 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: [
7293
7314
  /* @__PURE__ */ jsx28(FormattedValue, { value, format, onRate: (next) => editing?.setCell(row.id, field2.key, next), selectFirst: true }),
7294
- 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,
7295
7316
  refusal4 ? /* @__PURE__ */ jsx28(CellRefusalNotice, { refusal: refusal4, field: field2, row, editing, typed: false }) : null
7296
7317
  ] });
7297
7318
  }
@@ -7404,7 +7425,7 @@ function GridCell({
7404
7425
  }
7405
7426
  ) : null
7406
7427
  ] }),
7407
- 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,
7408
7429
  refusal4 ? /* @__PURE__ */ jsx28(CellRefusalNotice, { refusal: refusal4, field: field2, row, editing, typed: true }) : null
7409
7430
  ]
7410
7431
  }
@@ -7452,8 +7473,9 @@ function CellRefusalNotice({
7452
7473
  type: "button",
7453
7474
  "data-records-cell-refusal-line": "",
7454
7475
  title: line,
7455
- className: "block max-w-full truncate text-left text-[11px] text-destructive underline decoration-dotted underline-offset-2",
7456
- 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: "!"
7457
7479
  }
7458
7480
  ) }),
7459
7481
  /* @__PURE__ */ jsx28(
@@ -7488,12 +7510,12 @@ function WhoBadge({
7488
7510
  {
7489
7511
  type: "button",
7490
7512
  "data-records-who-badge": "",
7491
- "data-who-text": who.badge ?? "who?",
7513
+ "data-who-text": who.badge ?? "",
7492
7514
  "aria-hidden": "true",
7493
7515
  tabIndex: -1,
7494
7516
  "aria-label": `Who changed ${fieldName(field2)}?`,
7495
7517
  title: who.sentence ?? `Who changed ${fieldName(field2)}? (Option-Shift-H)`,
7496
- 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",
7497
7519
  onMouseEnter: ask,
7498
7520
  onClick: (event) => {
7499
7521
  event.preventDefault();
@@ -7505,7 +7527,11 @@ function WhoBadge({
7505
7527
  event.preventDefault();
7506
7528
  event.stopPropagation();
7507
7529
  onPressedTwice();
7508
- }
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
+ ] })
7509
7535
  }
7510
7536
  )
7511
7537
  );
@@ -7680,7 +7706,7 @@ function OpenCell({
7680
7706
  }
7681
7707
  ),
7682
7708
  /* @__PURE__ */ jsxs23("span", { "data-records-cell-tray": "", className: FLOATING_CELL_TRAY_CLASS, children: [
7683
- 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: [
7684
7710
  /* @__PURE__ */ jsx28(Button10, { size: "sm", onClick: () => once(() => onCommit(null, "pick")), children: "Save" }),
7685
7711
  /* @__PURE__ */ jsx28(Button10, { size: "sm", variant: "ghost", onClick: () => once(() => onCancel("pick")), children: "Cancel" })
7686
7712
  ] }),
@@ -7715,9 +7741,19 @@ function rememberRowCount(key, count) {
7715
7741
  }
7716
7742
 
7717
7743
  // src/RecordsSkeleton.tsx
7744
+ import { useSyncExternalStore } from "react";
7718
7745
  import { cn as cn20, Skeleton as Skeleton2 } from "@ai-matrx/design-system";
7719
7746
  import { MatrxDataTable } from "@ai-matrx/design-system/data-table";
7720
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
+ }
7721
7757
  var RECORDS_SKELETON_LAYOUTS = [
7722
7758
  "grid",
7723
7759
  "kanban",
@@ -7855,8 +7891,11 @@ function TablePageSkeleton({
7855
7891
  layout = "grid",
7856
7892
  embedded = false,
7857
7893
  rows,
7894
+ tableId,
7858
7895
  className
7859
7896
  }) {
7897
+ const remembered = useRememberedPageRows(embedded ? void 0 : tableId);
7898
+ const painted = rows ?? (remembered === "fill" ? void 0 : remembered);
7860
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: [
7861
7900
  /* @__PURE__ */ jsxs24("div", { className: TABLE_TOOLBAR_ROW_CLASS, "data-table-toolbar": "", "data-records-skeleton-part": "toolbar", "aria-hidden": "true", children: [
7862
7901
  /* @__PURE__ */ jsx29(Skeleton2, { shape: "control", width: "sm", className: "w-28" }),
@@ -7867,7 +7906,7 @@ function TablePageSkeleton({
7867
7906
  /* @__PURE__ */ jsx29(Skeleton2, { shape: "control", className: "w-24" })
7868
7907
  ] })
7869
7908
  ] }),
7870
- /* @__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 } : {} }) })
7871
7910
  ] }) });
7872
7911
  }
7873
7912
 
@@ -16323,7 +16362,7 @@ function useEnrichCells(tableId, recordIds) {
16323
16362
  }, [refresh]);
16324
16363
  return { cells, refresh, error };
16325
16364
  }
16326
- var NEVER = "Fill it in once and leave it alone";
16365
+ var NEVER2 = "Fill it in once and leave it alone";
16327
16366
  function EnrichPanel({ tableId, fieldId, className }) {
16328
16367
  const client = useRecordsClient30();
16329
16368
  const host = useRecordsUi();
@@ -16446,7 +16485,7 @@ function EnrichPanel({ tableId, fieldId, className }) {
16446
16485
  {
16447
16486
  id: "new-every",
16448
16487
  value: setup.every,
16449
- placeholder: NEVER,
16488
+ placeholder: NEVER2,
16450
16489
  onChange: (e) => setDraft((prev) => ({ ...prev, [fieldId]: { ...setup, every: e.target.value } }))
16451
16490
  }
16452
16491
  )
@@ -16541,14 +16580,14 @@ function EnrichPanel({ tableId, fieldId, className }) {
16541
16580
  id: `every-${row.field_id}`,
16542
16581
  value: d.every,
16543
16582
  disabled: !rights.admin,
16544
- placeholder: NEVER,
16583
+ placeholder: NEVER2,
16545
16584
  onChange: (e) => setDraft((prev) => ({
16546
16585
  ...prev,
16547
16586
  [row.field_id]: { ...d, every: e.target.value }
16548
16587
  }))
16549
16588
  }
16550
16589
  ),
16551
- /* @__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 })
16552
16591
  ] })
16553
16592
  ] }),
16554
16593
  /* @__PURE__ */ jsxs52("p", { className: "text-xs text-muted-foreground", children: [
@@ -16894,7 +16933,7 @@ function withTypeMark(field2, header) {
16894
16933
  }
16895
16934
 
16896
16935
  // src/ReverseColumns.tsx
16897
- 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";
16898
16937
  import { useFields as useFields6, useReverseColumns as useReverseColumns3, useReverseLinks, useTable as useTable4 } from "@ai-matrx/records/react";
16899
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";
16900
16939
  import { Fragment as Fragment17, jsx as jsx59, jsxs as jsxs54 } from "react/jsx-runtime";
@@ -17014,8 +17053,8 @@ function ReverseCell({ held, column, rowId, tableId }) {
17014
17053
  },
17015
17054
  [held]
17016
17055
  );
17017
- const answer = useSyncExternalStore(subscribe, () => held.answers?.[column.key]?.[rowId]);
17018
- const reading = useSyncExternalStore(subscribe, () => held.reading);
17056
+ const answer = useSyncExternalStore2(subscribe, () => held.answers?.[column.key]?.[rowId]);
17057
+ const reading = useSyncExternalStore2(subscribe, () => held.reading);
17019
17058
  return /* @__PURE__ */ jsx59(ReverseLinkChips, { column, answer, loading: reading, clamp: { tableId, recordId: rowId } });
17020
17059
  }
17021
17060
  var EMPTY_COLUMNS = [];
@@ -19080,7 +19119,7 @@ function ImportWizard({ tableId, source, onDone, onWrote, className }) {
19080
19119
  }
19081
19120
 
19082
19121
  // src/tableShape.ts
19083
- import { codeSpanText as codeSpanText2, mapInlineCodeSpans } from "@ai-matrx/content-ir/source";
19122
+ import { codeSpanText as codeSpanText2, findTableEnd, mapInlineCodeSpans, rowCells, tableStartsAt } from "@ai-matrx/content-ir/source";
19084
19123
  import { humanizeIdentifier as humanizeIdentifier9 } from "@ai-matrx/kit/text-case";
19085
19124
  import { parseDelimited as readDelimited } from "@ai-matrx/kit/delimited";
19086
19125
  var FEWEST_LIST_ITEMS = 2;
@@ -19128,25 +19167,8 @@ function nameAbove(lines, lineIndex) {
19128
19167
  }
19129
19168
  return null;
19130
19169
  }
19131
- var SEPARATOR = /^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)*\|?\s*$/;
19132
19170
  function splitPipes(line) {
19133
- let text = line.trim();
19134
- if (text.startsWith("|")) text = text.slice(1);
19135
- if (text.endsWith("|") && !text.endsWith("\\|")) text = text.slice(0, -1);
19136
- const cells = [];
19137
- let cell2 = "";
19138
- for (let i = 0; i < text.length; i += 1) {
19139
- const ch = text[i];
19140
- if (ch === "\\" && text[i + 1] === "|") {
19141
- cell2 += "\\|";
19142
- i += 1;
19143
- } else if (ch === "|") {
19144
- cells.push(cell2);
19145
- cell2 = "";
19146
- } else cell2 += ch;
19147
- }
19148
- cells.push(cell2);
19149
- return cells.map(cellWords);
19171
+ return rowCells(line).map(cellWords);
19150
19172
  }
19151
19173
  var LIST_ITEM = /^(\s*)(?:[-*+•]|\d{1,3}[.)])\s+(?:\[[ xX]\]\s+)?(.*)$/;
19152
19174
  var KEY_VALUE = /^\s*(?:\*\*|__)?([^:*_|]{1,40}?)(?::(?:\*\*|__)|(?:\*\*|__):|:)\s+(.+)$/;
@@ -19395,14 +19417,11 @@ function readTableShapes(text) {
19395
19417
  i = j + 1;
19396
19418
  continue;
19397
19419
  }
19398
- if (line.includes("|") && SEPARATOR.test(lines[i + 1] ?? "") && !SEPARATOR.test(line)) {
19420
+ if (tableStartsAt(lines, i)) {
19399
19421
  const headers = uniqueLabels(splitPipes(line));
19400
- let j = i + 2;
19422
+ const j = findTableEnd(lines, i);
19401
19423
  const matrix = [];
19402
- while (j < lines.length && (lines[j] ?? "").includes("|") && (lines[j] ?? "").trim() !== "") {
19403
- matrix.push(splitPipes(lines[j]));
19404
- j += 1;
19405
- }
19424
+ for (let r = i + 2; r < j; r += 1) matrix.push(splitPipes(lines[r]));
19406
19425
  const rows = rowsOf(headers, matrix);
19407
19426
  if (headers.length >= 1 && rows.length >= 1) {
19408
19427
  shapes.push({
@@ -19981,7 +20000,7 @@ function useGroupLabel(fields, groupKey) {
19981
20000
  }
19982
20001
 
19983
20002
  // src/gridUndo.tsx
19984
- import { useCallback as useCallback23, useEffect as useEffect44, useLayoutEffect as useLayoutEffect2, useMemo as useMemo31, useRef as useRef28, useState as useState54, useSyncExternalStore as useSyncExternalStore2 } from "react";
20003
+ import { useCallback as useCallback23, useEffect as useEffect44, useLayoutEffect as useLayoutEffect3, useMemo as useMemo31, useRef as useRef28, useState as useState54, useSyncExternalStore as useSyncExternalStore3 } from "react";
19985
20004
  import { tableShapeChanged as tableShapeChanged5, useRecordsClient as useRecordsClient34 } from "@ai-matrx/records/react";
19986
20005
  import { announceRecordChanged as announceRecordChanged2 } from "@ai-matrx/records/core";
19987
20006
  import { Button as Button38 } from "@ai-matrx/design-system";
@@ -20136,7 +20155,7 @@ function useUndoSource(undo) {
20136
20155
  );
20137
20156
  const { back, forward } = undo.depth;
20138
20157
  const busy = undo.busy;
20139
- useLayoutEffect2(() => {
20158
+ useLayoutEffect3(() => {
20140
20159
  const held = box.current.face;
20141
20160
  if (held.back === back && held.forward === forward && held.busy === busy) return;
20142
20161
  box.current.face = { back, forward, busy };
@@ -20145,7 +20164,7 @@ function useUndoSource(undo) {
20145
20164
  return source;
20146
20165
  }
20147
20166
  function UndoRedoLive({ source }) {
20148
- const face = useSyncExternalStore2(source.subscribe, source.face, source.face);
20167
+ const face = useSyncExternalStore3(source.subscribe, source.face, source.face);
20149
20168
  return /* @__PURE__ */ jsx66(UndoRedoPair, { face, onUndo: source.undo, onRedo: source.redo });
20150
20169
  }
20151
20170
  function UndoRedoPair({ face, onUndo, onRedo }) {
@@ -24826,6 +24845,7 @@ import { BasicInput as BasicInput16, Button as Button50, Select as Select10, Sel
24826
24845
 
24827
24846
  // src/newTableColumns.ts
24828
24847
  import { RESOLVABLE_FIELD_TYPE_WORDS } from "@ai-matrx/records/templates";
24848
+ import { parseDelimited as parseDelimited2 } from "@ai-matrx/kit/delimited";
24829
24849
  var NEW_COLUMN_TYPES = [
24830
24850
  { type: "text", words: "Text" },
24831
24851
  { type: "rich_text", words: "Formatted text" },
@@ -24922,7 +24942,7 @@ function specsFrom(text) {
24922
24942
  let parts;
24923
24943
  const firstLine = trimmed.split(/\r?\n/)[0];
24924
24944
  if (firstLine.includes(" ")) {
24925
- parts = firstLine.split(" ");
24945
+ parts = parseDelimited2(trimmed, { delimiter: " ", strayQuotes: "literal" }).data[0] ?? [];
24926
24946
  } else if (/\r?\n/.test(trimmed)) {
24927
24947
  parts = trimmed.split(/\r?\n/).map((line) => line.replace(BULLET, ""));
24928
24948
  } else {
@@ -47310,6 +47330,13 @@ var RAIL_TITLE = {
47310
47330
  "who-changed": "Who changed this",
47311
47331
  export: "Export"
47312
47332
  };
47333
+ function LookGlyph() {
47334
+ 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: [
47335
+ /* @__PURE__ */ jsx155("path", { d: "M4 7h10M18 7h2M4 17h2M10 17h10" }),
47336
+ /* @__PURE__ */ jsx155("circle", { cx: "16", cy: "7", r: "2" }),
47337
+ /* @__PURE__ */ jsx155("circle", { cx: "8", cy: "17", r: "2" })
47338
+ ] });
47339
+ }
47313
47340
  function RailFrame({
47314
47341
  phone,
47315
47342
  title,
@@ -48141,7 +48168,7 @@ function TablePage({
48141
48168
  if (table.loading && !table.data) {
48142
48169
  return /* @__PURE__ */ jsxs144(Fragment64, { children: [
48143
48170
  headerNode,
48144
- /* @__PURE__ */ jsx155(TablePageSkeleton, { layout: skeletonLayoutFor(hostLayout ? "grid" : shownLayout), embedded, ...className ? { className } : {} })
48171
+ /* @__PURE__ */ jsx155(TablePageSkeleton, { layout: skeletonLayoutFor(hostLayout ? "grid" : shownLayout), embedded, tableId, ...className ? { className } : {} })
48145
48172
  ] });
48146
48173
  }
48147
48174
  if (!table.data) {
@@ -48255,16 +48282,11 @@ function TablePage({
48255
48282
  ) : null,
48256
48283
  main === "records" && !hostLayout && !(controlsInSheet && shownLayout === "grid") ? /* @__PURE__ */ jsx155(ViewFilter, { tableId, view: shown4, onApply: (where) => void patchView({ where }) }) : null,
48257
48284
  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: [
48258
- /* @__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: [
48259
- /* @__PURE__ */ jsx155("span", { "aria-hidden": "true", className: "h-1.5 w-1.5 shrink-0 rounded-full bg-primary" }),
48260
- LOOK_WORDS.folded,
48261
- /* @__PURE__ */ jsxs144("span", { className: "sr-only", children: [
48262
- ": ",
48263
- LOOK_WORDS.yours
48264
- ] })
48285
+ /* @__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: [
48286
+ /* @__PURE__ */ jsx155(LookGlyph, {}),
48287
+ /* @__PURE__ */ jsx155("span", { "aria-hidden": "true", className: "absolute right-1 top-1 h-1.5 w-1.5 rounded-full bg-primary" })
48265
48288
  ] }) }),
48266
48289
  /* @__PURE__ */ jsxs144(DropdownMenuContent9, { align: "start", className: "w-60", "data-view-look-menu-content": "", children: [
48267
- /* @__PURE__ */ jsx155(DropdownMenuLabel3, { className: "text-xs font-normal text-muted-foreground", title: LOOK_WORDS.yours, children: LOOK_WORDS.yoursLabel }),
48268
48290
  lookSavable ? /* @__PURE__ */ jsx155(DropdownMenuItem7, { onSelect: () => void saveLookToView(), "data-view-look-save": "", children: LOOK_WORDS.saveToView }) : null,
48269
48291
  rights.write ? /* @__PURE__ */ jsx155(DropdownMenuItem7, { onSelect: () => setNamingLook(true), "data-view-look-save-new": "", children: LOOK_WORDS.saveAsNew }) : null,
48270
48292
  /* @__PURE__ */ jsx155(DropdownMenuItem7, { onSelect: () => void resetLook(), "data-view-look-reset": "", children: LOOK_WORDS.reset })
@@ -48273,10 +48295,7 @@ function TablePage({
48273
48295
  /* The reserved place keeps its full width at every row width (STABLE-TABLES): when it
48274
48296
  shrank on a narrow row, the look arriving on a sort pushed every control after it.
48275
48297
  A row too narrow for it scrolls sideways, as the row already does. */
48276
- /* @__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: [
48277
- /* @__PURE__ */ jsx155("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full" }),
48278
- LOOK_WORDS.folded
48279
- ] }) })
48298
+ /* @__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, {}) }) })
48280
48299
  ) : 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: [
48281
48300
  /* @__PURE__ */ jsx155("span", { className: "sr-only", children: LOOK_WORDS.yours }),
48282
48301
  /* @__PURE__ */ jsx155("span", { "aria-hidden": "true", className: "h-1.5 w-1.5 shrink-0 rounded-full bg-primary" }),