@ai-matrx/design-system 0.20.16 → 0.20.18
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/CHANGELOG.md +12 -0
- package/dist/data-table/copy-helpers.d.cts +1 -1
- package/dist/data-table/copy-helpers.d.ts +1 -1
- package/dist/data-table/filter-engine.d.cts +1 -1
- package/dist/data-table/filter-engine.d.ts +1 -1
- package/dist/data-table/host.d.cts +1 -1
- package/dist/data-table/host.d.ts +1 -1
- package/dist/data-table/index.cjs +1211 -1068
- package/dist/data-table/index.cjs.map +1 -1
- package/dist/data-table/index.d.cts +21 -3
- package/dist/data-table/index.d.ts +21 -3
- package/dist/data-table/index.js +1109 -966
- package/dist/data-table/index.js.map +1 -1
- package/dist/data-table/infer-filter.d.cts +1 -1
- package/dist/data-table/infer-filter.d.ts +1 -1
- package/dist/data-table/layered-filters.d.cts +1 -1
- package/dist/data-table/layered-filters.d.ts +1 -1
- package/dist/data-table/pagination.cjs +18 -14
- package/dist/data-table/pagination.cjs.map +1 -1
- package/dist/data-table/pagination.js +18 -14
- package/dist/data-table/pagination.js.map +1 -1
- package/dist/data-table/query-control.d.cts +1 -1
- package/dist/data-table/query-control.d.ts +1 -1
- package/dist/data-table/types.cjs.map +1 -1
- package/dist/data-table/types.d.cts +1 -1
- package/dist/data-table/types.d.ts +1 -1
- package/dist/data-table/url-state.d.cts +1 -1
- package/dist/data-table/url-state.d.ts +1 -1
- package/dist/data-table/xlsx.d.cts +1 -1
- package/dist/data-table/xlsx.d.ts +1 -1
- package/dist/tap-target.css +11 -2
- package/dist/{types-DB30aCHu.d.ts → types-D_UZxZC5.d.ts} +4 -0
- package/dist/{types-C2yaTspG.d.cts → types-n8d2I1Gu.d.cts} +4 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/data-table/index.ts","../../src/data-table/MatrxDataTable.tsx","../../src/data-table/icons.tsx","../../src/button.tsx","../../src/cn.ts","../../src/data-table/use-column-reorder-animation.ts","../../src/checkbox.tsx","../../src/icons.tsx","../../src/alert-dialog.tsx","../../src/motion.ts","../../src/portal-container.tsx","../../src/confirm-dialog.tsx","../../src/input.tsx","../../src/select.tsx","../../src/skeleton.tsx","../../src/data-table/TableTitleRow.tsx","../../src/data-table/TableSearch.tsx","../../src/tooltip.tsx","../../src/data-table/useScrollPagination.ts","../../src/data-table/useProgressiveTableRows.ts","../../src/dialog.tsx","../../src/radix-dialog-modal-context.tsx","../../src/use-is-mobile.ts","../../src/sheet.tsx","../../src/data-table/default-host.tsx","../../src/data-table/useTableNotice.tsx","../../src/data-table/host.tsx","../../src/data-table/pagination.tsx","../../src/content-transfer/matrx-copy.tsx","../../src/content-transfer/email-review.tsx","../../src/content-transfer/index.tsx","../../src/popover.tsx","../../src/tap-target/tap-target-button.tsx","../../src/tap-target/cn.ts","../../src/tap-target/link.ts","../../src/content-transfer/icon.ts","../../src/content-transfer/extensions.ts","../../src/data-table/copy-payload.ts","../../src/data-table/copy.tsx","../../src/data-table/CopySubset.tsx","../../src/data-table/layered-filters.ts","../../src/data-table/filter-engine.ts","../../src/data-table/tableCopy.ts","../../src/data-table/clipping.ts","../../src/data-table/url-state.ts","../../src/data-table/ColumnHeaderCell.tsx","../../src/command.tsx","../../src/data-table/ColumnResizeHandle.tsx","../../src/data-table/column-resize.ts","../../src/data-table/column-drag-preview.ts","../../src/data-table/ranked-search.ts","../../src/data-table/ColumnManager.tsx","../../src/data-table/saved-view-snapshot.ts","../../src/data-table/MatrxUuidCell.tsx","../../src/data-table/entity.ts","../../src/data-table/display-value.ts","../../src/data-table/DataRowInspector.tsx","../../src/data-table/DataRowWindow.tsx","../../src/data-table/row-title.ts","../../src/data-table/DirtySavePill.tsx","../../src/data-table/EditableTableCell.tsx","../../src/data-table/ToolbarFacets.tsx","../../src/data-table/LayeredFilterBuilder.tsx","../../src/data-table/infer-filter.ts","../../src/data-table/query-control.ts","../../src/data-table/SavedViewsControl.tsx","../../src/dropdown-menu.tsx","../../src/data-table/tableXlsx.ts"],"sourcesContent":["export { MatrxDataTable } from \"./MatrxDataTable\";\nexport { TableTitleRow } from \"./TableTitleRow\";\nexport type { TableTitleRowProps } from \"./TableTitleRow\";\nexport { SavedViewsControl } from \"./SavedViewsControl\";\nexport type { SavedViewsControlProps } from \"./SavedViewsControl\";\nexport { parseTableViewSnapshot } from \"./saved-view-snapshot\";\nexport { MatrxDataTableProvider, useMatrxDataTableHost } from \"./host\";\nexport type {\n MatrxDataTableHost,\n TableDoors,\n TableEntityRefProps,\n TableLinkProps,\n TablePeekProps,\n TableSidePanelProps,\n TableToolbarActionProps,\n TableWindowPanelProps,\n} from \"./host\";\nexport { DataRowInspector } from \"./DataRowInspector\";\nexport { DataRowWindow } from \"./DataRowWindow\";\nexport type { DataRowWindowProps, DataRowWindowTab } from \"./DataRowWindow\";\nexport { MatrxUuidCell, shortUuid } from \"./MatrxUuidCell\";\nexport type { MatrxUuidCellProps, MatrxUuidOpenResult } from \"./MatrxUuidCell\";\nexport { default as GenericTablePagination } from \"./pagination\";\nexport type { GenericTablePaginationProps } from \"./pagination\";\nexport {\n buildRowAgentInput,\n buildViewAgentInput,\n buildViewHuman,\n rowsToCsvFromColumns,\n rowsToMarkdownTable,\n rowsToRecordsFromColumns,\n} from \"./tableCopy\";\nexport { downloadTableAsXlsx } from \"./tableXlsx\";\nexport {\n collectSelectOptions,\n filterKindLabel,\n resolveFilterKind,\n} from \"./infer-filter\";\nexport type { ResolvedFilterKind } from \"./infer-filter\";\nexport { useScrollPagination } from \"./useScrollPagination\";\nexport type {\n ScrollPaginationContainer,\n UseScrollPaginationOptions,\n UseScrollPaginationResult,\n} from \"./useScrollPagination\";\nexport { useTableUrlState, tableUrlParamPrefix } from \"./url-state\";\nexport * from \"./types\";\n","\"use client\";\n\nimport {\n cloneElement,\n Fragment,\n isValidElement,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ComponentType,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n type Ref,\n type RefObject,\n type SetStateAction,\n} from \"react\";\nimport {\n DndContext,\n DragOverlay,\n MeasuringStrategy,\n PointerSensor,\n pointerWithin,\n useDndMonitor,\n useDraggable,\n useDroppable,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragMoveEvent,\n} from \"@dnd-kit/core\";\nimport {\n ChevronLeft,\n ChevronRight,\n Eraser,\n GripVertical,\n Loader2,\n RefreshControlIcon,\n PanelRight,\n PanelRightOpen,\n Search,\n SlidersHorizontal,\n Plus,\n WholeWord,\n X,\n} from \"./icons\";\nimport { Button } from \"../button\";\nimport { useColumnReorderAnimation } from \"./use-column-reorder-animation\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\nimport { Checkbox } from \"../checkbox\";\nimport { ConfirmDialog } from \"../confirm-dialog\";\nimport { Input } from \"../input\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select\";\nimport { Skeleton } from \"../skeleton\";\nimport { TableTitleRow } from \"./TableTitleRow\";\nimport { TableSearch } from \"./TableSearch\";\nimport {\n Tooltip,\n TooltipProvider,\n TooltipTrigger,\n TooltipContent,\n} from \"../tooltip\";\nimport { useScrollPagination } from \"./useScrollPagination\";\nimport { useProgressiveTableRows } from \"./useProgressiveTableRows\";\nimport { DefaultTableLink, DefaultTableSidePanel } from \"./default-host\";\nimport { useTableNotice } from \"./useTableNotice\";\nimport GenericTablePagination from \"./pagination\";\nimport { CopyButtons, type CopySubsetColumn } from \"./copy\";\nimport { useCopySubsetVariant } from \"./CopySubset\";\nimport { cn } from \"../cn\";\nimport { useClippedContentGuard } from \"./clipping\";\nimport { useTableUrlState } from \"./url-state\";\nimport {\n jsonUrlCodec,\n stringUrlCodec,\n useUrlState,\n} from \"@ai-matrx/kit/url-state\";\nimport { useMatrxDataTableHost, type TableToolbarActionProps } from \"./host\";\nimport { ColumnHeaderCell } from \"./ColumnHeaderCell\";\nimport { ColumnResizeHandle } from \"./ColumnResizeHandle\";\nimport {\n clampColumnWidth,\n columnResizeCssVar,\n normalizeColumnWidthMap,\n resolveColumnResizeBounds,\n} from \"./column-resize\";\nimport {\n projectColumnDragOrder,\n type ColumnDragPreview,\n} from \"./column-drag-preview\";\nimport { inferTableSearchRole, rankTableSearchRows, resolveTableSearchScopes } from \"./ranked-search\";\nimport { ColumnManager } from \"./ColumnManager\";\nimport { parseTableViewSnapshot } from \"./saved-view-snapshot\";\nimport { DataRowInspector } from \"./DataRowInspector\";\nimport { DataRowWindow } from \"./DataRowWindow\";\nimport { defaultRowTitle } from \"./row-title\";\nimport { formatTableDisplayValue } from \"./display-value\";\nimport { DirtySavePill } from \"./DirtySavePill\";\nimport { EditableTableCell } from \"./EditableTableCell\";\nimport { tokenFromColumnName, isUuidValue } from \"./entity\";\nimport { MatrxUuidCell } from \"./MatrxUuidCell\";\nimport { ToolbarFacets, resetToolbarFacets } from \"./ToolbarFacets\";\nimport { LayeredFilterBuilder } from \"./LayeredFilterBuilder\";\nimport {\n completeLayeredFilterRules,\n type LayeredFilterRule,\n} from \"./layered-filters\";\nimport {\n applyRowEdits,\n columnId,\n countActiveColumnFilters,\n filterAndSortRows,\n getCellValue,\n} from \"./filter-engine\";\nimport {\n buildRowAgentInput,\n buildDefaultTableRowAgentInput,\n buildDefaultTableViewAgentInput,\n buildViewAgentInput,\n buildViewHuman,\n formatDefaultTableCopyRecord,\n projectDefaultTableCopyRow,\n} from \"./tableCopy\";\nimport {\n nextQueryState,\n resolveQueryFilterMeta,\n safeQueryPage,\n type QueryFilterMeta,\n} from \"./query-control\";\n\nfunction TableToolbarAction({\n HostAction,\n ariaLabel,\n tooltip,\n disabled,\n busy,\n onClick,\n children,\n}: TableToolbarActionProps & { HostAction: ComponentType<TableToolbarActionProps> | undefined }) {\n if (HostAction) {\n return <span data-matrx-table-toolbar-action><HostAction ariaLabel={ariaLabel} tooltip={tooltip} disabled={disabled} busy={busy} onClick={onClick}>{children}</HostAction></span>;\n }\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span data-matrx-table-toolbar-action className=\"inline-flex\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"h-11 w-11 [&_svg]:size-5\" aria-label={ariaLabel} aria-busy={busy || undefined} disabled={disabled} onClick={onClick}>\n {isValidElement<{ className?: string }>(children)\n ? cloneElement(children, { className: cn(\"h-5 w-5\", children.props.className) })\n : children}\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>{tooltip ?? ariaLabel}</TooltipContent>\n </Tooltip>\n );\n}\nimport type {\n CellEditsMap,\n ColumnFilterValue,\n ColumnFiltersState,\n MatrxColumnDef,\n MatrxDataTableCopyConfig,\n MatrxDataTableHierarchyMove,\n TableViewSnapshot,\n MatrxDataTableProps,\n MatrxDataTableQueryState,\n SortState,\n TableSearchMatchMode,\n} from \"./types\";\n\ninterface TableRowCopyControlProps<T> {\n sourceId: string;\n copy: MatrxDataTableCopyConfig<T>;\n row: T;\n size: \"xs\" | \"icon\" | \"toolbar\";\n defaultColumns?: MatrxColumnDef<T>[];\n}\n\n/**\n * `processed` is intentionally an array result, so harmless caller prop\n * churn (for example an inline `toolbar` object) can rebuild its container on\n * every render. View subscribers care about the ordered records, not that\n * disposable array. Keep callback-driven parent state from feeding that\n * allocation back into another render forever.\n */\nfunction hasSameRowReferences<T>(previous: readonly T[], next: readonly T[]) {\n return (\n previous.length === next.length &&\n previous.every((row, index) => row === next[index])\n );\n}\n\n/** One row-copy seam shared by cards, desktop rows, panels, and windows. */\nfunction TableRowCopyControl<T>({\n copy,\n row,\n size,\n sourceId,\n defaultColumns,\n}: TableRowCopyControlProps<T>) {\n return (\n <CopyButtons\n size={size}\n sourceId={sourceId}\n label={copy.label}\n {...(copy.rowReferences ? { references: copy.rowReferences(row) } : {})}\n {...(copy.triggerVariant ? { triggerVariant: copy.triggerVariant } : {})}\n human={() => copy.humanRow(row)}\n json={() => (copy.agentRow ? copy.agentRow(row) : row)}\n agent={() => defaultColumns\n ? buildDefaultTableRowAgentInput(copy, row, defaultColumns)\n : buildRowAgentInput(copy, row)}\n {...(copy.rowAiVariants?.(row) === undefined ? {} : { aiVariants: copy.rowAiVariants?.(row) })}\n />\n );\n}\n\ninterface HierarchyDropPreview {\n move: MatrxDataTableHierarchyMove;\n targetId: string | null;\n position: \"before\" | \"after\" | \"inside\" | \"root\";\n depth: number;\n targetLabel: string | null;\n}\n\n/** Current pointer Y in viewport coords: drag-start position plus travel. */\nfunction dragPointerY(event: DragMoveEvent | DragEndEvent): number {\n const activator = event.activatorEvent;\n return \"clientY\" in activator && typeof activator.clientY === \"number\"\n ? activator.clientY + event.delta.y\n : 0;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return (\n Array.isArray(value) && value.every((item) => typeof item === \"string\")\n );\n}\n\nconst activeUrlTableIds = new Set<string>();\n\n/**\n * MatrxDataTable — the official canonical data table.\n *\n * Sticky headers · every-column sort/filter (searchable selects) · toolbar\n * facets with per-facet + global clear · any-of cross-column search ·\n * Copy/Copy-for-AI (row + this view) · inline edit with dirty Save/Cancel pill ·\n * row → SidePanelSurface or WindowPanel · trailing icon → the secondary view.\n */\nexport function MatrxDataTable<T>(props: MatrxDataTableProps<T>) {\n if (!props.urlState) return <MatrxDataTableCore {...props} />;\n return <MatrxDataTableWithUrlState {...props} urlState={props.urlState} />;\n}\n\nfunction MatrxDataTableWithUrlState<T>({\n urlState,\n ...props\n}: MatrxDataTableProps<T> & {\n urlState: NonNullable<MatrxDataTableProps<T>[\"urlState\"]>;\n}) {\n if (props.query && props.query.mode !== \"local\") {\n throw new Error(\n `MatrxDataTable \"${urlState.id}\" cannot combine urlState with controlled query mode. Use useTableUrlState({ tableId: \"${urlState.id}\" }) in the remote query owner.`,\n );\n }\n\n const table = useTableUrlState({\n tableId: urlState.id,\n ...(urlState.defaultSort === undefined ? {} : { defaultSort: urlState.defaultSort }),\n defaultPageSize: props.pageSize ?? 25,\n ...(urlState.history === undefined ? {} : { history: urlState.history }),\n ...(urlState.textHistory === undefined ? {} : { textHistory: urlState.textHistory }),\n });\n useEffect(() => {\n if (activeUrlTableIds.has(urlState.id)) {\n throw new Error(\n `Duplicate MatrxDataTable urlState.id \"${urlState.id}\" on one page. Give every table a unique stable id.`,\n );\n }\n activeUrlTableIds.add(urlState.id);\n return () => {\n activeUrlTableIds.delete(urlState.id);\n };\n }, [urlState.id]);\n const prefix = `table.${urlState.id}`;\n const [urlSelectedId, setUrlSelectedId] = useUrlState(\n `${prefix}.row`,\n stringUrlCodec(),\n );\n const [urlWindowRowId, setUrlWindowRowId] = useUrlState(\n `${prefix}.window`,\n stringUrlCodec(),\n );\n const [urlSelection, setUrlSelection] = useUrlState(\n `${prefix}.selection`,\n jsonUrlCodec<string[]>([], isStringArray),\n );\n const syncSelectedRow = urlState.selectedRow !== false;\n const syncWindowRow = urlState.windowRow !== false;\n const syncSelection = urlState.selection === true && Boolean(props.selection);\n const selectedId = syncSelectedRow ? urlSelectedId || null : props.selectedId;\n const windowRowId = syncWindowRow\n ? urlWindowRowId || null\n : props.windowRowId;\n const selection =\n syncSelection && props.selection\n ? {\n ...props.selection,\n selectedIds: urlSelection,\n onSelectedIdsChange: (ids: string[]) => {\n setUrlSelection(ids, { history: urlState.history });\n props.selection?.onSelectedIdsChange(ids);\n },\n }\n : props.selection;\n\n return (\n <MatrxDataTableCore\n {...props}\n urlState={urlState}\n query={{\n mode: \"controlled-local\",\n state: table.state,\n onStateChange: table.onStateChange,\n }}\n {...(selectedId === undefined ? {} : { selectedId })}\n onSelectedIdChange={(id) => {\n if (syncSelectedRow) {\n setUrlSelectedId(id === null ? \"\" : id, {\n ...(urlState.history === undefined ? {} : { history: urlState.history }),\n });\n }\n props.onSelectedIdChange?.(id);\n }}\n {...(windowRowId === undefined ? {} : { windowRowId })}\n onWindowRowIdChange={(id) => {\n if (syncWindowRow) {\n setUrlWindowRowId(id === null ? \"\" : id, {\n ...(urlState.history === undefined ? {} : { history: urlState.history }),\n });\n }\n props.onWindowRowIdChange?.(id);\n }}\n {...(selection === undefined ? {} : { selection })}\n />\n );\n}\n\nconst COLUMN_REORDER_ACTIVATION_DISTANCE = 6;\n\nfunction MatrxDataTableCore<T>({\n data: suppliedData,\n columns,\n tableId,\n defaultViewSnapshot,\n columnState,\n reorderableColumns = true,\n resizableColumns = true,\n columnManager: controlledColumnManager,\n getRowId,\n searchText,\n processLocalRows,\n defaultSort = null,\n isLoading: suppliedLoading = false,\n isFetching: suppliedFetching = false,\n query,\n urlState,\n toolbar,\n hideToolbar = false,\n hidePagination = false,\n filterUi,\n detail,\n window: windowConfig,\n copy,\n edit,\n hierarchy,\n selectedId: controlledSelectedId,\n onSelectedIdChange,\n windowRowId: controlledWindowRowId,\n onWindowRowIdChange,\n selection: selectionConfig,\n rowActions,\n footerRows = [],\n rowClassName,\n highlightedIndex,\n onViewChange,\n rowWrapper,\n emptyState,\n pageSize: defaultPageSize = 25,\n localPagination,\n pageSizeOptions = [10, 25, 50, 100, 200, 500, 1000, 2000],\n zebra = true,\n className,\n tableClassName,\n mobileCards,\n mobileCardsBreakpoint = \"sm\",\n onRowOpen,\n density,\n }: MatrxDataTableProps<T>) {\n const appendQuery = query?.mode === \"controlled-append\" ? query : null;\n const appendQueryKey = appendQuery?.pagination.queryKey ?? null;\n // Effects run after paint. Keep the last committed source identity in a ref\n // so a new append source cannot render a prior source's local UI state for\n // that first frame (including when the records happen to share ids).\n const committedAppendQueryKey = useRef<string | null>(appendQueryKey);\n const appendSourceChanged =\n appendQuery !== null && committedAppendQueryKey.current !== appendQueryKey;\n const data = appendQuery ? appendQuery.pagination.rows : suppliedData;\n const isLoading = appendQuery ? appendQuery.pagination.loading : suppliedLoading;\n const isFetching = appendQuery ? appendQuery.pagination.isFetchingNextPage : suppliedFetching;\n const host = useMatrxDataTableHost();\n const resolvedDensity = density ?? host.defaultDensity ?? \"normal\";\n const SavedViews = host.SavedViews;\n const Link = host.Link ?? DefaultTableLink;\n const SidePanelSurface = host.SidePanelSurface ?? DefaultTableSidePanel;\n const { notify: toast, notice } = useTableNotice();\n const [savedViewError, setSavedViewError] = useState<string | null>(null);\n const [toolbarActionError, setToolbarActionError] = useState<string | null>(null);\n const [toolbarActionPending, setToolbarActionPending] = useState({ refresh: false, add: false });\n const toolbarActionPendingRef = useRef({ refresh: false, add: false });\n // Coarse pointers receive a real, non-overlapping target from the shared\n // table density stylesheet. Do not add a pseudo-element hit zone here: it\n // overlaps neighboring cells and makes the visual table lie about targets.\n const CHECKBOX_TAP_AREA = \"h-4 w-4 touch-manipulation\";\n const mobileCardsClass =\n mobileCardsBreakpoint === \"lg\" ? \"lg:hidden\" : \"sm:hidden\";\n const tableWithCardsClass =\n mobileCardsBreakpoint === \"lg\" ? \"max-lg:hidden\" : \"max-sm:hidden\";\n const controlledQuery =\n query?.mode === \"controlled\" || query?.mode === \"controlled-local\" || query?.mode === \"controlled-append\"\n ? query\n : null;\n const remoteQuery = query?.mode === \"controlled\" || query?.mode === \"controlled-append\" ? query : null;\n const sourceProcessing = query?.mode === \"controlled\" || query?.mode === \"controlled-local\"\n ? query.sourceProcessing\n : appendQuery?.sourceProcessing;\n const appendUsesLocalProcessing = appendQuery !== null && sourceProcessing !== undefined;\n const sourceOwnsColumnFilters = appendQuery !== null && sourceProcessing === undefined\n ? true\n : sourceProcessing?.columnFilters === \"source\";\n const sourceOwnsSort = appendQuery !== null && sourceProcessing === undefined\n ? true\n : sourceProcessing?.sort === \"source\";\n // A source-owned query can only expose scope intent when it explicitly\n // declares support for ranking that scope. Controlled-local retains the\n // complete loaded rows only while ordinary search stays local.\n const sourceOwnsIntelligentSearch = sourceProcessing?.intelligentSearch === \"source\";\n const sourceOwnsSearch = remoteQuery?.mode === \"controlled\" ||\n (appendQuery !== null && sourceProcessing === undefined) ||\n sourceProcessing?.search === \"source\" || sourceOwnsIntelligentSearch;\n const intelligentSearchEnabled = toolbar?.intelligentSearch !== undefined &&\n (sourceOwnsIntelligentSearch || (remoteQuery === null && !sourceOwnsSearch));\n const emitControlledQueryChange = useCallback(\n (\n patch: Partial<MatrxDataTableQueryState>,\n options?: { resetPage?: boolean },\n ) => {\n if (!controlledQuery) return;\n controlledQuery.onStateChange(\n nextQueryState(controlledQuery.state, patch, options),\n );\n },\n [controlledQuery],\n );\n\n const [internalSearch, setInternalSearch] = useState(\"\");\n const [draggedRowId, setDraggedRowId] = useState<string | null>(null);\n const hierarchySensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: { distance: COLUMN_REORDER_ACTIVATION_DISTANCE },\n }),\n );\n const toolbarSearchControlled = toolbar?.searchValue !== undefined;\n const searchValue = controlledQuery\n ? controlledQuery.state.search\n : toolbarSearchControlled\n ? (toolbar?.searchValue ?? \"\")\n : internalSearch;\n const setSearchValue = (v: string) => {\n if (controlledQuery) {\n emitControlledQueryChange({ search: v }, { resetPage: true });\n } else if (!toolbarSearchControlled) {\n setInternalSearch(v);\n }\n toolbar?.onSearchChange?.(v);\n };\n const [internalSearchMatchMode, setInternalSearchMatchMode] =\n useState<TableSearchMatchMode>(\n toolbar?.searchMatch?.defaultMode ?? \"contains\",\n );\n const searchMatchMode = controlledQuery\n ? (controlledQuery.state.searchMatchMode ??\n toolbar?.searchMatch?.defaultMode ??\n \"contains\")\n : internalSearchMatchMode;\n const setSearchMatchMode = (mode: TableSearchMatchMode) => {\n if (controlledQuery) {\n emitControlledQueryChange({ searchMatchMode: mode }, { resetPage: true });\n return;\n }\n setInternalSearchMatchMode(mode);\n };\n const [internalSearchScope, setInternalSearchScope] = useState(\"all\");\n const searchScope = controlledQuery\n ? (controlledQuery.state.searchScope ?? \"all\")\n : internalSearchScope;\n const setSearchScope = (scope: string) => {\n if (controlledQuery) {\n emitControlledQueryChange({ searchScope: scope }, { resetPage: true });\n return;\n }\n setInternalSearchScope(scope);\n };\n\n const [internalAnyOf, setInternalAnyOf] = useState(\"\");\n const toolbarAnyOfControlled = toolbar?.anyOf?.value !== undefined;\n const anyOfValue = controlledQuery\n ? controlledQuery.state.anyOf\n : toolbarAnyOfControlled\n ? (toolbar?.anyOf?.value ?? \"\")\n : internalAnyOf;\n const setAnyOfValue = (v: string) => {\n if (controlledQuery) {\n emitControlledQueryChange({ anyOf: v }, { resetPage: true });\n } else if (!toolbarAnyOfControlled) {\n setInternalAnyOf(v);\n }\n toolbar?.anyOf?.onChange?.(v);\n };\n\n const [internalLayeredFilters, setInternalLayeredFilters] = useState<\n LayeredFilterRule[]\n >([]);\n const layeredFilters = controlledQuery\n ? (controlledQuery.state.layeredFilters ?? [])\n : internalLayeredFilters;\n const setLayeredFilters = (next: LayeredFilterRule[]) => {\n if (controlledQuery) {\n emitControlledQueryChange({ layeredFilters: next }, { resetPage: true });\n return;\n }\n setInternalLayeredFilters(next);\n };\n\n const [internalColumnFilters, setInternalColumnFilters] =\n useState<ColumnFiltersState>({});\n const columnFilters = controlledQuery\n ? controlledQuery.state.columnFilters\n : internalColumnFilters;\n const setColumnFilter = (id: string, next: ColumnFilterValue | undefined) => {\n const nextFilters = { ...columnFilters, [id]: next };\n if (controlledQuery) {\n emitControlledQueryChange(\n { columnFilters: nextFilters },\n { resetPage: true },\n );\n return;\n }\n setInternalColumnFilters(nextFilters);\n };\n\n const [internalSort, setInternalSort] = useState<SortState | null>(defaultSort);\n const sort = controlledQuery ? controlledQuery.state.sort : internalSort;\n const setSort = (next: SortState | null) => {\n if (controlledQuery) {\n emitControlledQueryChange({ sort: next }, { resetPage: true });\n return;\n }\n setInternalSort(next);\n };\n\n const [internalPage, setInternalPage] = useState(1);\n const page = controlledQuery ? controlledQuery.state.page : internalPage;\n const setPage = (next: number) => {\n if (controlledQuery) {\n emitControlledQueryChange({ page: next });\n return;\n }\n setInternalPage(next);\n };\n\n const [internalPageSize, setInternalPageSize] = useState(\n defaultPageSize === 0 ? Math.max(data.length, 1) : defaultPageSize,\n );\n const pageSize = controlledQuery\n ? controlledQuery.state.pageSize\n : internalPageSize;\n const setPageSize = (next: number) => {\n if (controlledQuery) {\n emitControlledQueryChange({ pageSize: next }, { resetPage: true });\n return;\n }\n setInternalPageSize(next);\n };\n\n const [uncontrolledSelectedId, setUncontrolledSelectedId] = useState<\n string | null\n >(null);\n const rawSelectedId =\n controlledSelectedId !== undefined\n ? controlledSelectedId\n : uncontrolledSelectedId;\n const selectedId = appendSourceChanged ? null : rawSelectedId;\n const setSelectedId = (id: string | null) => {\n if (controlledSelectedId === undefined) setUncontrolledSelectedId(id);\n onSelectedIdChange?.(id);\n };\n\n const [uncontrolledWindowRowId, setUncontrolledWindowRowId] = useState<\n string | null\n >(null);\n const rawWindowRowId =\n controlledWindowRowId !== undefined\n ? controlledWindowRowId\n : uncontrolledWindowRowId;\n const windowRowId = appendSourceChanged ? null : rawWindowRowId;\n const setWindowRowId = (id: string | null) => {\n if (controlledWindowRowId === undefined) setUncontrolledWindowRowId(id);\n onWindowRowIdChange?.(id);\n };\n const [windowRowSnapshot, setWindowRowSnapshot] = useState<{\n queryKey: string | null;\n row: T;\n } | null>(null);\n const editScopeKey = appendQueryKey === null ? \"\\u0000local\" : `append:${appendQueryKey}`;\n const [editsByScope, setEditsByScope] = useState<Record<string, {\n sourceKey: string | null;\n values: CellEditsMap;\n rows: T[];\n revisions: Record<string, Record<string, number>>;\n }>>({});\n const editRevisionRef = useRef<Record<string, Record<string, Record<string, number>>>>({});\n const [savingByScope, setSavingByScope] = useState<Record<string, number>>({});\n const [confirmForeignDraftDiscard, setConfirmForeignDraftDiscard] = useState(false);\n const edits = editsByScope[editScopeKey]?.values ?? {};\n const saving = (savingByScope[editScopeKey] ?? 0) > 0;\n const setEdits = (next: SetStateAction<CellEditsMap>) => {\n const scope = editScopeKey;\n setEditsByScope((current) => {\n const previous = current[scope];\n const values = typeof next === \"function\"\n ? next(previous?.values ?? {})\n : next;\n return {\n ...current,\n [scope]: {\n sourceKey: appendQueryKey,\n values,\n rows: appendQueryKey === null ? data : [...data],\n revisions: previous?.revisions ?? {},\n },\n };\n });\n };\n const setCellEdit = (rowId: string, field: string, value: unknown) => {\n const scope = editScopeKey;\n const scopeRevisions = editRevisionRef.current[scope] ?? {};\n const revision = (scopeRevisions[rowId]?.[field] ?? 0) + 1;\n editRevisionRef.current[scope] = {\n ...scopeRevisions,\n [rowId]: { ...(scopeRevisions[rowId] ?? {}), [field]: revision },\n };\n setEditsByScope((current) => {\n const previous = current[scope];\n const values = {\n ...(previous?.values ?? {}),\n [rowId]: { ...(previous?.values[rowId] ?? {}), [field]: value },\n };\n const revisions = {\n ...(previous?.revisions ?? {}),\n [rowId]: { ...(previous?.revisions[rowId] ?? {}), [field]: revision },\n };\n return {\n ...current,\n [scope]: {\n sourceKey: appendQueryKey,\n values,\n rows: appendQueryKey === null ? data : [...data],\n revisions,\n },\n };\n });\n return revision;\n };\n const startSaving = (scope: string) => {\n setSavingByScope((current) => ({ ...current, [scope]: (current[scope] ?? 0) + 1 }));\n };\n const finishSaving = (scope: string) => {\n setSavingByScope((current) => {\n const remaining = Math.max(0, (current[scope] ?? 1) - 1);\n const next = { ...current };\n if (remaining === 0) delete next[scope];\n else next[scope] = remaining;\n return next;\n });\n };\n const foreignDrafts = Object.entries(editsByScope)\n .filter(([scope, draft]) => scope !== editScopeKey && Object.keys(draft.values).length > 0)\n .map(([, draft]) => draft);\n const foreignDraftPayload = foreignDrafts.map((draft) => ({\n sourceKey: draft.sourceKey,\n rows: Object.entries(draft.values).map(([rowId, columns]) => ({ rowId, columns })),\n }));\n const selection =\n appendSourceChanged && selectionConfig\n ? { ...selectionConfig, selectedIds: [] }\n : selectionConfig;\n\n useEffect(() => {\n const previous = committedAppendQueryKey.current;\n committedAppendQueryKey.current = appendQueryKey;\n // A first append render and leaving append mode do not replace one remote\n // result set with another. A changed non-null key does.\n if (previous === null || appendQueryKey === null || previous === appendQueryKey) {\n return;\n }\n setUncontrolledSelectedId(null);\n setUncontrolledWindowRowId(null);\n setWindowRowSnapshot(null);\n onSelectedIdChange?.(null);\n onWindowRowIdChange?.(null);\n selectionConfig?.onSelectedIdsChange([]);\n }, [\n appendQueryKey,\n onSelectedIdChange,\n onWindowRowIdChange,\n selectionConfig,\n ]);\n\n // Mobile scroll affordance: edge fades (+ chevron) show that more columns\n // exist off-screen. Recomputed on scroll/resize; desktop hides them via CSS.\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const tableRef = useRef<HTMLTableElement | null>(null);\n const cardsScrollRef = useRef<HTMLDivElement | null>(null);\n const previousAppendKeyForScrollReset = useRef<string | null>(appendQueryKey);\n\n // A source replacement (filter, sort, refresh, or organization change) starts\n // at the first result before it paints. Preserve horizontal position: it is a\n // deliberate column-reading choice, not part of the source window.\n useLayoutEffect(() => {\n const previous = previousAppendKeyForScrollReset.current;\n previousAppendKeyForScrollReset.current = appendQueryKey;\n if (\n previous === null ||\n appendQueryKey === null ||\n previous === appendQueryKey\n ) {\n return;\n }\n if (scrollRef.current) scrollRef.current.scrollTop = 0;\n if (cardsScrollRef.current) cardsScrollRef.current.scrollTop = 0;\n }, [appendQueryKey]);\n\n const appendScrollPolicy = appendQuery?.scroll;\n const scrollPagination = useScrollPagination({\n containers: [scrollRef, cardsScrollRef],\n queryKey: appendQuery?.pagination.queryKey ?? \"\",\n hasNextPage: appendQuery?.pagination.hasNextPage ?? false,\n isFetchingNextPage: appendQuery?.pagination.isFetchingNextPage ?? false,\n loading: appendQuery?.pagination.loading ?? false,\n error: appendQuery?.pagination.error ?? null,\n loadNextPage: appendQuery?.pagination.loadNextPage ?? (() => undefined),\n enabled: appendQuery !== null,\n // Suspended policy is deliberately manual at the hook boundary: its\n // reason remains visible in the footer while automatic listeners stay off.\n mode: appendScrollPolicy?.mode === \"suspended\" ? \"manual\" : appendScrollPolicy?.mode ?? \"scroll\",\n ...(appendScrollPolicy?.mode === \"scroll\" && appendScrollPolicy.thresholdPx !== undefined\n ? { thresholdPx: appendScrollPolicy.thresholdPx }\n : {}),\n ...(appendScrollPolicy?.mode === \"scroll\" && appendScrollPolicy.intentTimeoutMs !== undefined\n ? { intentTimeoutMs: appendScrollPolicy.intentTimeoutMs }\n : {}),\n });\n // The table bounds itself with `h-full`, which is inert unless every\n // ancestor is a flex column. When one is not, the table grows past the page\n // and an `overflow-hidden` ancestor clips it: no scrollbar, unreachable\n // rows, no error anywhere. This screams instead.\n const rootRef = useRef<HTMLDivElement | null>(null);\n useClippedContentGuard(rootRef, {\n label: typeof copy === \"object\" && copy.listLabel ? `Table: ${copy.listLabel}` : \"MatrxDataTable\",\n });\n const [scrollHintRight, setScrollHintRight] = useState(false);\n const [scrollHintLeft, setScrollHintLeft] = useState(false);\n const updateScrollHint = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n setScrollHintRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 2);\n setScrollHintLeft(el.scrollLeft > 2);\n }, []);\n const scrollTableHorizontally = (direction: \"left\" | \"right\") => {\n const el = scrollRef.current;\n if (!el) return;\n el.scrollBy({\n left:\n (direction === \"right\" ? 1 : -1) *\n Math.max(Math.round(el.clientWidth * 0.72), 240),\n behavior: \"smooth\",\n });\n };\n useEffect(() => {\n updateScrollHint();\n window.addEventListener(\"resize\", updateScrollHint);\n // The window is not the only thing that changes this container's width —\n // a collapsing sidebar, an opening panel, or a column set that arrives a\n // tick later all do, and each one silently invalidated the hint before.\n const el = scrollRef.current;\n const observer =\n el && typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(updateScrollHint)\n : null;\n if (el && observer) {\n observer.observe(el);\n const table = el.querySelector(\"table\");\n if (table) observer.observe(table);\n }\n return () => {\n window.removeEventListener(\"resize\", updateScrollHint);\n observer?.disconnect();\n };\n }, [updateScrollHint, data, columns]);\n\n const [columnOrder, setColumnOrder] = useState(() => columnState?.order ?? columns.map(columnId));\n const [hiddenColumnIds, setHiddenColumnIds] = useState(\n () => new Set(columnState?.hidden ?? columns.filter((column) => column.hidden).map(columnId)),\n );\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>(\n () => normalizeColumnWidthsForColumns(columnState?.widths, columns),\n );\n const [fixedTableGeometry, setFixedTableGeometry] = useState<FixedTableGeometry | null>(null);\n const knownColumnIds = useRef(new Set(columns.map(columnId)));\n const draggedColumnId = useRef<string | null>(null);\n const columnDragActive = useRef(false);\n const columnDragRaf = useRef<number | null>(null);\n const columnDragScrollDirection = useRef<-1 | 0 | 1>(0);\n const [columnDragPreview, setColumnDragPreview] = useState<ColumnDragPreview | null>(null);\n const stopColumnDragScroll = useCallback(() => {\n if (columnDragRaf.current !== null) cancelAnimationFrame(columnDragRaf.current);\n columnDragRaf.current = null;\n columnDragScrollDirection.current = 0;\n }, []);\n useEffect(() => () => {\n columnDragActive.current = false;\n stopColumnDragScroll();\n }, [stopColumnDragScroll]);\n const startColumnDragScroll = useCallback(() => {\n if (!columnDragActive.current || columnDragRaf.current !== null) return;\n const scrollStep = () => {\n const scroll = scrollRef.current;\n const direction = columnDragScrollDirection.current;\n if (!columnDragActive.current || !scroll || direction === 0) {\n columnDragRaf.current = null;\n return;\n }\n const nextScrollLeft = Math.max(\n 0,\n Math.min(scroll.scrollLeft + direction * 18, scroll.scrollWidth - scroll.clientWidth),\n );\n if (nextScrollLeft === scroll.scrollLeft) {\n columnDragRaf.current = null;\n columnDragScrollDirection.current = 0;\n return;\n }\n scroll.scrollLeft = nextScrollLeft;\n if (!columnDragActive.current || columnDragScrollDirection.current === 0) {\n columnDragRaf.current = null;\n return;\n }\n columnDragRaf.current = requestAnimationFrame(scrollStep);\n };\n columnDragRaf.current = requestAnimationFrame(scrollStep);\n }, []);\n const commitColumnState = useCallback((order: string[], hidden: Set<string>) => {\n if (columnState) columnState.onChange({ order, hidden: [...hidden] });\n else {\n setColumnOrder(order);\n setHiddenColumnIds(hidden);\n }\n }, [columnState]);\n const [internalColumnManagerOpen, setInternalColumnManagerOpen] = useState(false);\n const columnManagerOpen = controlledColumnManager?.open ?? internalColumnManagerOpen;\n const setColumnManagerOpen = controlledColumnManager?.onOpenChange ?? setInternalColumnManagerOpen;\n const columnIds = useMemo(() => columns.map(columnId), [columns]);\n const effectiveColumnOrder = useMemo(() => columnState\n ? [...columnState.order.filter((id, index, values) => columnIds.includes(id) && values.indexOf(id) === index), ...columnIds.filter((id) => !columnState.order.includes(id))]\n : columnOrder, [columnIds, columnOrder, columnState]);\n const effectiveHiddenColumnIds = useMemo(() => columnState\n ? new Set(columnState.hidden.filter((id) => columnIds.includes(id)))\n : hiddenColumnIds, [columnIds, columnState, hiddenColumnIds]);\n const effectiveColumnWidths = useMemo(\n () => normalizeColumnWidthsForColumns(columnState?.widths ?? columnWidths, columns),\n [columns, columnState?.widths, columnWidths],\n );\n const resizeGestureSnapshotRef = useRef<{\n widths: Record<string, number>;\n geometry: FixedTableGeometry;\n } | null>(null);\n const measureVisibleColumnWidths = useCallback(() => {\n const measured: Record<string, number> = {};\n const headers = tableRef.current\n ? Array.from(tableRef.current.querySelectorAll<HTMLTableCellElement>(\n \"thead th[data-matrx-table-column-id]\",\n ))\n : [];\n for (const header of headers) {\n const columnId = header.dataset.matrxTableColumnId;\n const width = header.getBoundingClientRect().width;\n if (columnId && Number.isFinite(width) && width > 0) {\n measured[columnId] = Math.round(width);\n }\n }\n return normalizeColumnWidthsForColumns(measured, columns);\n }, [columns]);\n const measureFixedTableGeometry = useCallback((): FixedTableGeometry => {\n const table = tableRef.current;\n const headers = table\n ? Array.from(table.querySelectorAll<HTMLTableCellElement>(\"thead th\"))\n : [];\n const widthFor = (selector: string) => {\n const header = table?.querySelector<HTMLTableCellElement>(selector);\n const width = header?.getBoundingClientRect().width ?? 0;\n return Number.isFinite(width) && width > 0 ? Math.round(width) : undefined;\n };\n const headerTotal = headers.reduce(\n (total, header) => total + Math.max(0, header.getBoundingClientRect().width),\n 0,\n );\n const selectionWidth = widthFor(\"th[data-matrx-table-selection-column]\");\n const headerActionsWidth = widthFor(\"th[data-matrx-table-actions-column]\");\n // A fixed-width actions header can report the previous density while its\n // inline action strip is clipped. scrollWidth remains the strip's natural\n // width, so it is the authoritative lower bound after a density change.\n const visibleActionStrips = Array.from(\n table?.querySelectorAll<HTMLElement>(\"[data-matrx-table-row-actions]\") ?? [],\n ).filter(\n (element) =>\n element.closest(\"table\") === table && element.getClientRects().length > 0,\n );\n const actionContentWidth = Math.max(\n 0,\n ...visibleActionStrips.map((element) => Math.ceil(element.scrollWidth)),\n );\n // A visible strip is authoritative: the header can still be constrained\n // by the preceding density. Hidden mobile-card strips never participate.\n const actionsWidth = actionContentWidth || headerActionsWidth;\n return {\n ...(headerTotal > 0 ? { tableWidth: Math.ceil(headerTotal) } : {}),\n ...(selectionWidth === undefined ? {} : { selectionWidth }),\n ...(actionsWidth === undefined ? {} : { actionsWidth }),\n };\n }, [resolvedDensity]);\n const captureResizeGestureSnapshot = useCallback(() => {\n resizeGestureSnapshotRef.current = {\n widths: measureVisibleColumnWidths(),\n geometry: measureFixedTableGeometry(),\n };\n }, [measureFixedTableGeometry, measureVisibleColumnWidths]);\n const clearResizeGestureSnapshot = useCallback(() => {\n resizeGestureSnapshotRef.current = null;\n }, []);\n const commitColumnWidths = useCallback((next: Record<string, number>, captureInitialWidths = false) => {\n // Initial rendering deliberately uses native auto layout. On the first\n // resize, use every visible data-column width captured at gesture start\n // before the preview can redistribute native auto layout, then switch to\n // fixed layout; a single fixed hint would otherwise redistribute the\n // unspecified columns. Utility columns are measured separately and remain\n // non-resizable.\n const gestureSnapshot = captureInitialWidths ? resizeGestureSnapshotRef.current : null;\n resizeGestureSnapshotRef.current = null;\n const normalized = normalizeColumnWidthsForColumns(\n captureInitialWidths\n ? { ...(gestureSnapshot?.widths ?? measureVisibleColumnWidths()), ...next }\n : next,\n columns,\n );\n if (captureInitialWidths) {\n setFixedTableGeometry(gestureSnapshot?.geometry ?? measureFixedTableGeometry());\n }\n else setFixedTableGeometry(null);\n for (const id of columnIds) {\n tableRef.current?.style.removeProperty(columnResizeCssVar(id));\n }\n if (columnState) {\n columnState.onWidthsChange?.(normalized);\n return;\n }\n setColumnWidths(normalized);\n }, [columnIds, columnState, columns, measureFixedTableGeometry, measureVisibleColumnWidths]);\n useEffect(() => {\n const ids = columns.map(columnId);\n if (columnState) return;\n const previousIds = knownColumnIds.current;\n setColumnOrder((current) => [\n ...current.filter((id) => ids.includes(id)),\n ...ids.filter((id) => !current.includes(id)),\n ]);\n setHiddenColumnIds((current) => {\n const next = new Set([...current].filter((id) => ids.includes(id)));\n for (const column of columns) {\n const id = columnId(column);\n if (column.hidden && !previousIds.has(id)) next.add(id);\n }\n return next;\n });\n setColumnWidths((current) => normalizeColumnWidthsForColumns(current, columns));\n knownColumnIds.current = new Set(ids);\n }, [columns, columnState]);\n // Pointer moves are imperative previews. A committed, restored, or\n // externally controlled width must remove that transient override so the\n // declarative per-column fallback is the sole source of truth.\n useLayoutEffect(() => {\n for (const id of columnIds) {\n tableRef.current?.style.removeProperty(columnResizeCssVar(id));\n }\n });\n const previewColumnOrder = useMemo(\n () => projectColumnDragOrder(effectiveColumnOrder, columnDragPreview),\n [columnDragPreview, effectiveColumnOrder],\n );\n useColumnReorderAnimation(tableRef, previewColumnOrder.join(\"\\0\"), columnDragPreview !== null);\n const visibleColumns = useMemo(() => {\n const byId = new Map(columns.map((column) => [columnId(column), column]));\n return previewColumnOrder\n .map((id) => byId.get(id))\n .filter(\n (column): column is MatrxColumnDef<T> =>\n column !== undefined && !effectiveHiddenColumnIds.has(columnId(column)),\n );\n }, [columns, effectiveHiddenColumnIds, previewColumnOrder]);\n const usesMeasuredFixedLayout = visibleColumns.length > 0 &&\n visibleColumns.every((column) => effectiveColumnWidths[columnId(column)] !== undefined);\n useLayoutEffect(() => {\n if (!usesMeasuredFixedLayout) {\n if (fixedTableGeometry !== null) setFixedTableGeometry(null);\n return;\n }\n if (fixedTableGeometry === null) setFixedTableGeometry(measureFixedTableGeometry());\n }, [fixedTableGeometry, measureFixedTableGeometry, usesMeasuredFixedLayout]);\n // Utility columns are content-sized before the first resize. When table\n // density changes, remeasure only that fixed utility geometry; the explicit\n // data-column widths remain the source of truth and siblings never rebalance.\n useLayoutEffect(() => {\n if (!usesMeasuredFixedLayout) return;\n const table = tableRef.current;\n if (!table) return;\n const utilityHeaders = Array.from(table.querySelectorAll<HTMLTableCellElement>(\n \"th[data-matrx-table-selection-column], th[data-matrx-table-actions-column]\",\n ));\n const utilityStyles = utilityHeaders.map((header) => header.getAttribute(\"style\"));\n const resizedWidth = table.style.getPropertyValue(\"--matrx-resized-table-width\");\n // Fixed-layout utility widths describe the prior density. Temporarily\n // release only those constraints (and the table total) so this measure\n // sees the current action content. Data-column width state is untouched.\n for (const header of utilityHeaders) header.removeAttribute(\"style\");\n table.style.removeProperty(\"--matrx-resized-table-width\");\n void table.getBoundingClientRect();\n const geometry = measureFixedTableGeometry();\n utilityHeaders.forEach((header, index) => {\n const style = utilityStyles[index];\n if (style == null) header.removeAttribute(\"style\");\n else header.setAttribute(\"style\", style);\n });\n table.style.setProperty(\"--matrx-resized-table-width\", resizedWidth);\n setFixedTableGeometry(geometry);\n }, [resolvedDensity, measureFixedTableGeometry, usesMeasuredFixedLayout]);\n const fixedLayoutActive = usesMeasuredFixedLayout && fixedTableGeometry !== null;\n const declaredVisibleCopyColumns = useMemo(\n () => visibleColumns.filter((column) => column.accessorFn !== undefined || column.accessorKey !== undefined),\n [visibleColumns],\n );\n const tableCopySourceNamespace = useId();\n // dnd-kit otherwise assigns its screen-reader description from a module-global\n // counter, which differs between SSR and the browser bundle during hydration.\n const tableDndContextId = useId();\n const defaultCopyTitle = toolbar?.title || \"Table\";\n const defaultCopy = useMemo<MatrxDataTableCopyConfig<T>>(() => ({\n label: defaultCopyTitle,\n listLabel: defaultCopyTitle,\n location: defaultCopyTitle,\n rowKind: \"table-row\",\n listKind: \"table-view\",\n listDescription: `${defaultCopyTitle} — ${remoteQuery ? \"current filtered/sorted loaded view\" : \"current filtered/sorted view\"}.`,\n listAttributes: (_visible, loaded) => remoteQuery\n ? { coverage: \"loaded-current-view\", loaded_count: loaded.length }\n : { coverage: \"current-view\" },\n humanRow: (row) => formatDefaultTableCopyRecord(\n projectDefaultTableCopyRow(row, declaredVisibleCopyColumns),\n declaredVisibleCopyColumns,\n ),\n agentRow: (row) => projectDefaultTableCopyRow(row, declaredVisibleCopyColumns),\n }), [defaultCopyTitle, declaredVisibleCopyColumns, remoteQuery]);\n // The built-in table source is the normal contract; false is the only opt-out.\n // Keep this after visibleColumns so the default captures the effective order and visibility.\n const effectiveCopy = copy === false ? undefined : copy ?? defaultCopy;\n const effectiveCopyColumns = copy === undefined ? declaredVisibleCopyColumns : visibleColumns;\n\n /**\n * \"Filter & sort before copying…\" — every table with a `copy` config\n * offers the copy-subset door on its view copy AND its selected-rows copy.\n * Suppressed in remote controlled mode: there `data` is one server page,\n * and a door promising \"exactly what you want from the data\" over one page\n * would be a lie (a fetch-all seam is the honest prerequisite).\n */\n const copySubsetVariant = useCopySubsetVariant<T>();\n const copySubsetColumns = (): CopySubsetColumn<T>[] =>\n effectiveCopyColumns\n .filter((c) => c.filter !== false || c.accessorKey || c.accessorFn)\n .map((c) => ({\n id: columnId(c),\n header: typeof c.header === \"string\" ? c.header : columnId(c),\n ...(c.accessorKey === undefined ? {} : { accessorKey: c.accessorKey }),\n ...(c.accessorFn === undefined ? {} : { accessorFn: c.accessorFn }),\n ...(c.filter === undefined ? {} : { filter: c.filter }),\n }));\n const copySubsetVariantFor = (\n rows: () => T[],\n scope: \"view\" | \"selected\",\n ) =>\n effectiveCopy && !remoteQuery\n ? [\n copySubsetVariant(() => ({\n label:\n scope === \"selected\"\n ? `${rows().length} selected ${selectionNoun}${rows().length === 1 ? \"\" : \"s\"}`\n : (effectiveCopy.listLabel ?? `${effectiveCopy.label} view`),\n location: effectiveCopy.location,\n kind: effectiveCopy.listKind,\n rows: rows(),\n columns: copySubsetColumns(),\n getRowId,\n serializer: (shaped: T[]) =>\n buildViewAgentInput(effectiveCopy, shaped, data, { scope: \"custom\" }),\n })),\n ]\n : [];\n\n const filterMeta = useMemo(() => {\n const meta = new Map<string, QueryFilterMeta>();\n for (const col of visibleColumns) {\n const id = columnId(col);\n meta.set(id, resolveQueryFilterMeta(col, data, Boolean(remoteQuery)));\n }\n return meta;\n }, [visibleColumns, data, remoteQuery]);\n const intelligentSearchScopes = useMemo(\n () => resolveTableSearchScopes(data, columns, {\n ...(toolbar?.intelligentSearch?.roles === undefined\n ? {}\n : { roles: toolbar.intelligentSearch.roles }),\n ...(toolbar?.intelligentSearch?.scopes === undefined\n ? {}\n : { scopes: toolbar.intelligentSearch.scopes }),\n }),\n [columns, data, toolbar?.intelligentSearch?.roles, toolbar?.intelligentSearch?.scopes],\n );\n\n const processed = useMemo(() => {\n if (remoteQuery && !appendUsesLocalProcessing) return data;\n if (processLocalRows) {\n return processLocalRows(data, {\n page,\n pageSize,\n search: searchValue,\n searchMatchMode,\n ...(intelligentSearchEnabled ? { searchScope } : {}),\n anyOf: anyOfValue,\n layeredFilters,\n columnFilters,\n sort,\n });\n }\n const locallyFiltered = filterAndSortRows(\n data,\n intelligentSearchEnabled ? columns : visibleColumns,\n sourceOwnsColumnFilters ? {} : columnFilters,\n sourceOwnsSort ? null : sort,\n intelligentSearchEnabled || toolbar?.search === false || sourceOwnsSearch ? \"\" : searchValue,\n toolbar?.anyOf\n ? { columnIds: toolbar.anyOf.columnIds, query: anyOfValue }\n : undefined,\n layeredFilters,\n searchMatchMode,\n searchText,\n );\n if (!intelligentSearchEnabled || sourceOwnsSearch) return locallyFiltered;\n return rankTableSearchRows(\n locallyFiltered,\n columns,\n searchValue,\n {\n scope: searchScope,\n ...(toolbar?.intelligentSearch?.roles === undefined\n ? {}\n : { roles: toolbar.intelligentSearch.roles }),\n ...(toolbar?.intelligentSearch?.scopes === undefined\n ? {}\n : { scopes: toolbar.intelligentSearch.scopes }),\n matchMode: searchMatchMode,\n },\n searchText,\n );\n }, [\n data,\n visibleColumns,\n columnFilters,\n sort,\n searchValue,\n toolbar,\n anyOfValue,\n layeredFilters,\n searchMatchMode,\n searchText,\n columns,\n processLocalRows,\n page,\n pageSize,\n remoteQuery,\n appendUsesLocalProcessing,\n sourceOwnsColumnFilters,\n sourceOwnsSort,\n sourceOwnsSearch,\n intelligentSearchEnabled,\n searchScope,\n ]);\n\n const lastNotifiedViewRows = useRef<T[] | null>(null);\n useEffect(() => {\n if (!onViewChange) {\n lastNotifiedViewRows.current = null;\n return;\n }\n const changed =\n lastNotifiedViewRows.current === null ||\n !hasSameRowReferences(lastNotifiedViewRows.current, processed);\n lastNotifiedViewRows.current = processed;\n if (changed) onViewChange(processed);\n }, [processed, onViewChange]);\n\n useEffect(() => {\n if (controlledQuery) return;\n // eslint-disable-next-line react-hooks/set-state-in-effect -- Preserve the original local-mode contract: every query-shape change returns to page one, including externally controlled toolbar values.\n setInternalPage(1);\n }, [\n searchValue,\n searchMatchMode,\n anyOfValue,\n layeredFilters,\n columnFilters,\n sort,\n pageSize,\n controlledQuery,\n ]);\n\n const totalItems = appendQuery\n ? (appendQuery.pagination.totalItems ?? processed.length)\n : remoteQuery?.mode === \"controlled\"\n ? Math.max(0, remoteQuery.totalItems)\n : processed.length;\n const sourceTotal = sourceProcessing?.sourceTotal;\n const allRowsAreLoaded =\n !remoteQuery && (sourceTotal === undefined || sourceTotal <= data.length);\n // `0` is the table's local-only All sentinel. A remote source is never\n // handed that sentinel: it has only one loaded page (or an append receipt),\n // so showing all would lie and could turn into an unbounded request.\n const effectivePageSize = remoteQuery\n ? Math.max(pageSize, 1)\n : pageSize === 0\n ? Math.max(totalItems, 1)\n : Math.max(pageSize, 1);\n const pageCount = Math.max(1, Math.ceil(totalItems / effectivePageSize));\n const safePage = appendQuery ? 1 : remoteQuery\n ? safeQueryPage(page, totalItems, effectivePageSize)\n : Math.min(page, pageCount);\n // A source-owned projection without a completeness receipt is not a full\n // local dataset. Its source must supply the controlled-append contract.\n const sourceOwnsProcessing = sourceOwnsSearch || sourceOwnsSort || sourceOwnsColumnFilters;\n const localProgressiveEnabled = !remoteQuery && !hidePagination &&\n allRowsAreLoaded && (!sourceOwnsProcessing || sourceTotal !== undefined) &&\n localPagination?.mode !== \"numbered\";\n const progressiveRows = useProgressiveTableRows({\n rows: processed,\n pageSize,\n requestedPage: safePage,\n queryKey: JSON.stringify({ tableId, searchValue, searchMatchMode, searchScope,\n anyOfValue, layeredFilters, columnFilters, sort }),\n containers: [scrollRef, cardsScrollRef],\n enabled: localProgressiveEnabled,\n numberedPageHasMore: !hidePagination && !isLoading && !isFetching &&\n processed.length > 0 && safePage < pageCount &&\n (remoteQuery?.mode === \"controlled\" ||\n (!remoteQuery && localPagination?.mode === \"numbered\")),\n onPageAdvance: setPage,\n });\n const paginated = useMemo(() => {\n if (remoteQuery) return processed;\n if (hidePagination) return processed;\n if (localProgressiveEnabled) return [...progressiveRows.rows];\n if (pageSize === 0) return processed;\n const start = (safePage - 1) * effectivePageSize;\n return processed.slice(start, start + effectivePageSize);\n }, [processed, safePage, effectivePageSize, pageSize, remoteQuery, hidePagination, localProgressiveEnabled, progressiveRows.rows]);\n\n // A deletion or narrower filter can leave a controlled URL on a page that\n // no longer exists. Emit the clamped page once the new total arrives.\n useEffect(() => {\n if (!controlledQuery || controlledQuery.state.page === safePage) return;\n emitControlledQueryChange({ page: safePage });\n }, [controlledQuery, emitControlledQueryChange, safePage]);\n\n const selectedRow = useMemo(() => {\n if (!selectedId) return null;\n return data.find((r) => getRowId(r) === selectedId) ?? null;\n }, [data, selectedId, getRowId]);\n\n const windowRow = useMemo(() => {\n if (!windowRowId) return null;\n return (\n data.find((r) => getRowId(r) === windowRowId) ??\n (windowRowSnapshot &&\n windowRowSnapshot.queryKey === appendQueryKey &&\n getRowId(windowRowSnapshot.row) === windowRowId\n ? windowRowSnapshot.row\n : null)\n );\n }, [data, windowRowId, windowRowSnapshot, getRowId, appendQueryKey]);\n\n const detailEnabled = detail?.enabled !== false;\n const windowEnabled =\n windowConfig?.enabled !== false && (detailEnabled || Boolean(windowConfig));\n const opensWindowOnRowClick = Boolean(\n windowEnabled && windowConfig?.openOnRowClick !== false,\n );\n const editEnabled = Boolean(edit?.enabled && edit.onSave);\n const showRowCopy = effectiveCopy !== undefined && effectiveCopy.showRow !== false;\n const showToolbarCopy = effectiveCopy !== undefined && effectiveCopy.showToolbar !== false;\n\n const activeFilterCount = countActiveColumnFilters(columnFilters);\n const facetActive = (toolbar?.facets ?? []).some((f) => {\n if (f.type !== \"button-group\") return false;\n const def = f.defaultValue ?? f.options[0]?.value;\n return def !== undefined && f.value !== def;\n });\n const hasActiveFilters =\n activeFilterCount > 0 ||\n Boolean(searchValue.trim()) ||\n (intelligentSearchEnabled && searchScope !== \"all\") ||\n Boolean(anyOfValue.trim()) ||\n completeLayeredFilterRules(layeredFilters).length > 0 ||\n facetActive;\n\n const changeCount = useMemo(() => {\n let n = 0;\n for (const fields of Object.values(edits)) {\n n += Object.keys(fields).length;\n }\n return n;\n }, [edits]);\n\n const showSearch = toolbar?.search !== false;\n\n const openDetail = (row: T) => {\n if (!detailEnabled) {\n onRowOpen?.(row);\n return;\n }\n setSelectedId(getRowId(row));\n onRowOpen?.(row);\n };\n\n const openWindow = (row: T, e?: React.MouseEvent) => {\n e?.stopPropagation();\n // Prefer window.onOpen so consumers can hydrate the Edit tab without also\n // opening the side panel (onRowOpen is reserved for row-click → detail).\n if (windowConfig?.onOpen) {\n windowConfig.onOpen(row);\n } else if (!windowConfig?.openOnRowClick) {\n onRowOpen?.(row);\n }\n setWindowRowSnapshot({ queryKey: appendQueryKey, row });\n setWindowRowId(getRowId(row));\n };\n\n const closeWindow = () => {\n setWindowRowId(null);\n setWindowRowSnapshot(null);\n };\n\n const openRow = (row: T) => {\n if (opensWindowOnRowClick) {\n openWindow(row);\n return;\n }\n openDetail(row);\n };\n\n const clearAllFilters = () => {\n if (controlledQuery) {\n emitControlledQueryChange(\n {\n search: \"\",\n searchMatchMode: toolbar?.searchMatch?.defaultMode ?? \"contains\",\n ...(intelligentSearchEnabled ? { searchScope: \"all\" } : {}),\n anyOf: \"\",\n layeredFilters: [],\n columnFilters: {},\n },\n { resetPage: true },\n );\n toolbar?.onSearchChange?.(\"\");\n toolbar?.anyOf?.onChange?.(\"\");\n } else {\n setInternalColumnFilters({});\n setSearchValue(\"\");\n setInternalSearchMatchMode(\n toolbar?.searchMatch?.defaultMode ?? \"contains\",\n );\n setInternalSearchScope(\"all\");\n setAnyOfValue(\"\");\n setInternalLayeredFilters([]);\n }\n resetToolbarFacets(toolbar?.facets);\n };\n\n const commitCell = (rowId: string, field: string, next: unknown) => {\n const scope = editScopeKey;\n const nextEdits = { [rowId]: { [field]: next } };\n const revision = setCellEdit(rowId, field, next);\n if (edit?.autoSave && edit.onSave) {\n const rowsAtCommit = appendQueryKey === null ? data : [...data];\n const save = edit.onSave;\n startSaving(scope);\n void Promise.resolve().then(() => save(nextEdits, rowsAtCommit))\n .then(() => {\n setEditsByScope((current) => {\n const draft = current[scope];\n if (!draft || draft.revisions[rowId]?.[field] !== revision) return current;\n const rowDraft = draft.values[rowId];\n if (!rowDraft) return current;\n const { [field]: _saved, ...remainingFields } = rowDraft;\n const values = { ...draft.values };\n if (Object.keys(remainingFields).length === 0) delete values[rowId];\n else values[rowId] = remainingFields;\n return { ...current, [scope]: { ...draft, values } };\n });\n toast.success(\"Change saved\");\n })\n .catch((error: unknown) => {\n toast.error(\n `Couldn't save: ${error instanceof Error ? error.message : String(error)}`,\n );\n })\n .finally(() => finishSaving(scope));\n }\n };\n\n const discardRowEdits = (rowId: string) => {\n setEdits((previous) => {\n if (!previous[rowId]) return previous;\n const next = { ...previous };\n delete next[rowId];\n return next;\n });\n };\n\n const hierarchyRows = hierarchy?.rows ?? data;\n const hierarchyGetParentId = hierarchy?.getParentId;\n // O(1) lookups for everything the drag path needs. The previous\n // implementation walked ancestor chains with linear `.find`s per row per\n // render — quadratic work re-run on every drag event.\n const hierarchyIndex = useMemo(() => {\n if (!hierarchyGetParentId) return null;\n const byId = new Map<string, T>();\n const parentById = new Map<string, string | null>();\n for (const row of hierarchyRows) {\n const id = getRowId(row);\n byId.set(id, row);\n parentById.set(id, hierarchyGetParentId(row));\n }\n const depthById = new Map<string, number>();\n const depthOf = (id: string): number => {\n const known = depthById.get(id);\n if (known !== undefined) return known;\n // Iterative walk with cycle guard — bad data must not hang the tab.\n const chain: string[] = [];\n let cursor: string | null = id;\n while (\n cursor !== null &&\n !depthById.has(cursor) &&\n chain.length <= byId.size\n ) {\n chain.push(cursor);\n const parent: string | null = parentById.get(cursor) ?? null;\n cursor = parent !== null && byId.has(parent) ? parent : null;\n }\n let depth = cursor !== null ? (depthById.get(cursor) ?? 0) : -1;\n for (let i = chain.length - 1; i >= 0; i -= 1) {\n depth += 1;\n const chainId = chain[i];\n if (chainId !== undefined) depthById.set(chainId, depth);\n }\n return depthById.get(id) ?? 0;\n };\n for (const id of byId.keys()) depthOf(id);\n return { byId, parentById, depthById };\n }, [hierarchyGetParentId, hierarchyRows, getRowId]);\n const draggedRow =\n draggedRowId && hierarchyIndex\n ? hierarchyIndex.byId.get(draggedRowId)\n : undefined;\n // The dragged row plus its whole subtree: every id a drop may not land\n // inside. Built once per drag, not re-derived per row per render.\n const hierarchyBlockedIds = useMemo(() => {\n if (!draggedRowId || !hierarchyIndex) return null;\n const childrenById = new Map<string, string[]>();\n for (const [id, parentId] of hierarchyIndex.parentById) {\n if (parentId === null) continue;\n const siblings = childrenById.get(parentId);\n if (siblings) siblings.push(id);\n else childrenById.set(parentId, [id]);\n }\n const blocked = new Set<string>([draggedRowId]);\n const queue = [draggedRowId];\n while (queue.length > 0) {\n const id = queue.pop();\n if (id === undefined) break;\n for (const child of childrenById.get(id) ?? []) {\n if (!blocked.has(child)) {\n blocked.add(child);\n queue.push(child);\n }\n }\n }\n return blocked;\n }, [draggedRowId, hierarchyIndex]);\n const hierarchyDropZones = (\n targetId: string,\n ): { insideOk: boolean; siblingOk: boolean } => {\n if (!hierarchyIndex || !hierarchyBlockedIds || targetId === draggedRowId) {\n return { insideOk: false, siblingOk: false };\n }\n const parentId = hierarchyIndex.parentById.get(targetId) ?? null;\n return {\n insideOk: !hierarchyBlockedIds.has(targetId),\n siblingOk:\n Boolean(hierarchy?.manualOrder) &&\n (parentId === null || !hierarchyBlockedIds.has(parentId)),\n };\n };\n const canDropOn = (target: T): boolean => {\n const zones = hierarchyDropZones(getRowId(target));\n return zones.insideOk || zones.siblingOk;\n };\n const persistHierarchyMove = (row: T, move: MatrxDataTableHierarchyMove) => {\n if (!hierarchy) return;\n void Promise.resolve(hierarchy.onMove(row, move)).catch(\n (error: unknown) => {\n toast.error(\n `Couldn't move row: ${error instanceof Error ? error.message : String(error)}`,\n );\n },\n );\n };\n /**\n * One resolver for the live indicator AND the final drop, measuring the\n * target row's REAL on-screen rect (never dnd-kit's drag-start snapshot, the\n * source of drops landing on the wrong row after any mid-drag scroll).\n * Standard tree zones: top third = above, bottom third = below, middle =\n * nest inside; invalid zones fall back to whichever remains valid.\n */\n const resolveHierarchyMove = (\n overId: string,\n pointerY: number,\n ): HierarchyDropPreview | null => {\n if (!hierarchy || !hierarchyIndex || !scrollRef.current) return null;\n if (overId === \"__root__\") {\n return {\n move: {\n parentId: null,\n beforeId: null,\n position: \"root\",\n targetId: null,\n },\n targetId: null,\n position: \"root\",\n depth: 0,\n targetLabel: null,\n };\n }\n const target = hierarchyIndex.byId.get(overId);\n if (!target) return null;\n const zones = hierarchyDropZones(overId);\n if (!zones.insideOk && !zones.siblingOk) return null;\n const rowElement = scrollRef.current.querySelector(\n `tr[data-row-id=\"${CSS.escape(overId)}\"]`,\n );\n if (!rowElement) return null;\n const rect = rowElement.getBoundingClientRect();\n const ratio = rect.height > 0 ? (pointerY - rect.top) / rect.height : 0.5;\n let position: \"before\" | \"after\" | \"inside\";\n if (!zones.siblingOk) {\n position = \"inside\";\n } else if (!zones.insideOk) {\n position = ratio < 0.5 ? \"before\" : \"after\";\n } else if (ratio < 1 / 3) {\n position = \"before\";\n } else if (ratio > 2 / 3) {\n position = \"after\";\n } else {\n position = \"inside\";\n }\n const targetDepth = hierarchyIndex.depthById.get(overId) ?? 0;\n if (position === \"inside\") {\n return {\n move: {\n parentId: overId,\n beforeId: null,\n position: \"inside\",\n targetId: overId,\n },\n targetId: overId,\n position,\n depth: targetDepth + 1,\n targetLabel: hierarchy.itemLabel?.(target) ?? \"row\",\n };\n }\n const parentId = hierarchyIndex.parentById.get(overId) ?? null;\n // \"after\" resolves to \"before the next visible sibling\" so consumers keep\n // one insertion semantic; a target with no successor means insert last.\n let beforeId: string | null = overId;\n if (position === \"after\") {\n beforeId = null;\n const targetIndex = paginated.findIndex(\n (row) => getRowId(row) === overId,\n );\n for (\n let i = targetIndex + 1;\n targetIndex >= 0 && i < paginated.length;\n i += 1\n ) {\n const candidate = paginated[i];\n if (!candidate) continue;\n const candidateId = getRowId(candidate);\n if (candidateId === draggedRowId) continue;\n if ((hierarchyIndex.parentById.get(candidateId) ?? null) === parentId) {\n beforeId = candidateId;\n break;\n }\n // Left the sibling group (shallower row) — target is the last sibling.\n if (\n (hierarchyIndex.depthById.get(candidateId) ?? 0) <= targetDepth &&\n (hierarchyIndex.parentById.get(candidateId) ?? null) !== parentId\n ) {\n break;\n }\n }\n }\n return {\n move: { parentId, beforeId, position, targetId: overId },\n targetId: overId,\n position,\n depth: targetDepth,\n targetLabel: hierarchy.itemLabel?.(target) ?? \"row\",\n };\n };\n const endHierarchyDrag = (event: DragEndEvent) => {\n const source = hierarchyIndex?.byId.get(String(event.active.id));\n const preview = event.over\n ? resolveHierarchyMove(String(event.over.id), dragPointerY(event))\n : null;\n if (source && preview) {\n persistHierarchyMove(source, preview.move);\n }\n setDraggedRowId(null);\n };\n\n const handleSaveEdits = async () => {\n if (!edit?.onSave || changeCount === 0) return;\n const scope = editScopeKey;\n const draft = editsByScope[scope];\n if (!draft) return;\n const values = draft.values;\n const revisions = draft.revisions;\n const rows = appendQueryKey === null ? data : draft.rows;\n const save = edit.onSave;\n startSaving(scope);\n try {\n await Promise.resolve().then(() => save(values, rows));\n setEditsByScope((current) => {\n const currentDraft = current[scope];\n if (!currentDraft) return current;\n const nextValues: CellEditsMap = {};\n for (const [rowId, rowValues] of Object.entries(currentDraft.values)) {\n const savedRow = values[rowId];\n const savedRevisions = revisions[rowId];\n const currentRevisions = currentDraft.revisions[rowId];\n const remaining = Object.fromEntries(\n Object.entries(rowValues).filter(([field]) =>\n !Object.hasOwn(savedRow ?? {}, field)\n || currentRevisions?.[field] !== savedRevisions?.[field],\n ),\n );\n if (Object.keys(remaining).length > 0) nextValues[rowId] = remaining;\n }\n return { ...current, [scope]: { ...currentDraft, values: nextValues } };\n });\n toast.success(\"Changes saved\");\n } catch (e) {\n toast.error(\n `Couldn't save: ${e instanceof Error ? e.message : String(e)}`,\n );\n } finally {\n finishSaving(scope);\n }\n };\n\n const handleCancelEdits = () => {\n setEdits({});\n edit?.onCancel?.();\n };\n\n const showActionsCol = windowEnabled || Boolean(rowActions) || showRowCopy;\n\n // ── Multi-row selection ───────────────────────────────────────────────────\n // Controlled by the consumer (see MatrxDataTableSelectionConfig). Everything\n // here derives from `selection.selectedIds` — the table keeps no shadow copy\n // that could disagree with the surface after a re-fetch.\n const selectedIdSet = useMemo(\n () => new Set(selection?.selectedIds ?? []),\n [selection?.selectedIds],\n );\n const selectableRows = paginated.filter(\n (row) => selection?.isRowSelectable?.(row) ?? true,\n );\n const selectedOnPage = selectableRows.filter((row) =>\n selectedIdSet.has(getRowId(row)),\n );\n const allOnPageSelected =\n selectableRows.length > 0 &&\n selectedOnPage.length === selectableRows.length;\n const someOnPageSelected = selectedOnPage.length > 0 && !allOnPageSelected;\n const selectedRows = useMemo(\n () => data.filter((row) => selectedIdSet.has(getRowId(row))),\n [data, selectedIdSet, getRowId],\n );\n // Anchor for shift-click range selection — the thing that makes clearing 40\n // rows of noise one gesture instead of forty.\n const lastToggledIndex = useRef<number | null>(null);\n\n const setSelectedIds = (next: Set<string>) =>\n selection?.onSelectedIdsChange([...next]);\n\n const toggleRowSelected = (index: number, shiftKey: boolean) => {\n if (!selection) return;\n const row = paginated[index];\n if (!row) return;\n const id = getRowId(row);\n const next = new Set(selectedIdSet);\n const turningOn = !next.has(id);\n const anchor = lastToggledIndex.current;\n const from = shiftKey && anchor !== null ? Math.min(anchor, index) : index;\n const to = shiftKey && anchor !== null ? Math.max(anchor, index) : index;\n for (let i = from; i <= to; i += 1) {\n const target = paginated[i];\n if (!target) continue;\n if (!(selection.isRowSelectable?.(target) ?? true)) continue;\n const targetId = getRowId(target);\n if (turningOn) next.add(targetId);\n else next.delete(targetId);\n }\n lastToggledIndex.current = index;\n setSelectedIds(next);\n };\n\n const toggleAllOnPage = () => {\n if (!selection) return;\n const next = new Set(selectedIdSet);\n for (const row of selectableRows) {\n const id = getRowId(row);\n if (allOnPageSelected) next.delete(id);\n else next.add(id);\n }\n lastToggledIndex.current = null;\n setSelectedIds(next);\n };\n\n const selectionNoun = selection?.noun ?? \"row\";\n const selectionCount = selection?.selectedIds.length ?? 0;\n const leadingCols = selection ? 1 : 0;\n const renderedFacets = controlledQuery\n ? toolbar?.facets?.map((facet) =>\n facet.type === \"button-group\"\n ? {\n ...facet,\n onChange: (value: string) => {\n facet.onChange(value);\n emitControlledQueryChange({ page: 1 });\n },\n }\n : facet,\n )\n : toolbar?.facets;\n const renderRecordCell = (row: T, col: MatrxColumnDef<T>, index: number) => {\n const id = getRowId(row);\n const field = col.accessorKey ? String(col.accessorKey) : columnId(col);\n const rowEdits = edits[id];\n const display = renderCell(applyRowEdits(row, rowEdits), col, index);\n const href = col.href?.(row) ?? undefined;\n if (editEnabled && col.editable && (col.editableIf?.(row) ?? true)) {\n return <EditableTableCell\n value={rowEdits && field in rowEdits ? rowEdits[field] : getCellValue(row, col)}\n editType={col.editable}\n {...(col.editOptions === undefined ? {} : { editOptions: col.editOptions })}\n display={display}\n dirty={Boolean(rowEdits && field in rowEdits)}\n onCommit={(next) => commitCell(id, field, next)}\n {...(href === undefined ? {} : { href })}\n {...(col.editTrigger === undefined ? {} : { editTrigger: col.editTrigger })}\n />;\n }\n return href ? <Link href={href} onClick={(event) => event.stopPropagation()} className=\"block w-full min-w-0 rounded outline-none focus-visible:ring-2 focus-visible:ring-ring\">{display}</Link> : display;\n };\n\n const currentViewSnapshot = useMemo<TableViewSnapshot>(\n () => ({\n __kind: \"matrx-table-view\",\n version: 1,\n query: {\n pageSize,\n search: searchValue,\n ...(searchMatchMode === \"contains\" ? {} : { searchMatchMode }),\n ...(intelligentSearchEnabled && searchScope !== \"all\" ? { searchScope } : {}),\n anyOf: anyOfValue,\n ...(layeredFilters.length ? { layeredFilters } : {}),\n columnFilters,\n sort,\n },\n columns: {\n order: effectiveColumnOrder,\n hidden: [...effectiveHiddenColumnIds],\n ...(Object.keys(effectiveColumnWidths).length ? { widths: effectiveColumnWidths } : {}),\n },\n }),\n [\n anyOfValue,\n columnFilters,\n effectiveColumnOrder,\n effectiveColumnWidths,\n effectiveHiddenColumnIds,\n layeredFilters,\n pageSize,\n searchMatchMode,\n intelligentSearchEnabled,\n searchScope,\n searchValue,\n sort,\n ],\n );\n const declaredDefaultViewSnapshot = useMemo<TableViewSnapshot>(\n () => defaultViewSnapshot ?? {\n __kind: \"matrx-table-view\",\n version: 1,\n query: {\n pageSize: defaultPageSize,\n search: \"\",\n anyOf: \"\",\n layeredFilters: [],\n columnFilters: {},\n sort: defaultSort,\n },\n columns: {\n order: columns.map(columnId),\n hidden: columns.filter((column) => column.hidden).map(columnId),\n },\n },\n [columns, defaultPageSize, defaultSort, defaultViewSnapshot],\n );\n const applySavedView = useCallback(\n (rawSnapshot: TableViewSnapshot) => {\n const snapshot = parseTableViewSnapshot(rawSnapshot);\n if (!snapshot) {\n const message = \"This saved view has an unsupported format. The current table was left unchanged.\";\n setSavedViewError(message);\n throw new Error(message);\n }\n const knownColumns = new Set(columns.map(columnId));\n const staleScope = snapshot.query.searchScope !== undefined &&\n snapshot.query.searchScope !== \"all\" &&\n (!intelligentSearchEnabled || !intelligentSearchScopes.some((scope) => scope.id === snapshot.query.searchScope));\n if (staleScope) {\n const message = \"This saved view uses a search field that is no longer available. The current table was left unchanged.\";\n setSavedViewError(message);\n throw new Error(message);\n }\n const unknown = [...snapshot.columns.order, ...snapshot.columns.hidden,\n ...Object.keys(snapshot.query.columnFilters),\n ...(snapshot.query.sort ? [snapshot.query.sort.id] : []),\n ...(snapshot.query.layeredFilters?.map((rule) => rule.field) ?? [])]\n .filter((id, index, values) => !knownColumns.has(id) && values.indexOf(id) === index);\n if (unknown.length > 0) {\n const message = `This saved view refers to unavailable columns: ${unknown.join(\", \")}. The current table was left unchanged.`;\n setSavedViewError(message);\n throw new Error(message);\n }\n setSavedViewError(null);\n const nextQuery = { ...snapshot.query, page: 1 };\n const nextOrder = [...snapshot.columns.order, ...columns.map(columnId).filter((id) => !snapshot.columns.order.includes(id))];\n if (controlledQuery) {\n controlledQuery.onStateChange(nextQuery);\n toolbar?.onSearchChange?.(nextQuery.search);\n toolbar?.anyOf?.onChange?.(nextQuery.anyOf);\n }\n else {\n setSearchValue(nextQuery.search);\n setInternalSearchMatchMode(nextQuery.searchMatchMode ?? \"contains\");\n setInternalSearchScope(nextQuery.searchScope ?? \"all\");\n setAnyOfValue(nextQuery.anyOf);\n setInternalLayeredFilters(nextQuery.layeredFilters ?? []);\n setInternalColumnFilters(nextQuery.columnFilters);\n setInternalSort(nextQuery.sort);\n setInternalPageSize(nextQuery.pageSize);\n setInternalPage(1);\n }\n commitColumnState(nextOrder, new Set(snapshot.columns.hidden));\n commitColumnWidths(normalizeColumnWidthMap(snapshot.columns.widths, knownColumns));\n },\n [columns, commitColumnState, commitColumnWidths, controlledQuery, intelligentSearchEnabled, intelligentSearchScopes, toolbar],\n );\n\n return (\n <TooltipProvider>\n <DndContext\n id={tableDndContextId}\n sensors={hierarchySensors}\n collisionDetection={pointerWithin}\n accessibility={{\n screenReaderInstructions: {\n draggable: \"Drag with a pointer. To reorder columns with a keyboard, open Columns and use Move earlier or Move later.\",\n },\n }}\n // Re-measure droppables while dragging: the root drop strip mounts at\n // drag start and shifts every row, so drag-start-only rects would leave\n // collision detection one row off for the whole drag.\n measuring={{ droppable: { strategy: MeasuringStrategy.Always } }}\n onDragStart={(event) => {\n const kind = event.active.data.current?.matrxDragKind;\n if (kind === \"column-header\") {\n const draggedId = String(event.active.data.current?.columnId);\n draggedColumnId.current = draggedId;\n columnDragActive.current = true;\n setColumnDragPreview({ draggedId, targetId: null, after: false });\n return;\n }\n if (kind === \"column-manager\") return;\n setDraggedRowId(String(event.active.id));\n }}\n onDragMove={(event) => {\n if (\n !columnDragActive.current ||\n event.active.data.current?.matrxDragKind !== \"column-header\"\n ) return;\n const overData = event.over?.data.current;\n const overId = overData?.matrxDragKind === \"column-header\" ? overData.columnId : null;\n const activeRect = event.active.rect.current.translated;\n const overRect = event.over?.rect;\n if (!overId || !activeRect || !overRect) {\n setColumnDragPreview((current) =>\n current?.targetId === null ? current : current ? { ...current, targetId: null } : current,\n );\n columnDragScrollDirection.current = 0;\n stopColumnDragScroll();\n return;\n }\n const after = activeRect.left + activeRect.width / 2 >= overRect.left + overRect.width / 2;\n setColumnDragPreview((current) => {\n if (!current) return current;\n return current.targetId === overId && current.after === after\n ? current\n : { ...current, targetId: String(overId), after };\n });\n const scroll = scrollRef.current;\n if (!scroll) return;\n const bounds = scroll.getBoundingClientRect();\n const center = activeRect.left + activeRect.width / 2;\n columnDragScrollDirection.current = center - bounds.left < 80 ? -1 : bounds.right - center < 80 ? 1 : 0;\n if (columnDragScrollDirection.current === 0) stopColumnDragScroll();\n else startColumnDragScroll();\n }}\n onDragCancel={() => {\n columnDragActive.current = false;\n draggedColumnId.current = null;\n setColumnDragPreview(null);\n stopColumnDragScroll();\n setDraggedRowId(null);\n }}\n onDragEnd={(event) => {\n const kind = event.active.data.current?.matrxDragKind;\n if (kind === \"column-manager\") return;\n if (kind !== \"column-header\") {\n endHierarchyDrag(event);\n return;\n }\n const from = String(event.active.data.current?.columnId);\n const targetData = event.over?.data.current;\n const target = targetData?.matrxDragKind === \"column-header\" ? targetData.columnId : null;\n const activeRect = event.active.rect.current.translated;\n const overRect = event.over?.rect;\n columnDragActive.current = false;\n draggedColumnId.current = null;\n setColumnDragPreview(null);\n stopColumnDragScroll();\n if (\n columnDragPreview?.draggedId === from &&\n columnDragPreview.targetId !== null &&\n columnDragPreview.targetId !== from\n ) {\n commitColumnState(\n projectColumnDragOrder(effectiveColumnOrder, columnDragPreview),\n effectiveHiddenColumnIds,\n );\n return;\n }\n if (!target || from === target || !activeRect || !overRect) return;\n const order = [...effectiveColumnOrder];\n const fromIndex = order.indexOf(from);\n const targetIndex = order.indexOf(String(target));\n if (fromIndex < 0 || targetIndex < 0) return;\n order.splice(fromIndex, 1);\n const after = activeRect.left + activeRect.width / 2 >= overRect.left + overRect.width / 2;\n const insertion = order.indexOf(String(target)) + (after ? 1 : 0);\n order.splice(insertion, 0, from);\n commitColumnState(order, effectiveHiddenColumnIds);\n }}\n >\n <div\n ref={rootRef}\n data-matrx-table\n data-matrx-table-implementation=\"@ai-matrx/design-system\"\n data-matrx-table-density={resolvedDensity}\n data-url-state-table={urlState?.id}\n className={cn(\n \"flex h-full min-h-0 flex-col gap-2 px-0 py-2\",\n className,\n )}\n >\n {notice}\n {savedViewError ? <p role=\"alert\" className=\"shrink-0 text-xs text-destructive\">{savedViewError}</p> : null}\n {toolbarActionError ? <p role=\"alert\" className=\"shrink-0 text-xs text-destructive\">{toolbarActionError}</p> : null}\n {/* Toolbar */}\n {!hideToolbar && (toolbar?.title || showSearch ||\n toolbar?.anyOf ||\n toolbar?.layeredFilters ||\n (toolbar?.facets && toolbar.facets.length > 0) ||\n toolbar?.leading ||\n toolbar?.actions ||\n toolbar?.refresh ||\n toolbar?.add ||\n (tableId && SavedViews) ||\n hasActiveFilters ||\n showToolbarCopy ||\n columns.length > 0) && (\n <TableTitleRow\n {...(toolbar?.title === undefined ? {} : { title: toolbar.title })}\n context={\n tableId && SavedViews ? (\n <span data-matrx-table-view-control>\n <SavedViews\n tableId={tableId}\n snapshot={currentViewSnapshot}\n defaultSnapshot={declaredDefaultViewSnapshot}\n onApply={applySavedView}\n />\n </span>\n ) : undefined\n }\n search={\n showSearch ? intelligentSearchEnabled ? (\n <TableSearch\n value={searchValue}\n onChange={setSearchValue}\n scope={searchScope}\n onScopeChange={setSearchScope}\n scopes={intelligentSearchScopes}\n {...(toolbar?.searchPlaceholder === undefined\n ? {}\n : { placeholder: toolbar.searchPlaceholder })}\n />\n ) : (\n <div\n data-matrx-table-search\n className={cn(\n \"flex min-w-0 flex-1 sm:w-full sm:flex-none\",\n toolbar?.searchMatch ? \"sm:max-w-md\" : \"sm:max-w-xs\",\n )}\n >\n <div className=\"relative min-w-0 flex-1\">\n <Search className=\"absolute left-2 top-1/2 h-5 w-5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n placeholder={toolbar?.searchPlaceholder ?? \"Search…\"}\n className={cn(\n \"h-8 pl-7 pr-7 text-sm\",\n toolbar?.searchMatch && \"rounded-r-none\",\n )}\n style={{ fontSize: \"16px\" }}\n />\n {searchValue ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Clear search\"\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2 rounded p-0.5 text-muted-foreground hover:text-foreground\"\n onClick={() => setSearchValue(\"\")}\n >\n <X className=\"h-5 w-5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Clear search</TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n {toolbar?.searchMatch ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant={searchMatchMode === \"whole_words\" ? \"secondary\" : \"outline\"}\n size=\"sm\"\n className=\"h-8 shrink-0 gap-1 rounded-l-none border-l-0 px-2 text-xs\"\n aria-pressed={searchMatchMode === \"whole_words\"}\n aria-label={`Search match: ${searchMatchMode === \"whole_words\" ? \"whole words\" : \"contains text\"}`}\n onClick={() =>\n setSearchMatchMode(\n searchMatchMode === \"whole_words\" ? \"contains\" : \"whole_words\",\n )\n }\n >\n <WholeWord className=\"h-5 w-5\" />\n {searchMatchMode === \"whole_words\" ? \"Whole words\" : \"Contains\"}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {searchMatchMode === \"whole_words\"\n ? \"Whole words — click to match text anywhere\"\n : \"Contains text — click to require whole words\"}\n </TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n ) : null\n }\n >\n {toolbar?.layeredFilters ? (\n <LayeredFilterBuilder\n fields={toolbar.layeredFilters.fields}\n rules={layeredFilters}\n onChange={setLayeredFilters}\n maxRules={toolbar.layeredFilters.maxRules}\n label={toolbar.layeredFilters.label}\n />\n ) : null}\n\n {toolbar?.anyOf ? (\n <div className=\"relative w-full max-w-xs\">\n <Search className=\"absolute left-2 top-1/2 h-5 w-5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={anyOfValue}\n onChange={(e) => setAnyOfValue(e.target.value)}\n placeholder={toolbar.anyOf.placeholder ?? \"Match any of…\"}\n className=\"h-8 pl-7 pr-7 text-sm\"\n style={{ fontSize: \"16px\" }}\n />\n {anyOfValue ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Clear match-any search\"\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2 rounded p-0.5 text-muted-foreground hover:text-foreground\"\n onClick={() => setAnyOfValue(\"\")}\n >\n <X className=\"h-5 w-5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Clear match-any search</TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n ) : null}\n\n {renderedFacets ? <ToolbarFacets facets={renderedFacets} /> : null}\n {toolbar?.leading ? (\n <div\n data-matrx-table-toolbar-extras\n className=\"order-last flex w-full min-w-0 flex-wrap items-center gap-2\"\n >\n {toolbar.leading}\n </div>\n ) : null}\n\n <div\n data-matrx-table-actions\n className=\"ml-auto flex min-w-0 flex-wrap items-center gap-0\"\n >\n {sourceTotal !== undefined ? (\n <span\n data-matrx-table-source-total\n className=\"text-xs tabular-nums text-muted-foreground\"\n >\n {data.length.toLocaleString()} loaded of{\" \"}\n {Math.max(0, sourceTotal).toLocaleString()} ·{\" \"}\n {processed.length.toLocaleString()} matched\n </span>\n ) : null}\n <TableToolbarAction\n HostAction={host.ToolbarAction}\n ariaLabel=\"Clear all filters\"\n tooltip={hasActiveFilters ? \"Clear search and filters; keep columns and sort\" : \"No search or filters to clear\"}\n disabled={!hasActiveFilters}\n onClick={clearAllFilters}\n >\n <Eraser />\n </TableToolbarAction>\n {showToolbarCopy && effectiveCopy ? (\n <CopyButtons\n size=\"toolbar\"\n sourceId={`${tableCopySourceNamespace}:view`}\n label={effectiveCopy.listLabel ?? `${effectiveCopy.label} view`}\n {...(effectiveCopy.references ? { references: effectiveCopy.references(processed, data) } : {})}\n {...(effectiveCopy.triggerVariant ? { triggerVariant: effectiveCopy.triggerVariant } : {})}\n {...(copy === undefined ? {} : {\n human: () => buildViewHuman(effectiveCopy, processed, effectiveCopyColumns),\n json: () => processed.map((r) => (effectiveCopy.agentRow ? effectiveCopy.agentRow(r) : r)),\n })}\n agent={() =>\n copy === undefined\n ? buildDefaultTableViewAgentInput(effectiveCopy, processed, data, declaredVisibleCopyColumns, {\n search: searchValue,\n searchMatchMode,\n anyOf: anyOfValue,\n filterCount:\n activeFilterCount +\n completeLayeredFilterRules(layeredFilters).length,\n sort: sort ? `${sort.id}:${sort.direction}` : null,\n })\n : buildViewAgentInput(effectiveCopy, processed, data, {\n search: searchValue,\n searchMatchMode,\n anyOf: anyOfValue,\n filterCount:\n activeFilterCount +\n completeLayeredFilterRules(layeredFilters).length,\n sort: sort ? `${sort.id}:${sort.direction}` : null,\n })\n }\n aiVariants={[\n ...(effectiveCopy.aiVariants?.(processed, data) ?? []),\n ...copySubsetVariantFor(() => processed, \"view\"),\n ]}\n {...(effectiveCopy.aiCustom\n ? { aiCustom: effectiveCopy.aiCustom(processed, data) }\n : {})}\n export={{\n items: [],\n sheetRows: () => processed.map((row) =>\n projectDefaultTableCopyRow(row, declaredVisibleCopyColumns),\n ),\n sheetColumns: () => declaredVisibleCopyColumns.map((column) => ({\n id: columnId(column),\n label: column.label ?? (typeof column.header === \"string\" ? column.header : columnId(column)),\n })),\n }}\n />\n ) : null}\n {columns.length > 0 ? (\n <TableToolbarAction\n HostAction={host.ToolbarAction}\n ariaLabel=\"Columns\"\n tooltip=\"Show, hide, or reorder columns\"\n onClick={() => setColumnManagerOpen(true)}\n >\n <SlidersHorizontal />\n </TableToolbarAction>\n ) : null}\n {toolbar?.refresh ? (\n <TableToolbarAction\n HostAction={host.ToolbarAction}\n ariaLabel={toolbar.refresh.label ?? \"Refresh\"}\n tooltip={isFetching ? \"Refreshing table data\" : (toolbar.refresh.label ?? \"Refresh\")}\n disabled={isFetching || toolbarActionPending.refresh}\n busy={isFetching || toolbarActionPending.refresh}\n onClick={() => {\n if (toolbarActionPendingRef.current.refresh) return;\n toolbarActionPendingRef.current.refresh = true;\n setToolbarActionPending((current) => ({ ...current, refresh: true }));\n setToolbarActionError(null);\n void Promise.resolve()\n .then(() => toolbar.refresh?.onRefresh())\n .catch((cause: unknown) => {\n const message = cause instanceof Error ? cause.message : String(cause);\n setToolbarActionError(`Refresh failed: ${message}`);\n toast.error(`Refresh failed: ${message}`);\n })\n .finally(() => {\n toolbarActionPendingRef.current.refresh = false;\n setToolbarActionPending((current) => ({ ...current, refresh: false }));\n });\n }}\n >\n <RefreshControlIcon spinning={isFetching || toolbarActionPending.refresh} />\n </TableToolbarAction>\n ) : null}\n {toolbar?.add ? (\n <TableToolbarAction\n HostAction={host.ToolbarAction}\n ariaLabel=\"Add\"\n tooltip={toolbar.add.disabled ? (toolbar.add.disabledReason ?? \"Add unavailable\") : \"Add\"}\n disabled={toolbar.add.disabled || toolbarActionPending.add}\n busy={toolbarActionPending.add}\n onClick={() => {\n if (toolbarActionPendingRef.current.add) return;\n toolbarActionPendingRef.current.add = true;\n setToolbarActionPending((current) => ({ ...current, add: true }));\n setToolbarActionError(null);\n void Promise.resolve()\n .then(() => toolbar.add?.onAdd())\n .catch((cause: unknown) => {\n const message = cause instanceof Error ? cause.message : String(cause);\n setToolbarActionError(`Add failed: ${message}`);\n toast.error(`Add failed: ${message}`);\n })\n .finally(() => {\n toolbarActionPendingRef.current.add = false;\n setToolbarActionPending((current) => ({ ...current, add: false }));\n });\n }}\n >\n <Plus />\n </TableToolbarAction>\n ) : null}\n {toolbar?.actions}\n </div>\n </TableTitleRow>\n )}\n\n {/* Bulk bar — present only while rows are checked, so the toolbar's\n normal actions never compete with a selection that isn't there. */}\n {selection && selectionCount > 0 ? (\n <div className=\"flex shrink-0 flex-wrap items-center gap-2 rounded-md border border-primary/30 bg-primary/5 px-2 py-1.5\">\n <span className=\"text-xs font-medium text-foreground\">\n {formatCount(selectionCount)} {selectionNoun}\n {selectionCount === 1 ? \"\" : \"s\"} selected\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 gap-1 px-2 text-xs\"\n onClick={() => {\n lastToggledIndex.current = null;\n selection.onSelectedIdsChange([]);\n }}\n >\n <X className=\"h-3.5 w-3.5\" />\n Clear\n </Button>\n <div className=\"ml-auto flex flex-wrap items-center gap-1.5\">\n {effectiveCopy && selectedRows.length > 0 ? (\n <CopyButtons\n size=\"icon\"\n sourceId={`${tableCopySourceNamespace}:selection`}\n {...(effectiveCopy.references ? { references: effectiveCopy.references(selectedRows, data) } : {})}\n {...(effectiveCopy.triggerVariant ? { triggerVariant: effectiveCopy.triggerVariant } : {})}\n label={`${selectedRows.length} selected ${selectionNoun}${selectedRows.length === 1 ? \"\" : \"s\"}`}\n {...(copy === undefined ? {} : {\n human: () => buildViewHuman(effectiveCopy, selectedRows, effectiveCopyColumns),\n json: () => selectedRows.map((row) => (effectiveCopy.agentRow ? effectiveCopy.agentRow(row) : row)),\n })}\n agent={() =>\n copy === undefined\n ? buildDefaultTableViewAgentInput(effectiveCopy, selectedRows, data, declaredVisibleCopyColumns, { scope: \"selected\" })\n : buildViewAgentInput(effectiveCopy, selectedRows, data, { scope: \"selected\" })\n }\n aiVariants={copySubsetVariantFor(\n () => selectedRows,\n \"selected\",\n )}\n export={{\n items: [],\n sheetRows: () => selectedRows.map((row) =>\n projectDefaultTableCopyRow(row, declaredVisibleCopyColumns),\n ),\n sheetColumns: () => declaredVisibleCopyColumns.map((column) => ({\n id: columnId(column),\n label: column.label ?? (typeof column.header === \"string\" ? column.header : columnId(column)),\n })),\n }}\n />\n ) : null}\n {selection.actions?.(selectedRows, selection.selectedIds)}\n </div>\n </div>\n ) : null}\n\n {/* The shell's vertical P2 inset and P2 region gap are separate contracts.\n Controls retain accessible hit targets; visible-icon equality depends\n on their internal geometry and is verified at the rendered surface. */}\n <div data-matrx-table-body-region className=\"flex min-h-0 flex-1 flex-col gap-2\">\n <div className=\"relative min-h-0 flex-1\">\n {mobileCards ? (\n <div\n ref={cardsScrollRef}\n data-matrx-table-cards-scroll\n aria-busy={isLoading || isFetching}\n {...(appendQuery === null\n ? {}\n : { style: { containerType: \"inline-size\" } })}\n className={cn(\n \"flex h-full min-h-0 flex-col gap-2 overflow-y-auto rounded-md border border-border bg-card p-2\",\n mobileCardsClass,\n )}\n >\n {isFetching && !isLoading && appendQuery === null ? (\n <div\n role=\"status\"\n className=\"h-0.5 shrink-0 overflow-hidden rounded-full bg-primary/15\"\n >\n <div className=\"h-full w-full animate-pulse bg-primary\" />\n <span className=\"sr-only\">Refreshing table data</span>\n </div>\n ) : null}\n {isLoading ? (\n Array.from({ length: 4 }).map((_, index) => (\n <Skeleton\n key={`mobile-card-sk-${index}`}\n className=\"h-52 w-full shrink-0 rounded-lg\"\n />\n ))\n ) : paginated.length === 0 ? (\n <div className=\"flex min-h-48 flex-1 items-center justify-center px-4 py-12 text-center\">\n <div className=\"flex max-w-sm flex-col items-center gap-2\">\n {emptyState?.icon}\n <p className=\"text-sm font-medium text-foreground\">\n {emptyState?.title ?? \"No rows\"}\n </p>\n {emptyState?.description ? (\n <p className=\"text-xs text-muted-foreground\">\n {emptyState.description}\n </p>\n ) : null}\n {emptyState?.action}\n </div>\n </div>\n ) : (\n paginated.map((row, index) => {\n const id = getRowId(row);\n const displayRow = applyRowEdits(row, edits[id]);\n const selectable =\n selection?.isRowSelectable?.(row) ?? Boolean(selection);\n return (\n <Fragment key={id}>\n {mobileCards(displayRow, index, {\n renderCell: (columnKey) => {\n const column = columns.find((candidate) => columnId(candidate) === columnKey);\n return column ? renderRecordCell(row, column, index) : null;\n },\n selected: selectedIdSet.has(id),\n selectable,\n onSelectedChange: (nextSelected) => {\n if (\n !selection ||\n !selectable ||\n nextSelected === selectedIdSet.has(id)\n ) {\n return;\n }\n const next = new Set(selectedIdSet);\n if (nextSelected) next.add(id);\n else next.delete(id);\n setSelectedIds(next);\n },\n actions:\n showRowCopy || rowActions ? (\n <div\n data-matrx-table-row-actions\n className=\"inline-flex items-center justify-end gap-0\"\n onClick={(event) => event.stopPropagation()}\n >\n {showRowCopy && effectiveCopy ? (\n <TableRowCopyControl\n size=\"toolbar\"\n copy={effectiveCopy}\n row={displayRow}\n sourceId={`${tableCopySourceNamespace}:row:${getRowId(displayRow)}`}\n {...(copy === undefined ? { defaultColumns: declaredVisibleCopyColumns } : {})}\n />\n ) : null}\n {rowActions?.(displayRow, {\n closeDetail: () => setSelectedId(null),\n openDetail: () => openDetail(displayRow),\n openWindow: () => openWindow(displayRow),\n closeWindow,\n hasPendingEdits: Boolean(edits[id]),\n discardPendingEdits: () =>\n discardRowEdits(id),\n })}\n </div>\n ) : null,\n })}\n </Fragment>\n );\n })\n )}\n {appendQuery !== null && isFetching && !isLoading ? (\n <div\n data-matrx-table-append-loading-card\n role=\"status\"\n aria-live=\"polite\"\n className=\"sticky bottom-0 z-20 flex h-16 w-full max-w-[100cqw] shrink-0 items-center justify-center gap-2 rounded-md border border-border bg-card/95 px-3 text-sm font-medium text-foreground shadow-sm backdrop-blur-sm\"\n >\n <Loader2\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0 animate-spin text-primary motion-reduce:animate-none\"\n />\n Loading more rows…\n </div>\n ) : null}\n </div>\n ) : null}\n <div\n ref={scrollRef}\n data-matrx-table-scroll\n onScroll={updateScrollHint}\n aria-busy={isLoading || isFetching}\n {...(appendQuery === null\n ? {}\n : { style: { containerType: \"inline-size\" } })}\n className={cn(\n \"relative h-full w-full overflow-auto rounded-md border border-border bg-card\",\n mobileCards && tableWithCardsClass,\n tableClassName,\n )}\n >\n {hierarchy && draggedRow ? (\n <HierarchyRootDropTarget\n label={\n hierarchy.rootDropLabel ??\n \"Drop here to move to the top level\"\n }\n draggedLabel={\n hierarchy.itemLabel?.(draggedRow) ?? \"Moving row\"\n }\n />\n ) : null}\n {hierarchy && draggedRowId ? (\n <HierarchyDragIndicatorLayer\n scrollRef={scrollRef}\n resolve={resolveHierarchyMove}\n />\n ) : null}\n {isFetching && !isLoading && appendQuery === null ? (\n <div\n role=\"status\"\n className=\"sticky left-0 top-0 z-20 h-0.5 w-full overflow-hidden bg-primary/15\"\n >\n <div className=\"h-full w-full animate-pulse bg-primary\" />\n <span className=\"sr-only\">Refreshing table data</span>\n </div>\n ) : null}\n {/* Below `sm` the table sizes to its CONTENT (w-max + max-w-none — a\n global `table { max-width: 100% }` otherwise clamps it and silently\n kills the scroll) so the container scrolls horizontally instead of\n crushing every column into an unreadable wrap. Cells go nowrap, and\n the WHOLE row scrolls as one surface. A mobile column may never pin\n over the remaining data: a wide identity cell can otherwise consume\n the viewport and make every later value functionally unreachable.\n Written mobile-first rather than with `max-sm:` because a base\n `w-full` outranks `max-sm:w-max`; `sm:` restores the exact desktop\n rendering.\n The `table` + `overflow-visible` utilities are LOAD-BEARING: a\n globals.css base rule makes every `table` `display:block;\n overflow-x:auto` under 768px, which would turn the table into a\n second nested scroller. Utilities outrank the `@layer base` rule\n and restore real table layout. */}\n <table\n ref={tableRef}\n style={!fixedLayoutActive ? undefined : {\n // Track the same preview variables as the cells. A stale\n // pre-resize total redistributes spare width under fixed\n // layout and defeats both exact shrinking and max bounds.\n \"--matrx-resized-table-width\": `calc(${visibleColumns.map(column => {\n const id = columnId(column);\n return resizableColumns && column.resizable !== false\n ? `var(${columnResizeCssVar(id)}, ${effectiveColumnWidths[id]}px)`\n : `${effectiveColumnWidths[id]}px`;\n }).join(\" + \")} + ${(selection ? fixedTableGeometry?.selectionWidth ?? 0 : 0) + (showActionsCol ? fixedTableGeometry?.actionsWidth ?? 0 : 0)}px)`,\n } as CSSProperties}\n className={cn(\n \"table w-max min-w-full max-w-none caption-bottom overflow-visible text-sm sm:w-full sm:min-w-0 sm:max-w-full\",\n fixedLayoutActive && \"sm:table-fixed sm:max-w-none sm:w-[var(--matrx-resized-table-width)]\",\n )}\n >\n <thead className=\"sticky top-0 z-10 border-b border-border bg-muted/90 shadow-[0_1px_0_0_var(--border)] backdrop-blur-sm\">\n <tr>\n {selection ? (\n <th\n data-matrx-table-selection-column\n className=\"h-9 w-9 px-2 text-left align-middle\"\n style={fixedUtilityWidth(fixedTableGeometry?.selectionWidth)}\n >\n <div\n data-matrx-table-selection-target\n onClick={(event) => {\n // A coarse-pointer layout target must activate the\n // real checkbox without stealing its focus or\n // forwarding a checkbox-originated click twice.\n if (event.target === event.currentTarget) {\n event.currentTarget\n .querySelector<HTMLButtonElement>('[role=\"checkbox\"]')\n ?.click();\n }\n }}\n >\n <Checkbox\n className={CHECKBOX_TAP_AREA}\n checked={\n allOnPageSelected\n ? true\n : someOnPageSelected\n ? \"indeterminate\"\n : false\n }\n disabled={selectableRows.length === 0}\n onCheckedChange={toggleAllOnPage}\n aria-label={\n allOnPageSelected\n ? \"Clear selection on this page\"\n : \"Select every row on this page\"\n }\n />\n </div>\n </th>\n ) : null}\n {visibleColumns.map((col) => {\n const id = columnId(col);\n const meta = filterMeta.get(id);\n const isSorted = sort?.id === id;\n const headerLabel =\n col.label ??\n (typeof col.header === \"string\" ? col.header : id);\n const defaultSortDirection =\n col.defaultSortDirection ?? \"asc\";\n const isColumnDragShadow =\n columnDragPreview?.draggedId === id &&\n columnDragPreview.targetId !== null;\n const columnResizable = resizableColumns && col.resizable !== false;\n return (\n <th\n key={id}\n data-matrx-table-column-id={id}\n data-matrx-column-drag-shadow={\n isColumnDragShadow ? \"true\" : undefined\n }\n aria-sort={\n isSorted\n ? sort?.direction === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : undefined\n }\n className={cn(\n \"relative h-9 text-left align-middle max-sm:whitespace-nowrap\",\n // ICON COLUMN (MatrxColumnDef.compact): a 40px star\n // column cannot honor `width: 40` while paying 16px of\n // padding for a 14px glyph.\n col.compact ? \"px-1\" : \"px-2\",\n // An intentional mobile column set (see\n // MatrxColumnDef.mobileHidden). CSS, not a JS\n // breakpoint — no hydration mismatch, and the column\n // stays sortable/filterable from the toolbar.\n col.mobileHidden && \"max-sm:hidden\",\n // Consumer widths are desktop tuning: applied from `sm`\n // up via a CSS var. The minimum is load-bearing: without\n // it, a crowded table crushes a declared 190px column to a\n // few characters wide instead of using the canonical\n // horizontal-scroll surface.\n (col.width !== undefined || columnResizable) &&\n \"sm:w-[var(--matrx-col-w)] sm:min-w-[var(--matrx-col-w)]\",\n col.headerClassName,\n isColumnDragShadow &&\n \"bg-primary/10 shadow-[inset_2px_0_0_var(--primary),inset_-2px_0_0_var(--primary)]\",\n col.align === \"center\" && \"text-center\",\n col.align === \"right\" && \"text-right\",\n )}\n style={columnWidthVar(col.width, effectiveColumnWidths[id], id, columnResizable)}\n >\n <ColumnHeaderDropZone id={id} enabled={reorderableColumns}>\n <ColumnHeaderCell\n label={col.header}\n labelText={headerLabel}\n sortable={col.sortable !== false}\n isSorted={Boolean(isSorted)}\n sortDirection={sort?.direction ?? defaultSortDirection}\n onSortAsc={() => setSort({ id, direction: \"asc\" })}\n onSortDesc={() =>\n setSort({ id, direction: \"desc\" })\n }\n onClearSort={() => setSort(null)}\n onHeaderSortClick={() => {\n if (!isSorted) {\n setSort({ id, direction: defaultSortDirection });\n return;\n }\n if (sort?.direction === \"asc\") {\n setSort({ id, direction: \"desc\" });\n return;\n }\n // Header clicks always toggle direction. Clearing\n // remains an explicit menu action, so a table\n // whose default is descending never appears to\n // ignore the user's first click.\n setSort({ id, direction: \"asc\" });\n }}\n filterKind={meta?.kind ?? null}\n filterValue={columnFilters[id]}\n onFilterChange={(next) => setColumnFilter(id, next)}\n selectOptions={meta?.options}\n selectSingle={col.filterSingle}\n filterApplyLabel={filterUi?.applyLabel}\n filterShowCancel={filterUi?.showCancel}\n filterFooterHint={filterUi?.footerHint}\n allowNegation={filterUi?.allowNegation}\n allowNullModes={filterUi?.allowNullModes}\n align={col.align}\n compact={col.compact}\n reorderColumn={\n reorderableColumns ? { id, label: headerLabel } : undefined\n }\n />\n </ColumnHeaderDropZone>\n {columnResizable ? (\n <ColumnResizeHandle\n columnId={id}\n label={headerLabel}\n tableRef={tableRef}\n minWidth={col.minWidth}\n maxWidth={col.maxWidth}\n onResizeStart={captureResizeGestureSnapshot}\n onResizeCancel={clearResizeGestureSnapshot}\n onResizeCommit={(columnId, width) =>\n commitColumnWidths(\n { ...effectiveColumnWidths, [columnId]: width },\n true,\n )\n }\n />\n ) : null}\n </th>\n );\n })}\n {showActionsCol && (\n <th\n data-matrx-table-actions-column\n className=\"h-9 w-px px-2 text-right align-middle text-xs font-semibold uppercase tracking-wide text-muted-foreground\"\n style={fixedUtilityWidth(fixedTableGeometry?.actionsWidth)}\n >\n Actions\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {isLoading ? (\n Array.from({ length: 6 }).map((_, i) => (\n <tr key={`sk-${i}`} className=\"border-b border-border/60\">\n {selection ? (\n <td className=\"px-2 py-2\" style={fixedUtilityWidth(fixedTableGeometry?.selectionWidth)}>\n <Skeleton className=\"h-3.5 w-3.5\" />\n </td>\n ) : null}\n {visibleColumns.map((col) => (\n <td\n key={columnId(col)}\n className={cn(\n \"py-2\",\n col.compact ? \"px-1\" : \"px-2\",\n col.mobileHidden && \"max-sm:hidden\",\n )}\n >\n <Skeleton className=\"h-5 w-full\" />\n </td>\n ))}\n {showActionsCol && (\n <td className=\"text-right align-middle\" style={fixedUtilityWidth(fixedTableGeometry?.actionsWidth)}>\n <Skeleton className=\"ml-auto h-5 w-10\" />\n </td>\n )}\n </tr>\n ))\n ) : paginated.length === 0 ? (\n <tr>\n <td\n colSpan={\n visibleColumns.length +\n leadingCols +\n (showActionsCol ? 1 : 0)\n }\n className=\"px-4 py-12 text-center\"\n >\n <div className=\"mx-auto flex max-w-sm flex-col items-center gap-2\">\n {emptyState?.icon}\n <p className=\"text-sm font-medium text-foreground\">\n {emptyState?.title ?? \"No rows\"}\n </p>\n {emptyState?.description ? (\n <p className=\"text-xs text-muted-foreground\">\n {emptyState.description}\n </p>\n ) : null}\n {emptyState?.action}\n </div>\n </td>\n </tr>\n ) : (\n paginated.map((row, index) => {\n const id = getRowId(row);\n const isSelected = selectedId === id;\n const rowEdits = edits[id];\n const displayRow = applyRowEdits(row, rowEdits);\n const isChecked = selectedIdSet.has(id);\n const rowNode = (\n <tr\n key={id}\n data-row-id={id}\n data-state={isSelected ? \"selected\" : undefined}\n onClick={(e) => {\n // A click that started on a real link (the D112 title\n // anchor, an FK cell link) must not ALSO fire the\n // row-open — the anchor owns that navigation.\n if ((e.target as HTMLElement).closest(\"a\")) return;\n openRow(row);\n }}\n className={cn(\n // Keep the mobile row opaque while the complete row scrolls\n // horizontally. The translucent zebra/hover tints remain\n // desktop-only so densely layered mobile content stays crisp.\n \"border-b border-border/60 bg-card transition-colors\",\n (detailEnabled || Boolean(onRowOpen)) &&\n \"cursor-pointer sm:hover:bg-muted/50\",\n isSelected && \"bg-muted\",\n isChecked && \"bg-primary/5\",\n highlightedIndex === index &&\n \"bg-muted ring-1 ring-inset ring-primary/60\",\n rowClassName?.(row, index),\n draggedRowId === id && \"opacity-40\",\n zebra &&\n index % 2 === 1 &&\n !isSelected &&\n !isChecked &&\n \"sm:bg-muted/20\",\n )}\n >\n {selection ? (\n <td\n className=\"px-2 py-1.5 align-middle lg:py-0.5\"\n style={fixedUtilityWidth(fixedTableGeometry?.selectionWidth)}\n onClick={(e) => e.stopPropagation()}\n >\n {/*\n 🚨 An unselectable row gets NO CONTROL AT ALL — not a\n greyed one. `isRowSelectable` returning false means the\n surface beneath will refuse this row, and a checkbox\n that renders (even faded) still says \"this is a thing\n you pick\"; the cell stays for column alignment, the\n control does not exist. Absent, not disabled, not\n hidden — nothing in the DOM to find or tick.\n */}\n {(selection.isRowSelectable?.(row) ?? true) ? (\n <div\n data-matrx-table-selection-target\n onClick={(event) => {\n if (event.target === event.currentTarget) {\n event.currentTarget\n .querySelector<HTMLButtonElement>('[role=\"checkbox\"]')\n ?.click();\n }\n }}\n >\n <Checkbox\n className={CHECKBOX_TAP_AREA}\n checked={isChecked}\n aria-label={`Select this ${selectionNoun}`}\n // Radix hands the checkbox's own click through here;\n // shift-range needs the native event's modifier, so\n // the row toggles from onClick, not onCheckedChange.\n onClick={(e) =>\n toggleRowSelected(index, e.shiftKey)\n }\n />\n </div>\n ) : null}\n </td>\n ) : null}\n {visibleColumns.map((col, colIdx) => {\n const isColumnDragShadow =\n columnDragPreview?.draggedId === columnId(col) &&\n columnDragPreview.targetId !== null;\n return (\n <td\n key={columnId(col)}\n data-matrx-table-column-id={columnId(col)}\n data-matrx-column-drag-shadow={\n isColumnDragShadow ? \"true\" : undefined\n }\n className={cn(\n \"py-1.5 align-middle lg:py-0.5\",\n col.compact ? \"px-1\" : \"px-2\",\n // nowrap (NOT truncate — truncate clips the cell and\n // defeats w-max, killing the horizontal scroll).\n \"max-sm:whitespace-nowrap\",\n col.mobileHidden && \"max-sm:hidden\",\n (col.width !== undefined || (resizableColumns && col.resizable !== false)) &&\n \"sm:w-[var(--matrx-col-w)] sm:min-w-[var(--matrx-col-w)] sm:max-w-[var(--matrx-col-w)]\",\n col.className,\n isColumnDragShadow &&\n \"bg-primary/10 shadow-[inset_2px_0_0_var(--primary),inset_-2px_0_0_var(--primary)]\",\n col.align === \"center\" && \"text-center\",\n col.align === \"right\" && \"text-right\",\n )}\n style={columnWidthVar(\n col.width,\n effectiveColumnWidths[columnId(col)],\n columnId(col),\n resizableColumns && col.resizable !== false,\n )}\n >\n <div\n className={cn(\n colIdx === 0 &&\n hierarchy &&\n \"flex min-w-0 items-center\",\n )}\n >\n {colIdx === 0 && hierarchy ? (\n <HierarchyDragHandle\n id={id}\n label={\n hierarchy.itemLabel?.(row) ?? \"row\"\n }\n disabled={\n !(hierarchy.canReparent?.(row) ?? true)\n }\n />\n ) : null}\n {/* Desktop cells are a hard wrapping boundary. `overflow-wrap:\n anywhere` lowers the text min-content width for identifiers,\n URLs, and snake_case values; the descendant selector also\n defeats a consumer's accidental `whitespace-nowrap`. Mark\n compact interactive chrome with `data-matrx-cell-control` so\n its label stays intact. Mobile intentionally keeps\n content-sized horizontal scrolling. */}\n <div\n data-matrx-cell-content\n className=\"min-w-0 max-w-full flex-1 whitespace-normal break-words [overflow-wrap:anywhere] sm:[&_*]:min-w-0 sm:[&_*]:whitespace-normal sm:[&_*]:[overflow-wrap:anywhere] sm:[&_.truncate]:whitespace-nowrap sm:[&_[data-slot=badge]]:whitespace-nowrap sm:[&_[data-slot=badge]]:[overflow-wrap:normal] sm:[&_[data-matrx-cell-control]]:w-max sm:[&_[data-matrx-cell-control]]:min-w-max sm:[&_[data-matrx-cell-control]]:max-w-none sm:[&_[data-matrx-cell-control]]:whitespace-nowrap sm:[&_[data-matrx-cell-control]]:[overflow-wrap:normal] sm:[&_[data-matrx-cell-control]_*]:whitespace-nowrap sm:[&_[data-matrx-cell-control]_*]:[overflow-wrap:normal]\"\n >\n {renderRecordCell(row, col, index)}\n </div>\n </div>\n </td>\n );\n })}\n {showActionsCol && (\n <td\n data-matrx-table-row-action-cell\n className=\"text-right align-middle\"\n style={fixedUtilityWidth(fixedTableGeometry?.actionsWidth)}\n >\n <div\n data-matrx-table-row-actions\n className=\"inline-flex items-center justify-end gap-0\"\n onClick={(e) => e.stopPropagation()}\n >\n {showRowCopy && effectiveCopy ? (\n <TableRowCopyControl\n size=\"toolbar\"\n copy={effectiveCopy}\n row={displayRow}\n sourceId={`${tableCopySourceNamespace}:row:${getRowId(displayRow)}`}\n {...(copy === undefined ? { defaultColumns: declaredVisibleCopyColumns } : {})}\n />\n ) : null}\n {rowActions?.(displayRow, {\n closeDetail: () => setSelectedId(null),\n openDetail: () => openDetail(displayRow),\n openWindow: () => openWindow(displayRow),\n closeWindow,\n hasPendingEdits: Boolean(rowEdits),\n discardPendingEdits: () =>\n discardRowEdits(id),\n })}\n {windowEnabled ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-11 w-11 text-muted-foreground hover:text-foreground [&_svg]:size-5\"\n aria-label={\n windowConfig?.openOnRowClick === true ? \"Open in side panel\" : \"Open in window\"\n }\n onClick={(e) => {\n e.stopPropagation();\n if (windowConfig?.openOnRowClick === true) openDetail(row);\n else openWindow(row);\n }}\n >\n {opensWindowOnRowClick ? (\n <PanelRightOpen className=\"h-5 w-5\" />\n ) : (\n <PanelRight className=\"h-5 w-5\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {windowConfig?.openOnRowClick === true ? \"Open in side panel\" : \"Open in window\"}\n </TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n </td>\n )}\n </tr>\n );\n // The seam that keeps a surface from forking the table for a\n // right-click menu / drag handle / drop target. The wrapper\n // must emit the <tr> unchanged (Radix `asChild` does).\n const wrappedRow = rowWrapper\n ? rowWrapper(row, rowNode)\n : rowNode;\n return hierarchy ? (\n <HierarchyDroppableRow\n key={id}\n id={id}\n disabled={!canDropOn(row)}\n >\n {wrappedRow}\n </HierarchyDroppableRow>\n ) : (\n <Fragment key={id}>{wrappedRow}</Fragment>\n );\n })\n )}\n {appendQuery !== null && isFetching && !isLoading ? (\n <tr data-matrx-table-append-loading-row>\n <td\n colSpan={\n visibleColumns.length +\n leadingCols +\n (showActionsCol ? 1 : 0)\n }\n className=\"sticky bottom-0 z-20 h-16 border-y border-border bg-card/95 px-0 py-0 text-left shadow-sm backdrop-blur-sm\"\n >\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"sticky left-0 flex h-16 w-fit max-w-[100cqw] items-center justify-center gap-2 px-3 text-sm font-medium text-foreground\"\n >\n <Loader2\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0 animate-spin text-primary motion-reduce:animate-none\"\n />\n Loading more rows…\n </div>\n </td>\n </tr>\n ) : null}\n </tbody>\n {footerRows.length > 0 ? (\n <tfoot className=\"border-t-2 border-border bg-muted/50 font-semibold\">\n {footerRows.map((row, index) => (\n <tr key={`footer-${index}`}>\n {selection ? <td className=\"px-2 py-2\" /> : null}\n {visibleColumns.map((column) => (\n <td\n key={columnId(column)}\n className={cn(\n \"px-2 py-2 align-middle\",\n column.compact && \"px-1\",\n column.className,\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n )}\n style={columnWidthVar(\n column.width,\n effectiveColumnWidths[columnId(column)],\n columnId(column),\n resizableColumns && column.resizable !== false,\n )}\n >\n {renderCell(row, column, index)}\n </td>\n ))}\n {showActionsCol ? <td /> : null}\n </tr>\n ))}\n </tfoot>\n ) : null}\n </table>\n </div>\n {/* THE OFF-SCREEN COLUMNS MUST BE DISCOVERABLE ON DESKTOP.\n These measured, glass edge controls remain fixed over the scroll\n viewport while the table moves beneath them. On phones native touch\n scrolling plus the visible next-column edge provides discovery;\n floating 44px controls covered the very row data they were meant to\n reveal, so the buttons begin at `sm`.\n\n Measured 2026-08-25 on Search\n Console → Queries at 1362px: 1,662px of table in a 1,284px\n container — Position, Score and Level were entirely off the right\n edge with NOTHING on screen saying so. A desktop viewport is not a\n promise that everything fits. */}\n {scrollHintLeft ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Scroll table left\"\n data-matrx-table-scroll-control=\"left\"\n className=\"absolute left-1.5 top-1/2 z-30 hidden h-11 w-11 -translate-y-1/2 rounded-full border border-glass-edge bg-glass p-0 text-foreground shadow-glass backdrop-blur-glass backdrop-saturate-glass hover:bg-glass-hover active:bg-glass-active sm:inline-flex\"\n onClick={() => scrollTableHorizontally(\"left\")}\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>More columns to the left</TooltipContent>\n </Tooltip>\n ) : null}\n {scrollHintRight ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Scroll table right\"\n data-matrx-table-scroll-control=\"right\"\n className=\"absolute right-1.5 top-1/2 z-30 hidden h-11 w-11 -translate-y-1/2 rounded-full border border-glass-edge bg-glass p-0 text-foreground shadow-glass backdrop-blur-glass backdrop-saturate-glass hover:bg-glass-hover active:bg-glass-active sm:inline-flex\"\n onClick={() => scrollTableHorizontally(\"right\")}\n >\n <ChevronRight className=\"h-5 w-5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>More columns to the right</TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n\n {appendQuery ? (\n <div\n data-matrx-table-footer\n className=\"flex min-h-11 shrink-0 flex-wrap items-center gap-0 border-t border-border\"\n aria-busy={isLoading || isFetching}\n >\n <div\n {...(isFetching && !isLoading\n ? {}\n : { role: \"status\", \"aria-live\": \"polite\" })}\n className=\"flex w-full min-w-0 items-center gap-2 text-xs text-muted-foreground sm:w-auto sm:flex-1 sm:text-sm\"\n >\n {isLoading ? (\n <Loader2\n data-matrx-table-append-loader\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0 animate-spin text-primary motion-reduce:animate-none\"\n />\n ) : null}\n <div className=\"min-w-0 flex-1\">\n <p className=\"font-medium text-foreground\">\n {isLoading\n ? \"Loading rows…\"\n : `${formatCount(data.length)} loaded${appendQuery.pagination.totalItems === undefined ? \"\" : ` of ${formatCount(appendQuery.pagination.totalItems)}`}`}\n </p>\n {appendQuery.pagination.sourceUntil ? (\n <p>\n Source fixed through{\" \"}\n {new Date(appendQuery.pagination.sourceUntil).toLocaleString()}.\n </p>\n ) : null}\n {!isLoading &&\n !isFetching &&\n !appendQuery.pagination.loadAll?.isLoading &&\n !scrollPagination.error &&\n !appendQuery.pagination.hasNextPage &&\n appendQuery.pagination.totalItems !== undefined &&\n data.length === appendQuery.pagination.totalItems ? (\n <p>All source rows are loaded.</p>\n ) : appendUsesLocalProcessing ? (\n <p>Local search and filters cover loaded rows.</p>\n ) : null}\n {scrollPagination.error ? (\n <p role=\"alert\" className=\"text-destructive\">\n {scrollPagination.error.message}\n </p>\n ) : null}\n {appendScrollPolicy?.mode === \"suspended\" ? (\n <p role=\"status\">\n {appendScrollPolicy.reason} Load more remains available.\n </p>\n ) : null}\n </div>\n </div>\n {appendQuery.pagination.sourcePageSize ? (\n <Select\n value={String(appendQuery.pagination.sourcePageSize.value)}\n onValueChange={(value) =>\n appendQuery.pagination.sourcePageSize?.onChange(Number(value))\n }\n >\n <SelectTrigger\n aria-label=\"Rows per load\"\n className=\"h-11 min-w-20 shrink-0 rounded-md border border-border bg-card px-3 text-sm [&_svg]:size-5\"\n disabled={\n isLoading || isFetching || appendQuery.pagination.loadAll?.isLoading\n }\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {appendQuery.pagination.sourcePageSize.options.map((size) => (\n <SelectItem key={size} value={String(size)}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n {appendQuery.pagination.loadAll?.isLoading ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"h-11 shrink-0 px-3 text-sm\"\n onClick={appendQuery.pagination.loadAll.stop}\n >\n Stop loading\n </Button>\n ) : scrollPagination.error ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"h-11 shrink-0 px-3 text-sm\"\n onClick={\n appendQuery.pagination.retrySource ??\n (appendQuery.pagination.hasNextPage\n ? appendQuery.pagination.loadNextPage\n : appendQuery.pagination.refresh)\n }\n >\n {appendQuery.pagination.retrySource\n ? \"Retry source\"\n : appendQuery.pagination.hasNextPage\n ? \"Retry\"\n : \"Reload rows\"}\n </Button>\n ) : appendQuery.pagination.hasNextPage || scrollPagination.error ? (\n <div className=\"flex min-w-0 max-w-full flex-wrap gap-0\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"h-11 px-3 text-sm\"\n disabled={isLoading || isFetching}\n onClick={() => void scrollPagination.requestNextPage()}\n >\n Load more\n </Button>\n {appendQuery.pagination.loadAll ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-11 px-3 text-sm\"\n disabled={isLoading || isFetching}\n onClick={appendQuery.pagination.loadAll.request}\n >\n Load all\n </Button>\n ) : null}\n </div>\n ) : !isLoading &&\n appendQuery.pagination.totalItems !== undefined &&\n data.length === appendQuery.pagination.totalItems ? (\n <span className=\"min-w-0 max-w-full break-words whitespace-normal px-3 text-xs text-muted-foreground sm:text-sm\">All rows loaded</span>\n ) : null}\n </div>\n ) : !hidePagination && totalItems > 0 ? (\n <div className=\"shrink-0\">\n <GenericTablePagination\n totalItems={totalItems}\n {...(localProgressiveEnabled ? { progressive: {\n shownCount: progressiveRows.shownCount,\n loadedCount: data.length,\n hasMore: progressiveRows.hasMore,\n onShowMore: () => void progressiveRows.showMore(),\n } } : {})}\n itemsPerPage={\n pageSize === 0 && allRowsAreLoaded ? 0 : effectivePageSize\n }\n currentPage={safePage}\n onPageChange={setPage}\n onItemsPerPageChange={(n) => {\n setPageSize(n);\n if (!controlledQuery) setPage(1);\n }}\n pageSizeOptions={pageSizeOptions.filter((size) => size > 0)}\n showAllOption={allRowsAreLoaded}\n allValue={0}\n allOptionLabel=\"All loaded\"\n compact\n hideEntriesInfo={false}\n />\n </div>\n ) : null}\n </div>\n\n <ColumnManager\n open={columnManagerOpen}\n onOpenChange={setColumnManagerOpen}\n columns={columns}\n order={effectiveColumnOrder}\n hidden={effectiveHiddenColumnIds}\n onApply={commitColumnState}\n />\n\n {detailEnabled && selectedRow ? (\n <SidePanelSurface\n // `title` stays a plain string (it is the accessible name), while\n // `titleNode` / `description` carry whatever the caller actually\n // rendered — an `EntityRef` door included. These used to be coerced\n // through string-only resolvers, so a detail config returning JSX had\n // its door silently dropped.\n title={resolveStringTitle(\n detail?.title?.(selectedRow),\n defaultRowTitle(selectedRow, columns),\n )}\n titleNode={detail?.title?.(selectedRow)}\n description={detail?.description?.(selectedRow)}\n onClose={() => setSelectedId(null)}\n defaultWidth={detail?.defaultWidth ?? 480}\n headerActions={\n <div className=\"flex items-center gap-1\">\n {effectiveCopy && showRowCopy ? (\n <TableRowCopyControl\n size=\"icon\"\n copy={effectiveCopy}\n sourceId={`${tableCopySourceNamespace}:row:${getRowId(selectedRow)}`}\n row={selectedRow}\n {...(copy === undefined ? { defaultColumns: declaredVisibleCopyColumns } : {})}\n />\n ) : null}\n {detail?.headerActions?.(selectedRow)}\n {windowEnabled ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n aria-label=\"Open in window\"\n onClick={() => openWindow(selectedRow)}\n >\n <PanelRight className=\"h-5 w-5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Open in window</TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n }\n >\n {detail?.render ? (\n // The panel hands children a `min-h-0 flex-1 overflow-hidden` cell\n // and expects the child to own scrolling. `DataRowInspector` does;\n // custom `detail.render` bodies mostly did not, so their content\n // silently cut off at the fold with no scrollbar. Owning it here\n // fixes the whole class at once — a custom body that already\n // scrolls (`h-full` + `overflow-y-auto` root) still resolves to\n // this container's height, so no second scrollbar appears.\n <div className=\"h-full min-h-0 overflow-y-auto\">\n {detail.render(selectedRow, {\n closeDetail: () => setSelectedId(null),\n openDetail: () => openDetail(selectedRow),\n openWindow: () => openWindow(selectedRow),\n closeWindow,\n hasPendingEdits: Boolean(edits[getRowId(selectedRow)]),\n discardPendingEdits: () =>\n discardRowEdits(getRowId(selectedRow)),\n })}\n </div>\n ) : (\n <DataRowInspector\n row={selectedRow}\n {...(effectiveCopy?.rowKind === undefined ? {} : { recordKind: effectiveCopy?.rowKind })}\n {...(effectiveCopy?.label === undefined ? {} : { recordLabel: effectiveCopy?.label })}\n {...(effectiveCopy?.location === undefined ? {} : { location: effectiveCopy?.location })}\n {...(detail?.tokenForField === undefined ? {} : { tokenForField: detail?.tokenForField })}\n />\n )}\n </SidePanelSurface>\n ) : null}\n\n {windowRow ? (\n <DataRowWindow\n isOpen\n onClose={closeWindow}\n title={\n windowConfig?.title?.(windowRow) ??\n defaultRowTitle(windowRow, columns)\n }\n row={windowRow}\n width={windowConfig?.width}\n height={windowConfig?.height}\n windowId={`matrx-data-row-${urlState?.id ?? \"local\"}-${getRowId(windowRow)}`}\n defaultTab={windowConfig?.defaultTab}\n headerActions={\n <div className=\"flex items-center gap-1\">\n {windowConfig?.openOnRowClick === true && detail?.enabled === true ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n aria-label=\"Open in side panel\"\n onClick={() => {\n closeWindow();\n openDetail(windowRow);\n }}\n >\n <PanelRightOpen className=\"h-5 w-5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Open in side panel</TooltipContent>\n </Tooltip>\n ) : null}\n {effectiveCopy && showRowCopy ? (\n <TableRowCopyControl\n size=\"icon\"\n copy={effectiveCopy}\n sourceId={`${tableCopySourceNamespace}:row:${getRowId(windowRow)}`}\n row={windowRow}\n {...(copy === undefined ? { defaultColumns: declaredVisibleCopyColumns } : {})}\n />\n ) : null}\n </div>\n }\n viewContent={\n windowConfig?.renderView?.(windowRow, {\n closeDetail: () => setSelectedId(null),\n openDetail: () => openDetail(windowRow),\n openWindow: () => openWindow(windowRow),\n closeWindow,\n hasPendingEdits: Boolean(edits[getRowId(windowRow)]),\n discardPendingEdits: () => discardRowEdits(getRowId(windowRow)),\n }) ??\n <DataRowInspector\n row={windowRow}\n recordKind={effectiveCopy?.rowKind ?? \"record\"}\n recordLabel={effectiveCopy?.label ?? \"Record\"}\n location={effectiveCopy?.location ?? \"Table\"}\n fieldCopy={copy !== false}\n {...(detail?.tokenForField === undefined ? {} : { tokenForField: detail?.tokenForField })}\n />\n }\n editContent={\n windowConfig?.renderEdit === false\n ? undefined\n : windowConfig?.renderEdit\n ? windowConfig.renderEdit(windowRow, {\n closeDetail: () => setSelectedId(null),\n openDetail: () => openDetail(windowRow),\n openWindow: () => openWindow(windowRow),\n closeWindow,\n hasPendingEdits: Boolean(edits[getRowId(windowRow)]),\n discardPendingEdits: () =>\n discardRowEdits(getRowId(windowRow)),\n })\n : detail?.render?.(windowRow, {\n closeDetail: () => setSelectedId(null),\n openDetail: () => openDetail(windowRow),\n openWindow: () => openWindow(windowRow),\n closeWindow,\n hasPendingEdits: Boolean(edits[getRowId(windowRow)]),\n discardPendingEdits: () =>\n discardRowEdits(getRowId(windowRow)),\n })\n }\n >\n {windowConfig?.render?.(windowRow, {\n closeDetail: () => setSelectedId(null),\n openDetail: () => openDetail(windowRow),\n openWindow: () => openWindow(windowRow),\n closeWindow,\n hasPendingEdits: Boolean(edits[getRowId(windowRow)]),\n discardPendingEdits: () => discardRowEdits(getRowId(windowRow)),\n })}\n </DataRowWindow>\n ) : null}\n\n {editEnabled ? (\n <>\n {foreignDrafts.length > 0 ? (\n <div\n data-matrx-foreign-drafts\n className=\"fixed inset-x-3 bottom-20 z-50 flex flex-wrap items-center justify-center gap-2 rounded-lg border border-amber-500/40 bg-card px-3 py-2 text-xs shadow-lg sm:inset-x-auto sm:left-1/2 sm:-translate-x-1/2 sm:flex-nowrap\"\n >\n <span>Unsaved edits from previous results</span>\n <CopyButtons\n size=\"xs\"\n label=\"retained drafts\"\n human={() => JSON.stringify(foreignDraftPayload, null, 2)}\n json={() => foreignDraftPayload}\n />\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-7 text-xs text-destructive\" onClick={() => setConfirmForeignDraftDiscard(true)}>\n Discard drafts\n </Button>\n </div>\n ) : null}\n <ConfirmDialog\n open={confirmForeignDraftDiscard}\n onOpenChange={setConfirmForeignDraftDiscard}\n title=\"Discard unsaved edits from previous results?\"\n description=\"This permanently removes edits retained for other result sets. Copy drafts first if you may need them.\"\n confirmLabel=\"Discard drafts\"\n cancelLabel=\"Keep drafts\"\n variant=\"destructive\"\n onConfirm={() => {\n setEditsByScope((current) =>\n Object.fromEntries(\n Object.entries(current).filter(([scope]) => scope === editScopeKey),\n ),\n );\n setConfirmForeignDraftDiscard(false);\n }}\n />\n <DirtySavePill\n changeCount={changeCount}\n saving={saving}\n onSave={() => void handleSaveEdits()}\n onCancel={handleCancelEdits}\n />\n </>\n ) : null}\n </div>\n <DragOverlay>\n {draggedRow ? (\n // w-max: the overlay inherits the ACTIVE node's size, and the active\n // node is the 16px grip handle — without it the label wraps to one\n // character per line.\n <div className=\"w-max max-w-xs truncate rounded border border-border bg-card px-2.5 py-1.5 text-sm font-medium text-foreground shadow-md\">\n {hierarchy?.itemLabel?.(draggedRow) ?? \"Moving row\"}\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n </TooltipProvider>\n );\n}\n\nfunction HierarchyDragHandle({\n id,\n label,\n disabled,\n}: {\n id: string;\n label: string;\n disabled: boolean;\n}) {\n const { attributes, listeners, setNodeRef } = useDraggable({\n id,\n disabled,\n });\n return (\n <button\n ref={setNodeRef}\n type=\"button\"\n disabled={disabled}\n className=\"flex h-11 w-11 shrink-0 touch-none cursor-grab items-center justify-center text-muted-foreground hover:text-foreground active:cursor-grabbing disabled:cursor-default disabled:opacity-40 lg:h-7 lg:w-4\"\n aria-label={`Move ${label}`}\n title=\"Drag to move\"\n onClick={(event) => event.stopPropagation()}\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"h-3.5 w-3.5\" />\n </button>\n );\n}\n\nfunction HierarchyRootDropTarget({\n label,\n draggedLabel,\n}: {\n label: string;\n draggedLabel: string;\n}) {\n const { isOver, setNodeRef } = useDroppable({ id: \"__root__\" });\n return (\n <div\n ref={setNodeRef}\n data-matrx-hierarchy-root\n className={cn(\n \"sticky left-0 top-0 z-40 flex h-8 w-full items-center gap-2 border border-dashed border-primary/50 bg-primary/10 px-3 text-xs font-medium text-primary shadow-sm shadow-primary/20\",\n isOver && \"border-solid bg-primary/20 shadow-md shadow-primary/25\",\n )}\n >\n <span className=\"truncate\">{draggedLabel}</span>\n <span className=\"text-primary/75\">{label}</span>\n </div>\n );\n}\n\ninterface HierarchyIndicatorRect {\n preview: HierarchyDropPreview;\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/**\n * The live drop indicator, isolated so per-mousemove state re-renders ONLY\n * this leaf — never the table (the old design set preview state on the whole\n * table component, re-rendering every row on every pointer move). It draws in\n * the scroll container's own coordinate space, so it scrolls and clips with\n * the rows and can never float over the sticky header or off the table.\n */\nfunction HierarchyDragIndicatorLayer({\n scrollRef,\n resolve,\n}: {\n scrollRef: RefObject<HTMLDivElement | null>;\n resolve: (overId: string, pointerY: number) => HierarchyDropPreview | null;\n}) {\n const [indicator, setIndicator] = useState<HierarchyIndicatorRect | null>(\n null,\n );\n useDndMonitor({\n onDragMove(event) {\n const container = scrollRef.current;\n const overId = event.over ? String(event.over.id) : null;\n const preview =\n container && overId ? resolve(overId, dragPointerY(event)) : null;\n if (!container || !preview || preview.targetId === null) {\n setIndicator(null);\n return;\n }\n const rowElement = container.querySelector(\n `tr[data-row-id=\"${CSS.escape(preview.targetId)}\"]`,\n );\n if (!rowElement) {\n setIndicator(null);\n return;\n }\n const rowRect = rowElement.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n setIndicator({\n preview,\n top: rowRect.top - containerRect.top + container.scrollTop,\n left: rowRect.left - containerRect.left + container.scrollLeft,\n width: rowRect.width,\n height: rowRect.height,\n });\n },\n onDragCancel() {\n setIndicator(null);\n },\n onDragEnd() {\n setIndicator(null);\n },\n });\n if (!indicator) return null;\n const { preview } = indicator;\n const indent = indicator.left + 10 + preview.depth * 12;\n if (preview.position === \"inside\") {\n return (\n <div\n aria-hidden=\"true\"\n data-matrx-hierarchy-indicator=\"inside\"\n className=\"pointer-events-none absolute z-[5] rounded-sm bg-primary/10 ring-2 ring-inset ring-primary/60\"\n style={{\n top: indicator.top,\n left: indicator.left + 2,\n width: Math.max(0, indicator.width - 4),\n height: indicator.height,\n }}\n >\n {/* Left-anchored at the row's indent: the row can be far wider than\n the viewport, so a right-edge label would sit off-screen. */}\n <span\n className=\"absolute top-1/2 -translate-y-1/2 whitespace-nowrap rounded bg-card/95 px-1.5 py-0.5 text-[10px] font-medium text-primary\"\n style={{ left: 32 + preview.depth * 12 }}\n >\n Inside {preview.targetLabel}\n </span>\n </div>\n );\n }\n const lineTop =\n preview.position === \"before\"\n ? indicator.top - 1\n : indicator.top + indicator.height - 1;\n return (\n <div\n aria-hidden=\"true\"\n data-matrx-hierarchy-indicator={preview.position}\n className=\"pointer-events-none absolute z-[5]\"\n style={{\n top: lineTop,\n left: indent,\n width: Math.max(0, indicator.left + indicator.width - indent - 8),\n }}\n >\n <div className=\"relative h-0.5 rounded-full bg-primary\">\n <span className=\"absolute -left-1 top-1/2 h-2 w-2 -translate-y-1/2 rounded-full border-2 border-primary bg-card\" />\n <span\n className={cn(\n \"absolute left-2 rounded bg-card/95 px-1.5 py-0.5 text-[10px] font-medium text-primary\",\n preview.position === \"before\" ? \"top-1\" : \"bottom-1\",\n )}\n >\n {preview.position === \"before\" ? \"Above\" : \"Below\"}{\" \"}\n {preview.targetLabel}\n </span>\n </div>\n </div>\n );\n}\n\ntype HierarchyRowElementProps = HTMLAttributes<HTMLTableRowElement> & {\n ref?: Ref<HTMLTableRowElement>;\n};\n\nfunction HierarchyDroppableRow({\n id,\n disabled,\n children,\n}: {\n id: string;\n disabled: boolean;\n children: ReactNode;\n}) {\n const { setNodeRef } = useDroppable({ id, disabled });\n if (!isValidElement(children) || children.type !== \"tr\") return children;\n const row = children as ReactElement<HierarchyRowElementProps>;\n return cloneElement(row, {\n ref: setNodeRef,\n className: row.props.className,\n });\n}\n\nfunction ColumnHeaderDropZone({\n id,\n enabled,\n children,\n}: {\n id: string;\n enabled: boolean;\n children: ReactNode;\n}) {\n const { setNodeRef } = useDroppable({\n id: `matrx-column-header:${id}`,\n disabled: !enabled,\n data: { matrxDragKind: \"column-header\", columnId: id },\n });\n return <div ref={setNodeRef} className=\"flex min-w-0 items-center\">{children}</div>;\n}\n\n/**\n * Consumer column widths apply ONLY from `sm` up (via the paired\n * `sm:w-[var(--matrx-col-w)]` utilities) — below `sm` the table is\n * content-sized, and a hard width plus nowrap would bleed text across cells.\n */\ninterface FixedTableGeometry {\n tableWidth?: number;\n selectionWidth?: number;\n actionsWidth?: number;\n}\n\nfunction fixedUtilityWidth(width: number | undefined): CSSProperties | undefined {\n return width === undefined\n ? undefined\n : { width: `${width}px`, minWidth: `${width}px`, maxWidth: `${width}px` };\n}\n\nfunction normalizeColumnWidthsForColumns<T>(\n widths: Record<string, unknown> | undefined,\n columns: readonly MatrxColumnDef<T>[],\n): Record<string, number> {\n const byId = new Map(columns.map((column) => [columnId(column), column]));\n const normalized = normalizeColumnWidthMap(widths, new Set(byId.keys()));\n return Object.fromEntries(\n Object.entries(normalized).map(([id, width]) => {\n const column = byId.get(id);\n const bounds = resolveColumnResizeBounds(column?.minWidth, column?.maxWidth);\n return [id, clampColumnWidth(width, bounds)];\n }),\n );\n}\n\nfunction columnWidthVar(\n width: string | number | undefined,\n resizedWidth: number | undefined,\n id: string,\n resizable: boolean,\n): CSSProperties | undefined {\n if (width === undefined && resizedWidth === undefined && !resizable) return undefined;\n // Identity labels need a useful starting width even in an otherwise unconfigured table.\n // Explicit widths and saved/user resizing still win.\n const inferredWidth = resizable && inferTableSearchRole(id) === \"name\" ? \"12rem\" : \"auto\";\n const fallback = resizedWidth === undefined\n ? (width === undefined ? inferredWidth : typeof width === \"number\" ? `${width}px` : width)\n : `${resizedWidth}px`;\n return {\n \"--matrx-col-w\": resizable\n ? `var(${columnResizeCssVar(id)}, ${fallback})`\n : fallback,\n } as CSSProperties;\n}\n\nfunction DefaultJsonCell({ value }: { value: object }) {\n const [open, setOpen] = useState(false);\n const host = useMatrxDataTableHost();\n const Viewer = host.JsonViewer;\n const text = JSON.stringify(value, null, 2);\n const summary = Array.isArray(value) ? `${value.length} items` : Object.keys(value).slice(0, 3).join(\", \") || \"Empty object\";\n return <>\n <Tooltip><TooltipTrigger asChild><button type=\"button\" className=\"block max-w-full truncate text-left text-sm text-foreground\" onClick={(event) => { event.stopPropagation(); setOpen(true); }} style={{ display: \"-webkit-box\", WebkitLineClamp: 2, WebkitBoxOrient: \"vertical\", overflow: \"hidden\", whiteSpace: \"normal\", overflowWrap: \"anywhere\" }} aria-label=\"Open JSON value\">{Array.isArray(value) ? \"[ ]\" : \"{ }\"} {summary}</button></TooltipTrigger><TooltipContent className=\"max-w-md max-h-80 overflow-auto whitespace-pre-wrap break-words\">{text}</TooltipContent></Tooltip>\n <DataRowWindow isOpen={open} onClose={() => setOpen(false)} title=\"JSON value\" row={value} viewContent={Viewer ? <Viewer data={value} /> : <pre className=\"overflow-auto whitespace-pre-wrap p-3 text-xs\">{text}</pre>} />\n </>;\n}\n\nfunction renderCell<T>(\n row: T,\n col: MatrxColumnDef<T>,\n index: number,\n): ReactNode {\n if (col.cell) return col.cell(row, index);\n\n const raw = getCellValue(row, col);\n const kind = col.cellKind ?? \"auto\";\n const asUuid =\n kind === \"uuid\" || kind === \"fk\" || (kind === \"auto\" && isUuidValue(raw));\n\n if (asUuid && typeof raw === \"string\") {\n const forbidden =\n typeof col.fk?.forbidden === \"function\"\n ? col.fk.forbidden(raw, row)\n : Boolean(col.fk?.forbidden);\n const declaredToken =\n typeof col.fk?.token === \"function\" ? col.fk.token(row) : col.fk?.token;\n return (\n <MatrxUuidCell\n value={raw}\n label={\n col.fk?.label ??\n (typeof col.header === \"string\" ? col.header : col.id)\n }\n forbidden={forbidden}\n // `token: \"auto\"` opts INTO the column-name guess. It is opt-in, not\n // the default, because the guess is only safe when the author has\n // checked the FK: `scheduler.sch_run.task_id` points at\n // `scheduler.sch_task`, not the workspace `task` the name implies, and\n // `app_id` / `conversation_id` / `file_id` / `workflow_id` each have\n // several candidate tables. A wrong door sends the user to a different\n // record and is worse than no door at all.\n token={\n declaredToken === \"auto\"\n ? tokenFromColumnName(col.id ?? col.accessorKey ?? \"\")\n : declaredToken\n }\n href={col.fk?.href?.(raw, row)}\n {...(col.fk?.onOpen ? { onOpen: (id: string) => col.fk?.onOpen?.(id, row) } : {})}\n />\n );\n }\n\n if (raw !== null && typeof raw === \"object\" && !(raw instanceof Date)) return <DefaultJsonCell value={raw} />;\n if (typeof raw === \"boolean\") {\n return <span className={raw ? \"rounded bg-emerald-500/10 px-1.5 py-0.5 text-xs text-emerald-600\" : \"rounded bg-slate-500/10 px-1.5 py-0.5 text-xs text-muted-foreground\"}>{raw ? \"Yes\" : \"No\"}</span>;\n }\n const formatted = formatTableDisplayValue(raw);\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"block text-sm text-foreground\" style={{ display: \"-webkit-box\", WebkitLineClamp: 2, WebkitBoxOrient: \"vertical\", overflow: \"hidden\", overflowWrap: \"anywhere\" }}>{formatted}</span>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-md whitespace-pre-wrap break-words max-h-80 overflow-auto\">{typeof raw === \"object\" && raw !== null ? JSON.stringify(raw, null, 2) : formatted}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction resolveStringTitle(\n title: ReactNode | undefined,\n fallback: string,\n): string {\n if (typeof title === \"string\" && title.trim()) return title;\n if (typeof title === \"number\") return String(title);\n return fallback;\n}\n\nexport default MatrxDataTable;\n","import type { SVGProps } from \"react\";\n\ntype IconProps = SVGProps<SVGSVGElement>;\nfunction Icon({ children, ...props }: IconProps) {\n return <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" {...props}>{children}</svg>;\n}\nconst path = <path d=\"M4 12h16M12 4v16\" />;\nexport const ChevronLeft = (p: IconProps) => <Icon {...p}><path d=\"m15 18-6-6 6-6\" /></Icon>;\nexport const ChevronRight = (p: IconProps) => <Icon {...p}><path d=\"m9 18 6-6-6-6\" /></Icon>;\nexport const ChevronDown = (p: IconProps) => <Icon {...p}><path d=\"m6 9 6 6 6-6\" /></Icon>;\nexport const ArrowDown = (p: IconProps) => <Icon {...p}><path d=\"M12 4v16m-6-6 6 6 6-6\" /></Icon>;\nexport const ArrowUp = (p: IconProps) => <Icon {...p}><path d=\"M12 20V4m-6 6 6-6 6 6\" /></Icon>;\nexport const ArrowUpDown = (p: IconProps) => <Icon {...p}><path d=\"M12 4v16m-4-12 4-4 4 4m-8 8 4 4 4-4\" /></Icon>;\nexport const Check = (p: IconProps) => <Icon {...p}><path d=\"m5 12 4 4L19 6\" /></Icon>;\nexport const X = (p: IconProps) => <Icon {...p}><path d=\"M6 6l12 12M18 6 6 18\" /></Icon>;\nexport const Search = (p: IconProps) => <Icon {...p}><circle cx=\"11\" cy=\"11\" r=\"6\" /><path d=\"m16 16 4 4\" /></Icon>;\nexport const Plus = (p: IconProps) => <Icon {...p}>{path}</Icon>;\nexport const Minus = (p: IconProps) => <Icon {...p}><path d=\"M4 12h16\" /></Icon>;\nexport const Eraser = (p: IconProps) => <Icon {...p}><path d=\"m16 3 5 5-11 11H5l-3-3L13 5l3-2Z M8 10l6 6 M10 19h12\" /></Icon>;\nexport const GripVertical = (p: IconProps) => <Icon {...p}><circle cx=\"9\" cy=\"6\" r=\"1\" /><circle cx=\"15\" cy=\"6\" r=\"1\" /><circle cx=\"9\" cy=\"12\" r=\"1\" /><circle cx=\"15\" cy=\"12\" r=\"1\" /><circle cx=\"9\" cy=\"18\" r=\"1\" /><circle cx=\"15\" cy=\"18\" r=\"1\" /></Icon>;\n/** lucide `sliders-horizontal` — used for the table column manager. */\nexport const SlidersHorizontal = (p: IconProps) => <Icon {...p}>\n <path d=\"M21 4h-7M10 4H3M21 12h-9M8 12H3M21 20h-5M12 20H3M14 2v4M8 10v4M16 18v4\" />\n</Icon>;\nexport const Trash2 = (p: IconProps) => <Icon {...p}><path d=\"M4 7h16M10 11v6M14 11v6M9 7l1-2h4l1 2M6 7l1 13h10l1-13\" /></Icon>;\n/**\n * Spinner-only incomplete arc. Never a resting glyph — at rest this reads as a\n * broken half-circle. Pair it with `animate-spin` / `matrx-spin` only while\n * work is actually running. Refresh controls use `RefreshControlIcon`.\n */\nexport const Loader2 = (p: IconProps) => <Icon {...p}><path d=\"M20 12a8 8 0 1 1-2.3-5.7\" /></Icon>;\n/** lucide `refresh-cw` — the resting refresh arrows. */\nexport const RefreshCw = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n </Icon>\n);\n/** Refresh affordance: arrows at rest, spinner only while busy. */\nexport function RefreshControlIcon({\n spinning = false,\n className,\n ...props\n}: IconProps & { spinning?: boolean }) {\n if (spinning) {\n return (\n <Loader2\n className={[className, \"animate-spin\"].filter(Boolean).join(\" \")}\n {...props}\n />\n );\n }\n return <RefreshCw className={className} {...props} />;\n}\nexport const Save = (p: IconProps) => <Icon {...p}><path d=\"M5 3h12l2 2v16H5zM8 3v6h8V3M8 21v-7h8v7\" /></Icon>;\nexport const Pencil = (p: IconProps) => <Icon {...p}><path d=\"m4 20 4-1 11-11-3-3L5 16l-1 4z\" /></Icon>;\nexport const Eye = (p: IconProps) => <Icon {...p}><path d=\"M2 12s3-6 10-6 10 6 10 6-3 6-10 6S2 12 2 12z\" /><circle cx=\"12\" cy=\"12\" r=\"2\" /></Icon>;\nexport const PanelRight = (p: IconProps) => <Icon {...p}><rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M15 4v16\" /></Icon>;\nexport const PanelRightOpen = PanelRight;\nexport const WholeWord = (p: IconProps) => <Icon {...p}><path d=\"M4 6l3 12 3-8 3 8 3-12M17 15h4\" /></Icon>;\nexport const ExternalLink = (p: IconProps) => <Icon {...p}><path d=\"M14 4h6v6M20 4l-9 9M19 13v6H5V5h6\" /></Icon>;\nexport const Copy = (p: IconProps) => <Icon {...p}><rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\" /><path d=\"M15 9V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h3\" /></Icon>;\nexport const Lightbulb = (p: IconProps) => <Icon {...p}><path d=\"M9 18h6M10 22h4M8 14a6 6 0 1 1 8 0c-1 1-1 2-1 3H9c0-1 0-2-1-3z\" /></Icon>;\nexport const ShieldOff = (p: IconProps) => <Icon {...p}><path d=\"m3 3 18 18M12 3l7 3v5c0 4-3 7-7 9-4-2-7-5-7-9V6l4-2\" /></Icon>;\nexport const ListFilter = SlidersHorizontal;\nexport const ListX = X;\n\nexport const ChevronsLeft = (p: IconProps) => <Icon {...p}><path d=\"m11 18-6-6 6-6m8 12-6-6 6-6\" /></Icon>;\nexport const ChevronsRight = (p: IconProps) => <Icon {...p}><path d=\"m5 18 6-6-6-6m8 12 6-6-6-6\" /></Icon>;\n","\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport const buttonVariants = cva(\n \"inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-0 disabled:pointer-events-none disabled:opacity-50 active:scale-[0.98] [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90\",\n /**\n * An explicit spelling of `default`, identical by construction. It is\n * not decoration: matrx-frontend's `ButtonMine` fork carried it, ~17\n * call sites say `variant=\"primary\"`, and the alternative to keeping\n * the word was a host shim translating a prop — the massage C22 bans.\n */\n primary: \"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n /** The affirmative twin of `destructive` — confirm, approve, publish. */\n success:\n \"bg-success text-success-foreground shadow-sm hover:bg-success/90\",\n outline:\n \"border border-border bg-card shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n subtle:\n \"border border-transparent bg-muted/50 text-foreground hover:border-border hover:bg-muted\",\n },\n /**\n * ONE size scale, xs → 3xl, plus the two icon boxes. The top and bottom\n * of the scale came in from matrx-frontend's `ButtonMine` fork (2026-09-07):\n * a dense toolbar needs `xs`, and a marketing/hero call to action needs\n * `xl`+. A host that has to reach outside this scale forks the button,\n * which is exactly how `ButtonMine` was born.\n */\n size: {\n xs: \"h-6 rounded-md px-1 text-xs\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n default: \"h-9 px-4 py-2\",\n /** An explicit spelling of `default` (the fork's middle rung). */\n md: \"h-9 px-4 py-2\",\n lg: \"h-10 rounded-md px-6\",\n xl: \"h-12 px-8 py-3 text-base\",\n \"2xl\": \"h-14 px-10 py-3 text-base\",\n \"3xl\": \"h-16 px-12 py-3 text-base\",\n icon: \"h-9 w-9\",\n \"icon-sm\": \"h-7 w-7\",\n /** A circular icon box — an avatar-shaped control, not a square one. */\n roundIcon: \"h-8 w-8 rounded-full p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Component = asChild ? Slot : \"button\";\n return (\n <Component\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import { useLayoutEffect, useRef, type RefObject } from \"react\";\n\n/** Animate full columns into the projected drop order without changing layout. */\nexport function useColumnReorderAnimation(\n tableRef: RefObject<HTMLTableElement | null>,\n order: string,\n dragging: boolean,\n) {\n const previous = useRef<{ positions: Map<string, number>; dragging: boolean }>({ positions: new Map(), dragging: false });\n const animations = useRef<Animation[]>([]);\n\n useLayoutEffect(() => {\n const table = tableRef.current;\n if (!table) return;\n const headers = Array.from(table.querySelectorAll<HTMLTableCellElement>(\"th[data-matrx-table-column-id]\"));\n const positions = new Map(headers.map(header => [header.dataset.matrxTableColumnId!, header.offsetLeft]));\n const prefersReducedMotion =\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n const shouldAnimate =\n (dragging || previous.current.dragging) && !prefersReducedMotion;\n const offsets = new Map<string, number>();\n for (const header of headers) {\n const id = header.dataset.matrxTableColumnId!;\n const oldLeft = previous.current.positions.get(id);\n if (oldLeft === undefined) continue;\n // Carry unfinished travel forward when the pointer crosses several columns quickly.\n const transform = getComputedStyle(header).transform;\n const remaining = transform && transform !== \"none\" ? new DOMMatrixReadOnly(transform).m41 : 0;\n offsets.set(id, oldLeft - header.offsetLeft + remaining);\n }\n animations.current.forEach(animation => animation.cancel());\n animations.current = [];\n if (shouldAnimate) {\n for (const cell of Array.from(table.querySelectorAll<HTMLElement>(\"[data-matrx-table-column-id]\"))) {\n const offset = offsets.get(cell.dataset.matrxTableColumnId!);\n if (!offset || typeof cell.animate !== \"function\") continue;\n animations.current.push(cell.animate(\n [{ transform: `translateX(${offset}px)` }, { transform: \"translateX(0)\" }],\n { duration: 180, easing: \"cubic-bezier(0.2, 0.8, 0.2, 1)\" },\n ));\n }\n }\n previous.current = { positions, dragging };\n }, [tableRef, order, dragging]);\n\n useLayoutEffect(() => () => {\n animations.current.forEach(animation => animation.cancel());\n }, []);\n}\n","\"use client\";\n\n/**\n * Checkbox — Radix checkbox, and the indeterminate ruling that came with it.\n *\n * RADIX RENDERS THE INDICATOR FOR BOTH `checked` AND `\"indeterminate\"`. The\n * stock shadcn body puts a full check inside it either way, so a half-selected\n * \"select all\" tells the user every row is selected — a screen stating\n * something false. The two states get different glyphs here, always.\n *\n * `size` carries the two boxes the hosts had forked into: matrx-frontend's\n * dense 14px control and the stock 16px one.\n */\n\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { CheckIcon, DividerHorizontalIcon } from \"./icons\";\n\nexport type CheckboxSize = \"sm\" | \"md\";\n\nconst CHECKBOX_SIZES: Record<CheckboxSize, { root: string; glyph: string }> = {\n sm: { root: \"h-3.5 w-3.5 rounded-xs\", glyph: \"h-3 w-3\" },\n md: { root: \"h-4 w-4 rounded-sm\", glyph: \"h-3.5 w-3.5\" },\n};\n\nexport interface CheckboxProps\n extends React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> {\n /** Box size. Default `md` (the stock 16px control); `sm` is the dense 14px one. */\n size?: CheckboxSize;\n}\n\nconst Checkbox = React.forwardRef<\n React.ComponentRef<typeof CheckboxPrimitive.Root>,\n CheckboxProps\n>(({ className, size = \"md\", ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n data-slot=\"checkbox\"\n className={cn(\n \"peer shrink-0 cursor-pointer border border-primary shadow focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground\",\n CHECKBOX_SIZES[size].root,\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current\"\n >\n {props.checked === \"indeterminate\" ? (\n <DividerHorizontalIcon className={CHECKBOX_SIZES[size].glyph} />\n ) : (\n <CheckIcon className={CHECKBOX_SIZES[size].glyph} />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport { Checkbox };\n","/**\n * Internal inlined SVG icons (policy C19: no icon-library dependency, ever).\n *\n * Each icon is copied from the exact glyph the ported originals rendered:\n * lucide-react's Loader2 / ChevronLeft / ChevronRight / MoreHorizontal and\n * @radix-ui/react-icons' Cross2Icon. Same viewBoxes, same paths, same default\n * stroke geometry — a host swapping the import sees pixel-identical output.\n *\n * Not exported from the package entry; components consume them directly.\n */\n\nimport * as React from \"react\";\n\ntype IconProps = React.SVGAttributes<SVGSVGElement>;\n\nfunction lucideProps(props: IconProps): React.SVGAttributes<SVGSVGElement> {\n return {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n \"aria-hidden\": true,\n ...props,\n };\n}\n\n/**\n * lucide `loader-2` — the spinner glyph. Callers add `matrx-spin`.\n * Never a resting icon: at rest this incomplete arc reads as a broken\n * half-circle. Refresh controls use arrows, then swap to this only while busy.\n */\nexport function Loader2Icon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\n/** lucide `chevron-left`. */\nexport function ChevronLeftIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n );\n}\n\n/** lucide `chevron-right`. */\nexport function ChevronRightIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n );\n}\n\n/** lucide `chevron-down` — the disclosure's open glyph. */\nexport function ChevronDownIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\n/** lucide `archive` — the archived-rows glyph (ArchivedDisclosure). */\nexport function ArchiveIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <rect width=\"20\" height=\"5\" x=\"2\" y=\"3\" rx=\"1\" />\n <path d=\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8\" />\n <path d=\"M10 12h4\" />\n </svg>\n );\n}\n\n/** lucide `more-horizontal` — the kebab/ellipsis glyph. */\nexport function MoreHorizontalIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n </svg>\n );\n}\n\n/** lucide `check` — the selected-row tick (CreatablePicker). */\nexport function LucideCheckIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\n/** lucide `chevrons-up-down` — the combobox trigger glyph. */\nexport function ChevronsUpDownIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m7 15 5 5 5-5\" />\n <path d=\"m7 9 5-5 5 5\" />\n </svg>\n );\n}\n\n/** lucide `external-link` — the manage-in-new-tab glyph. */\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n </svg>\n );\n}\n\n/** lucide `lock` — the platform-governed vocabulary glyph. */\nexport function LockIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n );\n}\n\n/** lucide `plus` — the create/add glyph. */\nexport function PlusIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </svg>\n );\n}\n\n/** lucide `x` — the dialog close glyph (host dialog module used lucide X). */\nexport function XIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\n/**\n * @radix-ui/react-icons components default to width/height 15 — the bare\n * `<ChevronUpIcon />` renders in Select's scroll buttons rely on it.\n */\nfunction radixProps(props: IconProps): React.SVGAttributes<SVGSVGElement> {\n return {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 15 15\",\n width: 15,\n height: 15,\n fill: \"none\",\n \"aria-hidden\": true,\n ...props,\n };\n}\n\n/** @radix-ui/react-icons `MagnifyingGlassIcon` — the command search glyph. */\nexport function MagnifyingGlassIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M10 6.5C10 8.433 8.433 10 6.5 10C4.567 10 3 8.433 3 6.5C3 4.567 4.567 3 6.5 3C8.433 3 10 4.567 10 6.5ZM9.30884 10.0159C8.53901 10.6318 7.56251 11 6.5 11C4.01472 11 2 8.98528 2 6.5C2 4.01472 4.01472 2 6.5 2C8.98528 2 11 4.01472 11 6.5C11 7.56251 10.6318 8.53901 10.0159 9.30884L12.8536 12.1464C13.0488 12.3417 13.0488 12.6583 12.8536 12.8536C12.6583 13.0488 12.3417 13.0488 12.1464 12.8536L9.30884 10.0159Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `CheckIcon` — the select item indicator glyph. */\nexport function CheckIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M11.4669 3.72684C11.7558 3.91574 11.8369 4.30308 11.648 4.59198L7.39799 11.092C7.29783 11.2452 7.13556 11.3467 6.95402 11.3699C6.77247 11.3931 6.58989 11.3355 6.45446 11.2124L3.70446 8.71241C3.44905 8.48022 3.43023 8.08494 3.66242 7.82953C3.89461 7.57412 4.28989 7.55529 4.5453 7.78749L6.75292 9.79441L10.6018 3.90792C10.7907 3.61902 11.178 3.53795 11.4669 3.72684Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/**\n * @radix-ui/react-icons `DividerHorizontalIcon` — the INDETERMINATE checkbox\n * glyph. Radix renders the indicator for both `true` and `\"indeterminate\"`, so\n * a half-selected \"select all\" that shows a full check states something false;\n * the two states get different glyphs on purpose.\n */\nexport function DividerHorizontalIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M2 7.5C2 7.22386 2.22386 7 2.5 7H12.5C12.7761 7 13 7.22386 13 7.5C13 7.77614 12.7761 8 12.5 8H2.5C2.22386 8 2 7.77614 2 7.5Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `DotFilledIcon` — the menu radio-item indicator. */\nexport function DotFilledIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M9.875 7.5C9.875 8.81168 8.81168 9.875 7.5 9.875C6.18832 9.875 5.125 8.81168 5.125 7.5C5.125 6.18832 6.18832 5.125 7.5 5.125C8.81168 5.125 9.875 6.18832 9.875 7.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `ChevronRightIcon` — the submenu-trigger glyph. */\nexport function RadixChevronRightIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M6.1584 3.13508C6.35985 2.94621 6.67627 2.95642 6.86514 3.15788L10.6151 7.15788C10.7954 7.3502 10.7954 7.64949 10.6151 7.84182L6.86514 11.8418C6.67627 12.0433 6.35985 12.0535 6.1584 11.8646C5.95694 11.6757 5.94673 11.3593 6.1356 11.1579L9.565 7.49985L6.1356 3.84182C5.94673 3.64036 5.95694 3.32394 6.1584 3.13508Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `ChevronDownIcon` — the select trigger/scroll glyph. */\nexport function RadixChevronDownIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `ChevronUpIcon` — the select scroll-up glyph. */\nexport function RadixChevronUpIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M3.13523 8.84197C3.3241 9.04343 3.64052 9.05363 3.84197 8.86477L7.5 5.43536L11.158 8.86477C11.3595 9.05363 11.6759 9.04343 11.8648 8.84197C12.0536 8.64051 12.0434 8.32409 11.842 8.13523L7.84197 4.38523C7.64964 4.20492 7.35036 4.20492 7.15803 4.38523L3.15803 8.13523C2.95657 8.32409 2.94637 8.64051 3.13523 8.84197Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `Cross2Icon` — the dialog/sheet close glyph. */\nexport function Cross2Icon(props: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 15 15\"\n fill=\"none\"\n aria-hidden\n {...props}\n >\n <path\n d=\"M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/**\n * @radix-ui/react-icons `DragHandleDots2Icon` — the grip on `ResizableHandle`.\n * Inlined per C19: this package depends on no icon library.\n */\nexport function DragHandleDots2Icon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M4.5 2.5C5.05228 2.5 5.5 2.05228 5.5 1.5C5.5 0.947715 5.05228 0.5 4.5 0.5C3.94772 0.5 3.5 0.947715 3.5 1.5C3.5 2.05228 3.94772 2.5 4.5 2.5ZM4.5 6.5C5.05228 6.5 5.5 6.05229 5.5 5.5C5.5 4.94771 5.05228 4.5 4.5 4.5C3.94772 4.5 3.5 4.94771 3.5 5.5C3.5 6.05229 3.94772 6.5 4.5 6.5ZM5.5 9.5C5.5 10.0523 5.05228 10.5 4.5 10.5C3.94772 10.5 3.5 10.0523 3.5 9.5C3.5 8.94771 3.94772 8.5 4.5 8.5C5.05228 8.5 5.5 8.94771 5.5 9.5ZM4.5 14.5C5.05228 14.5 5.5 14.0523 5.5 13.5C5.5 12.9477 5.05228 12.5 4.5 12.5C3.94772 12.5 3.5 12.9477 3.5 13.5C3.5 14.0523 3.94772 14.5 4.5 14.5ZM11.5 1.5C11.5 2.05228 11.0523 2.5 10.5 2.5C9.94771 2.5 9.5 2.05228 9.5 1.5C9.5 0.947715 9.94771 0.5 10.5 0.5C11.0523 0.5 11.5 0.947715 11.5 1.5ZM10.5 6.5C11.0523 6.5 11.5 6.05229 11.5 5.5C11.5 4.94771 11.0523 4.5 10.5 4.5C9.94771 4.5 9.5 4.94771 9.5 5.5C9.5 6.05229 9.94771 6.5 10.5 6.5ZM11.5 9.5C11.5 10.0523 11.0523 10.5 10.5 10.5C9.94771 10.5 9.5 10.0523 9.5 9.5C9.5 8.94771 9.94771 8.5 10.5 8.5C11.0523 8.5 11.5 8.94771 11.5 9.5ZM10.5 14.5C11.0523 14.5 11.5 14.0523 11.5 13.5C11.5 12.9477 11.0523 12.5 10.5 12.5C9.94771 12.5 9.5 12.9477 9.5 13.5C9.5 14.0523 9.94771 14.5 10.5 14.5Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** lucide `star` — the default-organization badge (OrganizationPicker). */\nexport function StarIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\" />\n </svg>\n );\n}\n\n/** lucide `building-2` — the organization glyph (OrganizationPicker trigger). */\nexport function Building2Icon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z\" />\n <path d=\"M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2\" />\n <path d=\"M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2\" />\n <path d=\"M10 6h4\" />\n <path d=\"M10 10h4\" />\n <path d=\"M10 14h4\" />\n <path d=\"M10 18h4\" />\n </svg>\n );\n}\n","\"use client\";\n\n/**\n * AlertDialog — the confirm/destroy surface (78 host import sites).\n *\n * Ported from matrx-frontend `components/ui/alert-dialog.tsx`, which was the\n * only variant in the fleet that had been hardened. Its rulings, kept verbatim:\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. The gate a\n * wrapper once carried (\"Radix ids differ between SSR and client\") was\n * false, and it deleted always-visible Triggers (delete buttons, mostly)\n * from SSR and the first client paint.\n *\n * 2. AN UNDESCRIBED ALERT DIALOG STILL DESCRIBES ITSELF. A confirm dialog with\n * no `AlertDialogDescription` gets a screen-reader-only one rather than a\n * console warning — the surface where a blind user is about to destroy\n * something is the wrong place to ship an accessibility gap.\n *\n * ADDED HERE, from the same doctrine `Dialog` already carries and this\n * component demonstrably needed:\n *\n * 3. IT IS CLAMPED TO THE VIEWPORT AND SCROLLS INSIDE ITSELF\n * (`max-h-[85dvh] overflow-y-auto`). The host copy was NOT — an alert\n * dialog whose body listed what is about to be deleted pushed Cancel and\n * Continue below the fold on a short viewport, and the only way out was a\n * backdrop click. On an ALERT dialog Radix does not dismiss on backdrop\n * click, so the surface was a genuine dead end. Recorded in CHANGELOG as a\n * real defect fixed in the port, not \"preserved\".\n *\n * 4. THE ACTIONS ARE 44px TALL ON COARSE POINTERS. `AlertDialogAction` and\n * `AlertDialogCancel` inherit the package Button's own target rules through\n * `buttonVariants`; the footer keeps them safe-area padded on mobile.\n *\n * 5. THE STICKY FOOTER NEVER PAINTS OVER THE BODY (0.11.3). Ruling 3's footer\n * bled over the card's bottom padding with a negative block margin, and\n * `position: sticky` clamps a box to its containing block — so the footer\n * was dragged UP by `--dialog-pad` against the card's `gap-4`, covering the\n * last 8px of the consequence copy at every length, unreachable because the\n * card did not scroll. The bleed is now the card's RESERVATION\n * (`.matrx-dialog-card` hands its bottom padding to the footer), which\n * sticky has nothing to clamp. See `sticky-footer-geometry.test.tsx`.\n *\n * SEAM INVERSION. The host resolved its portal target through\n * `usePopoutContainer` (its window-panel popout body); here that is the\n * package's `PortalContainerProvider`, with an explicit `container` prop still\n * winning.\n */\n\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\nimport { treeContainsComponent } from \"@ai-matrx/kit/react-tree\";\nimport * as React from \"react\";\n\nimport { buttonVariants } from \"./button\";\nimport { cn } from \"./cn\";\nimport { CENTERED_DIALOG, MOTION_DIALOG, MOTION_OVERLAY } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\n\nconst AlertDialog = AlertDialogPrimitive.Root;\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\n\n/**\n * Portal-seam-aware AlertDialogPortal. Explicit `container` wins; with none,\n * the injected container; with neither, Radix's `document.body`.\n */\nconst AlertDialogPortal = ({\n container,\n ...props\n}: Omit<\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Portal>,\n \"container\"\n> & {\n /** `undefined` → use the injected container; `null` → force document.body. */\n container?: HTMLElement | null | undefined;\n}) => {\n const resolved = usePortalContainer(container);\n return (\n <AlertDialogPrimitive.Portal container={resolved ?? null} {...props} />\n );\n};\nAlertDialogPortal.displayName = \"AlertDialogPortal\";\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n ref={ref}\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-[10000] bg-[var(--matrx-overlay-scrim)]\",\n MOTION_OVERLAY,\n className,\n )}\n {...props}\n />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\n/**\n * Unstyled, non-portalling Content for custom layouts. AlertDialog is always\n * modal, so `aria-modal` is stated rather than derived.\n */\nconst AlertDialogContentPrimitive = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>((props, ref) => (\n <AlertDialogPrimitive.Content {...props} ref={ref} aria-modal=\"true\" />\n));\nAlertDialogContentPrimitive.displayName = \"AlertDialogContentPrimitive\";\n\nconst AlertDialogDescription = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n ref={ref}\n data-slot=\"alert-dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nAlertDialogDescription.displayName =\n AlertDialogPrimitive.Description.displayName;\n\nexport interface AlertDialogContentProps\n extends React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content> {\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly. It is NOT the reduced-motion switch;\n * `styles.css` already honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nconst AlertDialogContent = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Content>,\n AlertDialogContentProps\n>(({ className, children, container, animated = true, ...props }, ref) => {\n const hasDescription =\n treeContainsComponent(children, AlertDialogDescription) ||\n treeContainsComponent(children, AlertDialogPrimitive.Description);\n return (\n <AlertDialogPortal container={container}>\n <AlertDialogOverlay />\n <AlertDialogContentPrimitive\n ref={ref}\n data-slot=\"alert-dialog-content\"\n className={cn(\n `matrx-dialog-card fixed left-[50%] top-[50%] z-[10000] grid min-w-0 w-full max-w-lg ${CENTERED_DIALOG} gap-4 border bg-background p-6 shadow-lg`,\n // Ruling 3 — never taller than the viewport, always scrollable, and\n // the footer stays reachable via --dialog-pad like Dialog's.\n // Ruling 5 (0.11.3) — `matrx-dialog-card` hands the bottom padding to\n // a sticky footer when there is one, so the footer's box matches the\n // space the grid gave it and sticky never clamps it up over the\n // consequence copy.\n \"max-h-[85dvh] overflow-y-auto overscroll-contain [--dialog-pad:1.5rem] overflow-x-clip [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full\",\n \"sm:rounded-lg\",\n animated && MOTION_DIALOG,\n className,\n )}\n {...props}\n >\n {hasDescription ? null : (\n <AlertDialogPrimitive.Description className=\"sr-only\">\n Please confirm the action described in this dialog.\n </AlertDialogPrimitive.Description>\n )}\n {children}\n </AlertDialogContentPrimitive>\n </AlertDialogPortal>\n );\n});\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nconst AlertDialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\"flex flex-col space-y-2 text-center sm:text-left\", className)}\n {...props}\n />\n);\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\nconst AlertDialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n // Ruling 3/4 — sticky to the card edges so a scrolled body never shows\n // through under the actions, and safe-area padded on a phone.\n //\n // 🚨 THERE IS NO `mb-[…]` HERE, AND THERE MUST NEVER BE ONE AGAIN\n // (0.11.3, feedback bf8fb00b). The bleed over the card's bottom padding\n // used to be a NEGATIVE BLOCK MARGIN, which makes this box taller than\n // the grid area the card allocates it — and `position: sticky` CLAMPS a\n // box to its containing block, so the browser yanked the footer UP by\n // `--dialog-pad` against the card's `gap-4` and painted 8px of opaque\n // footer over the last line of the consequence, at every length. The\n // card now RESERVES this footer's block size instead (`matrx-dialog-card`\n // in styles.css hands over its `padding-bottom`), so the bleed costs no\n // margin at all. Guard: `sticky-footer-geometry.test.tsx`.\n //\n // These stay UTILITIES rather than a shipped rule so a caller's\n // `className` still wins through tailwind-merge — a shipped rule would\n // have to be unlayered to survive Tailwind preflight (§ THE PREFLIGHT\n // RULE in styles.css) and would then override every caller's padding.\n \"sticky bottom-0 z-10 bg-background pt-3\",\n \"mx-[calc(var(--dialog-pad,0px)*-1)] px-[var(--dialog-pad,0px)] pb-[var(--dialog-pad,0px)]\",\n className,\n )}\n {...props}\n />\n);\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n\nconst AlertDialogTitle = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title\n ref={ref}\n data-slot=\"alert-dialog-title\"\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nconst AlertDialogAction = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action\n ref={ref}\n data-slot=\"alert-dialog-action\"\n className={cn(buttonVariants(), className)}\n {...props}\n />\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nconst AlertDialogCancel = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n data-slot=\"alert-dialog-cancel\"\n className={cn(\n buttonVariants({ variant: \"outline\" }),\n \"mt-2 sm:mt-0\",\n className,\n )}\n {...props}\n />\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogContentPrimitive,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n};\n","/**\n * THE MOTION CONTRACT (0.10.0) — the class names every animated surface in\n * this package puts on the DOM, in ONE place.\n *\n * Why a module and not ten inline strings: the sweep that produced this file\n * found the same defect ten times over, and it was invisible each time\n * because each primitive spelled its animation out by hand. Ten hand-written\n * copies of `data-[state=open]:animate-in data-[state=closed]:animate-out\n * data-[state=closed]:fade-out-0 …` meant ten chances to reach for a utility\n * nothing in the package defines — which is exactly what happened. A single\n * exported constant per motion SHAPE means the next primitive cannot invent\n * an eleventh spelling, and `styles.test.ts` can prove every one of them\n * resolves to a rule in the shipped stylesheet.\n *\n * Every rule these name lives in `styles.css` under the package's own\n * keyframes. NONE of them is a Tailwind utility, and none requires a host\n * plugin — see that file's header for the measurement that made this\n * necessary.\n */\n\n/** Modal scrims: Dialog, AlertDialog, Sheet, CommandDialog. Fade only. */\nexport const MOTION_OVERLAY = \"matrx-motion-overlay\";\n\n/** The centred dialog card. Fades and scales; centring is not its business. */\nexport const MOTION_DIALOG = \"matrx-motion-dialog\";\n\n/**\n * THE CENTRING OF A CENTRED DIALOG CARD — package-owned, in the `translate`\n * property, and NEVER a Tailwind `translate-x-[-50%] translate-y-[-50%]` pair.\n *\n * Those utilities do not compile to the same thing in every host: Tailwind v3\n * writes them into `transform`, Tailwind v4 writes them into the independent\n * `translate` property, which COMPOSES with `transform` instead of being\n * replaced by it. 0.10.0's keyframes restated the centring inside `transform`,\n * which was harmless on v3 and doubled the centring on v4 — the card flew in\n * from off the top-left of the viewport for the animation's whole duration and\n * snapped into place at the end (fixed in 0.10.1).\n *\n * Owning it here means one spelling that reads the same on both, and it frees\n * `transform` so the keyframes carry ONLY the delta. Put this on every centred\n * surface UNCONDITIONALLY — it is geometry, so unlike {@link MOTION_DIALOG} it\n * must survive `animated={false}`. Its rule ships in `styles.css`.\n */\nexport const CENTERED_DIALOG = \"matrx-dialog-centered\";\n\n/**\n * The resting gap between a `popper`-positioned surface and its trigger, for\n * the primitives that want one (today: `Select`). Same law and same reason as\n * {@link CENTERED_DIALOG} — a position an animated surface holds AT REST is\n * the `translate` property's job, never a Tailwind translate utility, because\n * those land in `transform` on a v3 host and in `translate` on a v4 one while\n * the keyframes animate `transform` either way. Sizes from\n * `--matrx-popper-offset`; keys off Radix's `data-side`.\n */\nexport const POPPER_OFFSET = \"matrx-popper-offset\";\n\n/** The mobile Dialog / CommandDialog bottom sheet. Slides up and fades. */\nexport const MOTION_BOTTOM_SHEET = \"matrx-motion-bottom-sheet\";\n\n/**\n * Radix-popper surfaces: Popover, DropdownMenu, ContextMenu, HoverCard,\n * Select, Tooltip. Reads `--radix-popper-transform-origin` so the surface\n * grows out of its trigger, and `data-side` so it travels from it.\n */\nexport const MOTION_POPPER = \"matrx-motion-popper\";\n\n/** Edge sheets, one class per `sheetVariants` side. */\nexport const MOTION_SHEET = {\n top: \"matrx-motion-sheet-top\",\n bottom: \"matrx-motion-sheet-bottom\",\n left: \"matrx-motion-sheet-left\",\n right: \"matrx-motion-sheet-right\",\n center: \"matrx-motion-sheet-center\",\n} as const;\n\n/** Skeleton's breathing loop. */\nexport const MOTION_PULSE = \"matrx-pulse\";\n\n/** The spinner loop, for every inline busy indicator in the package. */\nexport const MOTION_SPIN = \"matrx-spin\";\n\n/**\n * Every motion class the package ships, for the guards. If a rule for one of\n * these is missing from `styles.css`, a component animates in no consumer and\n * says nothing about it — the C26 failure this list exists to make loud.\n */\nexport const ALL_MOTION_CLASSES = [\n MOTION_OVERLAY,\n MOTION_DIALOG,\n MOTION_BOTTOM_SHEET,\n MOTION_POPPER,\n ...Object.values(MOTION_SHEET),\n MOTION_PULSE,\n MOTION_SPIN,\n] as const;\n\n/**\n * The host-plugin utilities this package is forbidden to emit. They are\n * supplied by `tailwindcss-animate` / `tw-animate-css`, which is a HOST CSS\n * entry concern a package cannot declare a dependency on: three of the four\n * AI Matrx consumers never loaded it, so every surface wearing these appeared\n * with no animation and no error. `styles.test.ts` fails the build if one\n * comes back.\n */\nexport const FORBIDDEN_HOST_MOTION_UTILITIES = [\n \"animate-in\",\n \"animate-out\",\n \"fade-in\",\n \"fade-out\",\n \"zoom-in\",\n \"zoom-out\",\n \"slide-in-from\",\n \"slide-out-to\",\n \"animate-accordion\",\n \"animate-slide-down\",\n \"animate-slide-up\",\n \"animate-pulse\",\n \"animate-spin\",\n] as const;\n","\"use client\";\n\n/**\n * Injected portal-container seam.\n *\n * The matrx-frontend original resolved nested portal targets through\n * `useNestedPortalContainer` (explicit prop > dialog content > popout body >\n * document.body) — a host-shaped hook wired to that app's dialog and\n * window-panel systems. The package inverts the seam: hosts provide the\n * resolved container through `PortalContainerProvider`; an explicit\n * `container` prop on a component still wins, and with neither the portal\n * falls through to `document.body` (Radix default). Priority semantics are\n * unchanged from the original.\n */\n\nimport * as React from \"react\";\n\n// Shared identity across independently bundled public entrypoints/loaders.\nconst CONTEXT_SLOT = Symbol.for(\"ai-matrx.design-system.portal-container-context\");\nconst contextRegistry = globalThis as typeof globalThis & { [CONTEXT_SLOT]?: React.Context<HTMLElement | null | undefined> };\nconst PortalContainerContext = contextRegistry[CONTEXT_SLOT] ??= React.createContext<HTMLElement | null | undefined>(undefined);\n\nexport interface PortalContainerProviderProps {\n /** Where nested Radix portals (Popover, etc.) should mount. `null`/`undefined` → document.body. */\n container: HTMLElement | null | undefined;\n children: React.ReactNode;\n}\n\nexport function PortalContainerProvider({\n container,\n children,\n}: PortalContainerProviderProps) {\n return (\n <PortalContainerContext.Provider value={container ?? undefined}>\n {children}\n </PortalContainerContext.Provider>\n );\n}\n\n/**\n * Resolve a portal target: explicit prop (including an explicit `null`,\n * meaning \"the default body\") beats the injected container.\n */\nexport function usePortalContainer(\n explicit?: HTMLElement | null,\n): HTMLElement | undefined {\n const injected = React.useContext(PortalContainerContext);\n\n if (explicit !== undefined) {\n return explicit ?? undefined;\n }\n\n return injected ?? undefined;\n}\n","\"use client\";\n\n/**\n * ConfirmDialog — the `window.confirm` replacement, declarative half.\n *\n * WHY IT LIVES HERE AND NOT IN `@ai-matrx/kit` (census row 19i, decided by the\n * package-graph ruling of 2026-09-07, on the row-20a Tooltip precedent).\n *\n * kit shipped this dialog with its own inlined AlertDialog, its own inlined\n * button class strings, a hardcoded 80%-opaque black scrim, and\n * `data-[state=open]:animate-in … zoom-in-95 … slide-in-from-top-[48%]` —\n * host-plugin utilities `tailwindcss-animate`/`tw-animate-css` supply and a\n * package cannot ship. kit ships NO stylesheet at all, so in three of the four\n * consumers the most consequential surface in the app (the one standing\n * between a user and a destroyed thing) appeared with no animation, no error,\n * and a scrim that ignored the theme. kit could not import the fix:\n * `@ai-matrx/design-system` depends on `@ai-matrx/kit`, so importing back is a\n * cycle; giving kit its own sheet would invent a second required-CSS contract\n * no consumer performs (the C26 silent host contract, one layer down).\n *\n * The resolution is the one row 20a already proved: the surface moves to the\n * package that owns the surface. This file is built on THIS package's\n * `AlertDialog` — so it inherits, for free and forever:\n *\n * - the package motion layer (`matrx-motion-overlay` / `matrx-motion-dialog`),\n * whose rules ship in `styles.css` and are proven present in the tarball;\n * - `--matrx-overlay-scrim`, a token that answers to the host's theme,\n * instead of an opaque black literal;\n * - AlertDialog ruling 3 — clamped to `max-h-[85dvh]`, scrolling inside\n * itself, with a sticky footer. **This is what makes the consequence-first\n * copy law survivable**: a confirmation that names everything it is about\n * to destroy can be long, and in kit's copy a long one pushed Cancel and\n * Continue below the fold of a short viewport with no backdrop dismissal —\n * a dead end on a destructive action;\n * - `buttonVariants` as the ONE source of button appearance, including the\n * 44px coarse-pointer target;\n * - `PortalContainerProvider`, so a dialog opened inside a popped-out window\n * panel renders in THAT window's document.\n *\n * kit keeps `./confirm-opener` — the pure, React-free imperative `confirm()`\n * and its `globalThis`-slotted host registry — and re-exports nothing of this.\n * Consumers mount `<ConfirmDialogHost />` from here and call `confirm()` from\n * there. See `confirm-host.tsx` for the join.\n *\n * BEHAVIOR IS THE KIT PORT, VERBATIM. Every prop, default and interaction is\n * unchanged; only the chrome underneath it is the package's.\n *\n * Pattern: hold the pending target in state, render `<ConfirmDialog />` once at\n * the bottom of the component, and open it by setting the target. When busy\n * state is meaningful (a network delete that should hold the dialog open with a\n * spinner), use THIS component inline; the imperative `confirm()` closes\n * immediately on click.\n */\n\nimport * as React from \"react\";\n\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"./alert-dialog\";\nimport { buttonVariants } from \"./button\";\nimport { cn } from \"./cn\";\nimport { Loader2Icon } from \"./icons\";\nimport { MOTION_SPIN } from \"./motion\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: React.ReactNode;\n /**\n * THE CONSEQUENCE. Per the platform's destructive-and-expensive-actions law,\n * a confirmation must name what is lost, what is duplicated, and/or what it\n * costs — \"Are you sure?\" is not a confirmation. This renders as the dialog's\n * accessible description, so a screen-reader user is told the consequence\n * too, and it is never clamped or truncated.\n */\n description?: React.ReactNode | undefined;\n /**\n * Rich body rendered between the header and the footer. Use it for\n * supplementary or interactive content that is not part of the dialog's\n * accessible consequence description.\n */\n content?: React.ReactNode | undefined;\n /** Extra classes for the dialog content (e.g. a wider max-w for diffs). */\n contentClassName?: string | undefined;\n confirmLabel?: string | undefined;\n /**\n * `null` hides the cancel button entirely — for acknowledge-only dialogs\n * where there is nothing to cancel. Anything else labels it.\n */\n cancelLabel?: string | null | undefined;\n variant?: \"default\" | \"destructive\" | undefined;\n busy?: boolean | undefined;\n /**\n * Blocks confirming without pretending work is in flight. For a dialog whose\n * `content` asks the user something the action cannot proceed without — the\n * choice is missing, not loading — `busy` would show a misleading spinner.\n */\n confirmDisabled?: boolean | undefined;\n /**\n * Explicit portal target. Default (undefined): the container injected by\n * `PortalContainerProvider`, else `document.body`. Hosts with retargeting\n * needs (a popped-out browser window whose dialog must render in THAT\n * window's document) may still pass the element directly.\n */\n portalContainer?: HTMLElement | null | undefined;\n onConfirm: () => void | Promise<void>;\n}\n\n/**\n * Drop-in replacement for `window.confirm`. Use this anywhere you would\n * otherwise reach for a browser-level confirm dialog.\n */\nexport function ConfirmDialog({\n open,\n onOpenChange,\n title,\n description,\n content,\n contentClassName,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n variant = \"default\",\n busy = false,\n confirmDisabled = false,\n portalContainer,\n onConfirm,\n}: ConfirmDialogProps) {\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent\n className={contentClassName}\n {...(portalContainer === undefined ? {} : { container: portalContainer })}\n >\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n {description ? (\n <AlertDialogDescription asChild>\n <div>{description}</div>\n </AlertDialogDescription>\n ) : null}\n </AlertDialogHeader>\n {content ?? null}\n <AlertDialogFooter>\n {cancelLabel === null ? null : (\n <AlertDialogCancel className=\"max-lg:min-h-11\" disabled={busy}>\n {cancelLabel}\n </AlertDialogCancel>\n )}\n <AlertDialogAction\n disabled={busy || confirmDisabled}\n onClick={(event) => {\n event.preventDefault();\n void onConfirm();\n }}\n className={cn(\n \"max-lg:min-h-11\",\n // One source of button appearance: the destructive look comes\n // from `buttonVariants`, not a second hand-written copy of it.\n // tailwind-merge makes it WIN over the default variant classes.\n variant === \"destructive\" &&\n buttonVariants({ variant: \"destructive\" }),\n )}\n >\n {busy ? (\n <Loader2Icon className={cn(\"mr-2 h-4 w-4\", MOTION_SPIN)} />\n ) : null}\n {confirmLabel}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","\"use client\";\n\n/**\n * Input family — ported verbatim from matrx-frontend `components/ui/input.tsx`.\n *\n * Seam inversions:\n * - `MatrxVariant` (host `components/ui/types`) becomes the structural\n * `InputVariant` union with the identical members, so host call sites are\n * drop-in compatible.\n * - The host file's `CopyInput` / `FancyInput` / `DeleteInput` are\n * deliberately NOT absorbed (C8 split-out law): they carry a `motion/react`\n * dependency (and clipboard behavior) that plain-Input consumers must not\n * pay for. They stay host-owned until sanctioned separately.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport type InputVariant =\n | \"default\"\n | \"destructive\"\n | \"success\"\n | \"outline\"\n | \"secondary\"\n | \"ghost\"\n | \"link\"\n | \"primary\";\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n variant?: InputVariant;\n}\n\nconst getVariantStyles = (variant: InputVariant = \"default\") => {\n const baseStyles = `flex h-10 w-full border border-border bg-background text-foreground shadow-input rounded-md px-3 py-2 text-sm file:border-0 file:bg-transparent\n file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground\n focus-visible:outline-none focus-visible:ring-[2px] focus-visible:ring-ring\n disabled:cursor-not-allowed disabled:opacity-50\n dark:shadow-none\n transition duration-400\n [&:-webkit-autofill]:bg-background [&:-webkit-autofill]:shadow-[0_0_0_1000px_hsl(var(--background))_inset] [&:-webkit-autofill]:[caret-color:currentColor]\n dark:[&:-webkit-autofill]:shadow-[0_0_0_1000px_hsl(var(--background))_inset] dark:[&:-webkit-autofill]:[-webkit-text-fill-color:hsl(var(--foreground))]\n [&:-webkit-autofill:hover]:shadow-[0_0_0_1000px_hsl(var(--background))_inset] [&:-webkit-autofill:focus]:shadow-[0_0_0_1000px_hsl(var(--background))_inset]`;\n\n switch (variant) {\n case \"destructive\":\n return `${baseStyles} bg-destructive text-destructive-foreground`;\n case \"outline\":\n return `${baseStyles} border-2`;\n case \"secondary\":\n return `${baseStyles} bg-secondary text-secondary-foreground`;\n case \"ghost\":\n return `${baseStyles} bg-transparent shadow-none`;\n case \"link\":\n return `${baseStyles} bg-transparent underline-offset-4 hover:underline`;\n case \"primary\":\n return `${baseStyles} bg-primary text-primary-foreground`;\n default:\n return baseStyles;\n }\n};\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, variant = \"default\", ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(getVariantStyles(variant), className)}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport interface EnterInputProps extends InputProps {\n onEnter?: () => void;\n}\n\nexport const EnterInput = React.forwardRef<HTMLInputElement, EnterInputProps>(\n ({ onEnter, ...props }, ref) => {\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && onEnter) {\n e.preventDefault();\n onEnter();\n }\n };\n\n return (\n <Input\n {...props}\n ref={ref}\n onKeyDown={(e) => {\n handleKeyDown(e);\n if (props.onKeyDown) {\n props.onKeyDown(e);\n }\n }}\n />\n );\n },\n);\n\nEnterInput.displayName = \"EnterInput\";\n\nexport const BasicInput = React.forwardRef<HTMLInputElement, InputProps>(\n // `variant` is accepted (prop-compatible with Input) but intentionally\n // unused — and destructured so it never leaks onto the DOM element.\n ({ className, type, variant: _variant = \"default\", ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nBasicInput.displayName = \"BasicInput\";\n\nexport interface InputWithPrefixProps extends Omit<InputProps, \"prefix\"> {\n prefix?: React.ReactNode;\n wrapperClassName?: string;\n}\n\nexport const InputWithPrefix = React.forwardRef<\n HTMLInputElement,\n InputWithPrefixProps\n>(({ prefix, className, wrapperClassName, ...props }, ref) => {\n return (\n <div className={cn(\"relative\", wrapperClassName)}>\n {prefix && (\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground\">\n {prefix}\n </div>\n )}\n <Input\n ref={ref}\n className={cn(prefix && \"pl-10\", className)}\n {...props}\n />\n </div>\n );\n});\nInputWithPrefix.displayName = \"InputWithPrefix\";\n","\"use client\";\n\n/**\n * Select — ported verbatim from matrx-frontend `components/ui/select.tsx`.\n *\n * Seam inversions:\n * - The host's `useNestedPortalContainer` (dialog/popout aware) becomes the\n * injected `PortalContainerProvider` seam (`portal-container.tsx`); the\n * explicit `container` prop keeps top priority, exactly as before.\n * - `ChevronDownIcon` / `ChevronUpIcon` / `CheckIcon` come from the package's\n * inlined SVGs (C19), not @radix-ui/react-icons — same glyphs, same\n * viewBoxes. (The origin also imported `CaretSortIcon` without ever using\n * it; the dead import is not carried along.)\n *\n * THE ROOT RENDERS UNCONDITIONALLY — no mount gate. This wrapper used to defer\n * rendering until after hydration (\"Radix generates dynamic aria-controls ids\n * that differ between SSR and client\"), and that justification was false:\n * Radix ids come from React's SSR-stable `useId` (verified against\n * @radix-ui/react-select 2.3.1 / react-id 1.1.2). The gate was actively\n * harmful — it deleted the ALWAYS-VISIBLE select trigger (a form control)\n * from SSR and the first client paint.\n */\n\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER, POPPER_OFFSET } from \"./motion\";\nimport {\n CheckIcon,\n RadixChevronDownIcon,\n RadixChevronUpIcon,\n} from \"./icons\";\nimport { usePortalContainer } from \"./portal-container\";\n\nexport const Select = SelectPrimitive.Root;\n\nexport const SelectGroup = SelectPrimitive.Group;\n\nexport const SelectValue = SelectPrimitive.Value;\n\nexport const selectTriggerVariants = cva(\n \"flex w-full items-center justify-between gap-2 whitespace-nowrap rounded-md border border-border bg-card text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground transition-colors hover:bg-accent hover:border-accent-foreground/20 focus:outline-none focus:ring-1 focus:ring-primary/30 focus:border-primary/40 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:min-w-0 [&>span]:line-clamp-1\",\n {\n variants: {\n size: {\n sm: \"h-7 px-2 py-1 text-xs\",\n default: \"h-9 px-3 py-1\",\n lg: \"h-10 px-3 py-2\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n },\n);\n\nexport interface SelectTriggerProps\n extends\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>,\n VariantProps<typeof selectTriggerVariants> {\n hideArrow?: boolean;\n}\n\nexport const SelectTrigger = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Trigger>,\n SelectTriggerProps\n>(({ className, children, hideArrow = false, size, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(selectTriggerVariants({ size, className }))}\n {...props}\n >\n {children}\n {!hideArrow && (\n <SelectPrimitive.Icon asChild>\n <RadixChevronDownIcon className=\"h-4 w-4 shrink-0 opacity-50\" />\n </SelectPrimitive.Icon>\n )}\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nexport const SelectScrollUpButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <RadixChevronUpIcon />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nexport const SelectScrollDownButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <RadixChevronDownIcon />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName;\n\nexport interface SelectContentProps\n extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> {\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly. It is NOT the reduced-motion switch;\n * `styles.css` already honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nexport const SelectContent = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Content>,\n SelectContentProps\n>(\n (\n {\n className,\n children,\n position = \"popper\",\n container,\n animated = true,\n ...props\n },\n ref,\n ) => {\n const portalContainer = usePortalContainer(container);\n return (\n <SelectPrimitive.Portal container={portalContainer}>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-[10001] max-h-96 min-w-[8rem] max-w-[calc(100vw-2rem)] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n animated && MOTION_POPPER,\n // The resting gap from the trigger. It is the `translate` property\n // (POPPER_OFFSET), never Tailwind translate utilities: those compose\n // with `transform` on a v4 host and are REPLACED by it on a v3 one,\n // so on v3 the animation ate the gap and the surface snapped 4px at\n // the end. Same law as the centred dialog card — see motion.ts.\n position === \"popper\" && POPPER_OFFSET,\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"max-w-full overflow-y-auto p-0.5\",\n position === \"popper\" &&\n \"w-full min-w-[var(--radix-select-trigger-width)] max-h-[var(--radix-select-content-available-height)]\",\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n});\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nexport const SelectLabel = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nexport const SelectItem = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item> & {\n /**\n * Secondary line shown under the label IN THE LIST ONLY. Rendered outside\n * Radix `ItemText` on purpose: everything inside `ItemText` is what the\n * closed trigger displays, so a description passed as `children` gets\n * squeezed into the fixed-height trigger and clipped. This prop keeps the\n * trigger to the one-line label while the open list shows both lines.\n */\n description?: React.ReactNode;\n }\n>(({ className, children, description, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full min-w-0 cursor-default select-none rounded-sm py-1 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n description ? \"flex-col items-start gap-0.5 py-1.5\" : \"items-center\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <span className=\"min-w-0 whitespace-normal break-words [overflow-wrap:anywhere]\">\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </span>\n {description ? (\n <span className=\"block min-w-0 break-words text-xs leading-snug text-muted-foreground [overflow-wrap:anywhere]\">\n {description}\n </span>\n ) : null}\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nexport const SelectSeparator = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n","/**\n * Skeleton — the \"content is coming\" placeholder.\n *\n * Ported from matrx-frontend `components/ui/skeleton.tsx`; no seams, pure\n * markup over semantic tokens. ONE change from the original (0.10.0): the\n * breathing loop is `.matrx-pulse`, a package-owned keyframe, not Tailwind's\n * `animate-pulse`. A Skeleton that does not pulse is indistinguishable from an\n * empty grey box — it stops saying \"loading\" and starts saying \"nothing here\"\n * — so the motion is part of the component's meaning and ships with it (see\n * `styles.css` § THE MOTION LAYER).\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_PULSE } from \"./motion\";\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Package-owned pulse. Default `true`. Pass `false` for a static\n * placeholder — a print/PDF render, or a screenshot fixture where the\n * animation makes the output non-deterministic. `prefers-reduced-motion`\n * already SLOWS the pulse rather than stopping it (a still skeleton would\n * lose the information), so this is not the accessibility switch.\n */\n animated?: boolean;\n}\n\nexport function Skeleton({ className, animated = true, ...props }: SkeletonProps) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\n \"rounded-md bg-primary/10\",\n animated && MOTION_PULSE,\n className,\n )}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../cn\";\n\nexport interface TableTitleRowProps {\n title?: string;\n /** A page owns h1; tables nested within a page use the default h2. */\n headingLevel?: 1 | 2;\n /** Optional real context, such as a schema link or saved-view selector. */\n context?: ReactNode;\n count?: { value: number; label: string };\n search?: ReactNode;\n actions?: ReactNode;\n children?: ReactNode;\n className?: string;\n}\n\n/** Shared responsive title composition. Hosts retain their existing query,\n * navigation and persistence controllers; this component owns layout only. */\nexport function TableTitleRow({\n title,\n headingLevel = 2,\n context,\n count,\n search,\n actions,\n children,\n className,\n}: TableTitleRowProps) {\n const Heading = headingLevel === 1 ? \"h1\" : \"h2\";\n return (\n <div\n data-matrx-table-toolbar\n className={cn(\n \"relative flex min-w-0 shrink-0 flex-wrap items-center gap-2\",\n className,\n )}\n >\n {title ? (\n <Heading className=\"min-w-0 break-words text-sm font-semibold\">\n {title}\n </Heading>\n ) : null}\n {count ? (\n <span\n className=\"shrink-0 rounded-md bg-muted px-2 py-0.5 text-xs tabular-nums\"\n aria-label={`${count.value.toLocaleString()} ${count.label}`}\n >\n {count.value.toLocaleString()}\n </span>\n ) : null}\n {search ? (\n <div\n data-matrx-table-title-search\n className=\"order-last w-full min-w-0 sm:order-none sm:w-auto sm:min-w-64 sm:max-w-md\"\n >\n {search}\n </div>\n ) : null}\n {context}\n {children}\n {actions ? (\n <div\n data-matrx-table-actions\n className=\"ml-auto flex min-w-0 flex-wrap items-center gap-0\"\n >\n {actions}\n </div>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport { useRef, useState } from \"react\";\nimport { Input } from \"../input\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport { Search, X } from \"./icons\";\nimport type { TableSearchScope } from \"./ranked-search\";\n\nexport interface TableSearchProps {\n value: string;\n onChange: (value: string) => void;\n scope: string;\n onScopeChange: (scope: string) => void;\n scopes: readonly TableSearchScope[];\n placeholder?: string;\n}\n\n/** The title row is the positioning parent. The placeholder keeps its original\n * height and width while the focused control overlays the complete toolbar. */\nexport function TableSearch({ value, onChange, scope, onScopeChange, scopes, placeholder = \"Search…\" }: TableSearchProps) {\n const [expanded, setExpanded] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n return (\n <div data-matrx-table-search className=\"h-11 min-w-0 w-full sm:max-w-xs\">\n <div\n data-matrx-table-search-expanded={expanded || undefined}\n className=\"flex h-11 min-w-0 items-center rounded-md border border-input bg-background shadow-input\"\n style={expanded ? { position: \"absolute\", insetInline: 0, top: 0, zIndex: 30 } : { position: \"relative\" }}\n onFocus={() => setExpanded(true)}\n onBlur={event => {\n if (!event.currentTarget.contains(event.relatedTarget)) setExpanded(false);\n }}\n onKeyDown={event => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n setExpanded(false);\n inputRef.current?.blur();\n }\n }}\n >\n <Search aria-hidden=\"true\" className=\"ml-2 h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <Input\n ref={inputRef}\n value={value}\n onChange={event => onChange(event.target.value)}\n placeholder={placeholder}\n aria-label={placeholder.replace(/[…\\.]+$/, \"\") || \"Search table\"}\n className=\"h-full min-w-0 flex-1 border-0 bg-transparent px-2 shadow-none focus-visible:ring-0\"\n style={{ fontSize: \"16px\" }}\n />\n {value ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\" aria-label=\"Clear search\" className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-md hover:bg-muted\" onClick={() => { onChange(\"\"); inputRef.current?.focus(); }}>\n <X aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Clear search</TooltipContent>\n </Tooltip>\n ) : null}\n {expanded ? (\n <div role=\"group\" aria-label=\"Search fields\" className=\"flex shrink-0 items-center overflow-x-auto\" style={{ maxWidth: \"min(60%, max(0px, calc(100% - 12rem)))\" }}>\n {scopes.map(option => (\n <button key={option.id} type=\"button\" aria-pressed={scope === option.id} className=\"flex h-11 shrink-0 items-center justify-center px-1 text-xs\" onClick={() => onScopeChange(option.id)}>\n <span className={scope === option.id ? \"rounded-full bg-primary px-2 py-1 text-primary-foreground\" : \"rounded-full px-2 py-1 text-muted-foreground hover:bg-muted\"}>{option.label}</span>\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Tooltip — the ONE tooltip in the fleet.\n *\n * THE COLLAPSE (0.6.0). Two implementations existed: matrx-frontend's\n * `components/ui/tooltip.tsx` (182 import sites) and `@ai-matrx/tap-target`'s\n * `src/tooltip.tsx` — the latter an explicit inlined PORT of the former,\n * carrying a header that said so. tap-target shipped it only because its ~60\n * tap buttons need a tooltip and no shared package owned one; four repos then\n * adopted `TooltipProvider` from tap-target. That made tap-target — a\n * button-geometry package — the accidental owner of a design-system primitive,\n * with a second copy living in the biggest host.\n *\n * A tooltip is a design-system surface, so it lives here. tap-target now takes\n * `@ai-matrx/design-system` as an ordinary sibling dependency and imports this\n * file; its own copy is deleted, and its re-export removed. The DAG already\n * ordered design-system before tap-target, so no cycle is introduced.\n *\n * BEHAVIOUR is matrx-frontend's, verbatim, including the ruling both copies\n * carried in prose:\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. The gate the\n * host wrapper once carried (\"Radix generates dynamic aria-controls ids that\n * differ between SSR and client\") was false: Radix ids come from React's\n * SSR-stable `useId`. It was actively harmful — a Trigger wraps\n * ALWAYS-VISIBLE content, so `return null` deleted that subtree from SSR and\n * the first client paint.\n *\n * 2. THE SURFACE IS NEUTRAL, NOT BRANDED. Popover tokens, not `bg-primary`:\n * rich tooltip content using `text-muted-foreground` was illegible on a\n * brand-coloured background in one theme or the other.\n *\n * SEAM INVERSION. The host resolved nested portal targets through\n * `useNestedPortalContainer` (an app hook wired to its dialog + window-panel\n * systems); tap-target's port dropped that seam entirely and always portalled\n * to `document.body` — which is why a tooltip inside a popped-out panel landed\n * in the wrong window. Here it is the package's `PortalContainerProvider`\n * seam: an explicit `container` prop wins, then the injected container, then\n * `document.body`. Both prior behaviours are reachable; neither is forked.\n */\n\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\n\n/**\n * Mount once near the app root. Every tooltip in the tree shares its\n * `delayDuration` / `skipDelayDuration` timing.\n */\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nexport interface TooltipContentProps\n extends React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> {\n /**\n * Explicit portal target; wins over the injected `PortalContainerProvider`\n * value. Pass `null` to force `document.body`.\n */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly. It is NOT the reduced-motion switch;\n * `styles.css` already honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nconst TooltipContent = React.forwardRef<\n React.ComponentRef<typeof TooltipPrimitive.Content>,\n TooltipContentProps\n>(({ className, sideOffset = 4, container, animated = true, ...props }, ref) => {\n const resolved = usePortalContainer(container);\n return (\n <TooltipPrimitive.Portal container={resolved ?? null}>\n <TooltipPrimitive.Content\n ref={ref}\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-[10001] overflow-hidden rounded-md border border-border bg-popover px-3 py-1.5 text-xs text-popover-foreground shadow-md\",\n animated && MOTION_POPPER,\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n );\n});\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport type ScrollPaginationContainer =\n | HTMLElement\n | RefObject<HTMLElement | null>\n | null;\n\nexport interface UseScrollPaginationOptions {\n /** Every visible desktop/mobile scroll container that may present this table. */\n containers: readonly ScrollPaginationContainer[];\n /** Immutable identity of every source-affecting query value. */\n queryKey: string;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n loading: boolean;\n /** Automatic scrolling never retries a failed append. */\n error: Error | null;\n loadNextPage: () => Promise<void> | void;\n /** Manual mode exposes the explicit request only; it installs no listeners. */\n mode?: \"scroll\" | \"manual\";\n /** Distance from the bottom at which a qualifying user scroll may append. */\n thresholdPx?: number;\n /** How long an input may authorize the following real scroll movement. */\n intentTimeoutMs?: number;\n enabled?: boolean;\n}\n\nexport interface UseScrollPaginationResult {\n /** For the table's accessible Load more / Retry control. */\n requestNextPage: () => Promise<void>;\n canLoadMore: boolean;\n /** Includes an unexpected loader rejection until the person explicitly retries. */\n error: Error | null;\n}\n\ninterface ScrollOwner { element: HTMLElement; document: boolean; }\ninterface ScrollIntent {\n queryKey: string;\n source: HTMLElement;\n owner: ScrollOwner;\n startTop: number;\n sequence: number;\n expiresAt: number;\n}\n\nconst DEFAULT_THRESHOLD_PX = 96;\nconst DEFAULT_INTENT_TIMEOUT_MS = 1_200;\n\nfunction resolveContainer(container: ScrollPaginationContainer): HTMLElement | null {\n if (!container) return null;\n return container instanceof HTMLElement ? container : container.current;\n}\n\nfunction isVisibleContainer(container: HTMLElement): boolean {\n if (!container.isConnected) return false;\n for (let node: HTMLElement | null = container; node; node = node.parentElement) {\n const style = window.getComputedStyle(node);\n if (style.display === \"none\" || style.visibility === \"hidden\") return false;\n }\n return true;\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n return target.isContentEditable || Boolean(target.closest(\"input, textarea, select, [contenteditable='true']\"));\n}\n\nfunction isDownwardKeyboardInput(event: KeyboardEvent): boolean {\n if (isEditableTarget(event.target)) return false;\n return [\"ArrowDown\", \"PageDown\", \"End\", \" \", \"Spacebar\"].includes(event.key);\n}\n\nfunction isNearBottom(container: HTMLElement, thresholdPx: number): boolean {\n return container.scrollHeight - container.clientHeight - container.scrollTop <= thresholdPx;\n}\n\nfunction isVerticallyScrollable(element: HTMLElement): boolean {\n const overflowY = window.getComputedStyle(element).overflowY;\n return (overflowY === \"auto\" || overflowY === \"scroll\" || overflowY === \"overlay\") && element.scrollHeight > element.clientHeight;\n}\nfunction resolveScrollOwner(source: HTMLElement): ScrollOwner {\n const documentOwner = document.scrollingElement instanceof HTMLElement\n ? document.scrollingElement\n : document.documentElement;\n for (let node: HTMLElement | null = source; node; node = node.parentElement) {\n if (node === documentOwner || node === document.documentElement || node === document.body) {\n return { element: documentOwner, document: true };\n }\n if ((node === source && node.scrollHeight > node.clientHeight) || isVerticallyScrollable(node)) {\n return { element: node, document: false };\n }\n }\n return { element: documentOwner, document: true };\n}\nfunction ownerScrollTop(owner: ScrollOwner): number {\n return owner.document\n ? window.scrollY || document.documentElement.scrollTop || document.body.scrollTop || 0\n : owner.element.scrollTop;\n}\nfunction sourceBottomIsNearOwnerViewport(source: HTMLElement, owner: ScrollOwner, thresholdPx: number): boolean {\n if (!owner.document && owner.element === source) return isNearBottom(source, thresholdPx);\n const sourceRect = source.getBoundingClientRect();\n const ownerRect = owner.document ? { top: 0, bottom: window.innerHeight } : owner.element.getBoundingClientRect();\n return sourceRect.bottom > ownerRect.top && sourceRect.top < ownerRect.bottom && sourceRect.bottom <= ownerRect.bottom + thresholdPx;\n}\n\nfunction isNativeScrollbarPointer(event: PointerEvent, container: HTMLElement): boolean {\n // Overlay scrollbars expose no measurable gutter. Do not guess: Load more is\n // the accessible, reliable fallback there. A content click must never grant\n // permission for a later programmatic scroll to append rows.\n if (event.pointerType !== \"mouse\" || event.button !== 0 || !event.isPrimary) return false;\n const gutterWidth = container.offsetWidth - container.clientWidth;\n if (gutterWidth <= 0 || container.scrollHeight <= container.clientHeight) return false;\n const rect = container.getBoundingClientRect();\n return event.clientX >= rect.right - gutterWidth && event.clientX <= rect.right;\n}\n\n/**\n * Gates automatic append behind a fresh, real downward user scroll. The hook\n * owns neither fetching nor row state: callers feed it the data hook receipt\n * and render its explicit request as the accessible fallback control.\n */\nexport function useScrollPagination({\n containers,\n queryKey,\n hasNextPage,\n isFetchingNextPage,\n loading,\n error,\n loadNextPage,\n mode = \"scroll\",\n thresholdPx = DEFAULT_THRESHOLD_PX,\n intentTimeoutMs = DEFAULT_INTENT_TIMEOUT_MS,\n enabled = true,\n}: UseScrollPaginationOptions): UseScrollPaginationResult {\n const [requestError, setRequestError] = useState<Error | null>(null);\n const latestRef = useRef({\n queryKey,\n hasNextPage,\n isFetchingNextPage,\n loading,\n error,\n loadNextPage,\n mode,\n thresholdPx,\n enabled,\n });\n latestRef.current = {\n queryKey,\n hasNextPage,\n isFetchingNextPage,\n loading,\n error,\n loadNextPage,\n mode,\n thresholdPx,\n enabled,\n };\n\n const intentRef = useRef<ScrollIntent | null>(null);\n const inputSequenceRef = useRef(0);\n const consumedSequenceRef = useRef(0);\n const requestGenerationRef = useRef(0);\n const inFlightGenerationRef = useRef<number | null>(null);\n const requestErrorRef = useRef<Error | null>(null);\n const mountedRef = useRef(false);\n // Listener effects reattach when consumers recreate their container arrays.\n // Keep the last real scroll position with the element, not with one effect.\n const observedTopRef = useRef<WeakMap<HTMLElement, number>>(new WeakMap());\n const effectiveError = error ?? requestError;\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const requestNextPage = async () => {\n const current = latestRef.current;\n if (\n !current.enabled ||\n (!current.hasNextPage && effectiveError === null) ||\n current.loading ||\n current.isFetchingNextPage ||\n inFlightGenerationRef.current !== null\n ) {\n return;\n }\n const generation = ++requestGenerationRef.current;\n inFlightGenerationRef.current = generation;\n requestErrorRef.current = null;\n setRequestError(null);\n try {\n await current.loadNextPage();\n } catch (raw) {\n const nextError = raw instanceof Error ? raw : new Error(String(raw));\n if (inFlightGenerationRef.current === generation && latestRef.current.queryKey === current.queryKey) {\n requestErrorRef.current = nextError;\n if (mountedRef.current) setRequestError(nextError);\n }\n } finally {\n if (inFlightGenerationRef.current === generation) {\n inFlightGenerationRef.current = null;\n intentRef.current = null;\n }\n }\n };\n\n useEffect(() => {\n intentRef.current = null;\n observedTopRef.current = new WeakMap();\n consumedSequenceRef.current = inputSequenceRef.current;\n requestErrorRef.current = null;\n setRequestError(null);\n // A query change makes every existing completion stale. Its finally block\n // cannot clear a new request because generations are monotonically unique.\n inFlightGenerationRef.current = null;\n requestGenerationRef.current += 1;\n }, [queryKey]);\n\n useEffect(() => {\n if (mode !== \"scroll\" || !enabled || typeof window === \"undefined\") return;\n const attachable = containers.map(resolveContainer).filter((container): container is HTMLElement => container !== null);\n const ownerCleanups = new Map<HTMLElement, () => void>();\n const handleScroll = (source: HTMLElement, owner: ScrollOwner) => {\n const intent = intentRef.current;\n const current = latestRef.current;\n if (!intent || intent.queryKey !== current.queryKey || intent.source !== source || intent.owner.element !== owner.element || intent.owner.document !== owner.document || Date.now() > intent.expiresAt || ownerScrollTop(owner) <= intent.startTop || intent.sequence <= consumedSequenceRef.current || !isVisibleContainer(source) || !sourceBottomIsNearOwnerViewport(source, owner, current.thresholdPx) || !current.hasNextPage || current.loading || current.isFetchingNextPage || current.error !== null || requestErrorRef.current !== null || inFlightGenerationRef.current !== null) return;\n consumedSequenceRef.current = intent.sequence;\n void requestNextPage();\n };\n const ensureOwnerListener = (owner: ScrollOwner) => {\n if (ownerCleanups.has(owner.element)) return;\n const onOwnerScroll = () => {\n const intent = intentRef.current;\n if (intent && intent.owner.element === owner.element && intent.owner.document === owner.document) handleScroll(intent.source, owner);\n observedTopRef.current.set(owner.element, ownerScrollTop(owner));\n };\n if (owner.document) window.addEventListener(\"scroll\", onOwnerScroll, { passive: true });\n else owner.element.addEventListener(\"scroll\", onOwnerScroll, { passive: true });\n ownerCleanups.set(owner.element, () => {\n if (owner.document) window.removeEventListener(\"scroll\", onOwnerScroll);\n else owner.element.removeEventListener(\"scroll\", onOwnerScroll);\n });\n };\n const setIntent = (source: HTMLElement) => {\n const current = latestRef.current;\n const owner = resolveScrollOwner(source);\n if (!isVisibleContainer(source) || current.loading || current.isFetchingNextPage || inFlightGenerationRef.current !== null) return;\n inputSequenceRef.current += 1;\n const currentOwnerTop = ownerScrollTop(owner);\n const observedOwnerTop = observedTopRef.current.get(owner.element) ?? currentOwnerTop;\n observedTopRef.current.set(owner.element, currentOwnerTop);\n intentRef.current = { queryKey: current.queryKey, source, owner, startTop: Math.min(observedOwnerTop, currentOwnerTop), sequence: inputSequenceRef.current, expiresAt: Date.now() + intentTimeoutMs };\n ensureOwnerListener(owner);\n };\n const cleanups = attachable.map((source) => {\n if (!observedTopRef.current.has(source)) observedTopRef.current.set(source, source.scrollTop);\n const onWheel = (event: WheelEvent) => { if (event.deltaY > 0 && Math.abs(event.deltaY) > Math.abs(event.deltaX)) setIntent(source); };\n const onTouchStart = (event: TouchEvent) => { const touch = event.touches.item(0); if (touch) source.dataset.matrxPaginationTouchY = String(touch.clientY); };\n const onTouchMove = (event: TouchEvent) => { const touch = event.touches.item(0); const startY = Number(source.dataset.matrxPaginationTouchY); if (touch && Number.isFinite(startY) && startY - touch.clientY > 0) setIntent(source); };\n const onTouchEnd = () => { delete source.dataset.matrxPaginationTouchY; };\n const onKeyDown = (event: KeyboardEvent) => { if (isDownwardKeyboardInput(event)) setIntent(source); };\n const onPointerDown = (event: PointerEvent) => { if (isNativeScrollbarPointer(event, source)) setIntent(source); };\n const onScroll = () => { handleScroll(source, { element: source, document: false }); observedTopRef.current.set(source, source.scrollTop); };\n source.addEventListener(\"wheel\", onWheel, { passive: true }); source.addEventListener(\"touchstart\", onTouchStart, { passive: true }); source.addEventListener(\"touchmove\", onTouchMove, { passive: true }); source.addEventListener(\"touchend\", onTouchEnd, { passive: true }); source.addEventListener(\"touchcancel\", onTouchEnd, { passive: true }); source.addEventListener(\"keydown\", onKeyDown); source.addEventListener(\"pointerdown\", onPointerDown, { passive: true }); source.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => { delete source.dataset.matrxPaginationTouchY; source.removeEventListener(\"wheel\", onWheel); source.removeEventListener(\"touchstart\", onTouchStart); source.removeEventListener(\"touchmove\", onTouchMove); source.removeEventListener(\"touchend\", onTouchEnd); source.removeEventListener(\"touchcancel\", onTouchEnd); source.removeEventListener(\"keydown\", onKeyDown); source.removeEventListener(\"pointerdown\", onPointerDown); source.removeEventListener(\"scroll\", onScroll); };\n });\n return () => { cleanups.forEach((cleanup) => cleanup()); ownerCleanups.forEach((cleanup) => cleanup()); };\n }, [containers, enabled, intentTimeoutMs, mode]);\n\n return {\n requestNextPage,\n canLoadMore: enabled && !loading && !isFetchingNextPage && (hasNextPage || effectiveError !== null),\n error: effectiveError,\n };\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useScrollPagination,\n type ScrollPaginationContainer,\n} from \"./useScrollPagination\";\n\nexport interface UseProgressiveTableRowsOptions<T> {\n /** Complete, locally-held rows after local search/filter/sort processing. */\n rows: readonly T[];\n /** The normal local page size; `0` means all rows. */\n pageSize: number;\n /** A one-based URL/local page intent; its prefix must be visible on first paint. */\n requestedPage?: number | undefined;\n /**\n * Stable identity for the complete query shape (source, search, filters,\n * sort, and any other input that changes `rows`). A changed key resets to\n * its first batch synchronously, before the reset effect runs.\n */\n queryKey: string;\n /** The table's existing physical scroll surfaces. */\n containers?: readonly ScrollPaginationContainer[] | undefined;\n /**\n * Controlled-local only: persist a progressive append as the next one-based\n * page intent. Omit for ordinary local state; never supply for a remote page.\n */\n onPageAdvance?: ((nextPage: number) => void) | undefined;\n enabled?: boolean | undefined;\n thresholdPx?: number | undefined;\n /** Diagnose a numbered page that leaves space while later pages exist. */\n numberedPageHasMore?: boolean | undefined;\n}\n\nexport interface UseProgressiveTableRowsResult<T> {\n rows: readonly T[];\n shownCount: number;\n hasMore: boolean;\n /** Accessible explicit fallback for users who do not scroll. */\n showMore: () => Promise<void>;\n}\n\ninterface ProgressionState {\n key: string;\n shownCount: number;\n requestedPage: number;\n}\n\nfunction safePageSize(pageSize: number): number {\n return Number.isFinite(pageSize) && pageSize > 0 ? Math.floor(pageSize) : 0;\n}\n\nfunction safeRequestedPage(page: number | undefined): number {\n return Number.isFinite(page) && page! > 0 ? Math.floor(page!) : 1;\n}\n\nfunction startCount(pageSize: number, requestedPage: number): number {\n return pageSize === 0 ? Number.MAX_SAFE_INTEGER : pageSize * requestedPage;\n}\n\n/**\n * Reveals a complete local result set in batches. It never owns fetching and\n * must not receive a remote controlled page: a remote page cannot prove that\n * its next rows belong to the same response identity.\n */\nexport function useProgressiveTableRows<T>({\n rows,\n pageSize: rawPageSize,\n requestedPage: rawRequestedPage,\n queryKey,\n containers = [],\n onPageAdvance,\n enabled = true,\n thresholdPx,\n numberedPageHasMore = false,\n}: UseProgressiveTableRowsOptions<T>): UseProgressiveTableRowsResult<T> {\n const pageSize = safePageSize(rawPageSize);\n const hasExplicitRequestedPage = rawRequestedPage !== undefined;\n const requestedPage = safeRequestedPage(rawRequestedPage);\n // A changed query/page size starts from its first batch. A later page intent\n // for the same query is authoritative (back/forward and delayed hydration),\n // except when it acknowledges the next page we just emitted optimistically.\n const initialRequestedPageRef = useRef(requestedPage);\n const latestRequestedPageRef = useRef(requestedPage);\n const optimisticAdvancePageRef = useRef<number | null>(null);\n latestRequestedPageRef.current = requestedPage;\n const progressionKey = `${queryKey}\\u0000${pageSize}`;\n const initialShownCount = startCount(pageSize, initialRequestedPageRef.current);\n const resetShownCount = startCount(pageSize, 1);\n const queryStartShownCount = hasExplicitRequestedPage\n ? startCount(pageSize, requestedPage)\n : resetShownCount;\n const [progression, setProgression] = useState<ProgressionState>(() => ({\n key: progressionKey,\n shownCount: initialShownCount,\n requestedPage,\n }));\n const pageIntentChanged =\n progression.key === progressionKey &&\n progression.requestedPage !== requestedPage;\n const acknowledgedOptimisticAdvance =\n pageIntentChanged &&\n optimisticAdvancePageRef.current === requestedPage;\n const externallyRequestedPage =\n pageIntentChanged && !acknowledgedOptimisticAdvance;\n\n // Do not briefly render the preceding query's visible count or a stale page\n // after history navigation. An explicit incoming page is authoritative even\n // when the query key changes; query owners that omit it reset to batch one.\n const shownCount = progression.key !== progressionKey\n ? queryStartShownCount\n : externallyRequestedPage\n ? startCount(pageSize, requestedPage)\n : Math.max(progression.shownCount, resetShownCount);\n const visibleCount = Math.min(rows.length, shownCount);\n const hasMore = enabled && pageSize > 0 && visibleCount < rows.length;\n\n useEffect(() => {\n setProgression((current) => {\n if (current.key !== progressionKey) {\n optimisticAdvancePageRef.current = null;\n return {\n key: progressionKey,\n shownCount: queryStartShownCount,\n requestedPage,\n };\n }\n if (current.requestedPage === requestedPage) return current;\n const acknowledged = optimisticAdvancePageRef.current === requestedPage;\n optimisticAdvancePageRef.current = null;\n return {\n key: progressionKey,\n shownCount: acknowledged\n ? Math.max(current.shownCount, resetShownCount)\n : startCount(pageSize, requestedPage),\n requestedPage,\n };\n });\n }, [pageSize, progressionKey, queryStartShownCount, requestedPage, resetShownCount]);\n\n const appendBatch = () => {\n if (!enabled || pageSize === 0) return;\n setProgression((current) => {\n const baseline = current.key === progressionKey\n ? Math.max(current.shownCount, resetShownCount)\n : resetShownCount;\n return {\n key: progressionKey,\n shownCount: baseline + pageSize,\n requestedPage: latestRequestedPageRef.current,\n };\n });\n const nextPage = latestRequestedPageRef.current + 1;\n if (onPageAdvance) {\n optimisticAdvancePageRef.current = nextPage;\n onPageAdvance(nextPage);\n }\n };\n\n const warnedUnderfill = useRef<string | null>(null);\n\n // Fill genuinely unused viewport space from rows already held in memory.\n // Comparing content bounds (not scrollHeight, which is at least clientHeight)\n // avoids mistaking an unconstrained, content-sized table for spare capacity.\n useEffect(() => {\n if (!hasMore && !numberedPageHasMore) return;\n const surfaces = containers.map((entry) => entry && \"current\" in entry ? entry.current : entry)\n .filter((entry): entry is HTMLElement => entry !== null);\n const fillViewport = () => {\n for (const surface of surfaces) {\n if (surface.clientHeight <= 0 || surface.getClientRects().length === 0) continue;\n const content = surface.querySelector(\"table\") ?? surface.lastElementChild;\n if (!content) continue;\n const bounds = surface.getBoundingClientRect();\n const contentBottom = content.getBoundingClientRect().bottom - bounds.top + surface.scrollTop;\n if (contentBottom <= 0 || contentBottom >= surface.clientHeight - 1) continue;\n if (warnedUnderfill.current !== progressionKey) {\n warnedUnderfill.current = progressionKey;\n if (numberedPageHasMore) {\n console.warn(\"[MatrxDataTable] Numbered pagination leaves unused table height while later pages exist. Increase the page size, use a content-sized layout, or use progressive pagination to fill available height. The explicit numbered-page setting has been preserved.\");\n } else console.warn(\"[MatrxDataTable] The initial local batch leaves unused table height while more rows are already loaded. Revealing additional rows to fill the viewport; this is not a network fetch.\");\n }\n if (numberedPageHasMore) break;\n setProgression((current) => {\n if (current.key !== progressionKey) return current;\n const nextCount = Math.min(rows.length, visibleCount + pageSize);\n return current.shownCount >= nextCount ? current : { ...current, shownCount: nextCount };\n });\n break;\n }\n };\n fillViewport();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(fillViewport);\n for (const surface of surfaces) observer?.observe(surface);\n return () => observer?.disconnect();\n }, [containers, hasMore, numberedPageHasMore, pageSize, progressionKey, rows.length, visibleCount]);\n\n const scroll = useScrollPagination({\n containers,\n queryKey: progressionKey,\n hasNextPage: hasMore,\n isFetchingNextPage: false,\n loading: false,\n error: null,\n loadNextPage: appendBatch,\n enabled: enabled && pageSize > 0,\n ...(thresholdPx === undefined ? {} : { thresholdPx }),\n });\n\n return {\n rows: useMemo(() => rows.slice(0, visibleCount), [rows, visibleCount]),\n shownCount: visibleCount,\n hasMore,\n showMore: scroll.requestNextPage,\n };\n}\n","\"use client\";\n\n/**\n * Dialog — the modal surface, carrying every ruling the host forks paid for.\n *\n * Four hosts shipped four dialogs. Three were the stock shadcn body: a\n * fixed-size centered card with `overflow: visible`. matrx-frontend's had been\n * hardened, incident by incident, and those hardenings are the reason this\n * component belongs in the package rather than being copied a fifth time:\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. The gate a\n * wrapper once carried (\"Radix ids differ between SSR and client\") was\n * false — Radix ids come from React's SSR-stable `useId` — and it deleted\n * the always-visible Trigger from SSR and the first client paint.\n *\n * 2. THE DIALOG IS CLAMPED TO THE VIEWPORT AND SCROLLS INSIDE ITSELF. Proven\n * live: an admin \"Create Category\" dialog rendered 851px tall in a 657px\n * viewport with `overflow-y: visible`, so its Create button sat below the\n * fold, unreachable. The only way out was a backdrop click — which\n * dismisses WITHOUT writing, and is indistinguishable from a silent save\n * failure. `max-h-[85dvh] overflow-y-auto` is the cap.\n *\n * 3. THE PRIMARY ACTION IS ALWAYS PRESSABLE — AND NEVER ON TOP OF THE BODY.\n * `DialogFooter` is sticky and bleeds to the card's edges using\n * `--dialog-pad`. Until 0.11.3 that bleed was a NEGATIVE BLOCK MARGIN,\n * which sticky clamps: the footer was dragged up over the row above it by\n * `--dialog-pad` minus the card gap. The card now RESERVES the footer's\n * block size instead (`.matrx-dialog-card` in `styles.css` hands its bottom\n * padding to the footer), so scrolled content never shows through beneath\n * the actions AND the footer never covers the row above it. Outside a\n * DialogContent both variables are unset, the padding falls back to `0px`,\n * and the footer is the plain row it always was.\n *\n * 4. ON MOBILE THE SAME DIALOG IS A BOTTOM SHEET — full width, bottom\n * anchored, height-capped, internally scrollable, safe-area padded. Opt out\n * with `mobileSheet={false}` only for the rare surface that must stay\n * centered (a tiny spinner). The sheet geometry is re-asserted AFTER the\n * caller's className so a desktop `max-w-2xl` cannot un-fullscreen it.\n *\n * 5. AN UNTITLED DIALOG IS STILL ACCESSIBLE. Radix warns (correctly) that\n * every dialog needs a title; rather than let hosts ship the warning, a\n * visually-hidden title is injected when the tree has none, and\n * `aria-describedby` is dropped when there is no description rather than\n * pointing at nothing.\n *\n * SEAM INVERSIONS. The host original resolved its portal target through\n * app-shaped hooks (a popped-out window-panel body). Here that is the\n * package's `PortalContainerProvider` seam, with an explicit `container` prop\n * keeping top priority. And DialogContent PROVIDES that seam to its own\n * children, so a Popover or menu opened inside a dialog portals INTO the\n * dialog — staying inside the scroll shard, where its wheel events work.\n * `useDialogContainer` exposes the same element for host code that needs it.\n */\n\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport * as VisuallyHidden from \"@radix-ui/react-visually-hidden\";\nimport { treeContainsComponent } from \"@ai-matrx/kit/react-tree\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport {\n MOTION_BOTTOM_SHEET,\n MOTION_DIALOG,\n MOTION_OVERLAY,\n} from \"./motion\";\nimport { XIcon } from \"./icons\";\nimport { usePortalContainer, PortalContainerProvider } from \"./portal-container\";\nimport {\n RadixDialogModalProvider,\n useRadixDialogModal,\n} from \"./radix-dialog-modal-context\";\nimport { useIsMobile } from \"./use-is-mobile\";\n\nconst Dialog = ({\n children,\n ...props\n}: React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>) => {\n const modal = props.modal ?? true;\n return (\n <RadixDialogModalProvider modal={modal}>\n <DialogPrimitive.Root {...props} modal={modal}>\n {children}\n </DialogPrimitive.Root>\n </RadixDialogModalProvider>\n );\n};\nDialog.displayName = \"Dialog\";\n\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogClose = DialogPrimitive.Close;\n\n/**\n * Portal-seam-aware DialogPortal. An explicit `container` always wins; with\n * none, the injected `PortalContainerProvider` value decides; with neither,\n * Radix's `document.body`.\n */\nconst DialogPortal = ({\n container,\n ...props\n}: Omit<\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Portal>,\n \"container\"\n> & {\n /** `undefined` → use the injected container; `null` → force document.body. */\n container?: HTMLElement | null | undefined;\n}) => {\n const resolved = usePortalContainer(container);\n return <DialogPrimitive.Portal container={resolved ?? null} {...props} />;\n};\nDialogPortal.displayName = \"DialogPortal\";\n\n// Shared identity across independently bundled public entrypoints/loaders.\nconst CONTEXT_SLOT = Symbol.for(\"ai-matrx.design-system.dialog-container-context\");\nconst contextRegistry = globalThis as typeof globalThis & { [CONTEXT_SLOT]?: React.Context<HTMLElement | null> };\nconst DialogContainerContext = contextRegistry[CONTEXT_SLOT] ??= React.createContext<HTMLElement | null>(null);\n\n/** The DialogContent element, for host code that portals into the dialog. */\nexport const useDialogContainer = (): HTMLElement | null =>\n React.useContext(DialogContainerContext);\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(\n // Page context behind the modal stays readable; separation comes from a\n // light token scrim, not a blur.\n \"fixed inset-0 z-[10000] bg-[var(--matrx-overlay-scrim-soft)]\",\n MOTION_OVERLAY,\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\n/**\n * Unstyled, non-portalling Content for custom dialog layouts. Preserves Radix\n * focus/background behavior and derives `aria-modal` from the Root.\n */\nconst DialogContentPrimitive = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>((props, ref) => {\n const isModal = useRadixDialogModal();\n return (\n <DialogPrimitive.Content\n {...props}\n ref={ref}\n aria-modal={isModal || undefined}\n />\n );\n});\nDialogContentPrimitive.displayName = \"DialogContentPrimitive\";\n\nconst DIALOG_DESKTOP_CLASSES =\n \"matrx-dialog-card fixed inset-0 z-[10000] m-auto grid h-fit min-w-0 w-full max-w-lg gap-4 max-h-[85dvh] overflow-y-auto overscroll-contain [--dialog-pad:1.5rem] overflow-x-clip border bg-background p-6 shadow-lg [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full sm:rounded-lg\";\n\nconst DIALOG_MOBILE_SHEET_CLASSES =\n \"matrx-mobile-sheet matrx-dialog-card fixed inset-x-0 bottom-0 left-0 right-0 top-auto z-[10000] flex min-w-0 flex-col w-full max-w-full max-h-[90dvh] gap-4 [--dialog-pad:1rem] overflow-x-clip border-t bg-background p-4 pb-safe shadow-lg [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full rounded-t-2xl rounded-b-none overflow-y-auto overscroll-contain\";\n\n// Re-asserted LAST so sheet geometry always wins over a caller className.\nconst DIALOG_MOBILE_SHEET_OVERRIDE =\n \"inset-x-0 bottom-0 left-0 right-0 top-auto translate-none w-full max-w-full max-h-[90dvh] rounded-b-none rounded-t-2xl overflow-y-auto\";\n\nexport interface DialogContentProps\n extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n /** Render as a bottom sheet below the mobile breakpoint. Default `true`. */\n mobileSheet?: boolean;\n /** Render the built-in close control. Default `true`. */\n showCloseButton?: boolean;\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly. It is NOT the reduced-motion switch;\n * `styles.css` already honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(\n (\n {\n className,\n children,\n mobileSheet = true,\n animated = true,\n showCloseButton = true,\n container,\n ...props\n },\n ref,\n ) => {\n const isMobile = useIsMobile();\n const isModal = useRadixDialogModal();\n // Falls through to the injected container while `containerEl` is unset\n // (pre-mount) — the original's dialog > popout > body priority.\n const injectedContainer = usePortalContainer(container);\n const asSheet = mobileSheet && isMobile;\n const [containerEl, setContainerEl] = React.useState<HTMLElement | null>(\n null,\n );\n\n const mergedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setContainerEl(node);\n if (typeof ref === \"function\") ref(node);\n else if (ref)\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n\n const hasTitle =\n treeContainsComponent(children, DialogTitle) ||\n treeContainsComponent(children, DialogPrimitive.Title);\n const hasDescription =\n treeContainsComponent(children, DialogDescription) ||\n treeContainsComponent(children, DialogPrimitive.Description);\n\n return (\n <DialogPortal container={container}>\n {isModal ? <DialogOverlay /> : null}\n <DialogContentPrimitive\n ref={mergedRef}\n data-slot=\"dialog-content\"\n className={cn(\n asSheet ? DIALOG_MOBILE_SHEET_CLASSES : DIALOG_DESKTOP_CLASSES,\n animated && (asSheet ? MOTION_BOTTOM_SHEET : MOTION_DIALOG),\n className,\n asSheet && DIALOG_MOBILE_SHEET_OVERRIDE,\n // A non-modal dialog is the coexistence contract for content that\n // can sit beside a host's floating window manager (which starts at\n // z=1000); staying below that boundary makes a newly focused window\n // usable without coupling the two systems.\n !isModal && \"z-[900]\",\n )}\n {...(hasDescription ? {} : { \"aria-describedby\": undefined })}\n {...props}\n >\n {hasTitle ? null : (\n <VisuallyHidden.Root>\n <DialogPrimitive.Title>Dialog</DialogPrimitive.Title>\n </VisuallyHidden.Root>\n )}\n <DialogContainerContext.Provider value={containerEl}>\n <PortalContainerProvider\n container={containerEl ?? injectedContainer ?? null}\n >\n {children}\n </PortalContainerProvider>\n </DialogContainerContext.Provider>\n {showCloseButton ? (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n aria-label=\"Close\"\n className=\"absolute right-2 top-4 flex h-11 w-11 items-center justify-center rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground sm:right-4 lg:h-10 lg:w-10\"\n >\n <XIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n ) : null}\n </DialogContentPrimitive>\n </DialogPortal>\n );\n },\n);\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"dialog-header\"\n className={cn(\n // DialogContent owns an absolute close control. Reserve its hit area in\n // every header so trailing actions never render underneath it.\n \"flex flex-col space-y-1.5 pr-12 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n // Ruling 3/4 — sticky to the card edges so a scrolled body never shows\n // through under the actions, and safe-area padded on a phone.\n //\n // 🚨 THERE IS NO `mb-[…]` HERE, AND THERE MUST NEVER BE ONE AGAIN\n // (0.11.3, feedback bf8fb00b). The bleed over the card's bottom padding\n // used to be a NEGATIVE BLOCK MARGIN, which makes this box taller than\n // the grid area the card allocates it — and `position: sticky` CLAMPS a\n // box to its containing block, so the browser yanked the footer UP by\n // `--dialog-pad` against the card's `gap-4` and painted 8px of opaque\n // footer over the last line of the consequence, at every length. The\n // card now RESERVES this footer's block size instead (`matrx-dialog-card`\n // in styles.css hands over its `padding-bottom`), so the bleed costs no\n // margin at all. Guard: `sticky-footer-geometry.test.tsx`.\n //\n // These stay UTILITIES rather than a shipped rule so a caller's\n // `className` still wins through tailwind-merge — a shipped rule would\n // have to be unlayered to survive Tailwind preflight (§ THE PREFLIGHT\n // RULE in styles.css) and would then override every caller's padding.\n \"sticky bottom-0 z-10 bg-background pt-3\",\n \"mx-[calc(var(--dialog-pad,0px)*-1)] px-[var(--dialog-pad,0px)] pb-[var(--dialog-pad,0px)]\",\n className,\n )}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n data-slot=\"dialog-title\"\n className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n data-slot=\"dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogContentPrimitive,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","\"use client\";\n\n/**\n * Ported verbatim from matrx-frontend `components/ui/radix-dialog-modal-context.tsx`.\n * Shared by the Sheet and BottomSheet families (and available to hosts that\n * compose their own Radix Dialog-derived wrappers around these primitives).\n */\n\nimport * as React from \"react\";\n\n// Shared identity across independently bundled public entrypoints/loaders.\nconst CONTEXT_SLOT = Symbol.for(\"ai-matrx.design-system.dialog-modal-context\");\nconst contextRegistry = globalThis as typeof globalThis & { [CONTEXT_SLOT]?: React.Context<boolean> };\nconst RadixDialogModalContext = contextRegistry[CONTEXT_SLOT] ??= React.createContext<boolean>(true);\n\nexport interface RadixDialogModalProviderProps {\n children: React.ReactNode;\n modal: boolean;\n}\n\n/**\n * Keeps our Radix-based content wrappers aligned with the owning Root's\n * modality so ARIA semantics cannot drift from focus/pointer behavior.\n */\nexport function RadixDialogModalProvider({\n children,\n modal,\n}: RadixDialogModalProviderProps) {\n return (\n <RadixDialogModalContext.Provider value={modal}>\n {children}\n </RadixDialogModalContext.Provider>\n );\n}\n\n/** Returns whether the nearest Radix Dialog-derived root is modal. */\nexport function useRadixDialogModal(): boolean {\n return React.useContext(RadixDialogModalContext);\n}\n","\"use client\";\n\n/**\n * useIsMobile — the ONE breakpoint hook the package's responsive primitives\n * read (CommandDialog and Dialog both auto-render as a bottom sheet below it).\n *\n * Lifted out of `command.tsx`, where it lived privately, when Dialog arrived\n * and needed the SAME answer: two copies of a breakpoint hook is exactly the\n * duplication this package exists to end, and a Dialog that disagreed with a\n * CommandDialog about what \"mobile\" means would render two different sheet\n * geometries on one screen.\n *\n * SSR-safe by construction: `false` until mounted, so the server and the first\n * client paint agree and the desktop geometry is what hydrates. The mobile\n * geometry swaps in on the effect pass.\n *\n * The breakpoint is the host-original 768px (Tailwind `md`). It is exported so\n * a host can branch on the same number instead of inventing a second one.\n */\n\nimport * as React from \"react\";\n\n/** Viewport width (px) below which the package treats a surface as mobile. */\nexport const MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile(): boolean {\n const [isMobile, setIsMobile] = React.useState(false);\n const [hasMounted, setHasMounted] = React.useState(false);\n\n React.useEffect(() => {\n setHasMounted(true);\n\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n onChange();\n\n // NO ENVIRONMENT MAY CRASH ON THIS HOOK. `matchMedia` is absent in older\n // jsdom setups and in some embedded webviews, and a primitive that throws\n // there takes the whole host's test suite (or screen) down over a\n // breakpoint — a cost wildly out of proportion to the answer. Without it\n // the width read above still gives a correct first answer; only live\n // resize tracking is lost, which is exactly what is unavailable.\n if (typeof window.matchMedia !== \"function\") {\n return undefined;\n }\n\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n\n if (!hasMounted) {\n return false;\n }\n return isMobile;\n}\n","\"use client\";\n\n/**\n * Sheet — ported verbatim from matrx-frontend `components/ui/sheet.tsx`.\n *\n * Seam inversions:\n * - The host's `DialogContentPrimitive` (from its dialog module) is inlined\n * here as a private wrapper with identical behavior: unstyled non-portalling\n * Radix Content that derives `aria-modal` from the owning Root's modality.\n * - `Cross2Icon` comes from the package's inlined SVGs (C19), not\n * @radix-ui/react-icons.\n * - `treeContainsComponent` stays the ONE kit implementation\n * (@ai-matrx/kit/react-tree) — never a vendored twin.\n *\n * THE ROOT RENDERS UNCONDITIONALLY — no mount gate. This wrapper used to defer\n * rendering until after hydration (\"Radix generates dynamic aria-controls ids\n * that differ between SSR and client\"), and that justification was false:\n * Radix ids come from React's SSR-stable `useId` (verified against\n * @radix-ui/react-dialog 1.1.17 / react-id 1.1.2). The gate was actively\n * harmful — the Trigger wraps ALWAYS-VISIBLE content, so `return null`\n * deleted it from SSR and the first client paint.\n * The RadixDialogModalProvider wrapper stays — it is unrelated to hydration.\n */\n\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\";\nimport { treeContainsComponent } from \"@ai-matrx/kit/react-tree\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_OVERLAY, MOTION_SHEET } from \"./motion\";\nimport { Cross2Icon } from \"./icons\";\nimport {\n RadixDialogModalProvider,\n useRadixDialogModal,\n} from \"./radix-dialog-modal-context\";\n\n/**\n * Unstyled, non-portalling Content for Sheet layouts. It preserves Radix\n * focus/background behavior and derives `aria-modal` from the owning Root\n * (identical to the host dialog module's DialogContentPrimitive).\n */\nconst SheetContentBase = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>\n>(({ ...props }, ref) => {\n const isModal = useRadixDialogModal();\n return (\n <SheetPrimitive.Content\n {...props}\n ref={ref}\n aria-modal={isModal || undefined}\n />\n );\n});\nSheetContentBase.displayName = \"SheetContentBase\";\n\nexport const Sheet = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Root>\n>(({ children, ...props }, _ref) => {\n const modal = props.modal ?? true;\n\n return (\n <RadixDialogModalProvider modal={modal}>\n <SheetPrimitive.Root {...props} modal={modal}>\n {children}\n </SheetPrimitive.Root>\n </RadixDialogModalProvider>\n );\n});\nSheet.displayName = \"Sheet\";\n\nexport const SheetTrigger = SheetPrimitive.Trigger;\n\nexport const SheetClose = SheetPrimitive.Close;\n\nexport const SheetPortal = SheetPrimitive.Portal;\n\nexport const SheetOverlay = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-[var(--matrx-overlay-scrim)]\",\n MOTION_OVERLAY,\n className,\n )}\n {...props}\n ref={ref}\n />\n));\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName;\n\nexport const sheetVariants = cva(\n // Motion is NOT stated here (0.10.0). The `data-[state=*]:animate-in/out`\n // + `slide-in-from-*` pairs this base and its side variants used to carry\n // came from the `tailwindcss-animate` HOST plugin, which three of four\n // consumers never loaded — every sheet in them slammed open with no\n // animation and no error. `SheetContent` now applies the package-owned\n // `MOTION_SHEET[side]` class alongside these variants; the keyframes,\n // durations and reduced-motion handling all live in `styles.css`.\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b\",\n bottom: \"inset-x-0 bottom-0 border-t\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n right: \"inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n center: \"inset-0 m-auto max-h-full max-w-full border rounded-lg\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n },\n);\n\nexport interface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> {\n hideCloseButton?: boolean;\n /** Skip the dimming overlay — for non-modal side panels (e.g. chat canvas). */\n hideOverlay?: boolean;\n /** Optional className for the overlay when shown. */\n overlayClassName?: string;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a panel\n * that must appear instantly — a persistent side rail toggled by a keyboard\n * shortcut, say. It is NOT the reduced-motion switch; `styles.css` already\n * honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nexport const SheetDescription = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nSheetDescription.displayName = SheetPrimitive.Description.displayName;\n\nexport const SheetContent = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(\n (\n {\n side = \"right\",\n className,\n children,\n hideCloseButton = false,\n hideOverlay = false,\n overlayClassName,\n animated = true,\n ...props\n },\n ref,\n ) => {\n const hasDescription =\n treeContainsComponent(children, SheetDescription) ||\n treeContainsComponent(children, SheetPrimitive.Description);\n return (\n <SheetPortal>\n {!hideOverlay && <SheetOverlay className={overlayClassName} />}\n <SheetContentBase\n ref={ref}\n className={cn(\n sheetVariants({ side }),\n animated && MOTION_SHEET[side ?? \"right\"],\n className,\n )}\n {...(hasDescription ? {} : { \"aria-describedby\": undefined })}\n {...props}\n >\n {!hideCloseButton && (\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <Cross2Icon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n {children}\n </SheetContentBase>\n </SheetPortal>\n );\n },\n);\nSheetContent.displayName = SheetPrimitive.Content.displayName;\n\nexport const SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n);\nSheetHeader.displayName = \"SheetHeader\";\n\nexport const SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className,\n )}\n {...props}\n />\n);\nSheetFooter.displayName = \"SheetFooter\";\n\nexport const SheetTitle = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...props}\n />\n));\nSheetTitle.displayName = SheetPrimitive.Title.displayName;\n","\"use client\";\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from \"../dialog\";\nimport { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from \"../sheet\";\nimport type { TableLinkProps, TableSidePanelProps, TableWindowPanelProps } from \"./host\";\n\nexport function DefaultTableLink(props: TableLinkProps) { return <a {...props} />; }\nexport function DefaultTableSidePanel({ title, titleNode, description, defaultWidth = 480, onClose, headerActions, children }: TableSidePanelProps) {\n return <Sheet open onOpenChange={(open) => { if (!open) onClose(); }}><SheetContent side=\"right\" className=\"flex h-full flex-col\" style={{ width: `min(${defaultWidth}px, 100vw)` }}><SheetHeader><SheetTitle>{titleNode ?? title}</SheetTitle>{description ? <SheetDescription>{description}</SheetDescription> : null}{headerActions}</SheetHeader><div className=\"min-h-0 flex-1 overflow-auto\">{children}</div></SheetContent></Sheet>;\n}\nexport function DefaultTableWindow({ title, onClose, width = 720, height = 560, actionsRight, sidebar, children }: TableWindowPanelProps) {\n return <Dialog open onOpenChange={(open) => { if (!open) onClose(); }}><DialogContent className=\"flex flex-col overflow-hidden\" style={{ width: `min(${width}px, calc(100vw - 2rem))`, height: `min(${height}px, 85dvh)` }}><DialogHeader><DialogTitle>{title}</DialogTitle>{actionsRight}</DialogHeader><div className=\"flex min-h-0 flex-1\">{sidebar ? <aside className=\"shrink-0 border-r pr-2\">{sidebar}</aside> : null}<div className=\"min-h-0 min-w-0 flex-1 overflow-auto\">{children}</div></div></DialogContent></Dialog>;\n}\n","\"use client\";\nimport { useState } from \"react\";\nimport { useMatrxDataTableHost } from \"./host\";\n\n/** Every portable async action has visible feedback even without a host toast system. */\nexport function useTableNotice() {\n const host = useMatrxDataTableHost();\n const [message, setMessage] = useState<{ text: string; error: boolean } | null>(null);\n const notify = {\n success(text: string) { if (host.notify) host.notify.success(text); else setMessage({ text, error: false }); },\n error(text: string) { if (host.notify) host.notify.error(text); else setMessage({ text, error: true }); },\n };\n const notice = message ? <span role={message.error ? \"alert\" : \"status\"} className={message.error ? \"text-xs text-destructive\" : \"text-xs text-muted-foreground\"}>{message.text}<button type=\"button\" aria-label=\"Dismiss notification\" className=\"ml-2 underline\" onClick={() => setMessage(null)}>Dismiss</button></span> : null;\n return { notify, notice };\n}\n","\"use client\";\nimport { createContext, useContext, type Context, type ComponentType, type ReactNode, type MouseEventHandler } from \"react\";\nimport type { CopyControlProps } from \"./copy-types\";\nimport type { MatrxDataTableDensity, TableSavedViewsProps } from \"./types\";\n\nexport type {\n AgentPayloadInput,\n AiCustomSource,\n AiVariant,\n CopyControlProps,\n CopyExportConfig,\n} from \"./copy-types\";\n\nexport interface TableLinkProps { href: string; children: ReactNode; className?: string; onClick?: MouseEventHandler<HTMLAnchorElement>; }\n/**\n * Host-owned toolbar affordance. The table package keeps operation state and\n * labels; an application can supply its canonical icon-button primitive\n * without making the shared package depend on an application UI package.\n */\nexport interface TableToolbarActionProps { ariaLabel: string; tooltip?: string | undefined; disabled?: boolean | undefined; busy?: boolean | undefined; /** Indicates a selected mutually-exclusive action such as the current page. */ active?: boolean | undefined; onClick: () => void; children: ReactNode; }\nexport interface TableSidePanelProps { title: string; titleNode?: ReactNode; description?: ReactNode; onClose: () => void; defaultWidth?: number; headerActions?: ReactNode; children: ReactNode; }\nexport interface TableWindowPanelProps { id: string; title: string; onClose: () => void; width?: number; height?: number; minWidth?: number; minHeight?: number; actionsRight?: ReactNode; bodyClassName?: string; sidebarDefaultSize?: number; sidebarMinSize?: number; sidebar?: ReactNode; children: ReactNode; }\nexport interface TableEntityRefProps { token: string; id: string; href?: string; children: ReactNode; className?: string; }\nexport interface TablePeekProps { kind: string; id: string; href?: string; onClose: () => void; }\nexport interface TableDoors { href?: string; peekKind?: string; canPeek?: boolean; }\nexport interface MatrxDataTableHost { JsonViewer?: ComponentType<{ data: object | string }>; Link?: ComponentType<TableLinkProps>; CopyControls?: ComponentType<CopyControlProps>; ToolbarAction?: ComponentType<TableToolbarActionProps>; SidePanelSurface?: ComponentType<TableSidePanelProps>; WindowPanel?: ComponentType<TableWindowPanelProps>; EntityRef?: ComponentType<TableEntityRefProps>; resolveEntityDoors?: (token: string, id: string, href?: string | null) => TableDoors | null; ResourcePeek?: ComponentType<TablePeekProps>; SavedViews?: ComponentType<TableSavedViewsProps>; /** Host default; a table's explicit density takes precedence. */ defaultDensity?: MatrxDataTableDensity; notify?: { success(message: string): void; error(message: string): void }; }\n// Public entrypoints are independently bundled in ESM and CJS. The context\n// identity must survive those bundle boundaries; values stay provider-scoped.\nconst HOST_SLOT = Symbol.for(\"ai-matrx.design-system.table-host-context\");\nconst hostRegistry = globalThis as typeof globalThis & { [HOST_SLOT]?: Context<MatrxDataTableHost> };\nconst HostContext = hostRegistry[HOST_SLOT] ??= createContext<MatrxDataTableHost>({});\nexport function MatrxDataTableProvider({ value, children }: { value: MatrxDataTableHost; children: ReactNode }) { return <HostContext.Provider value={value}>{children}</HostContext.Provider>; }\nexport function useMatrxDataTableHost(): MatrxDataTableHost { return useContext(HostContext); }\n","\"use client\";\nimport { Button, type ButtonProps } from \"../button\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../tooltip\";\nimport {\n ChevronsLeft,\n ChevronLeft,\n ChevronsRight,\n ChevronRight,\n} from \"./icons\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../select\";\nimport { cn } from \"../cn\";\nimport { useMatrxDataTableHost, type TableToolbarActionProps } from \"./host\";\nimport type { ComponentType } from \"react\";\n\nexport interface GenericTablePaginationProps {\n totalItems: number;\n itemsPerPage: number;\n currentPage: number;\n onPageChange: (page: number) => void;\n onItemsPerPageChange: (items: number) => void;\n pageSizeOptions?: number[];\n className?: string;\n showItemsPerPageSelect?: boolean;\n showPageInfo?: boolean;\n showPageControls?: boolean;\n maxPagesToShow?: number;\n containerClassName?: string;\n selectContainerClassName?: string;\n infoContainerClassName?: string;\n controlsContainerClassName?: string;\n pageButtonClassName?: string;\n pageActiveButtonClassName?: string;\n navButtonClassName?: string;\n /** Value emitted for the optional All choice. Defaults to the current total. */\n allValue?: number;\n /** Honest label for the optional all-rows choice. */\n allOptionLabel?: string;\n showAllOption?: boolean;\n layoutType?: \"grid\" | \"flex\";\n labelFormat?: (start: number, end: number, total: number) => string;\n compact?: boolean;\n hideEntriesInfo?: boolean;\n /** Keeps progressive local pagination in one stable footer, including at\n * exhaustion. Counts describe rendered rows, not a numbered page. */\n progressive?: { loadedCount?: number; shownCount: number; hasMore: boolean; onShowMore: () => void };\n}\n\nfunction PageNavigationControl({\n label,\n disabledHint,\n visibilityClassName = \"inline-flex\",\n disabled,\n className,\n ...props\n}: ButtonProps & {\n label: string;\n disabledHint: string;\n visibilityClassName?: string;\n}) {\n const button = (\n <Button\n {...props}\n disabled={disabled}\n aria-label={label}\n className={cn(visibilityClassName, className, \"[&_svg]:size-5\")}\n />\n );\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n {disabled ? (\n <span\n className={cn(visibilityClassName, \"rounded-md outline-none focus-visible:ring-2 focus-visible:ring-ring\")}\n tabIndex={0}\n aria-label={`${label} — ${disabledHint.toLowerCase()}`}\n >\n {button}\n </span>\n ) : button}\n </TooltipTrigger>\n <TooltipContent>{disabled ? disabledHint : label}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction PaginationAction({\n HostAction,\n active = false,\n disabledHint,\n visibilityClassName = \"inline-flex\",\n fallbackClassName,\n ...props\n}: TableToolbarActionProps & {\n HostAction: ComponentType<TableToolbarActionProps> | undefined;\n active?: boolean;\n disabledHint: string;\n visibilityClassName?: string;\n fallbackClassName?: string;\n}) {\n if (HostAction) {\n return (\n <span data-matrx-table-icon-action className={visibilityClassName}>\n <HostAction\n {...props}\n active={active}\n tooltip={props.disabled ? disabledHint : (props.tooltip ?? props.ariaLabel)}\n />\n </span>\n );\n }\n return (\n <PageNavigationControl\n variant=\"outline\"\n size=\"icon\"\n visibilityClassName={visibilityClassName}\n label={props.ariaLabel}\n disabledHint={disabledHint}\n disabled={props.disabled}\n onClick={props.onClick}\n className={cn(\n PAGINATION_ACTION_CLASS,\n active && PAGINATION_ACTIVE_CLASS,\n fallbackClassName,\n )}\n aria-current={active ? \"page\" : undefined}\n data-matrx-table-icon-action\n >\n {props.children}\n </PageNavigationControl>\n );\n}\n\n// Table footers use an actual 44px control shape. A pseudo-element inset into a\n// smaller visual box let the select text and chevron escape its border.\nconst PAGINATION_ACTION_CLASS = \"h-11 w-11 min-h-11 min-w-11 rounded-md border border-border bg-card p-0 text-sm shadow-none hover:bg-accent disabled:opacity-40 [&_svg]:size-5\";\nconst PAGINATION_ACTIVE_CLASS = \"border-primary bg-primary text-primary-foreground hover:bg-primary/90\";\n\nexport default function GenericTablePagination({\n totalItems,\n itemsPerPage,\n currentPage,\n onPageChange,\n onItemsPerPageChange,\n pageSizeOptions = [5, 10, 25, 50, 100],\n className = \"\",\n showItemsPerPageSelect = true,\n showPageInfo = true,\n showPageControls = true,\n maxPagesToShow = 5,\n containerClassName = \"\",\n selectContainerClassName = \"\",\n infoContainerClassName = \"\",\n controlsContainerClassName = \"\",\n pageButtonClassName = \"\",\n pageActiveButtonClassName = \"\",\n navButtonClassName = \"\",\n allValue = totalItems,\n allOptionLabel = \"All\",\n showAllOption = true,\n layoutType = \"grid\",\n labelFormat,\n compact = false,\n hideEntriesInfo = false,\n progressive,\n}: GenericTablePaginationProps) {\n const host = useMatrxDataTableHost();\n const positivePageSizes = pageSizeOptions.filter((size) => size > 0);\n const availablePageSizes =\n itemsPerPage > 0 && !positivePageSizes.includes(itemsPerPage)\n ? [...positivePageSizes, itemsPerPage].sort((a, b) => a - b)\n : positivePageSizes;\n const effectiveItemsPerPage =\n itemsPerPage === 0 ? Math.max(totalItems, 1) : Math.max(itemsPerPage, 1);\n\n const totalPages = Math.max(1, Math.ceil(totalItems / effectiveItemsPerPage));\n\n const getPageNumbers = (limit = maxPagesToShow) => {\n let startPage = Math.max(1, currentPage - Math.floor(limit / 2));\n const endPage = Math.min(totalPages, startPage + limit - 1);\n startPage = Math.max(1, endPage - limit + 1);\n return Array.from(\n { length: endPage - startPage + 1 },\n (_, i) => startPage + i,\n );\n };\n\n const isFirstPageDisabled = currentPage <= 1;\n const isLastPageDisabled = currentPage >= totalPages;\n const startItem = totalItems === 0 ? 0 : progressive ? 1 : (currentPage - 1) * effectiveItemsPerPage + 1;\n const endItem = Math.min(progressive?.shownCount ?? currentPage * effectiveItemsPerPage, totalItems);\n\n const defaultLabelFormat = (start: number, end: number, total: number) => {\n if (progressive) return progressive.loadedCount !== undefined && progressive.loadedCount !== total\n ? `${end} shown / ${total} matching · ${progressive.loadedCount} loaded`\n : `${end} shown / ${total} loaded`;\n return compact\n ? `${start}-${end} of ${total}`\n : `Showing ${start} to ${end} of ${total} entries`;\n };\n\n const formatLabel = labelFormat || defaultLabelFormat;\n\n const containerClass = cn(\n \"w-full items-center\",\n !compact && \"border-t border-border\",\n layoutType === \"grid\"\n ? progressive\n ? \"grid grid-cols-[auto_minmax(0,1fr)_auto]\"\n : \"grid grid-cols-[auto_minmax(0,1fr)] sm:grid-cols-[auto_minmax(0,1fr)_auto]\"\n : \"flex flex-nowrap justify-between\",\n compact\n ? \"box-border min-h-11 gap-0 px-0 py-0\"\n : \"gap-1 px-2 py-1 sm:gap-4 sm:px-3\",\n className,\n containerClassName,\n );\n\n return (\n <TooltipProvider>\n <div data-matrx-table-footer className={containerClass}>\n {/* Items Per Page Select */}\n {showItemsPerPageSelect && (\n <div\n className={cn(\n \"flex min-w-0 justify-start\",\n !compact && \"sm:p-1\",\n selectContainerClassName,\n )}\n >\n <Select\n value={itemsPerPage.toString()}\n onValueChange={(value) => onItemsPerPageChange(parseInt(value))}\n >\n <SelectTrigger\n aria-label={progressive ? \"Rows per batch\" : \"Rows per page\"}\n className={cn(\n \"focus:ring-0\",\n compact\n ? \"h-11 min-w-20 rounded-md border border-border bg-card px-3 text-sm hover:bg-accent [&_svg]:size-5\"\n : \"h-8 w-[3.75rem] text-xs sm:w-36 sm:text-sm\",\n )}\n >\n <SelectValue placeholder={itemsPerPage.toString()} />\n </SelectTrigger>\n <SelectContent>\n {availablePageSizes.map((size) => (\n <SelectItem key={size} value={size.toString()}>\n {size}\n </SelectItem>\n ))}\n {showAllOption ? (\n <SelectItem value={allValue.toString()}>{allOptionLabel}</SelectItem>\n ) : null}\n </SelectContent>\n </Select>\n </div>\n )}\n\n <div\n className={cn(\"flex min-w-0 justify-center\", infoContainerClassName)}\n >\n {/* Page Info - only show if not hidden But always show the div. */}\n {showPageInfo && !hideEntriesInfo && (\n <>\n <span className=\"truncate text-xs tabular-nums text-muted-foreground sm:hidden\">\n {progressive ? `${endItem}/${totalItems} ${progressive.loadedCount !== undefined && progressive.loadedCount !== totalItems ? \"matching\" : \"loaded\"}` : `${startItem}-${endItem} / ${totalItems}`}\n </span>\n <span\n className={`hidden whitespace-nowrap ${\n compact ? \"text-sm\" : \"text-sm\"\n } min-w-0 truncate text-muted-foreground sm:inline`}\n >\n {formatLabel(startItem, endItem, totalItems)}\n </span>\n </>\n )}\n </div>\n\n {/* Page Controls */}\n {progressive ? (progressive.hasMore ? (\n <PaginationAction\n HostAction={host.ToolbarAction}\n ariaLabel={progressive.hasMore ? \"Show more rows\" : \"All rows shown\"}\n disabledHint=\"All rows shown\"\n disabled={!progressive.hasMore}\n onClick={progressive.onShowMore}\n >\n <ChevronRight className=\"h-5 w-5 rotate-90\" />\n </PaginationAction>\n ) : null) : showPageControls && (\n <div\n className={cn(\n \"col-span-2 flex min-w-0 items-center justify-end sm:col-span-1\",\n compact ? \"gap-0\" : \"gap-0.5 sm:gap-1\",\n controlsContainerClassName,\n )}\n >\n <PaginationAction\n HostAction={host.ToolbarAction}\n ariaLabel=\"First page\"\n disabledHint=\"Already on the first page\"\n visibilityClassName=\"hidden sm:inline-flex\"\n fallbackClassName={navButtonClassName}\n onClick={() => onPageChange(1)}\n disabled={isFirstPageDisabled}\n >\n <ChevronsLeft className=\"h-5 w-5\" />\n </PaginationAction>\n\n <PaginationAction\n HostAction={host.ToolbarAction}\n ariaLabel=\"Previous page\"\n disabledHint=\"Already on the first page\"\n fallbackClassName={navButtonClassName}\n onClick={() => onPageChange(currentPage - 1)}\n disabled={isFirstPageDisabled}\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </PaginationAction>\n\n {getPageNumbers(3).map((page) => (\n <PaginationAction\n key={`mobile-${page}`}\n HostAction={host.ToolbarAction}\n ariaLabel={`Page ${page}`}\n active={currentPage === page}\n disabledHint={`Already on page ${page}`}\n visibilityClassName={cn(\n \"sm:hidden\",\n page === currentPage ? \"inline-flex\" : \"hidden min-[360px]:inline-flex\",\n )}\n fallbackClassName={page === currentPage ? pageActiveButtonClassName : pageButtonClassName}\n onClick={() => onPageChange(page)}\n >\n <span>{page}</span>\n </PaginationAction>\n ))}\n\n {getPageNumbers().map((page) => (\n <PaginationAction\n key={`desktop-${page}`}\n HostAction={host.ToolbarAction}\n ariaLabel={`Page ${page}`}\n active={currentPage === page}\n disabledHint={`Already on page ${page}`}\n visibilityClassName=\"hidden sm:inline-flex\"\n fallbackClassName={currentPage === page ? pageActiveButtonClassName : pageButtonClassName}\n onClick={() => onPageChange(page)}\n >\n <span>{page}</span>\n </PaginationAction>\n ))}\n\n <PaginationAction\n HostAction={host.ToolbarAction}\n ariaLabel=\"Next page\"\n disabledHint=\"Already on the last page\"\n fallbackClassName={navButtonClassName}\n onClick={() => onPageChange(currentPage + 1)}\n disabled={isLastPageDisabled}\n >\n <ChevronRight className=\"h-5 w-5\" />\n </PaginationAction>\n\n <PaginationAction\n HostAction={host.ToolbarAction}\n ariaLabel=\"Last page\"\n disabledHint=\"Already on the last page\"\n visibilityClassName=\"hidden sm:inline-flex\"\n fallbackClassName={navButtonClassName}\n onClick={() => onPageChange(totalPages)}\n disabled={isLastPageDisabled}\n >\n <ChevronsRight className=\"h-5 w-5\" />\n </PaginationAction>\n </div>\n )}\n </div>\n </TooltipProvider>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n buildAgentPayload,\n createBrowserTransport,\n directSource,\n normalizeTransferJson,\n sealTransferArtifact,\n type AgentPayloadInput,\n type PageAction,\n type Payload,\n type Source,\n type TransferOutcome,\n} from \"@ai-matrx/kit/content-transfer\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\nimport {\n ContentTransferMenu,\n useContentTransferCapabilities,\n type ContentTransferController,\n type ContentTransferReference,\n type ContentTransferReferenceAction,\n type TransferMenuPresentation,\n} from \"./index\";\nimport type { AlchemyIcon } from \"./icon\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../dialog\";\nimport { Button } from \"../button\";\nimport { cn } from \"../cn\";\n\nexport type AlchemyOptionValues = Record<string, boolean | number>;\nexport type AlchemySourceOption =\n | {\n kind: \"toggle\";\n key: string;\n label: string;\n hint?: string;\n default: boolean;\n }\n | {\n kind: \"preset\";\n key: string;\n label: string;\n options: { label: string; value: number }[];\n default: number;\n }\n | {\n kind: \"slider\";\n key: string;\n label: string;\n hint?: string;\n stops: number[];\n default: number;\n formatValue: (value: number) => string;\n }\n | {\n kind: \"number\";\n key: string;\n label: string;\n hint?: string;\n min?: number;\n step?: number;\n presets?: { label: string; value: number }[];\n default: number;\n };\nexport interface AlchemyCustomSource {\n label?: string;\n hint?: string;\n options: AlchemySourceOption[];\n build(values: AlchemyOptionValues): {\n text: string;\n meta?: Record<string, string | number | boolean | undefined>;\n };\n wrap(\n text: string,\n values: AlchemyOptionValues,\n meta?: Record<string, string | number | boolean | undefined>,\n ): AgentPayloadInput;\n dialogTitle?: string;\n dialogDescription?: string;\n}\nexport type AlchemyDetail = \"full\" | \"compact\" | \"brief\";\nexport interface AlchemyGroomerSection {\n id: string;\n title: string;\n description?: string;\n cuttable?: boolean;\n levelLabels?: Partial<Record<AlchemyDetail, string>>;\n build(level: AlchemyDetail): unknown;\n defaultSelection?: AlchemyDetail | \"off\";\n}\nexport interface AlchemyGroomerConfig {\n label: string;\n kind: string;\n location: string;\n description: string;\n attributes?: AgentPayloadInput[\"attributes\"];\n context?: AgentPayloadInput[\"context\"];\n summary?: string;\n sections: AlchemyGroomerSection[];\n}\nexport interface AlchemyCopyVariant {\n id: string;\n label: string;\n hint?: string;\n icon?: React.ComponentType<{ className?: string }>;\n section?: \"copy\" | \"ai\";\n ariaLabel?: string;\n successMessage?: string;\n build?: () =>\n AgentPayloadInput | string | Promise<AgentPayloadInput | string>;\n onSelect?: () => void | Promise<void>;\n modal?: (props: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n }) => React.ReactNode;\n}\nexport interface AlchemyExportItem {\n id: string;\n label: string;\n build?: () => {\n content: BlobPart;\n extension: string;\n mime: string;\n /** Optional exact safe basename captured with bytes; omission derives a default, invalid values error. */\n filename?: string;\n };\n onSelect?: () => void | Promise<void>;\n}\ntype Resolvable<T> = T | (() => T);\nexport interface MatrxCopyMenuProps {\n label: string;\n /** Stable record identity when this mounted control can switch between records. */\n sourceId?: string;\n references?: readonly ContentTransferReference[];\n referenceActions?: readonly ContentTransferReferenceAction[];\n /** Prepare the tabular view while keeping raw JSON and human copy formats. */\n primarySource?: \"table\";\n human?: Resolvable<string>;\n json?: Resolvable<unknown>;\n agent?: Resolvable<AgentPayloadInput | string>;\n aiVariants?: AlchemyCopyVariant[];\n aiCustom?: AlchemyCustomSource;\n groomer?: () => AlchemyGroomerConfig;\n agentVariant?: {\n id?: string;\n label?: string;\n hint?: string;\n position?: \"first\" | \"last\";\n };\n export?: {\n items: AlchemyExportItem[];\n sheetRows?: () => Array<Record<string, unknown>>;\n sheetColumns?: () => Array<{ id: string; label: string }>;\n };\n /** Host-owned authenticated destination, not a second export serializer. */\n sendToSheet?: (\n rows: Array<Record<string, unknown>>,\n label: string,\n ) => Promise<TransferOutcome>;\n hide?: Array<\"copy\" | \"ai\" | \"export\">;\n disabled?: boolean;\n className?: string;\n stopPropagation?: boolean;\n size?: \"xs\" | \"icon\" | \"sm\" | \"toolbar\";\n appearance?: \"bare\" | \"segmented\";\n unified?: boolean;\n grouped?: boolean;\n icon?: AlchemyIcon;\n triggerVariant?: \"transparent\" | \"glass\" | \"outline\";\n}\nconst resolve = <T,>(value: Resolvable<T>): T =>\n typeof value === \"function\" ? (value as () => T)() : value;\nconst asPayload = (value: AgentPayloadInput | string): Payload => ({\n kind: \"markdown\",\n text: typeof value === \"string\" ? value : buildAgentPayload(value),\n});\nconst structuredPayload = (value: AgentPayloadInput | string): Payload => {\n if (typeof value === \"string\") return { kind: \"markdown\", text: value };\n const clean = (record?: AgentPayloadInput[\"context\"]) =>\n Object.fromEntries(\n Object.entries(record ?? {}).filter(([, entry]) => entry !== undefined),\n );\n return {\n kind: \"json\",\n value: normalizeTransferJson(\n {\n kind: value.kind,\n location: value.location,\n description: value.description,\n data: value.data,\n ...(value.summary !== undefined ? { summary: value.summary } : {}),\n attributes: clean(value.attributes),\n context: clean(value.context),\n },\n { omitUndefinedObjectProperties: true },\n ),\n };\n};\nconst actionDone = (message: string): TransferOutcome => ({\n status: \"success\",\n delivered: \"action\",\n mimeTypes: [],\n message,\n});\nconst isSafeFilename = (filename: string) =>\n filename === filename.trim() &&\n filename.length > 0 &&\n !/^\\.+$/.test(filename) &&\n !/[\\\\/\\x00-\\x1F\\x7F]/.test(filename);\nconst sourceFor = (\n id: string,\n label: string,\n build: () => Payload | Promise<Payload>,\n): Source => ({\n id,\n label,\n capture: async ({ signal }) => {\n signal.throwIfAborted();\n const payload = await build();\n signal.throwIfAborted();\n return directSource(payload, { sourceId: id, label });\n },\n});\n\n/** Opinionated bridge for Matrx's existing content builders, with one transfer UI. */\nexport function MatrxCopyMenu(props: MatrxCopyMenuProps) {\n const inherited = useContentTransferCapabilities();\n return (\n <MatrxCopyMenuSession\n key={JSON.stringify([\n inherited.identityKey ?? null,\n props.sourceId ?? props.label,\n ])}\n {...props}\n />\n );\n}\n\nfunction MatrxCopyMenuSession(props: MatrxCopyMenuProps) {\n const instance = React.useId();\n const controller = React.useRef<ContentTransferController>(null);\n const capabilities = useContentTransferCapabilities();\n const transport = capabilities.transport ?? createBrowserTransport();\n const [modal, setModal] = React.useState<AlchemyCopyVariant | null>(null);\n const [configuration, setConfiguration] = React.useState<{\n custom?: AlchemyCustomSource;\n groomer?: AlchemyGroomerConfig;\n } | null>(null);\n const copyVisible = !props.hide?.includes(\"copy\");\n const aiVisible = !props.hide?.includes(\"ai\");\n const exportVisible = !props.hide?.includes(\"export\");\n const make = (\n suffix: string,\n build: () => Payload | Promise<Payload>,\n label = props.label,\n ) =>\n sourceFor(\n `${props.sourceId ?? `${instance}:${props.label}`}:${suffix}`,\n label,\n build,\n );\n const human =\n copyVisible && props.human !== undefined\n ? make(\"human\", () => ({ kind: \"text\", text: resolve(props.human!) }))\n : undefined;\n const humanMarkdown =\n copyVisible && props.human !== undefined\n ? make(\"human-markdown\", () => ({\n kind: \"markdown\",\n text: resolve(props.human!),\n }))\n : undefined;\n const json =\n aiVisible && props.json !== undefined\n ? make(\"json\", () => ({\n kind: \"json\",\n value: normalizeTransferJson(resolve(props.json!), {\n omitUndefinedObjectProperties: true,\n }),\n }))\n : undefined;\n const agent =\n aiVisible && props.agent !== undefined\n ? make(\"agent\", () => asPayload(resolve(props.agent!)))\n : undefined;\n const structuredAgent =\n aiVisible && props.agent !== undefined\n ? make(\"structured-agent\", () => structuredPayload(resolve(props.agent!)))\n : undefined;\n const table =\n (exportVisible || props.primarySource === \"table\") &&\n props.export?.sheetRows\n ? make(\"rows\", () => {\n const value = normalizeTransferJson(props.export!.sheetRows!(), {\n omitUndefinedObjectProperties: true,\n });\n if (\n !Array.isArray(value) ||\n value.some(\n (row) =>\n row === null || typeof row !== \"object\" || Array.isArray(row),\n )\n )\n throw new Error(\"Sheet rows must be JSON objects.\");\n const rows = value as Array<\n Record<string, import(\"@ai-matrx/kit/content-transfer\").Json>\n >;\n const suppliedColumns = props.export!.sheetColumns?.();\n const columns = suppliedColumns ?? [...new Set(rows.flatMap((row) => Object.keys(row)))].map((id) => ({ id, label: id }));\n const ids = new Set<string>();\n for (const column of columns) {\n if (!column.id || !column.label || ids.has(column.id)) throw new Error(\"Sheet columns require unique nonempty ids and labels.\");\n ids.add(column.id);\n }\n for (const row of rows) for (const key of Object.keys(row)) if (!ids.has(key)) throw new Error(\"Table data contains a field outside its declared columns.\");\n return {\n kind: \"rows\",\n rows,\n columns: columns.map((column) => ({\n id: column.id,\n label: column.label,\n path: `/${column.id.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")}`,\n visible: true,\n })),\n };\n })\n : undefined;\n const builderVariants = aiVisible\n ? (props.aiVariants ?? [])\n .filter(\n (variant) => variant.build && !variant.onSelect && !variant.modal,\n )\n .map((variant) => ({\n ...variant,\n copyLabel: variant.label,\n source: make(\n `variant:${variant.id}`,\n async () => asPayload(await variant.build!()),\n variant.label,\n ),\n }))\n : [];\n const faithful = agent\n ? [\n {\n id: props.agentVariant?.id ?? \"faithful\",\n label: props.agentVariant?.label ?? \"Full AI context\",\n source: agent,\n copyLabel: props.agentVariant?.label ?? \"Copy for AI\",\n ...(props.agentVariant?.hint\n ? { hint: props.agentVariant.hint }\n : {}),\n },\n ]\n : [];\n const variants =\n props.agentVariant?.position === \"last\"\n ? [...builderVariants, ...faithful]\n : [...faithful, ...builderVariants];\n const actions: (PageAction & TransferMenuPresentation)[] = [];\n if (aiVisible)\n for (const variant of props.aiVariants ?? []) {\n if (!variant.onSelect && !variant.modal) continue;\n actions.push({\n ...variant,\n id: `variant-action:${variant.id}`,\n label: variant.label,\n supports: () => true,\n run: async () => {\n if (variant.onSelect) await variant.onSelect();\n else setModal(variant);\n return actionDone(`Opened ${variant.label}`);\n },\n });\n }\n if (aiVisible && props.aiCustom)\n actions.push({\n id: \"configure-source\",\n label: props.aiCustom.label ?? \"Customize source\",\n ...(props.aiCustom.hint ? { hint: props.aiCustom.hint } : {}),\n supports: () => true,\n run: async () => {\n setConfiguration({ custom: props.aiCustom! });\n return actionDone(\"Source options opened\");\n },\n });\n if (aiVisible && props.groomer)\n actions.push({\n id: \"groom-source\",\n label: \"Customize sections\",\n supports: () => true,\n run: async () => {\n setConfiguration({ groomer: props.groomer!() });\n return actionDone(\"Section options opened\");\n },\n });\n if (exportVisible)\n for (const item of props.export?.items ?? [])\n actions.push({\n id: `export:${item.id}`,\n label: item.label,\n supports: () => true,\n ...(item.build && !item.onSelect\n ? {\n placement: \"download\" as const,\n source: make(\n `export:${item.id}`,\n async () => {\n const file = item.build!();\n const bytes = new Uint8Array(\n await new Blob([file.content], {\n type: file.mime,\n }).arrayBuffer(),\n );\n return {\n kind: \"registered\",\n format: \"matrx-file\",\n value: {\n bytes: Array.from(bytes),\n mime: file.mime,\n extension: file.extension,\n ...(file.filename !== undefined\n ? { filename: file.filename }\n : {}),\n },\n };\n },\n item.label,\n ),\n }\n : {}),\n run: async ({ snapshot, draft, signal }) => {\n if (item.onSelect) {\n await item.onSelect();\n return actionDone(`Opened ${item.label}`);\n }\n const value =\n draft.payload.kind === \"registered\" ? draft.payload.value : null;\n if (\n !value ||\n Array.isArray(value) ||\n typeof value !== \"object\" ||\n !Array.isArray(value.bytes) ||\n typeof value.mime !== \"string\" ||\n typeof value.extension !== \"string\" ||\n value.bytes.some(\n (byte) =>\n typeof byte !== \"number\" ||\n !Number.isInteger(byte) ||\n byte < 0 ||\n byte > 255,\n )\n )\n throw new Error(`${item.label} did not capture a valid file.`);\n if (\n value.filename !== undefined &&\n (typeof value.filename !== \"string\" ||\n !isSafeFilename(value.filename))\n )\n throw new Error(\n `${item.label} has an unsafe filename. Use a nonempty basename without leading or trailing whitespace, dots only, path separators, or control characters.`,\n );\n if (\n draft.omissions.some((omission) => omission.reason !== \"duplicate\")\n )\n throw new Error(\n \"This custom file exceeds the configured export limits or contains excluded content. Use a standard format or revise the source options.\",\n );\n const bytes = new Uint8Array(value.bytes as number[]);\n const filename =\n typeof value.filename === \"string\"\n ? value.filename\n : `${\n props.label\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"export\"\n }.${value.extension.replace(/[^a-zA-Z0-9.-]/g, \"\") || \"bin\"}`;\n return transport.download(\n sealTransferArtifact({\n snapshotId: snapshot.id,\n draftRevision: draft.revision,\n format: `export:${item.id}`,\n plainText: \"\",\n file: { filename, mime: value.mime, bytes },\n omissions: [...draft.omissions],\n }),\n signal,\n );\n },\n });\n if (exportVisible && table && props.sendToSheet)\n actions.push({\n id: \"send-google-sheet\",\n label: \"Send to Google Sheet\",\n source: table,\n supports: () => true,\n run: async ({ draft }) => {\n if (draft.payload.kind !== \"rows\")\n throw new Error(\"Google Sheets requires captured rows.\");\n return props.sendToSheet!(draft.payload.rows, props.label);\n },\n });\n const source =\n (props.primarySource === \"table\" ? table : undefined) ??\n json ??\n table ??\n structuredAgent ??\n human ??\n builderVariants[0]?.source;\n if (!source && !actions.length) return null;\n // Action-only targets carry an explicit description, never invented record data.\n const target =\n source ?? make(\"actions\", () => ({ kind: \"text\", text: props.label }));\n return (\n <>\n <ContentTransferMenu\n triggerSize={props.size === \"xs\" || props.size === \"toolbar\" ? \"compact\" : \"default\"}\n source={target}\n {...(props.references ? { references: props.references } : {})}\n {...(props.referenceActions ? { referenceActions: props.referenceActions } : {})}\n {...(props.icon !== undefined ? { icon: props.icon } : {})}\n {...(props.triggerVariant !== undefined\n ? { triggerVariant: props.triggerVariant }\n : {})}\n controllerRef={controller}\n label={props.label}\n variants={variants}\n actions={actions}\n sourceFormats={Boolean(source)}\n hide={[\n ...(!copyVisible || !source ? [\"copy\" as const] : []),\n ...(!aiVisible || !source ? [\"prepare\" as const] : []),\n ...(!exportVisible ? [\"download\" as const] : []),\n ]}\n formatSources={{\n ...(human\n ? { plain: human, markdown: humanMarkdown!, html: humanMarkdown! }\n : {}),\n ...(json ? { json, \"compact-json\": json } : {}),\n ...(table && exportVisible ? { csv: table, tsv: table } : {}),\n }}\n {...(props.disabled !== undefined ? { disabled: props.disabled } : {})}\n className={cn(\n props.className,\n props.size === \"xs\" && \"matrx-alchemy-xs\",\n props.size === \"sm\" && \"matrx-alchemy-sm\",\n props.size === \"toolbar\" && \"matrx-alchemy-toolbar-target\",\n )}\n {...(props.stopPropagation !== undefined\n ? { stopPropagation: props.stopPropagation }\n : {})}\n />\n {modal?.modal?.({\n open: true,\n onOpenChange: (open) => {\n if (!open) setModal(null);\n },\n })}\n {configuration ? (\n <SourceConfiguration\n restoreFocus={() => controller.current?.focusTrigger()}\n key={`${instance}:configuration`}\n configuration={configuration}\n onClose={() => setConfiguration(null)}\n onPrepare={async (payload, label) => {\n if (!controller.current)\n throw new Error(\"Alchemy is no longer mounted.\");\n await controller.current.prepare(payload, {\n label,\n id: `${instance}:configured:${crypto.randomUUID()}`,\n });\n setConfiguration(null);\n }}\n />\n ) : null}\n </>\n );\n}\n\nfunction SourceConfiguration({\n restoreFocus,\n configuration,\n onClose,\n onPrepare,\n}: {\n configuration: {\n custom?: AlchemyCustomSource;\n groomer?: AlchemyGroomerConfig;\n };\n restoreFocus(): void;\n onClose(): void;\n onPrepare(payload: Payload, label: string): Promise<void>;\n}) {\n const custom = configuration.custom;\n const handingOff = React.useRef(false);\n const groomer = configuration.groomer;\n const [values, setValues] = React.useState<AlchemyOptionValues>(() =>\n Object.fromEntries(\n custom?.options.map((option) => [option.key, option.default]) ?? [],\n ),\n );\n const [sections, setSections] = React.useState<\n Record<string, AlchemyDetail | \"off\">\n >(() =>\n Object.fromEntries(\n groomer?.sections.map((section) => [\n section.id,\n section.defaultSelection ?? \"full\",\n ]) ?? [],\n ),\n );\n const [error, setError] = React.useState<string | null>(null);\n const [busy, setBusy] = React.useState(false);\n const title = custom?.dialogTitle ?? groomer?.label ?? \"Customize source\";\n let prepared: AgentPayloadInput | null = null;\n let buildError: string | null = null;\n let text = \"\";\n try {\n if (custom) {\n const result = custom.build(values);\n prepared = custom.wrap(result.text, values, result.meta);\n } else if (groomer) {\n const data: Record<string, unknown> = {};\n const omitted: string[] = [];\n for (const section of groomer.sections) {\n const level = sections[section.id] ?? \"full\";\n if (level === \"off\") omitted.push(section.id);\n else {\n const value = section.build(level);\n if (value !== undefined && value !== null) data[section.id] = value;\n }\n }\n prepared = {\n kind: groomer.kind,\n location: groomer.location,\n description: groomer.description,\n data,\n ...(groomer.summary ? { summary: groomer.summary } : {}),\n attributes: {\n ...groomer.attributes,\n dropped_sections: omitted.join(\",\"),\n },\n ...(groomer.context ? { context: groomer.context } : {}),\n };\n }\n text = prepared ? buildAgentPayload(prepared) : \"\";\n } catch (cause) {\n buildError =\n cause instanceof Error ? cause.message : \"Could not prepare this source.\";\n }\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !busy) onClose();\n }}\n >\n <DialogContent\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n if (!handingOff.current) restoreFocus();\n }}\n className=\"matrx-alchemy-workspace matrx-alchemy-configuration\"\n >\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>\n {custom?.dialogDescription ??\n \"Choose the source detail, then prepare, edit, summarize, copy or export it in Alchemy.\"}\n </DialogDescription>\n </DialogHeader>\n <div className=\"matrx-alchemy-workspace-body\">\n <div className=\"matrx-alchemy-main matrx-alchemy-toolbar\">\n {custom?.options.map((option) => (\n <label key={option.key}>\n {option.label}\n {\"hint\" in option && option.hint ? (\n <small>{option.hint}</small>\n ) : null}\n {option.kind === \"toggle\" ? (\n <input\n type=\"checkbox\"\n checked={Boolean(values[option.key])}\n onChange={(event) =>\n setValues({ ...values, [option.key]: event.target.checked })\n }\n />\n ) : option.kind === \"preset\" ? (\n <select\n value={Number(values[option.key])}\n onChange={(event) =>\n setValues({\n ...values,\n [option.key]: Number(event.target.value),\n })\n }\n >\n {option.options.map((choice) => (\n <option key={choice.value} value={choice.value}>\n {choice.label}\n </option>\n ))}\n </select>\n ) : option.kind === \"slider\" ? (\n <>\n <input\n type=\"range\"\n min={0}\n max={Math.max(0, option.stops.length - 1)}\n step={1}\n value={option.stops.indexOf(Number(values[option.key]))}\n onChange={(event) =>\n setValues({\n ...values,\n [option.key]: option.stops[Number(event.target.value)]!,\n })\n }\n />\n <span>{option.formatValue(Number(values[option.key]))}</span>\n </>\n ) : (\n <>\n <input\n type=\"number\"\n min={option.min}\n step={option.step}\n value={Number(values[option.key])}\n onChange={(event) =>\n setValues({\n ...values,\n [option.key]: Number(event.target.value),\n })\n }\n />\n {option.presets?.map((preset) => (\n <Button\n key={preset.value}\n type=\"button\"\n variant=\"ghost\"\n className=\"matrx-alchemy-workspace-secondary\"\n onClick={() =>\n setValues({ ...values, [option.key]: preset.value })\n }\n >\n {preset.label}\n </Button>\n ))}\n </>\n )}\n </label>\n ))}\n {groomer ? (\n <>\n <div>\n {([\"full\", \"compact\", \"brief\"] as const).map((level) => (\n <Button\n key={level}\n type=\"button\"\n variant=\"ghost\"\n className=\"matrx-alchemy-workspace-secondary\"\n onClick={() =>\n setSections(\n Object.fromEntries(\n groomer.sections.map((section) => [\n section.id,\n level === \"brief\" && section.cuttable\n ? \"off\"\n : level,\n ]),\n ),\n )\n }\n >\n {level}\n </Button>\n ))}\n </div>\n {groomer.sections.map((section) => (\n <label key={section.id}>\n {section.title}\n <select\n value={sections[section.id]}\n onChange={(event) =>\n setSections({\n ...sections,\n [section.id]: event.target.value as\n AlchemyDetail | \"off\",\n })\n }\n >\n {([\"full\", \"compact\", \"brief\"] as const).map((level) => (\n <option key={level} value={level}>\n {section.levelLabels?.[level] ?? level}\n </option>\n ))}\n {section.cuttable ? (\n <option value=\"off\">Exclude</option>\n ) : null}\n </select>\n {section.description ? (\n <span>{section.description}</span>\n ) : null}\n </label>\n ))}\n </>\n ) : null}\n </div>\n <p>\n {formatCount(text.length)} characters · approximately{\" \"}\n {formatCount(Math.ceil(text.length / 4))} tokens\n </p>\n {error || buildError ? <p role=\"alert\">{error ?? buildError}</p> : null}\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"matrx-alchemy-workspace-secondary\"\n disabled={busy}\n onClick={onClose}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n className=\"matrx-alchemy-workspace-primary\"\n disabled={busy || !prepared || Boolean(buildError)}\n onClick={async () => {\n if (!prepared) return;\n setBusy(true);\n setError(null);\n try {\n handingOff.current = true;\n await onPrepare(structuredPayload(prepared), title);\n } catch (cause) {\n handingOff.current = false;\n setError(\n cause instanceof Error\n ? cause.message\n : \"Could not open Alchemy.\",\n );\n } finally {\n setBusy(false);\n }\n }}\n >\n {busy ? \"Preparing…\" : \"Prepare in Alchemy\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport type AlchemyGroomerPreset = \"everything\" | \"balanced\" | \"minimal\";\nexport const GROOMER_LEVELS: AlchemyDetail[] = [\"full\", \"compact\", \"brief\"];\nexport function applyGroomerPreset(\n preset: AlchemyGroomerPreset,\n sections: AlchemyGroomerSection[],\n): Record<string, AlchemyDetail | \"off\"> {\n return Object.fromEntries(\n sections.map((section) => [\n section.id,\n preset === \"everything\"\n ? \"full\"\n : preset === \"balanced\"\n ? \"compact\"\n : section.cuttable\n ? \"off\"\n : \"brief\",\n ]),\n );\n}\nexport function defaultGroomerSelections(\n sections: AlchemyGroomerSection[],\n): Record<string, AlchemyDetail | \"off\"> {\n return Object.fromEntries(\n sections.map((section) => [section.id, section.defaultSelection ?? \"full\"]),\n );\n}\nexport function buildGroomerPresetPayload(\n config: AlchemyGroomerConfig,\n preset: AlchemyGroomerPreset,\n): AgentPayloadInput {\n const selections = applyGroomerPreset(preset, config.sections);\n const data: Record<string, unknown> = {};\n const dropped: string[] = [];\n for (const section of config.sections) {\n const selection = selections[section.id] ?? \"full\";\n if (selection === \"off\") {\n dropped.push(section.id);\n continue;\n }\n const value = section.build(selection);\n if (value !== undefined && value !== null) data[section.id] = value;\n }\n return {\n kind: config.kind,\n location: config.location,\n description:\n preset === \"everything\"\n ? config.description\n : `${config.description} (${preset} detail)`,\n data,\n ...(config.summary !== undefined ? { summary: config.summary } : {}),\n attributes: {\n ...config.attributes,\n detail: preset,\n ...(dropped.length ? { dropped_sections: dropped.join(\",\") } : {}),\n },\n ...(config.context ? { context: config.context } : {}),\n };\n}\nexport function groomerPresetVariants(\n getConfig: () => AlchemyGroomerConfig,\n): AlchemyCopyVariant[] {\n return [\n {\n id: \"balanced\",\n label: \"Balanced\",\n hint: \"Compact sections\",\n build: () => buildGroomerPresetPayload(getConfig(), \"balanced\"),\n },\n {\n id: \"minimal\",\n label: \"Minimal\",\n hint: \"Brief sections with optional detail excluded\",\n build: () => buildGroomerPresetPayload(getConfig(), \"minimal\"),\n },\n ];\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { Artifact, TransferOutcome } from \"@ai-matrx/kit/content-transfer\";\nimport { Button } from \"../button\";\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from \"../dialog\";\nimport type { ContentTransferEmailPort } from \"./extensions\";\n\ntype PendingEmail = {\n artifact: Artifact;\n context: { label: string; signal: AbortSignal };\n resolve(outcome: TransferOutcome): void;\n onAbort(): void;\n};\n\nconst cancelled = (): TransferOutcome => ({ status: \"cancelled\" });\nconst failed = (error: unknown): TransferOutcome => ({\n status: \"error\",\n code: \"email-failed\",\n message: error instanceof Error ? error.message : \"Could not send email.\",\n retryable: true,\n});\n\n/** Adds one explicit review step without changing the sealed artifact handed to the host. */\nexport function useReviewedTransferEmail(email?: ContentTransferEmailPort): {\n email: ContentTransferEmailPort | undefined;\n review: React.ReactNode;\n} {\n const [pending, setPending] = React.useState<PendingEmail | null>(null);\n const [sending, setSending] = React.useState(false);\n const pendingRef = React.useRef<PendingEmail | null>(null);\n const sendingRef = React.useRef(false);\n\n const settle = React.useCallback((request: PendingEmail, outcome: TransferOutcome, render = true) => {\n if (pendingRef.current !== request) return;\n pendingRef.current = null;\n request.context.signal.removeEventListener(\"abort\", request.onAbort);\n request.resolve(outcome);\n sendingRef.current = false;\n if (render) {\n setSending(false);\n setPending(null);\n }\n }, []);\n\n React.useEffect(\n () => () => {\n const request = pendingRef.current;\n if (!request) return;\n pendingRef.current = null;\n request.context.signal.removeEventListener(\"abort\", request.onAbort);\n request.resolve(cancelled());\n sendingRef.current = false;\n },\n [],\n );\n\n const reviewed = React.useMemo<ContentTransferEmailPort | undefined>(() => {\n if (!email) return undefined;\n return {\n send: (artifact, context) => {\n if (context.signal.aborted) return Promise.resolve(cancelled());\n if (pendingRef.current)\n return Promise.resolve({\n status: \"error\",\n code: \"email-review-active\",\n message: \"Finish reviewing the current email before starting another.\",\n retryable: true,\n });\n return new Promise<TransferOutcome>((resolve) => {\n const request: PendingEmail = {\n artifact,\n context,\n resolve,\n onAbort: () => settle(request, cancelled()),\n };\n pendingRef.current = request;\n context.signal.addEventListener(\"abort\", request.onAbort, { once: true });\n setSending(false);\n setPending(request);\n });\n },\n };\n }, [email, settle]);\n\n const cancel = React.useCallback(() => {\n const request = pendingRef.current;\n if (request && !sendingRef.current) settle(request, cancelled());\n }, [settle]);\n const confirm = React.useCallback(() => {\n const request = pendingRef.current;\n if (!request || sendingRef.current || request.context.signal.aborted) return;\n sendingRef.current = true;\n setSending(true);\n void email?.send(request.artifact, request.context).then(\n (outcome) => settle(request, outcome),\n (error) => settle(request, failed(error)),\n );\n }, [email, settle]);\n\n const review = pending ? <Dialog open onOpenChange={(open) => { if (!open) cancel(); }}>\n <DialogContent className=\"matrx-alchemy-workspace matrx-alchemy-email-review\" aria-busy={sending}>\n <DialogHeader>\n <DialogTitle>Review email attachment</DialogTitle>\n <DialogDescription>Email {pending.artifact.file?.filename ?? `${pending.artifact.format} output`} from {pending.context.label}. Review this exact attachment before sending.</DialogDescription>\n </DialogHeader>\n <textarea aria-label=\"Email attachment preview\" readOnly value={pending.artifact.plainText} className=\"matrx-alchemy-preview\" />\n {pending.artifact.omissions.length ? <details className=\"matrx-alchemy-email-adjustments\" open><summary>{pending.artifact.omissions.length} omission{pending.artifact.omissions.length === 1 ? \"\" : \"s\"} or adjustment{pending.artifact.omissions.length === 1 ? \"\" : \"s\"}</summary><ul >{pending.artifact.omissions.map((omission, index) => <li key={`${omission.path}-${omission.reason}-${index}`}>{omission.path || \"/\"}: {omission.reason}{omission.count == null ? \"\" : ` (${omission.count})`}</li>)}</ul></details> : <p className=\"matrx-alchemy-meta\">No omissions or adjustments.</p>}\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={sending} onClick={cancel}>Cancel</Button>\n <Button type=\"button\" className=\"matrx-alchemy-workspace-primary\" disabled={sending} onClick={confirm}>{sending ? \"Sending email…\" : \"Send email\"}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog> : null;\n\n return { email: reviewed, review };\n}\n","\"use client\";\n\nimport { useReviewedTransferEmail } from \"./email-review\";\n\nimport * as React from \"react\";\nimport { createPortal, flushSync } from \"react-dom\";\nimport {\n applySectionSelection,\n applyTransferLimits,\n capture,\n buildAgentPayload,\n collectAllMatching,\n createBrowserTransport,\n createDraft,\n directSource,\n editDraft,\n projectSnapshot,\n readTransferCell,\n reduceJson,\n resetDraft,\n resolveTransferPreferences,\n resolveTransferRegistry,\n sealTransferArtifact,\n serialize,\n serializeMarkdownRich,\n transformRows,\n undoDraft,\n type AiPreparation,\n type Artifact,\n type BoundAllMatching,\n type Draft,\n type ExportProjection,\n type FormatAdapter,\n type Json,\n type PageAction,\n type Payload,\n type Section,\n type Snapshot,\n type Source,\n type SurfaceHandle,\n type TransferCapabilities,\n type TransferOutcome,\n type TransferTarget,\n type TransferPreferenceOverrides,\n type TransferPreferences,\n type TransferScope,\n type Transport,\n} from \"@ai-matrx/kit/content-transfer\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\nimport { Button } from \"../button\";\nimport { cn } from \"../cn\";\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from \"../dialog\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { TapTargetButton, TapTargetButtonTransparent } from \"../tap-target/index\";\nimport { ALCHEMY_GLYPH_VIEWBOX, ALCHEMY_GLYPH_PATHS, type AlchemyIcon } from \"./icon\";\nexport { ALCHEMY_GLYPH_SVG, ALCHEMY_COPY_TRANSFORM_SVG, type AlchemyIcon } from \"./icon\";\n\nimport { createTransferEmailActions, type ContentTransferReference, type ContentTransferReferencePort, type ContentTransferEmailPort } from \"./extensions\";\nexport { tableSchemaFormat, tableDataFormat, createTransferEmailActions, type ContentTransferReference, type ContentTransferReferencePort, type ContentTransferEmailPort } from \"./extensions\";\nexport type ContentTransferReferenceAction = { id: string; label: string; run(): void | Promise<void> };\n\nexport function AlchemyGlyph({ icon = \"portal\", ...props }: React.SVGAttributes<SVGSVGElement> & { icon?: AlchemyIcon }) {\n return <svg width=\"18\" height=\"18\" viewBox={ALCHEMY_GLYPH_VIEWBOX[icon]} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" {...props}>{ALCHEMY_GLYPH_PATHS[icon].map((d) => <path key={d} d={d}/>)}</svg>;\n}\n\nexport type ContentTransferCapabilities = TransferCapabilities & {\n /** Opaque host session boundary. It is used only to reset local menu state. */\n identityKey?: string;\n transport?: Transport;\n reference?: ContentTransferReferencePort;\n email?: ContentTransferEmailPort;\n actions?: PageAction[];\n preferences?: TransferPreferenceOverrides;\n onOutcome?: (outcome: TransferOutcome) => void;\n};\nconst CapabilityContext = React.createContext<ContentTransferCapabilities>({});\nexport function ContentTransferCapabilitiesProvider({ value, children }: { value: ContentTransferCapabilities; children: React.ReactNode }) {\n return <CapabilityContext.Provider value={value}>{children}</CapabilityContext.Provider>;\n}\nexport const useContentTransferCapabilities = () => React.useContext(CapabilityContext);\nconst SurfaceContext = React.createContext<SurfaceHandle | null>(null);\nexport function ContentTransferSurfaceProvider({ handle, children }: { handle: SurfaceHandle; children: React.ReactNode }) {\n return <SurfaceContext.Provider value={handle}>{children}</SurfaceContext.Provider>;\n}\nexport const useContentTransferSurface = () => React.useContext(SurfaceContext);\n\nexport type SerializableFormat = \"plain\" | \"markdown\" | \"html\" | \"json\" | \"compact-json\" | \"csv\" | \"tsv\";\ntype BuiltInFormat = SerializableFormat | \"xlsx\";\nexport interface TransferMenuPresentation {\n group?: \"save\" | \"chat\" | \"email\";\n prepared?: boolean;\n hint?: string;\n icon?: React.ComponentType<{ className?: string }>;\n ariaLabel?: string;\n /** Download-only actions join the shared format palette instead of a second menu. */\n placement?: \"download\";\n}\nexport interface TransferMenuVariant extends TransferMenuPresentation {\n id: string; label: string; source: Source | Payload;\n copyLabel?: string;\n section?: \"copy\" | \"ai\";\n successMessage?: string;\n}\nfunction MenuPresentation({ label, hint, icon: Icon }: TransferMenuPresentation & { label: string }) {\n return <>{Icon ? <Icon className=\"matrx-alchemy-menu-icon\"/> : <PaletteGlyph file/>}<span>{label}{hint ? <small className=\"matrx-alchemy-menu-hint\">{hint}</small> : null}</span></>;\n}\nfunction DestinationPresentation({ action }: { action: PageAction & TransferMenuPresentation }) {\n const paths: Record<string, string> = {\n notes: \"M5 3h14v18H5zM8 8h8M8 12h8M8 16h5\",\n scratch: \"M5 3h14v18H5zM9 12h6M12 9v6\",\n document: \"M6 3h8l4 4v14H6zM14 3v5h4M9 12h6M9 16h6\",\n workbook: \"M3 4h18v16H3zM3 9h18M9 4v16M15 9v11M3 15h18\",\n task: \"M9 6h11M9 12h11M9 18h11M3 6l1 1 2-2M3 12l1 1 2-2M3 18l1 1 2-2\",\n attach: \"m9 12 5-5a3 3 0 0 1 4 4l-7 7a5 5 0 0 1-7-7l8-8M7 14l7-7\",\n code: \"m8 6-6 6 6 6m8-12 6 6-6 6m-3-14-2 16\",\n chat: \"M4 4h16v13H9l-5 4zM8 9h8M8 13h5\",\n assistant: \"M3 4h18v16H3zM15 4v16M6 9h6M6 13h4\",\n tools: \"m14 4 3 3 4-1a6 6 0 0 1-8 7l-7 7-3-3 7-7a6 6 0 0 1 4-6z\",\n };\n const path = paths[action.id.replace(/^matrx:/, \"\")];\n return <>{action.icon ? <action.icon className=\"matrx-alchemy-menu-icon\"/> : path ? <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d={path}/></svg> : <PaletteGlyph file/>}<span>{action.label}{action.hint ? <small className=\"matrx-alchemy-menu-hint\">{action.hint}</small> : null}</span></>;\n}\nfunction ReceiptLink({ target }: { target: TransferTarget | undefined }) {\n return target?.href && /^(\\/(?!\\/)|https?:\\/\\/)/.test(target.href) ? <a className=\"matrx-alchemy-receipt-link\" href={target.href}>Open {target.kind}</a> : null;\n}\nfunction PaletteGlyph({ format, ai = false, file = false, kind }: { format?: string; ai?: boolean; file?: boolean; kind?: \"ai-copy\" | \"sliders\" | \"link\" | \"surface\" }) {\n if (kind === \"link\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M10 13a5 5 0 0 0 7 0l3-3a5 5 0 0 0-7-7l-2 2M14 11a5 5 0 0 0-7 0l-3 3a5 5 0 0 0 7 7l2-2\"/></svg>;\n if (kind === \"surface\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M3 9h18M9 9v12\"/></svg>;\n if (kind === \"ai-copy\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><rect x=\"5\" y=\"5\" width=\"11\" height=\"14\" rx=\"2\"/><path d=\"M9 3h6a2 2 0 0 1 2 2v10\"/><path d=\"m18.5 3 .55 1.45L20.5 5l-1.45.55L18.5 7l-.55-1.45L16.5 5l1.45-.55z\"/></svg>;\n if (kind === \"sliders\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 6h16M4 12h16M4 18h16\"/><path d=\"M8 3v6M16 9v6M10 15v6\"/></svg>;\n if (ai) return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 5a3 3 0 1 0-5.997.125A4 4 0 0 0 3.5 10.9a4 4 0 0 0 .556 6.588A4 4 0 0 0 12 19\"/><path d=\"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.503 5.775 4 4 0 0 1-.556 6.588A4 4 0 0 1 12 19\"/><path d=\"M12 5v14M8 9h1M15 9h1M8 15h1M15 15h1\"/></svg>;\n if (file) return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 3h8l4 4v14H6z\"/><path d=\"M14 3v5h5M9 13h6M9 17h6\"/></svg>;\n const path = format === \"json\" || format === \"table-data\" ? <><path d=\"M9 4C7 4 7 7 5 7v3c2 0 2 1 2 2s0 2-2 2v3c2 0 2 3 4 3\"/><path d=\"M15 4c2 0 2 3 4 3v3c-2 0-2 1-2 2s0 2 2 2v3c-2 0-2 3-4 3\"/></>\n : format === \"table-schema\" ? <><rect x=\"8\" y=\"3\" width=\"8\" height=\"5\" rx=\"1\"/><rect x=\"2\" y=\"16\" width=\"8\" height=\"5\" rx=\"1\"/><rect x=\"14\" y=\"16\" width=\"8\" height=\"5\" rx=\"1\"/><path d=\"M12 8v4M6 16v-4h12v4\"/></>\n : format === \"compact-json\" ? <><path d=\"m14 10 7-7\"/><path d=\"M20 10h-6V4\"/><path d=\"m3 21 7-7\"/><path d=\"M4 14h6v6\"/></>\n : format === \"csv\" ? <><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\"/><path d=\"M4 10h16M10 4v16\"/></>\n : format === \"tsv\" ? <><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><path d=\"M14 2v6h6M8 13h2M14 13h2M8 17h2M14 17h2\"/></>\n : format === \"xlsx\" ? <><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><path d=\"M14 2v6h6M8 13h8M8 17h8M12 11v8\"/></>\n : format === \"markdown\" ? <><path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5z\"/><path d=\"M14 2v6h6M10 13l-2 2 2 2M14 17l2-2-2-2\"/></>\n : format === \"html\" ? <><path d=\"M15 6h6M3 6h7M3 12h18M3 18h12\"/></>\n : <><path d=\"M4 7V4h16v3M9 20h6M12 4v16\"/></>;\n return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">{path}</svg>;\n}\nfunction PaletteRows({ title, items, onRun, extra, ai = false, glyphKind, fallbackHint }: { title: string; items: readonly TransferMenuVariant[]; onRun?: (item: TransferMenuVariant) => void; extra?: React.ReactNode; ai?: boolean; glyphKind?: \"ai-copy\" | \"sliders\"; fallbackHint?: string }) {\n if (!items.length && !extra) return null;\n return <section className=\"matrx-alchemy-palette-section\"><h3>{title}</h3>{items.map((item) => { const label = item.copyLabel ?? item.label; const hint = item.hint ?? fallbackHint; return <button key={item.id} type=\"button\" className={cn(\"matrx-alchemy-palette-row\", ai && \"matrx-alchemy-palette-row-ai\")} aria-label={item.ariaLabel ?? `${label}${hint ? ` ${hint}` : \"\"}`} onClick={() => onRun?.(item)}>{item.icon ? <item.icon className=\"matrx-alchemy-menu-icon\"/> : <PaletteGlyph ai={ai} {...(glyphKind ? { kind: glyphKind } : {})}/>}<span>{label}{hint ? <small className=\"matrx-alchemy-menu-hint\">{hint}</small> : null}</span></button>; })}{extra}</section>;\n}\nexport interface ContentTransferMenuProps {\n source?: Payload | Source;\n projection?: ExportProjection;\n sections?: Section[];\n preferences?: TransferPreferenceOverrides;\n enabled?: boolean;\n surface?: SurfaceHandle;\n label?: string;\n table?: { availableScopes: TransferScope[]; initialScope: TransferScope; scopeLabels?: Partial<Record<TransferScope, string>> };\n references?: readonly ContentTransferReference[];\n referenceActions?: readonly ContentTransferReferenceAction[];\n /** A quick format may explicitly capture a different representation. */\n formatSources?: Partial<Record<SerializableFormat, Source | Payload>>;\n /** Set false for action-only hosts; source formats and adapters are then omitted. */\n sourceFormats?: boolean;\n /** Named alternate sources open this same preparation workspace. */\n variants?: readonly TransferMenuVariant[];\n actions?: (PageAction & TransferMenuPresentation)[];\n capabilities?: ContentTransferCapabilities;\n disabled?: boolean;\n /** Portal is the default Alchemy mark; copy-transform remains opt-in. */\n icon?: AlchemyIcon;\n /** Uses the canonical TapTargetButton presentation. */\n triggerVariant?: \"transparent\" | \"glass\" | \"outline\";\n triggerSize?: \"default\" | \"compact\";\n className?: string;\n stopPropagation?: boolean;\n hide?: readonly (\"copy\" | \"prepare\" | \"download\")[];\n controllerRef?: React.Ref<ContentTransferController>;\n}\nexport interface ContentTransferController {\n focusTrigger(): void;\n prepare(source: Source | Payload, options?: { id?: string; label?: string }): Promise<void>;\n}\n\nconst LABEL: Record<BuiltInFormat, string> = { plain: \"Plain text\", markdown: \"Markdown\", html: \"Formatted\", json: \"JSON\", \"compact-json\": \"Compact JSON\", csv: \"CSV\", tsv: \"Google Sheets\", xlsx: \"Excel workbook\" };\nconst BUILT_INS = Object.freeze((Object.keys(LABEL) as BuiltInFormat[]).map((id) => ({ id })));\nconst COPIES: SerializableFormat[] = [\"plain\", \"markdown\", \"html\", \"json\", \"compact-json\", \"csv\", \"tsv\"];\nconst DOWNLOADS: BuiltInFormat[] = [...COPIES, \"xlsx\"];\nconst EMPTY_VARIANTS: readonly { id: string; label: string; source: Source | Payload }[] = [];\nconst SCOPE_LABEL: Record<TransferScope, string> = { target: \"This content\", row: \"This row\", selected: \"Selected rows\", view: \"Current view\", loaded: \"Loaded rows\", \"all-matching\": \"All matching rows\" };\nconst filenameFor = (label: string) => label.toLocaleLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/(^-|-$)/g, \"\") || \"export\";\nconst estimateTokens = (text: string) => Math.ceil(text.length / 4);\nconst errorMessage = (error: unknown, fallback: string) => error instanceof Error ? error.message : fallback;\nconst isAbort = (error: unknown) => error instanceof DOMException && error.name === \"AbortError\";\nconst supportsBuiltIn = (format: BuiltInFormat, payload: Payload) => ![\"csv\", \"tsv\", \"xlsx\"].includes(format) || payload.kind === \"rows\";\nconst outcomeMessage = (result: TransferOutcome) => {\n if (result.status === \"success\") {\n const success = result as TransferOutcome & { delivered: string; message?: string };\n return success.delivered === \"action\" ? success.message ?? \"Action completed\" : success.delivered === \"download-started\" ? \"Download started\" : success.message ?? \"Copied\";\n }\n return result.status === \"degraded\" ? `Copied as plain text: ${result.reason}` : result.status === \"cancelled\" ? \"Cancelled\" : result.message;\n};\nconst materialIds = new WeakMap<object, number>();\nlet nextMaterialId = 0;\nfunction materialIdentity(material: Source | Payload | SurfaceHandle | null | undefined) {\n if (!material) return \"missing\";\n if (\"instanceId\" in material) return `surface:${material.instanceId}`;\n if (\"id\" in material) return `source:${material.id}`;\n let id = materialIds.get(material);\n if (id === undefined) { id = ++nextMaterialId; materialIds.set(material, id); }\n return `payload:${id}`;\n}\n\ntype CaptureResult = { snapshot: Snapshot; allMatching?: BoundAllMatching; collectionError?: string };\ntype WorkspaceState = CaptureResult & { sourceStale?: boolean | undefined; key: string; original: Draft; draft: Draft; scope: TransferScope; preferences: TransferPreferences; pending?: (CaptureResult & { scope: TransferScope }) | undefined; error?: string | undefined };\n\n/** Compare captured meaning at the user action boundary, never during render. */\nfunction snapshotContent(snapshot: Snapshot) {\n const { sourceId, label, payload, coverage, unsavedChanges, omissions, sections, limits } = snapshot;\n return JSON.stringify({ sourceId, label, payload, coverage, unsavedChanges, omissions, sections, limits });\n}\n\nfunction useFence() {\n const mounted = React.useRef(true);\n const nextId = React.useRef(0);\n const active = React.useRef(new Set<AbortController>());\n React.useEffect(() => {\n mounted.current = true;\n return () => { mounted.current = false; nextId.current += 1; active.current.forEach((c) => c.abort()); active.current.clear(); };\n }, []);\n const begin = React.useCallback(() => { const controller = new AbortController(); active.current.add(controller); return { controller, id: ++nextId.current }; }, []);\n const finish = React.useCallback((controller: AbortController) => active.current.delete(controller), []);\n const valid = React.useCallback((id: number, controller: AbortController) => mounted.current && !controller.signal.aborted && nextId.current === id, []);\n const abortAll = React.useCallback(() => { nextId.current += 1; active.current.forEach((c) => c.abort()); active.current.clear(); }, []);\n return { begin, finish, valid, abortAll };\n}\n\nasync function xlsxArtifact(draft: Draft, label: string): Promise<Artifact> {\n if (draft.payload.kind !== \"rows\") throw new Error(\"Excel workbook export requires tabular content.\");\n const XLSX = await import(\"xlsx\");\n const columns = draft.payload.columns.filter((c) => c.visible && c.exportable !== false && c.classification !== \"secret\" && c.classification !== \"credential\");\n const cells = draft.payload.rows.map((row) => columns.map((column) => {\n const value = readTransferCell(row, column);\n return value === null || [\"string\", \"number\", \"boolean\"].includes(typeof value) ? value : value === undefined ? \"\" : JSON.stringify(value);\n }));\n const sheet = XLSX.utils.aoa_to_sheet([columns.map((c) => c.label), ...cells]);\n const book = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(book, sheet, label.replace(/[\\\\/?*[\\]:]/g, \" \").trim().slice(0, 31) || \"Data\");\n const written = XLSX.write(book, { type: \"array\", bookType: \"xlsx\", compression: true });\n return sealTransferArtifact({ snapshotId: draft.snapshotId, draftRevision: draft.revision, format: \"xlsx\", plainText: serialize(draft, \"tsv\", { spreadsheetSafe: true }).plainText, file: { filename: `${filenameFor(label)}.xlsx`, mime: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", bytes: written instanceof Uint8Array ? written : new Uint8Array(written) }, omissions: [...draft.omissions] });\n}\nasync function buildArtifact(draft: Draft, format: BuiltInFormat, label: string): Promise<Artifact> {\n if (!supportsBuiltIn(format, draft.payload)) throw new Error(`${LABEL[format]} is available for tabular content only.`);\n if (format === \"xlsx\") return xlsxArtifact(draft, label);\n if (format === \"html\" && draft.payload.kind === \"markdown\") return serializeMarkdownRich(draft, `${filenameFor(label)}.html`);\n const extension = format === \"plain\" ? \"txt\" : format === \"compact-json\" ? \"json\" : format;\n return serialize(draft, format, { spreadsheetSafe: format === \"csv\" || format === \"tsv\", filename: `${filenameFor(label)}.${extension}` });\n}\n\nexport function ContentTransferMenu(props: ContentTransferMenuProps) {\n const inherited = React.useContext(CapabilityContext);\n const identityKey = props.capabilities?.identityKey ?? inherited.identityKey;\n return <ContentTransferMenuSession key={identityKey ?? \"anonymous\"} {...props} />;\n}\n\nfunction ContentTransferMenuSession({ references = [], referenceActions = [], source, surface, label, projection, sections, preferences, table, formatSources, sourceFormats = true, variants = EMPTY_VARIANTS, actions = [], capabilities: local, disabled, enabled = true, className, stopPropagation = true, hide = [], controllerRef, icon = \"portal\", triggerVariant = \"transparent\", triggerSize = \"default\" }: ContentTransferMenuProps) {\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const inherited = React.useContext(CapabilityContext);\n const nearestSurface = React.useContext(SurfaceContext);\n const fence = useFence();\n const [menuCapture, setMenuCapture] = React.useState<CaptureResult | null>(null);\n const [menuStatus, setMenuStatus] = React.useState<\"idle\" | \"loading\" | string>(\"idle\");\n const [workspaces, setWorkspaces] = React.useState<Record<string, WorkspaceState>>({});\n const [workspaceKey, setWorkspaceKey] = React.useState<string | null>(null);\n const [workspaceOpen, setWorkspaceOpen] = React.useState(false);\n const workspaceCaptures = React.useRef(new Map<string, (scope: TransferScope, signal: AbortSignal) => Promise<CaptureResult>>());\n const externalWorkspaceKeys = React.useRef(new Set<string>());\n const [notice, setNotice] = React.useState<string | null>(null);\n const [receiptTarget, setReceiptTarget] = React.useState<TransferTarget | undefined>();\n const [paletteOpen, setPaletteOpen] = React.useState(false);\n const [mode, setMode] = React.useState<\"copy\" | \"download\">(\"copy\");\n const scopes = React.useMemo(() => table?.availableScopes ?? ([\"target\"] as TransferScope[]), [table]);\n const [requestedScope, setRequestedScope] = React.useState<TransferScope>(table?.initialScope ?? \"target\");\n const initialScope = scopes.includes(requestedScope) ? requestedScope : table?.initialScope ?? \"target\";\n if (!scopes.includes(initialScope)) throw new Error(\"Alchemy initialScope must be included in availableScopes.\");\n const primary = surface ?? source ?? nearestSurface;\n const sourceLabel = label ?? (surface?.surfaceName ?? (source && \"label\" in source ? source.label : nearestSurface?.surfaceName) ?? \"content\");\n const primaryWorkspaceBase = `primary:${materialIdentity(primary)}`;\n const primaryWorkspaceKey = `${primaryWorkspaceBase}:${initialScope}`;\n const nearestWorkspaceKey = source && !surface && nearestSurface ? `surface:${materialIdentity(nearestSurface)}` : null;\n const variantWorkspaceKeys = React.useMemo(() => new Map(variants.map((variant) => [variant.id, `variant:${variant.id}:${materialIdentity(variant.source)}`])), [variants]);\n const transport = local?.transport ?? inherited.transport ?? createBrowserTransport();\n const ai = local?.ai ?? inherited.ai;\n const referencePort = local?.reference ?? inherited.reference;\n const { email: emailPort, review: emailReview } = useReviewedTransferEmail(local?.email ?? inherited.email);\n const providerPreferences = React.useMemo(() => resolveTransferPreferences(inherited.preferences, local?.preferences), [inherited.preferences, local?.preferences]);\n const adapters = React.useMemo(() => resolveTransferRegistry<{ id: string }>(BUILT_INS, inherited.formats ?? [], local?.formats ?? []).filter((x): x is FormatAdapter => \"build\" in x), [inherited.formats, local?.formats]);\n const emailJsonFormat = adapters.find((adapter) => adapter.id === \"table-data\");\n const emailActions = React.useMemo(() => emailPort ? createTransferEmailActions(emailPort, emailJsonFormat ? { jsonFormat: emailJsonFormat } : {}) : [], [emailPort, emailJsonFormat]);\n const registeredActions = React.useMemo(() => resolveTransferRegistry(emailActions, inherited.actions ?? [], local?.actions ?? [], actions), [actions, emailActions, inherited.actions, local?.actions]);\n React.useMemo(() => resolveTransferRegistry(variants), [variants]);\n const report = React.useCallback((result: TransferOutcome) => { inherited.onOutcome?.(result); local?.onOutcome?.(result); setNotice(outcomeMessage(result)); setReceiptTarget(\"target\" in result ? result.target : undefined); }, [inherited, local]);\n React.useEffect(() => {\n const valid = new Set([...scopes.map((scope) => `${primaryWorkspaceBase}:${scope}`), ...(nearestWorkspaceKey ? [nearestWorkspaceKey] : []), ...variantWorkspaceKeys.values(), ...externalWorkspaceKeys.current]);\n setWorkspaces((current) => Object.fromEntries(Object.entries(current).filter(([key]) => valid.has(key))));\n for (const key of workspaceCaptures.current.keys()) if (!valid.has(key)) workspaceCaptures.current.delete(key);\n if (workspaceKey && !valid.has(workspaceKey)) { setWorkspaceKey(null); setWorkspaceOpen(false); }\n }, [nearestWorkspaceKey, primaryWorkspaceBase, scopes, variantWorkspaceKeys, workspaceKey]);\n\n const captureOne = React.useCallback(async (material: Source | Payload | SurfaceHandle | null, scope: TransferScope, signal: AbortSignal, applyMenuProjection = false, collectPages = true): Promise<CaptureResult> => {\n if (!material) throw new Error(\"Alchemy needs a source or a mounted transfer surface.\");\n let sourceMaterial: Source;\n if (\"instanceId\" in material) {\n if (!material.isMounted()) throw new Error(\"The requested transfer surface is no longer mounted.\");\n const captured = await material.capture(signal);\n sourceMaterial = { id: captured.snapshot.sourceId, label: captured.snapshot.label, capture: async () => captured };\n } else if (\"kind\" in material) {\n sourceMaterial = { id: materialIdentity(material), label: sourceLabel, capture: async () => directSource(material, { sourceId: materialIdentity(material), label: sourceLabel, ...(applyMenuProjection && projection ? { projection } : {}), ...(applyMenuProjection && sections ? { sections } : {}) }) };\n } else if (applyMenuProjection && (projection || sections)) {\n sourceMaterial = {\n id: material.id,\n label: material.label,\n capture: async (request) => {\n const captured = await material.capture(request);\n return {\n ...captured,\n projection: { rules: [...captured.projection.rules, ...(projection?.rules ?? [])] },\n snapshot: { ...captured.snapshot, ...(sections ? { sections } : {}) },\n };\n },\n };\n } else {\n sourceMaterial = material;\n }\n const raw = await sourceMaterial.capture({ scope, signal });\n const constrained = resolveTransferPreferences(providerPreferences, preferences, raw.snapshot.limits);\n const result = await capture({ id: raw.snapshot.sourceId, label: raw.snapshot.label, capture: async () => ({ ...raw, snapshot: { ...raw.snapshot, limits: constrained.limits } }) }, signal, scope);\n if (scope !== \"all-matching\" || !collectPages) return result;\n if (!result.allMatching) throw new Error(\"This source cannot provide a stable all-matching export.\");\n const collected = await collectAllMatching(result.allMatching, signal);\n if (result.snapshot.payload.kind !== \"rows\") throw new Error(\"All-matching export requires tabular content.\");\n return { snapshot: projectSnapshot({ ...result.snapshot, payload: { kind: \"rows\", rows: collected.rows, columns: result.snapshot.payload.columns }, coverage: collected.coverage, omissions: [...collected.omissions] }, { rules: [] }), allMatching: result.allMatching, ...(collected.error ? { collectionError: collected.error.message } : {}) };\n }, [preferences, projection, providerPreferences, sections, sourceLabel]);\n const capturePrimary = React.useCallback((scope: TransferScope, signal: AbortSignal) => captureOne(primary, scope, signal, true), [captureOne, primary]);\n workspaceCaptures.current.set(primaryWorkspaceKey, capturePrimary);\n if (nearestWorkspaceKey && nearestSurface) workspaceCaptures.current.set(nearestWorkspaceKey, (scope, signal) => captureOne(nearestSurface, scope, signal, true));\n for (const variant of variants) {\n const key = variantWorkspaceKeys.get(variant.id)!;\n workspaceCaptures.current.set(key, (scope, signal) => captureOne(variant.source, scope, signal, true));\n }\n\n const preflight = React.useCallback(async (scope = initialScope) => {\n const { controller, id } = fence.begin(); setMenuCapture(null); setMenuStatus(\"loading\");\n try { const result = await captureOne(primary, scope, controller.signal, true, false); if (fence.valid(id, controller)) { setMenuCapture(result); setMenuStatus(\"idle\"); } }\n catch (error) { if (fence.valid(id, controller)) { setMenuCapture(null); setMenuStatus(errorMessage(error, \"Could not inspect content\")); } }\n finally { fence.finish(controller); }\n }, [captureOne, fence, initialScope, primary]);\n\n const transfer = React.useCallback(async (format: BuiltInFormat | FormatAdapter, download: boolean, alternate?: TransferMenuVariant) => {\n const { controller, id } = fence.begin();\n try {\n const explicit = alternate?.source ?? (typeof format === \"string\" && format !== \"xlsx\" ? formatSources?.[format] : undefined);\n const result = await (explicit ? captureOne(explicit, initialScope, controller.signal, true) : capturePrimary(initialScope, controller.signal));\n if (result.collectionError) throw new Error(`The complete source could not be collected: ${result.collectionError}`);\n if (result.snapshot.coverage.status !== \"complete\" || result.snapshot.omissions.length > 0) {\n const reason = result.snapshot.coverage.reason ?? `${result.snapshot.omissions.length} omission${result.snapshot.omissions.length === 1 ? \"\" : \"s\"}`;\n throw new Error(`Quick transfer is partial (${reason}). Open Prepare for AI to review it before delivery.`);\n }\n const resolved = resolveTransferPreferences(providerPreferences, preferences, result.snapshot.limits);\n const draft = applyTransferLimits(createDraft(result.snapshot), resolved.limits); const revision = draft.revision;\n if (draft.omissions.length > result.snapshot.omissions.length) throw new Error(\"Quick transfer requires content reductions. Open Prepare for AI to review them before delivery.\");\n const artifact = typeof format === \"string\" ? await buildArtifact(draft, format, result.snapshot.label) : await format.build(draft, controller.signal);\n if (artifact.omissions.length > draft.omissions.length) throw new Error(`Quick format requires ${artifact.omissions.length - draft.omissions.length} adjustment${artifact.omissions.length - draft.omissions.length === 1 ? \"\" : \"s\"}. Open Prepare for AI to review before delivery.`);\n if (!fence.valid(id, controller) || artifact.snapshotId !== result.snapshot.id || artifact.draftRevision !== revision) return;\n const outcome = await transport[download ? \"download\" : \"copy\"](artifact, controller.signal);\n if (fence.valid(id, controller)) report(outcome.status === \"success\" && alternate?.successMessage ? { ...outcome, message: alternate.successMessage } : outcome);\n } catch (error) { if (fence.valid(id, controller)) report({ status: \"error\", code: \"prepare-failed\", message: errorMessage(error, \"Preparation failed\"), retryable: true }); }\n finally { fence.finish(controller); }\n }, [captureOne, capturePrimary, fence, formatSources, initialScope, preferences, providerPreferences, report, transport]);\n\n const openWorkspace = React.useCallback(\n async (\n key = primaryWorkspaceKey,\n variant?: { source: Source | Payload | SurfaceHandle; label: string },\n ) => {\n const variantMaterial =\n variant && \"kind\" in variant.source\n ? ({\n id: `variant:${key}`,\n label: variant.label,\n capture: async () =>\n directSource(variant.source as Payload, {\n sourceId: `variant:${key}`,\n label: variant.label,\n }),\n } satisfies Source)\n : variant?.source;\n const captureWorkspace = (\n scope: TransferScope,\n signal: AbortSignal,\n collectPages = true,\n ) =>\n captureOne(variantMaterial ?? primary, scope, signal, true, collectPages);\n workspaceCaptures.current.set(key, captureWorkspace);\n const existing = workspaces[key];\n const { controller, id } = fence.begin();\n if (existing) {\n try {\n const scopeChanged = existing.scope !== initialScope;\n const allMatching = initialScope === \"all-matching\";\n const fresh = await captureWorkspace(\n initialScope,\n controller.signal,\n scopeChanged || !allMatching,\n );\n if (!fence.valid(id, controller) || !workspaceCaptures.current.has(key))\n return;\n if (allMatching && (!fresh.allMatching || (!scopeChanged && !existing.allMatching)))\n throw new Error(\n \"This source can no longer provide an all-matching snapshot.\",\n );\n const collectionIdentity = (value: BoundAllMatching | undefined) =>\n value && {\n query: value.source.query,\n projection: value.projection,\n columns: value.columns,\n limits: value.limits,\n };\n const changed = scopeChanged || (allMatching\n ? JSON.stringify(collectionIdentity(existing.allMatching)) !==\n JSON.stringify(collectionIdentity(fresh.allMatching))\n : snapshotContent(existing.snapshot) !==\n snapshotContent(fresh.snapshot));\n setWorkspaces((current) => {\n const retained = current[key];\n if (!retained) return current;\n return {\n ...current,\n [key]: {\n ...retained,\n error: fresh.collectionError,\n ...(allMatching && !scopeChanged\n ? { sourceStale: changed }\n : changed\n ? { pending: { ...fresh, scope: initialScope } }\n : { pending: undefined }),\n },\n };\n });\n setWorkspaceKey(key);\n setWorkspaceOpen(true);\n } catch (error) {\n if (fence.valid(id, controller) && workspaceCaptures.current.has(key)) {\n setWorkspaces((current) =>\n current[key]\n ? {\n ...current,\n [key]: {\n ...current[key]!,\n error: errorMessage(error, \"Could not refresh source\"),\n },\n }\n : current,\n );\n setWorkspaceKey(key);\n setWorkspaceOpen(true);\n }\n } finally {\n fence.finish(controller);\n }\n return;\n }\n try {\n const result = await captureWorkspace(initialScope, controller.signal);\n if (!fence.valid(id, controller)) return;\n const resolved = resolveTransferPreferences(\n providerPreferences,\n preferences,\n result.snapshot.limits,\n );\n const original = createDraft(result.snapshot);\n const base: WorkspaceState = {\n ...result,\n key,\n original,\n draft: original,\n scope: initialScope,\n preferences: resolved,\n ...(result.collectionError ? { error: result.collectionError } : {}),\n };\n setWorkspaces((current) => ({\n ...current,\n [key]: { ...base, draft: rebuild(base, initialControls(base)) },\n }));\n setWorkspaceKey(key);\n setWorkspaceOpen(true);\n } catch (error) {\n if (fence.valid(id, controller))\n setReceiptTarget(undefined); setNotice(errorMessage(error, \"Could not capture content\"));\n } finally {\n fence.finish(controller);\n }\n },\n [\n captureOne,\n capturePrimary,\n fence,\n initialScope,\n preferences,\n primaryWorkspaceKey,\n primary,\n providerPreferences,\n workspaces,\n ],\n );\n React.useImperativeHandle(controllerRef, () => ({\n focusTrigger: () => triggerRef.current?.focus(),\n prepare: async (requestedSource, options) => {\n const requestedLabel = options?.label ?? (\"label\" in requestedSource ? requestedSource.label : \"content\");\n const requestedKey = `controller:${options?.id ?? \"source\"}:${materialIdentity(requestedSource)}`;\n externalWorkspaceKeys.current.add(requestedKey);\n await openWorkspace(requestedKey, { source: requestedSource, label: requestedLabel });\n },\n }), [openWorkspace]);\n\n const runAction = React.useCallback(async (action: PageAction) => {\n const { controller, id } = fence.begin();\n try { const actionSource = (action as PageAction & { source?: Source }).source; const { snapshot } = actionSource ? await captureOne(actionSource, initialScope, controller.signal, true) : await capturePrimary(initialScope, controller.signal); const resolved = resolveTransferPreferences(providerPreferences, preferences, snapshot.limits); const draft = applyTransferLimits(createDraft(snapshot), resolved.limits); if (snapshot.coverage.status !== \"complete\" || draft.omissions.length) throw new Error(\"This content is partial or requires reductions. Open Prepare for AI to review it before sending it to a destination.\"); if (!action.supports(snapshot, draft)) throw new Error(`${action.label} is unavailable for this content.`); const result = await action.run({ snapshot, draft, signal: controller.signal }); if (fence.valid(id, controller) && draft.snapshotId === snapshot.id) report(result); }\n catch (error) { if (fence.valid(id, controller)) report({ status: \"error\", code: \"action-failed\", message: errorMessage(error, \"Action failed\"), retryable: true }); }\n finally { fence.finish(controller); }\n }, [captureOne, capturePrimary, fence, initialScope, preferences, providerPreferences, report]);\n\n const copyReference = async (reference: ContentTransferReference) => {\n const { controller, id } = fence.begin();\n closePalette();\n try {\n if (!referencePort?.supports(reference)) throw new Error(\"This reference is not registered or its identity is incomplete.\");\n const text = await referencePort.build(reference);\n if (!text.trim()) throw new Error(\"The reference serializer returned no content.\");\n const artifact = sealTransferArtifact({ snapshotId: `reference:${reference.id}`, draftRevision: 0, format: \"matrx-reference\", plainText: text, omissions: [] });\n if (!fence.valid(id, controller)) return;\n const outcome = await transport.copy(artifact, controller.signal);\n if (fence.valid(id, controller)) report(outcome);\n } catch (error) { if (fence.valid(id, controller)) report({status: \"error\", code: \"reference-failed\", message: errorMessage(error, \"Could not copy reference\"), retryable: true}); }\n finally { fence.finish(controller); }\n };\n const openReference = async (action: ContentTransferReferenceAction) => {\n closePalette();\n try { await action.run(); }\n catch (error) { report({status: \"error\", code: \"reference-failed\", message: errorMessage(error, \"Could not open reference picker\"), retryable: true}); }\n };\n if (!enabled) return null;\n const payload = menuCapture?.snapshot.payload ?? (source && \"kind\" in source ? source : undefined);\n const quickVariants = (section: \"copy\" | \"ai\") => variants.filter((v) => v.copyLabel && (v.section ?? \"ai\") === section);\n const visibleCopies = sourceFormats ? COPIES.filter((f) => Boolean(formatSources?.[f]) || ![\"csv\", \"tsv\"].includes(f) || payload?.kind === \"rows\") : [];\n const visibleDownloads = sourceFormats ? DOWNLOADS.filter((f) => (f !== \"xlsx\" && Boolean(formatSources?.[f])) || ![\"csv\", \"tsv\", \"xlsx\"].includes(f) || payload?.kind === \"rows\") : [];\n const visibleAdapters = sourceFormats && menuCapture ? adapters.filter((a) => a.supports(menuCapture.snapshot.payload)) : [];\n const visibleActions = menuCapture ? registeredActions.filter((a) => a.supports(menuCapture.snapshot, applyTransferLimits(createDraft(menuCapture.snapshot), resolveTransferPreferences(providerPreferences, preferences, menuCapture.snapshot.limits).limits))) : [];\n const downloadActions = visibleActions.filter((action) => (action as TransferMenuPresentation).placement === \"download\");\n const ordinaryActions = visibleActions.filter((action) => (action as TransferMenuPresentation).placement !== \"download\");\n const preparedActions = registeredActions.filter((action) => (action as TransferMenuPresentation).prepared && !action.source);\n const copyAvailable = !hide.includes(\"copy\") && (visibleCopies.length + visibleAdapters.length + quickVariants(\"copy\").length > 0);\n const downloadAvailable = !hide.includes(\"download\") && (visibleDownloads.length + visibleAdapters.length + downloadActions.length > 0);\n const prepareAvailable = !hide.includes(\"prepare\") && (quickVariants(\"ai\").length > 0 || Boolean(primary) || Boolean(nearestWorkspaceKey) || variants.length > 0);\n const resolvedMode = mode === \"copy\" && !copyAvailable ? \"download\" : mode === \"download\" && !downloadAvailable ? \"copy\" : mode;\n const nativeAiFormat: FormatAdapter = {\n id: \"ai-context\", label: \"AI context\", supports: () => true,\n build: async (draft) => {\n const json = serialize(draft, \"json\");\n return sealTransferArtifact({ snapshotId: draft.snapshotId, draftRevision: draft.revision, format: \"ai-context\", plainText: buildAgentPayload({ kind: \"matrx_content\", location: sourceLabel, description: \"Captured content for an assistant\", data: JSON.parse(json.plainText), attributes: { source: draft.sourceId } }), omissions: [...json.omissions] });\n },\n };\n const closePalette = () => setPaletteOpen(false);\n const tile = (id: string, label: string, onClick: () => void, options: { custom?: boolean; action?: PageAction; ai?: boolean; file?: boolean; ariaLabel?: string } = {}) => {\n const presentation = options.action as TransferMenuPresentation | undefined;\n const Icon = presentation?.icon;\n const fallbackLabel = options.file && !/^download\\b/i.test(label) ? `Download ${label}` : label;\n return <button key={id} type=\"button\" className=\"matrx-alchemy-palette-tile\" title={id === \"table-data\" ? \"JSON using column display names\" : id === \"table-schema\" ? \"Table schema and rows\" : label} aria-label={presentation?.ariaLabel ?? (presentation ? fallbackLabel : options.ariaLabel ?? `${resolvedMode === \"copy\" ? \"Copy\" : \"Download\"} ${label}`)} onClick={() => { closePalette(); onClick(); }}>{Icon ? <Icon className=\"matrx-alchemy-menu-icon\"/> : <PaletteGlyph format={id} ai={Boolean(options.ai)} file={options.file || Boolean(options.custom && id !== \"table-data\" && id !== \"table-schema\")}/>}<span>{label}{presentation?.hint ? <small className=\"matrx-alchemy-menu-hint\">{presentation.hint}</small> : null}</span></button>;\n };\n return <span className={cn(\"matrx-alchemy\", className)} onClick={stopPropagation ? (event) => event.stopPropagation() : undefined}>\n <Popover open={paletteOpen} onOpenChange={(open) => { setPaletteOpen(open); if (open) { setMode(\"copy\"); void preflight(); } }}><PopoverTrigger asChild>{triggerVariant === \"outline\" ? <Button ref={triggerRef} variant=\"outline\" size=\"icon-sm\" aria-label={`Copy, transform or export ${sourceLabel}`} data-alchemy-trigger=\"outline\" disabled={disabled}><AlchemyGlyph icon={icon}/></Button> : triggerVariant === \"glass\" ? <TapTargetButton ref={triggerRef} icon={<AlchemyGlyph icon={icon}/>} tooltip={false} ariaLabel={`Copy, transform or export ${sourceLabel}`} data-alchemy-trigger=\"glass\" data-alchemy-size={triggerSize} disabled={disabled} /> : <TapTargetButtonTransparent ref={triggerRef} icon={<AlchemyGlyph icon={icon}/>} tooltip={false} ariaLabel={`Copy, transform or export ${sourceLabel}`} data-alchemy-trigger=\"transparent\" data-alchemy-size={triggerSize} disabled={disabled} />}</PopoverTrigger><PopoverContent align=\"end\" className=\"matrx-alchemy-menu matrx-alchemy-palette\" aria-label=\"Alchemy output options\" onCloseAutoFocus={() => triggerRef.current?.focus()}>\n {menuStatus === \"loading\" ? <p className=\"matrx-alchemy-palette-status\">Inspecting content…</p> : menuStatus !== \"idle\" ? <p className=\"matrx-alchemy-error\">{menuStatus}</p> : null}\n {table && scopes.length > 1 ? <label className=\"matrx-alchemy-scope\">Content scope<select aria-label=\"Content scope\" value={initialScope} onChange={(event) => { const next = scopes.find((scope) => scope === event.target.value); if (next) { setRequestedScope(next); void preflight(next); } }}>{scopes.map((scope) => <option key={scope} value={scope}>{table.scopeLabels?.[scope] ?? SCOPE_LABEL[scope]}</option>)}</select></label> : null}\n {copyAvailable || downloadAvailable ? <section className=\"matrx-alchemy-output\"><h3>{resolvedMode === \"copy\" ? \"Copy as\" : \"Download as\"}</h3>{copyAvailable && downloadAvailable ? <div className=\"matrx-alchemy-mode\" aria-label=\"Output action\"><button type=\"button\" aria-label=\"Copy mode\" aria-pressed={resolvedMode === \"copy\"} onClick={() => setMode(\"copy\")}>Copy</button><button type=\"button\" aria-label=\"Download mode\" aria-pressed={resolvedMode === \"download\"} onClick={() => setMode(\"download\")}>Download</button></div> : null}\n {resolvedMode === \"copy\" && copyAvailable ? <><div className=\"matrx-alchemy-palette-grid\">{visibleCopies.map((format) => tile(format, ({ plain: \"Text\", markdown: \"Markdown\", html: \"Formatted\", json: \"JSON\", \"compact-json\": \"Compact\", csv: \"CSV\", tsv: \"Sheets\" } as Record<SerializableFormat, string>)[format]!, () => void transfer(format, false), { ariaLabel: `Copy ${LABEL[format]}` }))}{visibleAdapters.map((adapter) => tile(adapter.id, adapter.label, () => void transfer(adapter, false), { custom: true }))}</div>{quickVariants(\"copy\").length ? <PaletteRows title=\"Quick copy\" items={quickVariants(\"copy\")} onRun={(variant) => { closePalette(); void transfer(\"markdown\", false, variant); }}/>: null}</> : null}\n {resolvedMode === \"download\" && downloadAvailable ? <><div className=\"matrx-alchemy-palette-grid\">{visibleDownloads.map((format) => tile(format, ({ plain: \"Text\", markdown: \"Markdown\", html: \"Formatted\", json: \"JSON\", \"compact-json\": \"Compact\", csv: \"CSV\", tsv: \"Sheets\", xlsx: \"Excel\" } as Record<BuiltInFormat, string>)[format]!, () => void transfer(format, true), { ariaLabel: `Download ${LABEL[format]}` }))}{visibleAdapters.map((adapter) => tile(adapter.id, adapter.label, () => void transfer(adapter, true), { custom: true }))}{downloadActions.map((action) => tile(action.id, action.label, () => void runAction(action), { custom: true, action, file: true }))}</div></> : null}</section> : null}\n {prepareAvailable ? <><PaletteRows title=\"Copy for AI\" ai glyphKind=\"ai-copy\" fallbackHint=\"Copies immediately\" extra={sourceFormats ? <button type=\"button\" className=\"matrx-alchemy-palette-row\" onClick={() => { closePalette(); void transfer(nativeAiFormat, false); }}><PaletteGlyph kind=\"ai-copy\"/><span>Copy with AI context<small className=\"matrx-alchemy-menu-hint\">Include source context</small></span></button> : null} items={quickVariants(\"ai\")} onRun={(variant) => { closePalette(); void transfer(\"markdown\", false, variant); }}/><PaletteRows title=\"Edit and prepare\" items={[]} extra={<button type=\"button\" className=\"matrx-alchemy-palette-row\" aria-label=\"Prepare for AI\" onClick={() => { closePalette(); void openWorkspace(); }}><PaletteGlyph kind=\"sliders\"/><span>Prepare for AI<small className=\"matrx-alchemy-menu-hint\">Trim, edit or summarize</small></span></button>}/></>: null}\n {prepareAvailable && (nearestWorkspaceKey || variants.length) ? <PaletteRows title=\"Other sources\" items={[]} extra={<>{nearestWorkspaceKey && nearestSurface ? <button type=\"button\" className=\"matrx-alchemy-palette-row\" onClick={() => { closePalette(); void openWorkspace(nearestWorkspaceKey, { source: nearestSurface, label: nearestSurface.surfaceName }); }}><PaletteGlyph kind=\"surface\"/><span>Prepare this page</span></button> : null}{variants.map((variant) => <button key={variant.id} type=\"button\" className=\"matrx-alchemy-palette-row\" aria-label={variant.ariaLabel} onClick={() => { closePalette(); void openWorkspace(variantWorkspaceKeys.get(variant.id)!, variant); }}><MenuPresentation {...variant} label={`Prepare ${variant.label}`}/></button>)}</>}/>: null}\n {references.length || referenceActions.length ? <section className=\"matrx-alchemy-palette-section\"><h3>References</h3>{referenceActions.map((action) => <button key={action.id} type=\"button\" className=\"matrx-alchemy-palette-row\" onClick={() => void openReference(action)}><PaletteGlyph kind=\"link\"/><span>{action.label}</span><svg className=\"matrx-alchemy-disclosure\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" aria-hidden=\"true\"><path d=\"m6 4 4 4-4 4\"/></svg></button>)}{references.map((reference) => <button key={reference.id} type=\"button\" className=\"matrx-alchemy-palette-row\" title=\"Copies a reference to saved data\" onClick={() => void copyReference(reference)}><PaletteGlyph kind=\"link\"/><span>{reference.label}</span></button>)}</section> : null}\n {([\"save\", \"chat\", \"email\", \"other\"] as const).map((group) => { const entries = ordinaryActions.filter((action) => ((action as TransferMenuPresentation).group ?? \"other\") === group); return entries.length ? <details key={group} className=\"matrx-alchemy-palette-destinations\"><summary>{group === \"save\" ? \"Save to Matrx\" : group === \"chat\" ? \"Continue with AI\" : group === \"email\" ? \"Email to me\" : \"Actions\"}<span className=\"matrx-alchemy-disclosure-meta\"><span>{entries.length}</span><svg className=\"matrx-alchemy-disclosure\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" aria-hidden=\"true\"><path d=\"m6 4 4 4-4 4\"/></svg></span></summary><div>{entries.map((action) => <button key={action.id} type=\"button\" className=\"matrx-alchemy-palette-row\" aria-label={(action as TransferMenuPresentation).ariaLabel} onClick={() => { closePalette(); void runAction(action); }}><DestinationPresentation action={action}/></button>)}</div></details> : null; })}\n </PopoverContent></Popover>\n {notice && triggerRef.current ? createPortal(<div className=\"matrx-alchemy-feedback\"><span role=\"status\">{notice}</span><ReceiptLink target={receiptTarget}/><button type=\"button\" aria-label=\"Dismiss Alchemy feedback\" onClick={() => setNotice(null)}>×</button></div>, triggerRef.current.ownerDocument.body) : null}\n {Object.values(workspaces).map((saved) => <PreparationWorkspace restoreFocus={() => triggerRef.current?.focus()} key={saved.key} open={workspaceOpen && workspaceKey === saved.key} state={saved} scopes={scopes} scopeLabels={table?.scopeLabels} onClose={() => setWorkspaceOpen(false)} onChange={(next) => setWorkspaces((current) => ({ ...current, [saved.key]: next }))} transport={transport} adapters={adapters} actions={preparedActions} captureScope={workspaceCaptures.current.get(saved.key) ?? capturePrimary} {...(ai ? { ai } : {})} onOutcome={report}/>)}\n {emailReview}\n </span>;\n}\n\ntype Preset = \"full\" | \"compact\" | \"brief\" | \"custom\";\ntype Controls = {\n preset: Preset;\n sections: string[];\n search: string;\n filters: Record<string, string>;\n sort: string;\n direction: \"asc\" | \"desc\";\n top: number | null;\n visibleColumns: string[];\n selectedOnly: boolean;\n selectedIndices: number[];\n maxDepth: number | null;\n maxStringChars: number | null;\n maxArrayItems: number | null;\n};\n\nfunction initialControls(state: WorkspaceState): Controls {\n const rows = state.original.payload.kind === \"rows\" ? state.original.payload : null;\n return {\n preset: state.preferences.initialPreset,\n sections: state.snapshot.sections.filter((s) => s.includedByDefault).map((s) => s.id),\n search: \"\", filters: {}, sort: \"\", direction: \"asc\",\n top: state.preferences.limits.maxRows,\n visibleColumns: rows?.columns.filter((c) => c.visible).map((c) => c.id) ?? [],\n selectedOnly: false, selectedIndices: [],\n maxDepth: state.preferences.limits.maxDepth,\n maxStringChars: state.preferences.limits.maxStringChars,\n maxArrayItems: state.preferences.limits.maxArrayItems ?? null,\n };\n}\nfunction presetLimits(preset: Preset, controls: Controls, preferences: TransferPreferences) {\n const min = (choice: number | null, cap: number | null) => choice == null ? cap : cap == null ? choice : Math.min(choice, cap);\n if (preset === \"full\") return preferences.limits;\n const request = preset === \"brief\" ? { maxDepth: 4, maxStringChars: 800, maxArrayItems: 25 } : preset === \"compact\" ? { maxDepth: 8, maxStringChars: 4000, maxArrayItems: 100 } : { maxDepth: controls.maxDepth, maxStringChars: controls.maxStringChars, maxArrayItems: controls.maxArrayItems };\n return { ...preferences.limits, maxDepth: min(request.maxDepth, preferences.limits.maxDepth), maxStringChars: min(request.maxStringChars, preferences.limits.maxStringChars), maxArrayItems: min(request.maxArrayItems, preferences.limits.maxArrayItems ?? null) };\n}\nfunction rebuild(state: WorkspaceState, controls: Controls): Draft {\n let draft = resetDraft(state.snapshot);\n if (state.snapshot.sections.length) draft = applySectionSelection(draft, state.snapshot, controls.sections);\n if (draft.payload.kind === \"rows\") draft = transformRows(draft, {\n search: controls.search,\n filters: controls.filters,\n ...(controls.sort ? { sort: { column: controls.sort, direction: controls.direction } } : {}),\n ...(controls.selectedOnly ? { selectedIndices: controls.selectedIndices } : {}),\n visibleColumns: controls.visibleColumns,\n structuredProjection: \"visible\",\n top: controls.top,\n });\n const limits = presetLimits(controls.preset, controls, state.preferences);\n if (draft.payload.kind === \"json\" || draft.payload.kind === \"registered\") {\n draft = reduceJson(draft, { maxDepth: limits.maxDepth, maxStringChars: limits.maxStringChars, maxArrayItems: limits.maxArrayItems ?? null });\n }\n return applyTransferLimits(draft, limits);\n}\nfunction isBuiltInFormat(format: string): format is BuiltInFormat { return format in LABEL; }\nfunction preview(draft: Draft, format: string) {\n const resolved = isBuiltInFormat(format) ? format : \"plain\";\n return serialize(draft, resolved === \"xlsx\" ? \"tsv\" : resolved, { spreadsheetSafe: resolved === \"csv\" || resolved === \"tsv\" || resolved === \"xlsx\" }).plainText;\n}\n\nfunction PreparationWorkspace({ restoreFocus, open, state, scopes, scopeLabels, onClose, onChange, transport, ai, adapters, actions, onOutcome, captureScope }: {\n restoreFocus: () => void;\n open: boolean;\n state: WorkspaceState;\n scopes: TransferScope[];\n scopeLabels?: Partial<Record<TransferScope, string>> | undefined;\n onClose: () => void;\n onChange: (next: WorkspaceState) => void;\n transport: Transport;\n ai?: AiPreparation;\n adapters: FormatAdapter[];\n actions: PageAction[];\n onOutcome: (outcome: TransferOutcome) => void;\n captureScope: (scope: TransferScope, signal: AbortSignal) => Promise<CaptureResult>;\n}) {\n const fence = useFence();\n const latest = React.useRef(state); latest.current = state;\n const aiSession = React.useRef<AiPreparation | undefined>(undefined);\n if (!aiSession.current && ai) aiSession.current = ai.fork?.() ?? ai;\n const [controls, setControls] = React.useState(() => initialControls(state));\n const [controlsHistory, setControlsHistory] = React.useState<Controls[]>([]);\n const [pendingControls, setPendingControls] = React.useState<Controls | null>(null);\n const requestedFormat = state.preferences.initialFormat;\n const [format, setFormat] = React.useState<string>(() => isBuiltInFormat(requestedFormat) ? (supportsBuiltIn(requestedFormat, state.draft.payload) ? requestedFormat : \"plain\") : adapters.some((adapter) => adapter.id === requestedFormat && adapter.supports(state.draft.payload)) ? requestedFormat : \"plain\");\n const [buffer, setBuffer] = React.useState(() => isBuiltInFormat(format) ? preview(state.draft, format) : \"Preparing format preview…\");\n const [bufferError, setBufferError] = React.useState<string | null>(null);\n const [formatError, setFormatError] = React.useState<string | null>(null);\n const [preparedArtifact, setPreparedArtifact] = React.useState<Artifact | null>(null);\n const [instruction, setInstruction] = React.useState(\"\");\n const [busy, setBusy] = React.useState<\"ai\" | \"capture\" | \"copy\" | \"download\" | \"action\" | null>(null);\n const [aiFailed, setAiFailed] = React.useState(false);\n React.useEffect(() => { setAiFailed(false); }, [state.snapshot.id, state.draft.revision]);\n const handingOff = React.useRef(false);\n React.useEffect(() => { if (open) handingOff.current = false; }, [open]);\n const activeAi = React.useRef<AbortController | null>(null);\n const activeCapture = React.useRef<AbortController | null>(null);\n\n React.useEffect(() => {\n if (bufferError) return;\n const adapter = adapters.find((candidate) => candidate.id === format);\n const controller = new AbortController();\n const snapshotId = state.snapshot.id; const revision = state.draft.revision;\n setPreparedArtifact(null); setFormatError(null);\n if (adapter) setBuffer(\"Preparing format preview…\");\n const artifactPromise = adapter ? adapter.build(state.draft, controller.signal) : buildArtifact(state.draft, isBuiltInFormat(format) ? format : \"plain\", state.snapshot.label);\n void artifactPromise.then((artifact) => {\n if (!controller.signal.aborted && artifact.snapshotId === snapshotId && artifact.draftRevision === revision) { setPreparedArtifact(artifact); setBuffer(artifact.plainText); }\n }).catch((error) => { if (!controller.signal.aborted) setFormatError(errorMessage(error, \"Format preview failed\")); });\n return () => controller.abort();\n }, [adapters, bufferError, format, state.draft, state.snapshot.id]);\n const close = React.useCallback(() => { activeAi.current?.abort(); activeCapture.current?.abort(); activeAi.current = null; activeCapture.current = null; fence.abortAll(); setBusy(null); onClose(); }, [fence, onClose]);\n const changeControls = (next: Controls) => {\n if (state.draft.manuallyEdited) { setPendingControls(next); return; }\n setControlsHistory((history) => [...history, controls]); setControls(next); onChange({ ...state, draft: rebuild(state, next), error: undefined });\n };\n const applyPendingControls = () => {\n if (!pendingControls) return;\n setControlsHistory((history) => [...history, controls]); setControls(pendingControls); setBufferError(null);\n onChange({ ...state, draft: rebuild(state, pendingControls), error: undefined });\n setPendingControls(null);\n };\n const editBuffer = (text: string) => {\n setBuffer(text);\n setPreparedArtifact(null); setFormatError(null);\n const payload = state.draft.payload;\n if (payload.kind === \"json\" || payload.kind === \"registered\") {\n try {\n const value = JSON.parse(text) as Json;\n const next: Payload = payload.kind === \"json\" ? { kind: \"json\", value } : { kind: \"registered\", format: payload.format, value };\n setBufferError(null); onChange({ ...state, draft: editDraft(state.draft, next), error: undefined });\n } catch { setBufferError(\"JSON is incomplete or invalid. Fix it before copying or downloading.\"); }\n return;\n }\n setBufferError(null);\n const kind = payload.kind === \"markdown\" || format === \"markdown\" ? \"markdown\" : \"text\";\n if (payload.kind === \"rows\" || !isBuiltInFormat(format)) setFormat(\"plain\");\n onChange({ ...state, draft: editDraft(state.draft, { kind, text }), error: undefined });\n };\n\n const requestCapture = async (scope: TransferScope) => {\n activeCapture.current?.abort();\n const { controller, id } = fence.begin(); activeCapture.current = controller; const revision = state.draft.revision; setBusy(\"capture\");\n try {\n const result = await captureScope(scope, controller.signal);\n if (fence.valid(id, controller) && latest.current.draft.revision === revision) onChange({ ...latest.current, pending: { ...result, scope }, sourceStale: false, error: result.collectionError });\n } catch (error) { if (fence.valid(id, controller)) onChange({ ...latest.current, error: errorMessage(error, \"Refresh failed\") }); }\n finally { fence.finish(controller); if (activeCapture.current === controller) activeCapture.current = null; if (fence.valid(id, controller)) setBusy(null); }\n };\n const resolveCapture = (choice: \"keep\" | \"regenerate\") => {\n if (!state.pending) return;\n if (choice === \"keep\") { const { pending: _pending, ...kept } = state; onChange({ ...kept, error: undefined }); return; }\n const pending = state.pending;\n const preferences = resolveTransferPreferences({}, state.preferences, pending.snapshot.limits);\n const base: WorkspaceState = { ...pending, key: state.key, original: createDraft(pending.snapshot), draft: createDraft(pending.snapshot), scope: pending.scope, preferences, ...(pending.collectionError ? { error: pending.collectionError } : {}) };\n const nextControls = initialControls(base); setControls(nextControls); setControlsHistory([]); setPendingControls(null); setBufferError(null);\n onChange({ ...base, draft: rebuild(base, nextControls) });\n };\n\n const runAi = async (recover = false) => {\n const adapter = aiSession.current;\n if (!adapter || !adapter.supports(state.snapshot) || (!recover && !instruction.trim()) || (recover && !adapter.recover)) return;\n activeAi.current?.abort();\n const { controller, id } = fence.begin(); activeAi.current = controller;\n const snapshotId = state.snapshot.id; const revision = state.draft.revision; setBusy(\"ai\"); setAiFailed(false);\n try {\n const next = recover ? await adapter.recover!({ snapshot: state.snapshot, draft: state.draft, signal: controller.signal }) : await adapter.run({ snapshot: state.snapshot, draft: state.draft, instruction, signal: controller.signal });\n const current = latest.current;\n if (!fence.valid(id, controller) || current.snapshot.id !== snapshotId || current.draft.revision !== revision || next.snapshotId !== snapshotId || next.sourceId !== state.draft.sourceId || next.sourceRevision !== state.draft.sourceRevision || next.revision <= revision) return;\n try { serialize(next, \"plain\"); } catch { onChange({ ...current, error: \"AI returned an invalid transfer draft.\" }); setAiFailed(true); return; }\n onChange({ ...current, draft: next, error: undefined }); setBufferError(null);\n } catch (error) {\n if (!isAbort(error) && fence.valid(id, controller)) { setAiFailed(true); onChange({ ...latest.current, error: errorMessage(error, \"AI preparation failed\") }); }\n } finally { fence.finish(controller); if (activeAi.current === controller) activeAi.current = null; if (fence.valid(id, controller)) setBusy(null); }\n };\n const cancelAi = async () => {\n const aiController = activeAi.current;\n const { controller, id } = fence.begin();\n try { await aiSession.current?.cancel?.(); }\n catch (error) { if (fence.valid(id, controller)) onChange({ ...latest.current, error: errorMessage(error, \"AI cancellation failed\") }); }\n finally { aiController?.abort(); fence.finish(controller); if (activeAi.current === aiController) activeAi.current = null; if (fence.valid(id, controller)) setBusy(null); }\n };\n const [deliveryNotice, setDeliveryNotice] = React.useState<string | null>(null);\n React.useEffect(() => { setDeliveryNotice(null); }, [state.draft.revision]);\n const reportDelivery = (outcome: TransferOutcome) => { setDeliveryNotice(outcomeMessage(outcome)); onOutcome(outcome); };\n const deliver = async (download: boolean) => {\n if (bufferError) return;\n const { controller, id } = fence.begin(); const snapshotId = state.snapshot.id; const revision = state.draft.revision; setBusy(download ? \"download\" : \"copy\");\n try {\n if (!preparedArtifact) throw new Error(\"Wait for the selected format preview before delivery.\");\n const artifact = preparedArtifact;\n const current = latest.current;\n if (!fence.valid(id, controller) || current.snapshot.id !== snapshotId || current.draft.revision !== revision || artifact.snapshotId !== snapshotId || artifact.draftRevision !== revision) return;\n const result = await transport[download ? \"download\" : \"copy\"](artifact, controller.signal);\n if (fence.valid(id, controller)) reportDelivery(result);\n } catch (error) { if (fence.valid(id, controller)) reportDelivery({ status: \"error\", code: \"prepare-failed\", message: errorMessage(error, \"Preparation failed\"), retryable: true }); }\n finally { fence.finish(controller); if (fence.valid(id, controller)) setBusy(null); }\n };\n\n const deliverAction = async (action: PageAction) => {\n if (busy || bufferError || formatError || !preparedArtifact) return;\n const { controller, id } = fence.begin();\n const current = latest.current;\n setBusy(\"action\");\n try {\n if (!action.supports(current.snapshot, current.draft)) throw new Error(`${action.label} is unavailable for this prepared content.`);\n // Release the preparation focus trap before a host opens its destination.\n // This component remains mounted, retaining the exact edited revision.\n handingOff.current = true;\n flushSync(() => onClose());\n const result = await action.run({ snapshot: current.snapshot, draft: current.draft, signal: controller.signal });\n if (fence.valid(id, controller)) reportDelivery(result);\n } catch (error) {\n if (fence.valid(id, controller)) reportDelivery({ status: \"error\", code: \"destination-failed\", message: errorMessage(error, \"Could not deliver prepared content\"), retryable: false });\n } finally { fence.finish(controller); if (fence.valid(id, controller)) setBusy(null); }\n };\n const eligibleActions = actions.filter((action) => action.supports(state.snapshot, state.draft));\n\n const rows = state.original.payload.kind === \"rows\" ? state.original.payload : null;\n const formats = COPIES.filter((f) => supportsBuiltIn(f, state.draft.payload));\n const workspaceAdapters = adapters.filter((adapter) => adapter.supports(state.draft.payload));\n const displayedOmissions = preparedArtifact?.omissions ?? state.draft.omissions;\n const limitText = Object.entries(state.preferences.limits).filter(([, value]) => value != null).map(([key, value]) => `${key.replace(/^max/, \"max \")} ${formatCount(Number(value))}`).join(\" · \");\n return <Dialog open={open} onOpenChange={(next) => { if (!next) close(); }}><DialogContent onCloseAutoFocus={(event) => { event.preventDefault(); if (!handingOff.current) restoreFocus(); }} className=\"matrx-alchemy-workspace max-w-5xl\" aria-busy={busy !== null}>\n <DialogHeader><DialogTitle>Prepare {state.snapshot.label}</DialogTitle><DialogDescription>{state.snapshot.unsavedChanges ? \"Includes your unsaved changes. \" : \"\"}Review and edit this copy. Your original stays unchanged.</DialogDescription></DialogHeader>\n <div className=\"matrx-alchemy-workspace-body\"><div className=\"matrx-alchemy-workspace-grid\"><section className=\"matrx-alchemy-main\">\n <div className=\"matrx-alchemy-toolbar\">\n {scopes.length > 1 ? <label>Scope<select aria-label=\"Transfer scope\" value={state.scope} disabled={busy !== null} onChange={(e) => void requestCapture(e.target.value as TransferScope)}>{scopes.map((scope) => <option key={scope} value={scope}>{scopeLabels?.[scope] ?? SCOPE_LABEL[scope]}</option>)}</select></label> : null}\n <label>Detail<select aria-label=\"Detail preset\" value={controls.preset} onChange={(e) => changeControls({ ...controls, preset: e.target.value as Preset })}><option value=\"full\">Full</option><option value=\"compact\">Compact</option><option value=\"brief\">Brief</option><option value=\"custom\">Custom</option></select></label>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={(!state.draft.history?.length && !controlsHistory.length) || busy !== null} onClick={() => { setBufferError(null); if (controlsHistory.length) { const next = controlsHistory[controlsHistory.length - 1]!; setControls(next); setControlsHistory((history) => history.slice(0, -1)); onChange({ ...state, draft: rebuild(state, next), error: undefined }); } else onChange({ ...state, draft: undoDraft(state.draft), error: undefined }); }}>Undo</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={busy !== null} onClick={() => { const next = initialControls(state); setControls(next); setControlsHistory([]); setPendingControls(null); setBufferError(null); onChange({ ...state, draft: rebuild(state, next), error: undefined }); }}>Reset</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={busy !== null} onClick={() => void requestCapture(state.scope)}>Refresh source</Button>\n </div>\n {controls.preset === \"custom\" ? <fieldset className=\"matrx-alchemy-options\"><legend>{state.draft.payload.kind === \"json\" || state.draft.payload.kind === \"registered\" ? \"JSON limits\" : \"Content limits\"}</legend>{([ [\"maxDepth\", \"Maximum depth\"], [\"maxStringChars\", state.draft.payload.kind === \"rows\" ? \"Maximum characters per cell\" : \"Maximum string characters\"], [\"maxArrayItems\", \"Maximum array items\"] ] as const).filter(([key]) => key === \"maxStringChars\" || state.draft.payload.kind === \"json\" || state.draft.payload.kind === \"registered\").map(([key, text]) => <label key={key}>{text}<input type=\"number\" min=\"0\" value={controls[key] ?? \"\"} onChange={(e) => changeControls({ ...controls, [key]: Number.isNaN(e.target.valueAsNumber) ? null : e.target.valueAsNumber })}/></label>)}</fieldset> : null}\n {rows ? <details className=\"matrx-alchemy-options matrx-alchemy-data-controls\"><summary>Data selection · {controls.visibleColumns.length} columns{controls.search || controls.sort || controls.top != null || controls.selectedOnly || Object.values(controls.filters).some(Boolean) ? \" · customized\" : \" · all rows\"}</summary><div className=\"matrx-alchemy-data-controls-body\"><RowControls rows={rows} controls={controls} change={changeControls}/></div></details> : null}\n {state.snapshot.sections.length ? <details className=\"matrx-alchemy-options\"><summary>Sections · {controls.sections.length} included</summary><fieldset aria-label=\"Included sections\">{state.snapshot.sections.map((section) => <label key={section.id}><input type=\"checkbox\" checked={controls.sections.includes(section.id)} onChange={(e) => changeControls({ ...controls, sections: e.target.checked ? [...controls.sections, section.id] : controls.sections.filter((id) => id !== section.id) })}/> {section.label}</label>)}</fieldset></details> : null}\n <label className=\"matrx-alchemy-preview-label\">Output format<select aria-label=\"Output format\" value={format} onChange={(e) => setFormat(e.target.value)}>{formats.map((f) => <option key={f} value={f}>{LABEL[f]}</option>)}{state.draft.payload.kind === \"rows\" ? <option value=\"xlsx\">Excel workbook</option> : null}{workspaceAdapters.map((adapter) => <option key={adapter.id} value={adapter.id}>{adapter.label}</option>)}</select></label>\n <textarea className=\"matrx-alchemy-preview\" aria-label=\"Prepared output\" aria-invalid={bufferError ? true : undefined} aria-describedby={bufferError ? \"alchemy-buffer-error\" : undefined} value={buffer} onChange={(e) => editBuffer(e.target.value)}/>\n <div className=\"matrx-alchemy-coverage\"><span>{state.snapshot.coverage.included.toLocaleString()} included{state.snapshot.coverage.total == null ? \"\" : ` of ${state.snapshot.coverage.total.toLocaleString()}`} · {state.snapshot.coverage.status}</span>{state.snapshot.coverage.reason ? <span>{state.snapshot.coverage.reason}</span> : null}{limitText ? <span>Limits: {limitText}</span> : null}{displayedOmissions.length ? <details><summary>{displayedOmissions.length} omissions or adjustments</summary><ul>{displayedOmissions.map((o, i) => <li key={`${o.path}-${o.reason}-${i}`}>{o.path || \"/\"}: {o.reason}{o.count == null ? \"\" : ` (${o.count})`}</li>)}</ul></details> : null}</div>\n {bufferError ? <p id=\"alchemy-buffer-error\" role=\"alert\" className=\"matrx-alchemy-error\">{bufferError}</p> : null}\n {formatError ? <p role=\"alert\" className=\"matrx-alchemy-error\">{formatError}</p> : null}\n {bufferError ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" disabled={busy !== null} onClick={() => { const fallback = editDraft(state.draft, { kind: \"text\", text: buffer }); setBufferError(null); onChange({ ...state, draft: fallback, error: undefined }); setFormat(\"plain\"); }}>Use invalid JSON as plain text</Button> : null}\n </section>{ai || busy === \"capture\" || state.error ? <aside>\n {ai ? <>\n <label>Start with<select aria-label=\"AI preparation recipe\" defaultValue=\"\" onChange={(event) => { if (event.target.value) setInstruction(event.target.value); }}><option value=\"\">Choose an instruction</option><option value=\"Summarize this content concisely. Preserve important facts, names, decisions, and source references.\">Summarize</option><option value=\"Extract decisions, action items, owners, and due dates. Mark missing details as unspecified.\">Extract action items</option><option value=\"Prepare a complete handoff for another assistant. Include the objective, relevant facts, constraints, decisions, and unresolved questions.\">Assistant handoff</option><option value=\"Condense this content by removing repetition and formatting noise. Preserve every unique fact and all identifiers.\">Condense without losing facts</option><option value=\"Turn this content into a clear structured outline. Keep the original meaning and explicitly flag uncertainty.\">Create an outline</option><option value=\"Analyze this data. Identify patterns, anomalies, and useful comparisons. Distinguish observations from inferences.\">Analyze the data</option></select></label>\n <label>AI instruction<textarea value={instruction} onChange={(e) => setInstruction(e.target.value)} placeholder=\"Tell AI how to prepare this content\"/></label>\n <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" disabled={!aiSession.current || !instruction.trim() || busy !== null || !aiSession.current.supports(state.snapshot)} onClick={() => void runAi(false)}>Generate preview</Button>\n {busy === \"ai\" ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => void cancelAi()}>{aiSession.current?.cancel ? \"Cancel AI\" : \"Stop waiting\"}</Button> : null}\n </> : null}\n {busy === \"capture\" ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => { activeCapture.current?.abort(); activeCapture.current = null; setBusy(null); }}>Stop loading rows</Button> : null}\n {ai && aiFailed && aiSession.current?.recover && busy !== \"ai\" ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => void runAi(true)}>{aiFailed ? \"Retry or rejoin AI run\" : \"Rejoin AI run\"}</Button> : null}\n {ai ? <p className=\"matrx-alchemy-meta\">AI updates the preview; copy it when you are ready. Closing this window lets the AI run continue.</p> : null}{state.error ? <p role=\"alert\" className=\"matrx-alchemy-error\">{state.error}</p> : null}\n </aside> : null}</div>\n {pendingControls ? <div className=\"matrx-alchemy-decision\" role=\"alert\"><p>This control would replace your manual edit.</p><Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => setPendingControls(null)}>Keep edited draft</Button><Button className=\"matrx-alchemy-workspace-primary\" type=\"button\" onClick={applyPendingControls}>Rebuild from source</Button></div> : null}\n {state.sourceStale ? <p role=\"alert\" className=\"matrx-alchemy-decision\">The source changed since this draft. Use Refresh source to review the latest data.</p> : null}\n {state.pending ? <div className=\"matrx-alchemy-decision\" role=\"alert\"><p>A fresh source snapshot is ready.</p>{state.pending.scope !== state.scope ? <p>Switch from {scopeLabels?.[state.scope] ?? SCOPE_LABEL[state.scope]} to {scopeLabels?.[state.pending.scope] ?? SCOPE_LABEL[state.pending.scope]} by regenerating. Your current draft is retained until you choose.</p> : null}<Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => resolveCapture(\"keep\")}>Keep current snapshot and draft</Button><Button className=\"matrx-alchemy-workspace-primary\" type=\"button\" onClick={() => resolveCapture(\"regenerate\")}>Regenerate from fresh source</Button></div> : null}\n {eligibleActions.length ? <details className=\"matrx-alchemy-options matrx-alchemy-destinations\"><summary>Use prepared content · {eligibleActions.length} destinations</summary><div className=\"matrx-alchemy-destination-grid\">{eligibleActions.map((action) => <button key={action.id} type=\"button\" className=\"matrx-alchemy-palette-row\" disabled={busy !== null || Boolean(bufferError || formatError) || !preparedArtifact} onClick={() => void deliverAction(action)}><DestinationPresentation action={action}/></button>)}</div></details> : null}\n {deliveryNotice ? <p role=\"status\" className=\"matrx-alchemy-meta\">{deliveryNotice}</p> : null}</div>\n <DialogFooter><span className=\"matrx-alchemy-meta\">{buffer.length.toLocaleString()} characters · ~{estimateTokens(buffer).toLocaleString()} tokens</span><Button type=\"button\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" onClick={close}>Close</Button><Button type=\"button\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" aria-label=\"Download prepared output\" disabled={busy !== null || Boolean(bufferError || formatError) || !preparedArtifact} onClick={() => void deliver(true)}>Download</Button><Button type=\"button\" className=\"matrx-alchemy-workspace-primary\" aria-label=\"Copy prepared output\" disabled={busy !== null || Boolean(bufferError || formatError) || !preparedArtifact} onClick={() => void deliver(false)}>Copy</Button></DialogFooter>\n </DialogContent></Dialog>;\n}\n\nfunction RowControls({ rows, controls, change }: {\n rows: Extract<Payload, { kind: \"rows\" }>;\n controls: Controls;\n change: (next: Controls) => void;\n}) {\n const filterCount = Object.values(controls.filters).filter(Boolean).length;\n const selectionSummary = controls.selectedOnly ? `${controls.selectedIndices.length} selected row${controls.selectedIndices.length === 1 ? \"\" : \"s\"}` : \"All rows\";\n const dataSummary = [controls.search ? \"search active\" : \"\", controls.sort ? `sorted by ${rows.columns.find((column) => column.id === controls.sort)?.label ?? controls.sort}` : \"\", filterCount ? `${filterCount} filter${filterCount === 1 ? \"\" : \"s\"}` : \"\"].filter(Boolean).join(\" · \");\n return <>\n <div className=\"matrx-alchemy-toolbar\">\n <label>Search<input value={controls.search} onChange={(e) => change({ ...controls, search: e.target.value })}/></label>\n <label>Sort<select value={controls.sort} onChange={(e) => change({ ...controls, sort: e.target.value })}><option value=\"\">None</option>{rows.columns.map((column) => <option key={column.id} value={column.id}>{column.label}</option>)}</select></label>\n <label>Direction<select value={controls.direction} disabled={!controls.sort} onChange={(e) => change({ ...controls, direction: e.target.value as \"asc\" | \"desc\" })}><option value=\"asc\">Ascending</option><option value=\"desc\">Descending</option></select></label>\n <label>Top rows<input type=\"number\" min=\"0\" value={controls.top ?? \"\"} onChange={(e) => change({ ...controls, top: Number.isNaN(e.target.valueAsNumber) ? null : e.target.valueAsNumber })}/></label>\n </div>\n <details className=\"matrx-alchemy-options\"><summary>Columns and filters{dataSummary ? ` — ${dataSummary}` : \"\"}</summary><fieldset aria-label=\"Columns and filters\">{rows.columns.map((column) => <div className=\"matrx-alchemy-column\" key={column.id}><label><input type=\"checkbox\" checked={controls.visibleColumns.includes(column.id)} onChange={(e) => change({ ...controls, visibleColumns: e.target.checked ? [...controls.visibleColumns, column.id] : controls.visibleColumns.filter((id) => id !== column.id) })}/> {column.label}</label><input aria-label={`Filter ${column.label}`} placeholder=\"Filter\" value={controls.filters[column.id] ?? \"\"} onChange={(e) => change({ ...controls, filters: { ...controls.filters, [column.id]: e.target.value } })}/></div>)}</fieldset></details>\n <details className=\"matrx-alchemy-options\"><summary>Rows — {selectionSummary}</summary><fieldset aria-label=\"Row selection\"><label><input type=\"checkbox\" checked={controls.selectedOnly} onChange={(e) => change({ ...controls, selectedOnly: e.target.checked })}/> Only selected rows</label><div className=\"matrx-alchemy-row-list\">{rows.rows.map((row, index) => {\n const summary = rows.columns.filter((column) => column.visible).slice(0, 2).map((column) => String(readTransferCell(row, column) ?? \"\")).filter(Boolean).join(\" · \");\n return <label key={index}><input type=\"checkbox\" checked={controls.selectedIndices.includes(index)} onChange={(e) => change({ ...controls, selectedIndices: e.target.checked ? [...controls.selectedIndices, index] : controls.selectedIndices.filter((value) => value !== index) })}/> Row {index + 1}{summary ? ` — ${summary}` : \"\"}</label>;\n })}</div></fieldset></details>\n </>;\n}\n\nexport * from \"./matrx-copy\";\n","\"use client\";\n\n/**\n * Popover — ported verbatim from matrx-frontend `components/ui/popover.tsx`.\n *\n * Seam inversion: the host's `useNestedPortalContainer` (dialog/popout aware)\n * becomes the injected `PortalContainerProvider` seam (`portal-container.tsx`);\n * the explicit `container` prop keeps top priority, exactly as before.\n *\n * THE ROOT RENDERS UNCONDITIONALLY — no mount gate. This wrapper used to defer\n * rendering until after hydration (\"Radix generates dynamic aria-controls ids\n * that differ between SSR and client\"), and that justification was false:\n * Radix ids come from React's SSR-stable `useId` (verified against\n * @radix-ui/react-popover 1.1.17 / react-id 1.1.2). The gate was actively\n * harmful — the Trigger wraps ALWAYS-VISIBLE content, so `return null`\n * deleted it from SSR and the first client paint.\n */\n\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\n\nexport const Popover = PopoverPrimitive.Root;\n\nexport const PopoverTrigger = PopoverPrimitive.Trigger;\n\nexport const PopoverAnchor = PopoverPrimitive.Anchor;\n\nexport interface PopoverContentProps\n extends React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> {\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly — a picker re-anchoring while the user\n * types, a measurement pass. It is NOT the reduced-motion switch;\n * `styles.css` already honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nexport const PopoverContent = React.forwardRef<\n React.ComponentRef<typeof PopoverPrimitive.Content>,\n PopoverContentProps\n>(\n (\n {\n className,\n align = \"center\",\n sideOffset = 4,\n container,\n animated = true,\n ...props\n },\n ref,\n ) => {\n const portalContainer = usePortalContainer(container);\n return (\n <PopoverPrimitive.Portal container={portalContainer}>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n // Cap to the viewport space Radix measured and scroll — a popover taller\n // than the screen must never trap the user with unreachable content.\n // z must EQUAL the dialog layer (z-[10000]), never exceed it: with equal\n // z, DOM portal order decides, so a dialog opened FROM a popover stacks\n // above it, and a popover opened from a dialog still stacks above the\n // dialog. z-[10001] buried dialogs behind fullscreen popovers.\n \"z-[10000] w-72 max-h-[var(--radix-popover-content-available-height)] overflow-y-auto overscroll-contain rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none\",\n animated && MOTION_POPPER,\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n },\n);\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n","\"use client\";\n\nimport {\n cloneElement,\n forwardRef,\n isValidElement,\n type ButtonHTMLAttributes,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from \"react\";\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport { cn } from \"./cn\";\nimport {\n getTapTargetLinkComponent,\n type TapTargetLinkComponent,\n} from \"./link\";\n\nexport interface TapTargetButtonProps {\n icon?: React.ReactNode;\n children?: React.ReactNode;\n strokeWidth?: number | undefined;\n onClick?: (() => void) | undefined;\n className?: string | undefined;\n as?: \"button\" | \"label\" | undefined;\n htmlFor?: string | undefined;\n ariaLabel?: string | undefined;\n disabled?: boolean | undefined;\n /**\n * When set, the tap button renders as a link instead of a button.\n * - Internal hrefs (e.g. \"/tasks\") render via the injected link component\n * (`setTapTargetLinkComponent` / the `linkComponent` prop), falling back\n * to a plain `<a>` when none is registered.\n * - External hrefs (http://, https://, mailto:, tel:) render as `<a>`\n * with `target=\"_blank\"` and `rel=\"noopener noreferrer\"` by default.\n * - When combined with `disabled`, the trigger renders as a non-navigable\n * `<span aria-disabled=\"true\">` with the same visual styling.\n */\n href?: string | undefined;\n /** Override target. Works on both internal links and external anchors. */\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\" | undefined;\n /** Override rel. Works on both internal links and external anchors. */\n rel?: string | undefined;\n /** Forwarded to the injected link component. Pass `false` to disable prefetching. */\n prefetch?: boolean | null | undefined;\n /**\n * Per-instance link component for internal hrefs — overrides the\n * module-level `setTapTargetLinkComponent` registration.\n */\n linkComponent?: TapTargetLinkComponent | undefined;\n /**\n * Tooltip text. Defaults to `ariaLabel` when omitted.\n * Pass `false` to explicitly disable the tooltip.\n */\n tooltip?: string | false | undefined;\n /** Tooltip placement. Defaults to \"top\". */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\" | undefined;\n /** Tooltip alignment along its side. Defaults to \"center\". */\n tooltipAlign?: \"start\" | \"center\" | \"end\" | undefined;\n /**\n * Visible caption rendered inline after the icon (`[icon Label]`).\n * Widens the pill automatically. Tooltip defaults to off when set — the\n * label is self-describing. Visible text becomes the accessible name.\n */\n label?: string | undefined;\n /**\n * Collapse an icon + caption pill to its icon-only 44px tap target below\n * the `sm` breakpoint. The caption and inline geometry return at `sm+`;\n * `ariaLabel` (falling back to `label`) remains the accessible name.\n */\n mobileIconOnly?: boolean | undefined;\n}\n\nexport interface TapTargetButtonSolidProps extends TapTargetButtonProps {\n bgColor?: string | undefined;\n iconColor?: string | undefined;\n hoverBgColor?: string | undefined;\n /**\n * Press-state background. Defaults to `active:brightness-90` which works on\n * any color. Override when using a custom `bgColor` that should darken to a\n * specific shade on press (e.g. `active:bg-primary/60`).\n */\n activeBgColor?: string | undefined;\n}\n\nconst EXTERNAL_RE = /^(https?:|mailto:|tel:)/i;\n\n// Geometry + press feedback + tap hygiene are the SINGLE SOURCE OF TRUTH in\n// the shipped stylesheet (the `.matrx-tap-*` family in styles.css — import\n// \"@ai-matrx/tap-target/styles.css\" once at app root). This component only\n// picks the right class and layers each variant's decoration on top.\nconst TAP_OUTER_CLASS = \"matrx-tap-target group\";\nconst TAP_GROUP_OUTER_CLASS = \"matrx-tap-target matrx-tap-target-sm group\";\n\nfunction IconContent({\n icon,\n children,\n strokeWidth = 2,\n className,\n}: Pick<\n TapTargetButtonProps,\n \"icon\" | \"children\" | \"strokeWidth\" | \"className\"\n>) {\n if (icon) {\n if (isValidElement<{ className?: string }>(icon)) {\n return cloneElement(icon, {\n className: cn(className, icon.props.className),\n });\n }\n return <span className={className}>{icon}</span>;\n }\n return (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {children}\n </svg>\n );\n}\n\ntype TapTargetSize = \"default\" | \"sm\";\n\nfunction resolveTapGeometry(\n label: string | undefined,\n size: TapTargetSize,\n mobileIconOnly: boolean,\n) {\n const inline = Boolean(label);\n if (size === \"sm\") {\n return {\n outerClassName:\n inline && mobileIconOnly\n ? \"matrx-tap-target matrx-tap-target-sm matrx-tap-target-mobile-icon-only-sm group\"\n : inline\n ? \"matrx-tap-target matrx-tap-target-sm matrx-tap-target-inline-sm group\"\n : TAP_GROUP_OUTER_CLASS,\n inlineModifier: mobileIconOnly\n ? \"matrx-tap-pill-mobile-icon-only-sm\"\n : \"matrx-tap-pill-inline-sm\",\n };\n }\n return {\n outerClassName:\n inline && mobileIconOnly\n ? `${TAP_OUTER_CLASS} matrx-tap-target-mobile-icon-only`\n : inline\n ? `${TAP_OUTER_CLASS} matrx-tap-target-inline`\n : TAP_OUTER_CLASS,\n inlineModifier: mobileIconOnly\n ? \"matrx-tap-pill-mobile-icon-only\"\n : \"matrx-tap-pill-inline\",\n };\n}\n\nfunction buildTapInner({\n label,\n pillClassName,\n iconClassName,\n labelClassName,\n inlineModifier,\n icon,\n children,\n strokeWidth = 2,\n}: {\n label?: string | undefined;\n pillClassName: string;\n iconClassName: string;\n labelClassName?: string | undefined;\n inlineModifier: string;\n icon?: React.ReactNode;\n children?: React.ReactNode;\n strokeWidth?: number | undefined;\n}) {\n const iconEl = (\n <IconContent\n icon={icon}\n strokeWidth={strokeWidth}\n className={iconClassName}\n >\n {children}\n </IconContent>\n );\n const pillClasses = label\n ? `${pillClassName} ${inlineModifier}`.trim()\n : pillClassName;\n\n if (!label) {\n return <div className={pillClasses}>{iconEl}</div>;\n }\n\n return (\n <div className={pillClasses}>\n {iconEl}\n <span className={labelClassName ?? \"matrx-tap-label\"}>{label}</span>\n </div>\n );\n}\n\ninterface RenderTapTargetArgs extends Pick<\n TapTargetButtonProps,\n | \"icon\"\n | \"children\"\n | \"strokeWidth\"\n | \"label\"\n | \"mobileIconOnly\"\n | \"onClick\"\n | \"as\"\n | \"htmlFor\"\n | \"ariaLabel\"\n | \"disabled\"\n | \"href\"\n | \"target\"\n | \"rel\"\n | \"prefetch\"\n | \"linkComponent\"\n | \"tooltip\"\n | \"tooltipSide\"\n | \"tooltipAlign\"\n> {\n size?: TapTargetSize;\n pillClassName: string;\n iconClassName: string;\n labelClassName?: string | undefined;\n rest?: ButtonHTMLAttributes<HTMLButtonElement> | undefined;\n buttonRef?: Ref<HTMLButtonElement> | undefined;\n}\n\nfunction renderTapTarget({\n size = \"default\",\n pillClassName,\n iconClassName,\n labelClassName,\n icon,\n children,\n strokeWidth,\n label,\n mobileIconOnly = false,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n rest,\n buttonRef,\n}: RenderTapTargetArgs): ReactElement {\n const { outerClassName, inlineModifier } = resolveTapGeometry(\n label,\n size,\n mobileIconOnly,\n );\n const responsiveLabelClassName = mobileIconOnly\n ? `${labelClassName ?? \"matrx-tap-label\"} matrx-tap-label-mobile-icon-only`\n : labelClassName;\n const inner = buildTapInner({\n label,\n pillClassName,\n iconClassName,\n labelClassName: responsiveLabelClassName,\n inlineModifier: label ? inlineModifier : \"\",\n icon,\n children,\n strokeWidth,\n });\n const resolvedTooltip =\n tooltip !== undefined ? tooltip : label ? false : undefined;\n const triggerAriaLabel =\n label && !mobileIconOnly ? undefined : (ariaLabel ?? label);\n const trigger = renderTrigger({\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n as,\n htmlFor,\n onClick,\n ariaLabel: triggerAriaLabel,\n disabled,\n outerClassName,\n children: inner,\n rest,\n buttonRef,\n });\n return withTooltip(trigger, {\n tooltip: resolvedTooltip,\n ariaLabel: triggerAriaLabel,\n disabled,\n tooltipSide,\n tooltipAlign,\n });\n}\n\ninterface RenderTriggerArgs {\n href?: string | undefined;\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\" | undefined;\n rel?: string | undefined;\n prefetch?: boolean | null | undefined;\n linkComponent?: TapTargetLinkComponent | undefined;\n as?: \"button\" | \"label\" | undefined;\n htmlFor?: string | undefined;\n onClick?: (() => void) | undefined;\n ariaLabel?: string | undefined;\n disabled?: boolean | undefined;\n outerClassName: string;\n children: ReactNode;\n rest?: ButtonHTMLAttributes<HTMLButtonElement> | undefined;\n buttonRef?: Ref<HTMLButtonElement> | undefined;\n}\n\n/**\n * Resolves the correct trigger element based on the props passed.\n *\n * - `href` + `disabled` → unclickable `<span aria-disabled>`\n * - `href` matching `http(s):|mailto:|tel:` → `<a target=\"_blank\" rel=\"noopener noreferrer\">`\n * - `href` (internal) → the injected link component (per-instance\n * `linkComponent` prop, else `setTapTargetLinkComponent` registration),\n * falling back to a plain `<a>` when none is registered\n * - `as=\"label\"` → `<label htmlFor=...>`\n * - default → `<button>`\n */\nfunction renderTrigger({\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n as,\n htmlFor,\n onClick,\n ariaLabel,\n disabled,\n outerClassName,\n children,\n rest,\n buttonRef,\n}: RenderTriggerArgs): ReactElement {\n if (disabled && href) {\n return (\n <span\n aria-disabled=\"true\"\n aria-label={ariaLabel}\n className={`${outerClassName} opacity-40 pointer-events-none`}\n >\n {children}\n </span>\n );\n }\n if (href) {\n const isExternal = EXTERNAL_RE.test(href);\n if (isExternal) {\n return (\n <a\n href={href}\n target={target ?? \"_blank\"}\n rel={rel ?? \"noopener noreferrer\"}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </a>\n );\n }\n const Link = linkComponent ?? getTapTargetLinkComponent();\n if (Link) {\n return (\n <Link\n href={href}\n target={target}\n rel={rel}\n prefetch={prefetch}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </Link>\n );\n }\n // No link component registered — plain <a>. `prefetch` is a router hint,\n // not a DOM attribute, so it is deliberately dropped here.\n return (\n <a\n href={href}\n target={target}\n rel={rel}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </a>\n );\n }\n if (as === \"label\") {\n return (\n <label\n htmlFor={htmlFor}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </label>\n );\n }\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n disabled={disabled}\n {...rest}\n className={outerClassName}\n >\n {children}\n </button>\n );\n}\n\n/**\n * Wraps a trigger element in a Tooltip when a tooltip label is available.\n * Falls back to `ariaLabel` when `tooltip` is not explicitly set. If both\n * are absent (or `tooltip === false`), the trigger is returned unwrapped.\n */\nfunction withTooltip(\n trigger: ReactElement,\n {\n tooltip,\n ariaLabel,\n disabled,\n tooltipSide = \"top\",\n tooltipAlign = \"center\",\n }: {\n tooltip?: string | false | undefined;\n ariaLabel?: string | undefined;\n disabled?: boolean | undefined;\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\" | undefined;\n tooltipAlign?: \"start\" | \"center\" | \"end\" | undefined;\n },\n): ReactElement {\n if (tooltip === false) return trigger;\n const label =\n typeof tooltip === \"string\" && tooltip.length > 0 ? tooltip : ariaLabel;\n if (!label) return trigger;\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n {disabled ? (\n // Radix Tooltip triggers need a hoverable element; a disabled button\n // does not dispatch pointer events, so we wrap in a span for the\n // trigger target while keeping the disabled visual state.\n <span className=\"inline-flex\">{trigger}</span>\n ) : (\n trigger\n )}\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} align={tooltipAlign}>\n {label}\n </TooltipContent>\n </Tooltip>\n );\n}\n\n// To resize/retune every tap button, edit styles.css — not here.\n\nexport const TapTargetButton = forwardRef<\n HTMLButtonElement,\n TapTargetButtonProps & ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButton(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n className,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n const color = className ?? \"text-foreground\";\n return renderTapTarget({\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName: \"matrx-tap-pill matrx-glass-thin-border\",\n iconClassName: `matrx-tap-icon ${color}`,\n rest,\n buttonRef: ref,\n });\n});\n\nexport const TapTargetButtonTransparent = forwardRef<\n HTMLButtonElement,\n TapTargetButtonProps & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonTransparent(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n className,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n const color = className ?? \"text-foreground\";\n return renderTapTarget({\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName:\n \"matrx-tap-pill hover:bg-muted active:bg-muted-foreground/15\",\n iconClassName: `matrx-tap-icon ${color}`,\n rest,\n buttonRef: ref,\n });\n});\n\nexport const TapTargetButtonSolid = forwardRef<\n HTMLButtonElement,\n TapTargetButtonSolidProps & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonSolid(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n bgColor = \"bg-primary\",\n iconColor = \"text-primary-foreground\",\n hoverBgColor = \"hover:bg-primary/80\",\n activeBgColor = \"active:brightness-90\",\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n return renderTapTarget({\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName: `matrx-tap-pill ${bgColor} ${iconColor} ${hoverBgColor} ${activeBgColor}`,\n iconClassName: `matrx-tap-icon ${iconColor}`,\n labelClassName: `matrx-tap-label ${iconColor}`,\n rest,\n buttonRef: ref,\n });\n});\n\n/** Solid destructive pill — delete/remove actions. White-on-red like the\n * primary solid is white-on-blue. Use THIS, never hand-pass bg-destructive\n * with the default (dark) icon color. */\nexport const TapTargetButtonDestructive = forwardRef<\n HTMLButtonElement,\n TapTargetButtonSolidProps & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonDestructive(\n {\n bgColor = \"bg-destructive\",\n iconColor = \"text-destructive-foreground\",\n hoverBgColor = \"hover:bg-destructive/90\",\n ...rest\n },\n ref,\n) {\n return (\n <TapTargetButtonSolid\n ref={ref}\n bgColor={bgColor}\n iconColor={iconColor}\n hoverBgColor={hoverBgColor}\n {...rest}\n />\n );\n});\n\nexport const TapTargetButtonForGroup = forwardRef<\n HTMLButtonElement,\n TapTargetButtonProps & ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonForGroup(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n className,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n const color = className ?? \"text-foreground\";\n return renderTapTarget({\n size: \"sm\",\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName: \"matrx-tap-pill matrx-tap-pill-sm matrx-glass-interactive\",\n iconClassName: `matrx-tap-icon ${color}`,\n labelClassName: `matrx-tap-label ${color}`,\n rest,\n buttonRef: ref,\n });\n});\n\nexport function TapTargetButtonGroup({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string | undefined;\n}) {\n return (\n <div\n className={\n className\n ? `relative inline-flex h-9 items-center ${className}`\n : \"relative inline-flex h-9 items-center\"\n }\n >\n <div className=\"pointer-events-none absolute inset-x-0 top-1/2 -translate-y-1/2 h-7 rounded-full matrx-glass-thin-border\" />\n {/* min-w-0 lets flexible children (e.g. a truncating filename) shrink\n under container pressure; fixed-size tap buttons are unaffected. */}\n <div className=\"relative flex min-w-0 items-center\">{children}</div>\n </div>\n );\n}\n","/**\n * Minimal className join — the only piece of `cn` this package needs.\n * No tailwind-merge / clsx dependency by design: callers pass literal strings.\n */\nexport function cn(\n ...values: Array<string | null | undefined | false>\n): string {\n return values.filter(Boolean).join(\" \").trim();\n}\n","import type { ComponentType, ReactNode } from \"react\";\n\n/**\n * The injectable link seam — the package's replacement for the original\n * hard `next/link` import.\n *\n * Internal hrefs (anything NOT matching `http(s):`, `mailto:`, `tel:`) render\n * through the link component resolved here; external hrefs always render a\n * plain `<a target=\"_blank\" rel=\"noopener noreferrer\">`, exactly like the\n * original. When nothing is registered and no per-instance `linkComponent`\n * prop is given, internal hrefs fall back to a plain `<a>` (no prefetch, no\n * client-side routing — still a working link).\n */\nexport interface TapTargetLinkProps {\n href: string;\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\" | undefined;\n rel?: string | undefined;\n /** Router prefetch hint (next/link semantics). Plain `<a>` fallback ignores it. */\n prefetch?: boolean | null | undefined;\n \"aria-label\"?: string | undefined;\n className?: string | undefined;\n children?: ReactNode;\n}\n\nexport type TapTargetLinkComponent = ComponentType<TapTargetLinkProps>;\n\n/**\n * The registered component lives in a `Symbol.for` slot on `globalThis` — NOT\n * in module state — so it survives the module graph being instantiated more\n * than once: the `.` and `./buttons` dist bundles each inline the primitives\n * (tsup `splitting: false`), and a consumer may even mix `import` and\n * `require`. One registration must reach every copy.\n */\nconst LINK_SLOT = Symbol.for(\"@ai-matrx/tap-target:link-component\");\n\ntype GlobalWithLinkSlot = typeof globalThis & {\n [LINK_SLOT]?: TapTargetLinkComponent | null;\n};\n\n/**\n * Register the app's link component once at startup (e.g. `next/link`):\n *\n * ```tsx\n * import Link from \"next/link\";\n * import { setTapTargetLinkComponent } from \"@ai-matrx/tap-target\";\n * setTapTargetLinkComponent(Link);\n * ```\n *\n * Pass `null` to unregister (plain `<a>` fallback resumes).\n */\nexport function setTapTargetLinkComponent(\n component: TapTargetLinkComponent | null,\n): void {\n (globalThis as GlobalWithLinkSlot)[LINK_SLOT] = component;\n}\n\n/** The currently registered link component, or `null` when none is set. */\nexport function getTapTargetLinkComponent(): TapTargetLinkComponent | null {\n return (globalThis as GlobalWithLinkSlot)[LINK_SLOT] ?? null;\n}\n","/** Pure Alchemy icon assets. Safe to import without React or browser APIs. */\nexport type AlchemyIcon = \"portal\" | \"copy-transform\";\nexport const ALCHEMY_GLYPH_PATHS: Record<AlchemyIcon, readonly string[]> = {\n portal: [\"M10 4H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h4M14 4h4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-4M12 8v8m-3-3 3 3 3-3\"],\n \"copy-transform\": [\"M8 7V5a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v8M13 21H5a2 2 0 0 1-2-2V10a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v3m-5 4h11m-3-3 3 3-3 3\"],\n};\nexport const ALCHEMY_GLYPH_VIEWBOX: Record<AlchemyIcon, string> = { portal: \"0 0 24 24\", \"copy-transform\": \"0 0 24 24\" };\nconst svg = (paths: readonly string[], viewBox: string) => `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"${viewBox}\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${paths.map((d) => `<path d=\"${d}\"/>`).join(\"\")}</svg>`;\nexport const ALCHEMY_GLYPH_SVG = svg(ALCHEMY_GLYPH_PATHS.portal, ALCHEMY_GLYPH_VIEWBOX.portal);\nexport const ALCHEMY_COPY_TRANSFORM_SVG = svg(ALCHEMY_GLYPH_PATHS[\"copy-transform\"], ALCHEMY_GLYPH_VIEWBOX[\"copy-transform\"]);\n","import {\n ContentTransferError,\n readTransferCell,\n sealTransferArtifact,\n serialize,\n type Artifact,\n type Draft,\n type FormatAdapter,\n type Json,\n type PageAction,\n type Payload,\n type TransferOutcome,\n} from \"@ai-matrx/kit/content-transfer\";\n\nexport type ContentTransferReference = {\n id: string;\n label: string;\n noun: string;\n items: Record<string, Json>[];\n};\n\nexport type ContentTransferReferencePort = {\n supports(reference: ContentTransferReference): boolean;\n build(reference: ContentTransferReference): string | Promise<string>;\n};\n\nexport type ContentTransferEmailPort = {\n send(\n artifact: Artifact,\n context: { label: string; signal: AbortSignal },\n ): Promise<TransferOutcome>;\n};\n\nconst exportableColumns = (payload: Extract<Payload, { kind: \"rows\" }>) =>\n payload.columns.filter(\n (column) =>\n column.visible &&\n column.exportable !== false &&\n column.classification !== \"secret\" &&\n column.classification !== \"credential\",\n );\n\n/** A sealed, projection-safe representation of a tabular draft's declared schema and values. */\nexport const tableSchemaFormat: FormatAdapter = {\n id: \"table-schema\",\n label: \"Schema\",\n supports: (payload) => payload.kind === \"rows\",\n async build(draft, signal) {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n if (draft.payload.kind !== \"rows\")\n throw new ContentTransferError(\n \"unsupported-format\",\n \"Schema + rows requires tabular content; manually edited text cannot carry a table schema.\",\n );\n const rowColumns = exportableColumns(draft.payload);\n const columns = rowColumns.map((column) => ({\n id: column.id,\n label: column.label,\n path: column.path,\n ...(column.schema === undefined ? {} : { schema: column.schema }),\n }));\n const body = {\n sourceId: draft.sourceId,\n columns,\n rows: draft.payload.rows.map((row) =>\n Object.fromEntries(rowColumns.map((column) => [column.id, readTransferCell(row, column) ?? null])),\n ),\n } satisfies Json;\n const plainText = JSON.stringify(body, null, 2);\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format: \"table-schema\",\n plainText,\n file: {\n filename: \"table-schema.json\",\n mime: \"application/json\",\n bytes: new TextEncoder().encode(plainText),\n },\n omissions: [...draft.omissions],\n });\n },\n};\n\nfunction displayLabels(payload: Extract<Payload, { kind: \"rows\" }>): [string, typeof payload.columns[number]][] {\n const columns = exportableColumns(payload);\n const counts = new Map<string, number>();\n for (const column of columns) counts.set(column.label, (counts.get(column.label) ?? 0) + 1);\n const used = new Set<string>();\n return columns.map((column) => {\n const base = counts.get(column.label) === 1 ? column.label : `${column.label} [${column.id}]`;\n let label = base;\n for (let suffix = 2; used.has(label); suffix += 1) label = `${base} (${suffix})`;\n used.add(label);\n return [label, column];\n });\n}\n\n/** Flat row JSON keyed by user-facing display labels, never raw table records. */\nexport const tableDataFormat: FormatAdapter = {\n id: \"table-data\",\n label: \"Table JSON\",\n supports: (payload) => payload.kind === \"rows\",\n async build(draft, signal) {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n if (draft.payload.kind !== \"rows\")\n throw new ContentTransferError(\"unsupported-format\", \"Display-label JSON requires tabular content.\");\n const columns = displayLabels(draft.payload);\n const plainText = JSON.stringify(\n draft.payload.rows.map((row) =>\n Object.fromEntries(columns.map(([label, column]) => [label, readTransferCell(row, column) ?? null])),\n ),\n null,\n 2,\n );\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format: \"json\",\n plainText,\n file: {\n filename: \"data.json\",\n mime: \"application/json;charset=utf-8\",\n bytes: new TextEncoder().encode(plainText),\n },\n omissions: [...draft.omissions],\n });\n },\n};\n\ntype EmailFormat = \"csv\" | \"json\" | \"markdown\";\nexport type TransferEmailAction = PageAction & { prepared: true; group: \"email\" };\n\nconst emailArtifact = (draft: Draft, format: EmailFormat, signal: AbortSignal, jsonFormat?: FormatAdapter): Promise<Artifact> =>\n format === \"json\" && jsonFormat?.supports(draft.payload)\n ? jsonFormat.build(draft, signal)\n : Promise.resolve(serialize(draft, format, { spreadsheetSafe: format === \"csv\" }));\n\n/** Prepared-only delivery actions always serialize the current draft, never a host source. */\nexport function createTransferEmailActions(\n email: ContentTransferEmailPort,\n options: { jsonFormat?: FormatAdapter } = {},\n): TransferEmailAction[] {\n return ([\"csv\", \"json\", \"markdown\"] as const).map((format) => ({\n id: `email-${format}`,\n label: `Email ${format === \"csv\" ? \"CSV\" : format === \"json\" ? \"JSON\" : \"Markdown\"}`,\n prepared: true,\n group: \"email\",\n supports: (_snapshot, draft) => Boolean(draft) && (format !== \"csv\" || draft?.payload.kind === \"rows\"),\n async run({ draft, signal, snapshot }) {\n if (signal.aborted) return { status: \"cancelled\" };\n const artifact = await emailArtifact(draft, format, signal, options.jsonFormat);\n return email.send(artifact, { label: snapshot.label, signal });\n },\n }));\n}\n","import type { AgentPayloadInput } from \"./copy-types\";\n\n/** Portable Copy-for-AI envelope. The UI never hands an agent bare JSON. */\nexport function tableAgentText(value: AgentPayloadInput | string): string {\n if (typeof value === \"string\") return value;\n const attributes = Object.entries(value.attributes ?? {})\n .filter(([, entry]) => entry !== null && entry !== undefined && entry !== \"\")\n .map(([key, entry]) => ` ${key}=\"${String(entry)}\"`)\n .join(\"\");\n const context = Object.entries(value.context ?? {})\n .filter(([, entry]) => entry !== null && entry !== undefined && entry !== \"\")\n .map(([key, entry]) => `<${key}>${String(entry)}</${key}>`)\n .join(\"\\n\");\n const url = typeof window === \"undefined\" ? \"\" : window.location.href;\n const route = typeof window === \"undefined\" ? \"\" : window.location.pathname;\n return `<${value.kind}${attributes}>\n<context>\n<location>${value.location}</location>\n${url ? `<url>${url}</url>` : \"\"}\n${route ? `<route>${route}</route>` : \"\"}\n<copied>${value.description}</copied>\n<copied-at>${new Date().toISOString()}</copied-at>\n${context}\n</context>\n${value.summary ? `<summary>\\n${value.summary}\\n</summary>\\n` : \"\"}<data format=\"json\">\n\\`\\`\\`json\n${JSON.stringify(value.data, null, 2)}\n\\`\\`\\`\n</data>\n</${value.kind}>`;\n}\n","\"use client\";\nimport { MatrxCopyMenu } from \"../content-transfer/matrx-copy\";\nimport { useMatrxDataTableHost } from \"./host\";\nimport type { CopyControlProps, ExportItem } from \"./copy-types\";\nexport type { AgentPayloadInput, AiCustomSource, AiVariant, CopyControlProps, CopySubsetColumn } from \"./copy-types\";\nexport { tableAgentText } from \"./copy-payload\";\n\n/** All portable row, selection, toolbar and detail copy controls use Alchemy.\n * Host ports remain explicit so installed applications can activate their\n * authenticated destinations when they adopt the published package. */\nexport function CopyButtons(props: CopyControlProps) {\n const { CopyControls } = useMatrxDataTableHost();\n const copyProps = props.export?.sheetRows\n ? { ...props, primarySource: \"table\" as const }\n : props;\n if (CopyControls) return <CopyControls {...copyProps} />;\n return <MatrxCopyMenu {...copyProps} />;\n}\nexport function jsonExportItem(build: () => unknown, label: string): ExportItem { return { id: \"json\", label, build: () => ({ content: JSON.stringify(build(), null, 2), extension: \"json\", mime: \"application/json\" }) }; }\n","\"use client\";\nimport { useState } from \"react\";\nimport { useClipboard } from \"@ai-matrx/kit/clipboard\";\nimport { Button } from \"../button\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"../dialog\";\nimport { tableAgentText } from \"./copy-payload\";\n\nimport { MatrxDataTable } from \"./MatrxDataTable\";\nimport { filterAndSortRows, getCellValue } from \"./filter-engine\";\nimport { rowsToCsvFromColumns, rowsToMarkdownTable } from \"./tableCopy\";\nimport { useTableNotice } from \"./useTableNotice\";\nimport type { MatrxColumnDef, MatrxDataTableQueryState } from \"./types\";\nimport type { AiVariant, CopySubsetSource } from \"./copy-types\";\n\nfunction CopySubsetDialog<T>({ source, onClose }: { source: CopySubsetSource<T>; onClose: () => void }) {\n // Snapshot the array on opening; shaping never changes the originating view.\n const [rows] = useState(() => [...source.rows]);\n const [hidden, setHidden] = useState(() => new Set(source.columns.filter((c) => c.hidden).map((c) => c.id)));\n const [selectedIds, setSelectedIds] = useState<string[]>([]);\n const [format, setFormat] = useState(\"ai\");\n const [query, setQuery] = useState<MatrxDataTableQueryState>({ page: 1, pageSize: 50, search: \"\", anyOf: \"\", columnFilters: {}, sort: null });\n const { notify, notice } = useTableNotice();\n const clipboard = useClipboard({ notify: (message, kind) => notify[kind](message) });\n const columns: MatrxColumnDef<T>[] = source.columns.filter((c) => !hidden.has(c.id));\n const matched = filterAndSortRows(rows, columns, query.columnFilters, query.sort, query.search, undefined, query.layeredFilters, query.searchMatchMode ?? \"contains\");\n const selected = new Set(selectedIds);\n const shaped = selected.size ? matched.filter((row) => selected.has(source.getRowId(row))) : matched;\n const records = shaped.map((row) => Object.fromEntries(columns.map((col) => [String(col.header), getCellValue(row, col)])));\n let text = \"\";\n let buildError: string | null = null;\n try {\n text = format === \"csv\" ? rowsToCsvFromColumns(shaped, columns)\n : format === \"markdown\" ? rowsToMarkdownTable(shaped, columns)\n : format === \"json\" ? JSON.stringify(records, null, 2)\n : tableAgentText({ ...(source.serializer ? source.serializer(shaped) : { kind: source.kind, location: source.location, description: source.label }), data: records });\n } catch (raw) { buildError = raw instanceof Error ? raw.message : String(raw); }\n return <Dialog open onOpenChange={(open) => { if (!open) onClose(); }}><DialogContent className=\"matrx-alchemy-workspace matrx-alchemy-subset\"><DialogHeader><DialogTitle>Filter & sort before copying</DialogTitle></DialogHeader>\n <div className=\"matrx-alchemy-workspace-body matrx-alchemy-subset-body\"><fieldset className=\"matrx-alchemy-subset-columns\"><legend>Visible columns</legend>{source.columns.map((column) => <label key={column.id} className=\"mr-3 inline-flex items-center gap-1\"><input type=\"checkbox\" checked={!hidden.has(column.id)} onChange={() => setHidden((current) => { const next = new Set(current); next.has(column.id) ? next.delete(column.id) : next.add(column.id); return next; })} />{column.header}</label>)}</fieldset>\n {columns.length ? <div className=\"matrx-alchemy-subset-table\"><MatrxDataTable copy={false} data={rows} columns={columns} getRowId={source.getRowId} query={{ mode: \"controlled-local\", state: query, onStateChange: setQuery }} selection={{ selectedIds, onSelectedIdsChange: setSelectedIds }} detail={{ enabled: false }} window={{ enabled: false }} toolbar={{ searchMatch: {} }} /></div> : <p>Show at least one column to copy.</p>}\n {buildError ? <p role=\"alert\" className=\"text-destructive\">{buildError}</p> : null}{notice}</div>\n <DialogFooter><label className=\"matrx-alchemy-subset-format\">Format<select aria-label=\"Copy format\" value={format} onChange={(event) => setFormat(event.target.value)}><option value=\"ai\">For AI</option><option value=\"markdown\">Markdown</option><option value=\"csv\">CSV</option><option value=\"json\">JSON</option></select></label><span role=\"status\" className=\"text-xs\">{shaped.length} of {rows.length} rows · {columns.length} columns · {text.length.toLocaleString()} characters</span><Button type=\"button\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" onClick={onClose}>Close</Button><Button type=\"button\" className=\"matrx-alchemy-workspace-primary\" disabled={buildError !== null || !columns.length || !shaped.length} onClick={() => void clipboard.copyText(text, `${source.label} copied`)}>Copy subset</Button></DialogFooter>\n </DialogContent></Dialog>;\n}\nexport function useCopySubsetVariant<T>() {\n return (getSource: () => CopySubsetSource<T>): AiVariant => ({ id: \"copy-subset\", label: \"Filter & sort before copying\", section: \"ai\", modal: ({ open, onOpenChange }) => open ? <CopySubsetDialog source={getSource()} onClose={() => onOpenChange(false)} /> : null });\n}\n","/**\n * Shared vocabulary for ordered, AND-combined table filters. The same rule\n * shape is URL-safe, can be evaluated by local tables, and can be handed to a\n * controlled table's server query without a surface inventing another query\n * builder.\n */\n\nimport { z } from \"zod\";\nimport type { ColumnFiltersState } from \"./types\";\n\nexport const LAYERED_FILTER_OPERATORS = [\n \"contains\",\n \"not_contains\",\n \"equals\",\n \"not_equals\",\n \"starts_with\",\n \"ends_with\",\n \"word\",\n \"not_word\",\n \"is_empty\",\n \"is_not_empty\",\n \"greater_than\",\n \"greater_or_equal\",\n \"less_than\",\n \"less_or_equal\",\n \"between\",\n] as const;\n\nexport type LayeredFilterOperator = (typeof LAYERED_FILTER_OPERATORS)[number];\n\nexport interface LayeredFilterRule {\n id: string;\n field: string;\n operator: LayeredFilterOperator;\n value: string;\n valueTo?: string | undefined;\n}\n\nexport type LayeredFilterField =\n | {\n id: string;\n label: string;\n kind: \"text\";\n operators?: LayeredFilterOperator[];\n }\n | {\n id: string;\n label: string;\n kind: \"number\";\n operators?: LayeredFilterOperator[];\n placeholder?: string;\n }\n | {\n id: string;\n label: string;\n kind: \"select\";\n operators?: LayeredFilterOperator[];\n options: Array<{ value: string; label: string }>;\n };\n\nconst layeredFilterRuleSchema = z.object({\n id: z.string().min(1),\n field: z.string().min(1),\n operator: z.enum(LAYERED_FILTER_OPERATORS),\n value: z.string(),\n valueTo: z.string().optional(),\n});\n\nconst layeredFilterRulesSchema = z.array(layeredFilterRuleSchema).max(20);\n\nconst TEXT_OPERATORS: LayeredFilterOperator[] = [\n \"contains\",\n \"not_contains\",\n \"equals\",\n \"not_equals\",\n \"starts_with\",\n \"ends_with\",\n \"word\",\n \"not_word\",\n \"is_empty\",\n \"is_not_empty\",\n];\n\nconst NUMBER_OPERATORS: LayeredFilterOperator[] = [\n \"equals\",\n \"not_equals\",\n \"greater_than\",\n \"greater_or_equal\",\n \"less_than\",\n \"less_or_equal\",\n \"between\",\n \"is_empty\",\n \"is_not_empty\",\n];\n\nconst SELECT_OPERATORS: LayeredFilterOperator[] = [\n \"equals\",\n \"not_equals\",\n \"is_empty\",\n \"is_not_empty\",\n];\n\nexport const LAYERED_FILTER_OPERATOR_LABELS: Record<\n LayeredFilterOperator,\n string\n> = {\n contains: \"contains\",\n not_contains: \"doesn't contain\",\n equals: \"is\",\n not_equals: \"is not\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n word: \"has the word\",\n not_word: \"doesn't have the word\",\n is_empty: \"is empty\",\n is_not_empty: \"is not empty\",\n greater_than: \"is greater than\",\n greater_or_equal: \"is at least\",\n less_than: \"is less than\",\n less_or_equal: \"is at most\",\n between: \"is between\",\n};\n\nexport function operatorsForLayeredField(\n field: LayeredFilterField,\n): LayeredFilterOperator[] {\n if (field.operators) return field.operators;\n if (field.kind === \"number\") return NUMBER_OPERATORS;\n if (field.kind === \"select\") return SELECT_OPERATORS;\n return TEXT_OPERATORS;\n}\n\nexport function layeredFilterNeedsValue(\n operator: LayeredFilterOperator,\n): boolean {\n return operator !== \"is_empty\" && operator !== \"is_not_empty\";\n}\n\nexport function isCompleteLayeredFilterRule(rule: LayeredFilterRule): boolean {\n if (!layeredFilterNeedsValue(rule.operator)) return true;\n if (rule.value.trim() === \"\") return false;\n return rule.operator !== \"between\" || Boolean(rule.valueTo?.trim());\n}\n\nexport function completeLayeredFilterRules(\n rules: readonly LayeredFilterRule[] | undefined,\n): LayeredFilterRule[] {\n return (rules ?? []).filter(isCompleteLayeredFilterRule);\n}\n\nexport function isLayeredFilterOperator(\n value: string,\n): value is LayeredFilterOperator {\n return LAYERED_FILTER_OPERATORS.some((operator) => operator === value);\n}\n\n/** Decode URL-owned rules without trusting a hand-edited link. */\nexport function decodeLayeredFilterRules(\n raw: string | null,\n): LayeredFilterRule[] {\n if (!raw) return [];\n try {\n const parsed: unknown = JSON.parse(raw);\n const result = layeredFilterRulesSchema.safeParse(parsed);\n return result.success ? result.data : [];\n } catch {\n return [];\n }\n}\n\n/** Stable compact URL/wire form; rule order is preserved. */\nexport function encodeLayeredFilterRules(\n rules: readonly LayeredFilterRule[] | undefined,\n): string | null {\n return rules?.length ? JSON.stringify(rules) : null;\n}\n\n/**\n * Translate ordinary per-column controls into the same ordered rule language\n * used by the advanced builder. Controlled tables can send these rules to one\n * server evaluator instead of rebuilding numeric/text filter semantics.\n * Select filters are intentionally omitted because their multi-select control\n * is OR-combined and should stay in its native query parameter.\n */\nexport function columnFiltersToLayeredRules(\n filters: ColumnFiltersState,\n fieldIds: readonly string[],\n): LayeredFilterRule[] {\n const rules: LayeredFilterRule[] = [];\n for (const field of fieldIds) {\n const filter = filters[field];\n if (!filter) continue;\n\n if (filter.kind === \"text\") {\n rules.push({\n id: `column-${field}`,\n field,\n operator:\n filter.mode === \"empty\"\n ? \"is_empty\"\n : filter.mode === \"not_empty\"\n ? \"is_not_empty\"\n : \"contains\",\n value: filter.value,\n });\n continue;\n }\n\n if (filter.kind === \"number\") {\n if (filter.min !== undefined && filter.max !== undefined) {\n rules.push({\n id: `column-${field}`,\n field,\n operator: \"between\",\n value: String(filter.min),\n valueTo: String(filter.max),\n });\n } else if (filter.min !== undefined) {\n rules.push({\n id: `column-${field}`,\n field,\n operator: \"greater_or_equal\",\n value: String(filter.min),\n });\n } else if (filter.max !== undefined) {\n rules.push({\n id: `column-${field}`,\n field,\n operator: \"less_or_equal\",\n value: String(filter.max),\n });\n }\n continue;\n }\n\n if (filter.kind === \"boolean\") {\n rules.push({\n id: `column-${field}`,\n field,\n operator: \"equals\",\n value: String(filter.value),\n });\n }\n }\n return rules;\n}\n\nfunction normalizedText(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n return String(value).trim().toLocaleLowerCase();\n}\n\nfunction words(value: string): string[] {\n return value.split(/[^\\p{L}\\p{N}]+/u).filter(Boolean);\n}\n\n/** Local-table evaluator. Controlled tables send the same rule shape server-side. */\nexport function layeredFilterMatchesValue(\n value: unknown,\n rule: LayeredFilterRule,\n): boolean {\n const actual = normalizedText(value);\n const expected = rule.value.trim().toLocaleLowerCase();\n const expectedTo = rule.valueTo?.trim().toLocaleLowerCase() ?? \"\";\n\n switch (rule.operator) {\n case \"contains\":\n return actual.includes(expected);\n case \"not_contains\":\n return !actual.includes(expected);\n case \"equals\":\n return actual === expected;\n case \"not_equals\":\n return actual !== expected;\n case \"starts_with\":\n return actual.startsWith(expected);\n case \"ends_with\":\n return actual.endsWith(expected);\n case \"word\":\n return words(actual).includes(expected);\n case \"not_word\":\n return !words(actual).includes(expected);\n case \"is_empty\":\n return actual === \"\";\n case \"is_not_empty\":\n return actual !== \"\";\n case \"greater_than\":\n return Number(actual) > Number(expected);\n case \"greater_or_equal\":\n return Number(actual) >= Number(expected);\n case \"less_than\":\n return Number(actual) < Number(expected);\n case \"less_or_equal\":\n return Number(actual) <= Number(expected);\n case \"between\": {\n const numeric = Number(actual);\n return numeric >= Number(expected) && numeric <= Number(expectedTo);\n }\n }\n}\n\nexport function layeredFilterRuleSummary(\n rule: LayeredFilterRule,\n fields: readonly LayeredFilterField[],\n): string {\n const field = fields.find((candidate) => candidate.id === rule.field);\n const fieldLabel = field?.label ?? rule.field;\n const operator = LAYERED_FILTER_OPERATOR_LABELS[rule.operator];\n if (!layeredFilterNeedsValue(rule.operator))\n return `${fieldLabel} ${operator}`;\n const selectedLabel =\n field?.kind === \"select\"\n ? field.options.find((option) => option.value === rule.value)?.label\n : undefined;\n const value = selectedLabel ?? rule.value;\n return rule.operator === \"between\"\n ? `${fieldLabel} ${operator} ${value} and ${rule.valueTo ?? \"\"}`\n : `${fieldLabel} ${operator} ${value}`;\n}\n","import type {\n ColumnFilterValue,\n ColumnFiltersState,\n MatrxColumnDef,\n SortState,\n TableSearchMatchMode,\n} from \"./types\";\nimport {\n completeLayeredFilterRules,\n layeredFilterMatchesValue,\n type LayeredFilterRule,\n} from \"./layered-filters\";\n\n/**\n * Sentinel select-filter values for \"no value\" / \"any value\" — every select\n * filter offers them automatically when the column has empty cells, so any\n * table can isolate rows missing a value (or having one) without extra config.\n */\nexport const SELECT_EMPTY_VALUE = \"__empty__\";\nexport const SELECT_NOT_EMPTY_VALUE = \"__not_empty__\";\n\nexport function columnId<T>(col: MatrxColumnDef<T>): string {\n if (col.id) return col.id;\n if (col.accessorKey) return String(col.accessorKey);\n throw new Error(\"MatrxDataTable column requires `id` or `accessorKey`\");\n}\n\nexport function getCellValue<T>(row: T, col: MatrxColumnDef<T>): unknown {\n if (col.accessorFn) return col.accessorFn(row);\n if (col.accessorKey) {\n return (row as Record<string, unknown>)[col.accessorKey];\n }\n return undefined;\n}\n\nexport function getFilterValue<T>(row: T, col: MatrxColumnDef<T>): unknown {\n return col.filterValue ? col.filterValue(row) : getCellValue(row, col);\n}\n\nexport function getSortValue<T>(row: T, col: MatrxColumnDef<T>): unknown {\n return col.sortValue ? col.sortValue(row) : getCellValue(row, col);\n}\n\nexport function stringifyCellValue(value: unknown): string {\n if (value == null) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value instanceof Date) return value.toISOString();\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/** Unicode-aware tokenization shared by whole-word table search. */\nexport function tableSearchWords(value: string): string[] {\n return value\n .toLocaleLowerCase()\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter(Boolean);\n}\n\n/**\n * Match the primary table search against one row's searchable text. In\n * whole-word mode every entered word must exist as a complete token, so\n * `are` matches `we are ready` but never `hardware`.\n */\nexport function matchesTableSearch(\n searchableText: string,\n query: string,\n mode: TableSearchMatchMode = \"contains\",\n): boolean {\n const normalizedQuery = query.trim().toLocaleLowerCase();\n if (!normalizedQuery) return true;\n if (mode === \"contains\") {\n return searchableText.toLocaleLowerCase().includes(normalizedQuery);\n }\n const actualWords = new Set(tableSearchWords(searchableText));\n const expectedWords = tableSearchWords(normalizedQuery);\n return (\n expectedWords.length > 0 &&\n expectedWords.every((word) => actualWords.has(word))\n );\n}\n\nfunction compareValues(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"boolean\" && typeof b === \"boolean\") {\n return Number(a) - Number(b);\n }\n return stringifyCellValue(a).localeCompare(stringifyCellValue(b), undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n}\n\n/** Select filters treat array-valued cells as sets, never as serialized JSON choices. */\nexport function selectCellValues(value: unknown): string[] {\n return (Array.isArray(value) ? value : [value])\n .map(stringifyCellValue)\n .filter((item) => item !== \"\");\n}\n\nexport function passesColumnFilter(\n value: unknown,\n filter: ColumnFilterValue,\n): boolean {\n const matches = (() => {\n switch (filter.kind) {\n case \"text\": {\n const s = stringifyCellValue(value);\n if (filter.mode === \"null\") return value == null;\n if (filter.mode === \"not_null\") return value != null;\n if (filter.mode === \"empty\") return s.trim() === \"\";\n if (filter.mode === \"not_empty\") return s.trim() !== \"\";\n const q = filter.value.trim().toLowerCase();\n if (!q) return true;\n return s.toLowerCase().includes(q);\n }\n case \"select\": {\n const selected =\n filter.values ??\n (filter.value && filter.value !== \"__all__\" ? [filter.value] : []);\n if (selected.length === 0) return true;\n const values = selectCellValues(value);\n // OR semantics across the set; sentinels compose (\"A or (empty)\").\n return selected.some((v) =>\n v === SELECT_EMPTY_VALUE\n ? values.length === 0\n : v === SELECT_NOT_EMPTY_VALUE\n ? values.length > 0\n : values.includes(v),\n );\n }\n case \"boolean\": {\n return Boolean(value) === filter.value;\n }\n case \"number\": {\n const n =\n typeof value === \"number\"\n ? value\n : Number(stringifyCellValue(value).replace(/[^0-9.-]/g, \"\"));\n if (Number.isNaN(n)) return false;\n if (filter.min !== undefined && n < filter.min) return false;\n if (filter.max !== undefined && n > filter.max) return false;\n return true;\n }\n }\n })();\n return filter.negated ? !matches : matches;\n}\n\nexport function filterAndSortRows<T>(\n rows: T[],\n columns: MatrxColumnDef<T>[],\n columnFilters: ColumnFiltersState,\n sort: SortState | null,\n globalSearch: string,\n anyOf?: { columnIds: string[]; query: string },\n layeredFilters?: readonly LayeredFilterRule[],\n globalSearchMode: TableSearchMatchMode = \"contains\",\n searchText?: (row: T) => string,\n): T[] {\n const colById = new Map(columns.map((c) => [columnId(c), c]));\n const q = globalSearch.trim().toLowerCase();\n const anyQ = anyOf?.query.trim().toLowerCase() ?? \"\";\n const activeLayeredFilters = completeLayeredFilterRules(layeredFilters);\n\n let result = rows.filter((row) => {\n for (const [id, filter] of Object.entries(columnFilters)) {\n if (!filter) continue;\n const col = colById.get(id);\n if (!col || col.filter === false) continue;\n if (!passesColumnFilter(getFilterValue(row, col), filter)) return false;\n }\n\n for (const rule of activeLayeredFilters) {\n const col = colById.get(rule.field);\n if (!col || !layeredFilterMatchesValue(getFilterValue(row, col), rule)) {\n return false;\n }\n }\n\n if (anyQ && anyOf) {\n const hit = anyOf.columnIds.some((id) => {\n const col = colById.get(id);\n if (!col) return false;\n return stringifyCellValue(getFilterValue(row, col))\n .toLowerCase()\n .includes(anyQ);\n });\n if (!hit) return false;\n }\n\n if (!q) return true;\n const searchableValues = columns\n .filter(\n (col) =>\n col.filter !== false || Boolean(col.accessorKey || col.accessorFn),\n )\n .map((col) => stringifyCellValue(getFilterValue(row, col)));\n const additionalSearchText = searchText?.(row);\n if (additionalSearchText) searchableValues.push(additionalSearchText);\n if (globalSearchMode === \"contains\") {\n return searchableValues.some((value) =>\n matchesTableSearch(value, q, \"contains\"),\n );\n }\n return matchesTableSearch(searchableValues.join(\" \"), q, \"whole_words\");\n });\n\n if (sort) {\n const col = colById.get(sort.id);\n if (col && col.sortable !== false) {\n const dir = sort.direction === \"asc\" ? 1 : -1;\n result = [...result].sort((a, b) => {\n const va = getSortValue(a, col);\n const vb = getSortValue(b, col);\n // Empty cells (null / \"\") sort LAST in both directions — sorting a\n // column should surface its values, never a wall of blanks.\n const ea = va == null || stringifyCellValue(va) === \"\";\n const eb = vb == null || stringifyCellValue(vb) === \"\";\n if (ea !== eb) return ea ? 1 : -1;\n return compareValues(va, vb) * dir;\n });\n }\n }\n\n return result;\n}\n\nexport function countActiveColumnFilters(filters: ColumnFiltersState): number {\n let n = 0;\n for (const f of Object.values(filters)) {\n if (!f) continue;\n switch (f.kind) {\n case \"text\":\n if (f.value.trim() || (f.mode && f.mode !== \"contains\")) n += 1;\n break;\n case \"select\":\n if (f.values ? f.values.length > 0 : f.value && f.value !== \"__all__\")\n n += 1;\n break;\n case \"boolean\":\n n += 1;\n break;\n case \"number\":\n if (f.min !== undefined || f.max !== undefined) n += 1;\n break;\n }\n }\n return n;\n}\n\nexport function isColumnFilterActive(\n filter: ColumnFilterValue | undefined,\n): boolean {\n if (!filter) return false;\n switch (filter.kind) {\n case \"text\":\n return (\n filter.value.trim().length > 0 ||\n (filter.mode !== undefined && filter.mode !== \"contains\")\n );\n case \"select\":\n return filter.values\n ? filter.values.length > 0\n : Boolean(filter.value) && filter.value !== \"__all__\";\n case \"boolean\":\n return true;\n case \"number\":\n return filter.min !== undefined || filter.max !== undefined;\n }\n}\n\n/** Apply draft edits onto a row for display (shallow field merge). */\nexport function applyRowEdits<T>(\n row: T,\n edits: Record<string, unknown> | undefined,\n): T {\n if (!edits || Object.keys(edits).length === 0) return row;\n return { ...row, ...edits };\n}\n","import type { AgentPayloadInput } from \"./copy\";\nimport { normalizeTransferJson } from \"@ai-matrx/kit/content-transfer\";\nimport type { MatrxColumnDef, MatrxDataTableCopyConfig } from \"./types\";\nimport { columnId, getCellValue, stringifyCellValue } from \"./filter-engine\";\n\n/**\n * Typed, declared-column capture for MatrxDataTable's built-in Alchemy source.\n * It deliberately runs only at the transfer boundary: accessor functions can\n * throw useful capture errors, and rendering never evaluates them for copying.\n */\nexport function projectDefaultTableCopyRow<T>(\n row: T,\n columns: MatrxColumnDef<T>[],\n): Record<string, unknown> {\n const record: Record<string, unknown> = Object.create(null) as Record<string, unknown>;\n for (const column of columns) {\n const value = getCellValue(row, column);\n if (value !== undefined) record[columnId(column)] = value;\n }\n return normalizeTransferJson(record, { omitUndefinedObjectProperties: true }) as Record<string, unknown>;\n}\n\n/** Builds the default table's AI envelope from one already validated capture. */\nexport function buildDefaultTableViewAgentInput<T>(\n config: MatrxDataTableCopyConfig<T>,\n rows: T[],\n all: T[],\n columns: MatrxColumnDef<T>[],\n meta?: Parameters<typeof buildViewAgentInput<T>>[3],\n): AgentPayloadInput {\n const projected = rows.map((row) => projectDefaultTableCopyRow(row, columns));\n return {\n kind: config.listKind,\n location: config.location,\n description:\n meta?.scope === \"selected\"\n ? `${projected.length} selected ${projected.length === 1 ? config.label : (config.listLabel ?? `${config.label} rows`)}.`\n : (config.listDescription ?? `${config.listLabel ?? config.label} — current filtered/sorted view.`),\n data: projected,\n summary: projected.map((record) => formatDefaultTableCopyRecord(record, columns)).join(\"\\n---\\n\"),\n attributes: {\n visible_count: projected.length,\n total_count: all.length,\n search: meta?.search || undefined,\n search_match: meta?.search ? meta.searchMatchMode : undefined,\n any_of: meta?.anyOf || undefined,\n active_filters: meta?.filterCount ?? 0,\n sort: meta?.sort || undefined,\n scope: meta?.scope ?? \"view\",\n ...config.listAttributes?.(rows, all),\n },\n ...(config.listContext ? { context: config.listContext(rows, all) } : {}),\n };\n}\n\n/** Builds the default row AI envelope from one validated projection. */\nexport function buildDefaultTableRowAgentInput<T>(\n config: MatrxDataTableCopyConfig<T>,\n row: T,\n columns: MatrxColumnDef<T>[],\n): AgentPayloadInput {\n const projected = projectDefaultTableCopyRow(row, columns);\n return {\n kind: config.rowKind,\n location: config.location,\n description: config.rowDescription ?? `One ${config.label} row.`,\n data: projected,\n summary: formatDefaultTableCopyRecord(projected, columns),\n ...(config.rowAttributes ? { attributes: config.rowAttributes(row) } : {}),\n };\n}\n\nexport function formatDefaultTableCopyRecord<T>(\n record: Record<string, unknown>,\n columns: MatrxColumnDef<T>[],\n): string {\n return columns\n .map((column) => {\n const id = columnId(column);\n const label = column.label ?? (typeof column.header === \"string\" ? column.header : id);\n return `${label}: ${stringifyCellValue(record[id])}`;\n })\n .join(\"\\n\");\n}\n\n/** Human markdown table of the current view (visible columns × rows). */\nexport function rowsToMarkdownTable<T>(\n rows: T[],\n columns: MatrxColumnDef<T>[],\n): string {\n const cols = columns.filter((c) => c.filter !== false || c.accessorKey);\n if (cols.length === 0) return \"\";\n const headers = cols.map((c) => {\n if (typeof c.header === \"string\") return c.header;\n return columnId(c);\n });\n const lines = [\n `| ${headers.join(\" | \")} |`,\n `| ${headers.map(() => \"---\").join(\" | \")} |`,\n ];\n for (const row of rows) {\n const cells = cols.map((c) =>\n stringifyCellValue(getCellValue(row, c)).replace(/\\|/g, \"\\\\|\"),\n );\n lines.push(`| ${cells.join(\" | \")} |`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function buildRowAgentInput<T>(\n config: MatrxDataTableCopyConfig<T>,\n row: T,\n): AgentPayloadInput {\n return {\n kind: config.rowKind,\n location: config.location,\n description: config.rowDescription ?? `One ${config.label} row.`,\n data: config.agentRow ? config.agentRow(row) : row,\n summary: config.humanRow(row),\n ...(config.rowAttributes ? { attributes: config.rowAttributes(row) } : {}),\n };\n}\n\nexport function buildViewAgentInput<T>(\n config: MatrxDataTableCopyConfig<T>,\n visible: T[],\n all: T[],\n meta?: {\n search?: string;\n searchMatchMode?: string;\n anyOf?: string;\n filterCount?: number;\n sort?: string | null;\n /** `custom` = shaped in the copy-subset window (filter & sort before copying). */\n scope?: \"view\" | \"selected\" | \"custom\";\n },\n): AgentPayloadInput {\n return {\n kind: config.listKind,\n location: config.location,\n description:\n meta?.scope === \"selected\"\n ? `${visible.length} selected ${visible.length === 1 ? config.label : (config.listLabel ?? `${config.label} rows`)}.`\n : (config.listDescription ??\n `${config.listLabel ?? config.label} — current filtered/sorted view.`),\n data: visible.map((r) => (config.agentRow ? config.agentRow(r) : r)),\n summary: visible.map((r) => config.humanRow(r)).join(\"\\n---\\n\"),\n attributes: {\n visible_count: visible.length,\n total_count: all.length,\n search: meta?.search || undefined,\n search_match: meta?.search ? meta.searchMatchMode : undefined,\n any_of: meta?.anyOf || undefined,\n active_filters: meta?.filterCount ?? 0,\n sort: meta?.sort || undefined,\n scope: meta?.scope ?? \"view\",\n ...config.listAttributes?.(visible, all),\n },\n ...(config.listContext ? { context: config.listContext(visible, all) } : {}),\n };\n}\n\n/** CSV of the current view (visible columns × rows), for ExportMenu. */\nexport function rowsToCsvFromColumns<T>(\n rows: T[],\n columns: MatrxColumnDef<T>[],\n): string {\n const cols = columns.filter((c) => c.filter !== false || c.accessorKey);\n const escape = (value: string) =>\n /[\",\\n\\r]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n const lines = [\n cols\n .map((c) => escape(typeof c.header === \"string\" ? c.header : columnId(c)))\n .join(\",\"),\n ];\n for (const row of rows) {\n lines.push(\n cols\n .map((c) => escape(stringifyCellValue(getCellValue(row, c))))\n .join(\",\"),\n );\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * The same rows the CSV export produces, as records — the shape a Google Sheet\n * (or any other row destination) takes.\n *\n * It shares `rowsToCsvFromColumns`'s column selection and cell stringification\n * ON PURPOSE: a user who exports the view as CSV and a user who sends it to a\n * Sheet must get the SAME columns, in the same order, with the same values.\n * Two independent row builders is how those two answers start disagreeing.\n */\nexport function rowsToRecordsFromColumns<T>(\n rows: T[],\n columns: MatrxColumnDef<T>[],\n): Array<Record<string, unknown>> {\n const cols = columns.filter((c) => c.filter !== false || c.accessorKey);\n const headers = cols.map((c) =>\n typeof c.header === \"string\" ? c.header : columnId(c),\n );\n return rows.map((row) => {\n const record: Record<string, unknown> = {};\n cols.forEach((c, index) => {\n record[headers[index] ?? columnId(c)] = stringifyCellValue(getCellValue(row, c));\n });\n return record;\n });\n}\n\nexport function buildViewHuman<T>(\n config: MatrxDataTableCopyConfig<T>,\n visible: T[],\n columns: MatrxColumnDef<T>[],\n): string {\n const md = rowsToMarkdownTable(visible, columns);\n const summaries = visible.map((r) => config.humanRow(r)).join(\"\\n\\n\");\n return [\n `${config.listLabel ?? config.label} (${visible.length} rows)`,\n \"\",\n md,\n \"\",\n \"---\",\n \"\",\n summaries,\n ].join(\"\\n\");\n}\n","\"use client\";\nimport { useEffect } from \"react\";\nexport function useClippedContentGuard(ref: React.RefObject<HTMLElement | null>, options: { label: string; enabled?: boolean; onDiagnostic?: (message: string) => void }) {\n useEffect(() => { if (!options.enabled || !ref.current) return; const node = ref.current; const check = () => { if (node.scrollHeight > node.clientHeight && node.clientHeight === 0) options.onDiagnostic?.(`${options.label} has no visible height`); }; check(); const observer = new ResizeObserver(check); observer.observe(node); return () => observer.disconnect(); }, [ref, options]);\n}\n","\"use client\";\n\n/**\n * useTableUrlState — the ONE owner of controlled MatrxDataTable query state\n * that mirrors to the URL.\n *\n * `MatrxDataTableQueryState`'s own doc-comment says controlled callers \"may\n * mirror it to URL search params and use it as part of a direct\n * database-query cache key\" — this hook is that sentence made a primitive, so\n * no surface hand-rolls its own searchParams plumbing (or worse, loses\n * back/forward + shareable-link behavior by keeping the state in a bare\n * useState).\n *\n * Contract:\n * - `state` — the live query state; pass to `query={{ mode: \"controlled\", state, … }}`.\n * - `queryState` — same shape with SEARCH debounced (300ms); use as the input\n * to the data-fetching hook so keystrokes don't fan out into per-character\n * server queries. Page/sort/filter changes pass through immediately.\n * - `onStateChange` — hand to the table verbatim.\n *\n * URL params (all omitted at their defaults, so a pristine table has a clean\n * URL): `p` page, `ps` pageSize, `q` search, `match` search match mode,\n * `any` any-of search, `scope` intelligent-search scope, `sort` \"<id>.<asc|desc>\", `f` JSON-encoded column\n * filters, and `lf` JSON-encoded layered filters. User changes push native\n * history entries without a server round-trip, so Back/Forward restores the\n * exact table view instead of only restoring the route.\n *\n * This is deliberately VIEW-QUERY state (search, filters, page) — ephemeral,\n * shareable via link, never persisted. View STYLE (density, columns, view)\n * belongs to `useListViewPrefs` (lib/list-views), a different axis.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n ColumnFiltersState,\n MatrxDataTableQueryState,\n SortState,\n} from \"./types\";\nimport type { LayeredFilterRule } from \"./layered-filters\";\nimport {\n commitUrlParams,\n type UrlHistoryMode,\n useUrlSearchParams,\n} from \"@ai-matrx/kit/url-state\";\n\nexport interface UseTableUrlStateOptions {\n /** Stable table id used in `table.<id>.*` parameters. */\n tableId: string;\n /** Initial sort when the URL carries none. Default: none. */\n defaultSort?: SortState | null;\n /** Default page size (also the \"omit from URL\" value). Default 25. */\n defaultPageSize?: number;\n /** Debounce for `queryState.search`, ms. Default 300. */\n searchDebounceMs?: number;\n /** Browser history behavior for table transitions. Default: `push`. */\n history?: UrlHistoryMode;\n /** Rapid text edits push once, then replace by default. */\n textHistory?: \"session\" | UrlHistoryMode;\n}\n\nexport interface TableUrlState {\n /** Live state — pass to the table's controlled `query.state`. */\n state: MatrxDataTableQueryState;\n /** Search-debounced state — feed the data-fetching layer. */\n queryState: MatrxDataTableQueryState;\n /** Pass to the table's controlled `query.onStateChange`. */\n onStateChange: (next: MatrxDataTableQueryState) => void;\n /** Reset to defaults (clears the mirrored URL params too). */\n reset: () => void;\n}\n\nfunction parseSort(raw: string | null): SortState | null {\n if (!raw) return null;\n const at = raw.lastIndexOf(\".\");\n if (at <= 0) return null;\n const direction = raw.slice(at + 1);\n if (direction !== \"asc\" && direction !== \"desc\") return null;\n return { id: raw.slice(0, at), direction };\n}\n\nfunction parseObject<T extends object>(raw: string | null, fallback: T): T {\n if (!raw) return fallback;\n try {\n const parsed: unknown = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as T;\n }\n } catch {\n // A hand-mangled URL is not an error state — fall through to empty.\n }\n return fallback;\n}\n\nfunction parseLayeredFilters(raw: string | null): LayeredFilterRule[] {\n if (!raw) return [];\n try {\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as LayeredFilterRule[]) : [];\n } catch {\n return [];\n }\n}\n\nfunction positiveInt(raw: string | null, fallback: number): number {\n const n = raw ? Number.parseInt(raw, 10) : Number.NaN;\n return Number.isFinite(n) && n > 0 ? n : fallback;\n}\n\nexport function tableUrlParamPrefix(tableId: string): string {\n if (!/^[a-z][a-z0-9-]{0,63}$/.test(tableId)) {\n throw new Error(\n `MatrxDataTable urlState.id must match /^[a-z][a-z0-9-]{0,63}$/; received \"${tableId}\".`,\n );\n }\n return `table.${tableId}`;\n}\n\nexport function useTableUrlState(\n options: UseTableUrlStateOptions,\n): TableUrlState {\n const {\n tableId,\n defaultSort = null,\n defaultPageSize = 25,\n searchDebounceMs = 300,\n history = \"push\",\n textHistory = \"session\",\n } = options;\n const prefix = tableUrlParamPrefix(tableId);\n const key = useCallback((name: string) => `${prefix}.${name}`, [prefix]);\n const defaultSortId = defaultSort?.id;\n const defaultSortDirection = defaultSort?.direction;\n\n const searchParams = useUrlSearchParams();\n const readState = useCallback(\n (params: Pick<URLSearchParams, \"get\">): MatrxDataTableQueryState => {\n const initialSort =\n defaultSortId && defaultSortDirection\n ? { id: defaultSortId, direction: defaultSortDirection }\n : null;\n return {\n page: positiveInt(params.get(key(\"p\")), 1),\n pageSize: positiveInt(params.get(key(\"ps\")), defaultPageSize),\n search: params.get(key(\"q\")) ?? \"\",\n searchMatchMode:\n params.get(key(\"match\")) === \"whole_words\"\n ? \"whole_words\"\n : \"contains\",\n ...(params.get(key(\"scope\"))\n ? { searchScope: params.get(key(\"scope\"))! }\n : {}),\n anyOf: params.get(key(\"any\")) ?? \"\",\n layeredFilters: parseLayeredFilters(params.get(key(\"lf\"))),\n columnFilters: parseObject<ColumnFiltersState>(\n params.get(key(\"f\")),\n {},\n ),\n sort: parseSort(params.get(key(\"sort\"))) ?? initialSort,\n };\n },\n [defaultPageSize, defaultSortDirection, defaultSortId, key],\n );\n\n const state = readState(searchParams);\n const lastTextWriteAt = useRef(0);\n\n const [debouncedSearch, setDebouncedSearch] = useState(state.search);\n useEffect(() => {\n if (state.search === debouncedSearch) return;\n const timer = window.setTimeout(\n () => setDebouncedSearch(state.search),\n searchDebounceMs,\n );\n return () => window.clearTimeout(timer);\n }, [state.search, debouncedSearch, searchDebounceMs]);\n\n const writeState = useCallback(\n (nextState: MatrxDataTableQueryState, mode: UrlHistoryMode = history) => {\n const params = new URLSearchParams(window.location.search);\n const setOrDelete = (name: string, value: string | null) => {\n if (value === null || value === \"\") params.delete(name);\n else params.set(name, value);\n };\n setOrDelete(key(\"p\"), nextState.page > 1 ? String(nextState.page) : null);\n setOrDelete(\n key(\"ps\"),\n nextState.pageSize !== defaultPageSize\n ? String(nextState.pageSize)\n : null,\n );\n setOrDelete(key(\"q\"), nextState.search || null);\n setOrDelete(\n key(\"match\"),\n nextState.searchMatchMode === \"whole_words\" ? \"whole_words\" : null,\n );\n setOrDelete(\n key(\"scope\"),\n nextState.searchScope && nextState.searchScope !== \"all\"\n ? nextState.searchScope\n : null,\n );\n setOrDelete(key(\"any\"), nextState.anyOf || null);\n const sortToken = nextState.sort\n ? `${nextState.sort.id}.${nextState.sort.direction}`\n : null;\n const defaultToken =\n defaultSortId && defaultSortDirection\n ? `${defaultSortId}.${defaultSortDirection}`\n : null;\n setOrDelete(key(\"sort\"), sortToken !== defaultToken ? sortToken : null);\n const activeFilters = Object.fromEntries(\n Object.entries(nextState.columnFilters).filter(\n ([, v]) => v !== undefined,\n ),\n );\n setOrDelete(\n key(\"lf\"),\n nextState.layeredFilters && nextState.layeredFilters.length > 0\n ? JSON.stringify(nextState.layeredFilters)\n : null,\n );\n setOrDelete(\n key(\"f\"),\n Object.keys(activeFilters).length > 0\n ? JSON.stringify(activeFilters)\n : null,\n );\n const nextParams = new URLSearchParams(params);\n const currentParams = new URLSearchParams(window.location.search);\n const patch: Record<string, string | null> = {};\n for (const name of [\"p\", \"ps\", \"q\", \"match\", \"scope\", \"any\", \"sort\", \"lf\", \"f\"]) {\n const parameter = key(name);\n const nextValue = nextParams.get(parameter);\n if (currentParams.get(parameter) !== nextValue)\n patch[parameter] = nextValue;\n }\n commitUrlParams(patch, mode);\n },\n [defaultPageSize, defaultSortDirection, defaultSortId, history, key],\n );\n\n const onStateChange = useCallback(\n (next: MatrxDataTableQueryState) => {\n const changed = Object.keys(next).filter(\n (name) =>\n JSON.stringify(next[name as keyof MatrxDataTableQueryState]) !==\n JSON.stringify(state[name as keyof MatrxDataTableQueryState]),\n );\n const textOnly =\n changed.length > 0 &&\n changed.every((name) => name === \"search\" || name === \"anyOf\");\n let mode = history;\n if (textOnly && textHistory === \"replace\") mode = \"replace\";\n if (textOnly && textHistory === \"push\") mode = \"push\";\n if (textOnly && textHistory === \"session\") {\n const now = Date.now();\n mode = now - lastTextWriteAt.current < 750 ? \"replace\" : history;\n lastTextWriteAt.current = now;\n }\n writeState(next, mode);\n },\n [history, state, textHistory, writeState],\n );\n\n const reset = useCallback(() => {\n const dSort =\n defaultSortId && defaultSortDirection\n ? { id: defaultSortId, direction: defaultSortDirection }\n : null;\n const next: MatrxDataTableQueryState = {\n page: 1,\n pageSize: defaultPageSize,\n search: \"\",\n searchMatchMode: \"contains\",\n searchScope: \"all\",\n anyOf: \"\",\n layeredFilters: [],\n columnFilters: {},\n sort: dSort,\n };\n writeState(next);\n setDebouncedSearch(\"\");\n }, [defaultPageSize, defaultSortDirection, defaultSortId, writeState]);\n\n const queryState = useMemo<MatrxDataTableQueryState>(\n () =>\n state.search === debouncedSearch\n ? state\n : { ...state, search: debouncedSearch, page: 1 },\n [state, debouncedSearch],\n );\n\n return { state, queryState, onStateChange, reset };\n}\n","\"use client\";\n\nimport {\n forwardRef,\n useEffect,\n useMemo,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from \"react\";\nimport { useDraggable } from \"@dnd-kit/core\";\nimport {\n ArrowDown,\n ArrowUp,\n ArrowUpDown,\n Check as CheckIcon,\n ListFilter,\n ListX,\n X,\n} from \"./icons\";\nimport { Button } from \"../button\";\nimport { Input } from \"../input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from \"../command\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select\";\nimport { cn } from \"../cn\";\nimport type { ColumnFilterValue, SortDirection } from \"./types\";\nimport type { ResolvedFilterKind } from \"./infer-filter\";\nimport { isColumnFilterActive } from \"./filter-engine\";\n\ninterface ColumnHeaderCellProps {\n label: ReactNode;\n /** Plain-text column name for icon-only control aria-labels. */\n labelText?: string | undefined;\n sortable: boolean;\n isSorted: boolean;\n sortDirection: SortDirection;\n onSortAsc: () => void;\n onSortDesc: () => void;\n onClearSort: () => void;\n onHeaderSortClick: () => void;\n filterKind: ResolvedFilterKind | null;\n filterValue: ColumnFilterValue | undefined;\n onFilterChange: (next: ColumnFilterValue | undefined) => void;\n selectOptions?: Array<{ value: string; label: string }> | undefined;\n /** Single-choice select semantics (MatrxColumnDef.filterSingle). */\n selectSingle?: boolean | undefined;\n align?: \"left\" | \"center\" | \"right\" | undefined;\n className?: string | undefined;\n /**\n * ICON COLUMN header (MatrxColumnDef.compact): the label IS the glyph, so the\n * three controls collapse into ONE popover trigger carrying the same sort\n * actions and the same filter body. Nothing is lost — see the field's doc.\n */\n compact?: boolean | undefined;\n /** When supplied, filter edits remain a draft until Apply. */\n filterApplyLabel?: string | undefined;\n filterShowCancel?: boolean | undefined;\n filterFooterHint?: ReactNode | undefined;\n /** Opt-in because remote query sources may not understand negated filters. */\n allowNegation?: boolean | undefined;\n /** Opt-in because remote query sources may not understand null sentinels. */\n allowNullModes?: boolean | undefined;\n /** Internal column-reorder activator. The visible header label is the handle. */\n reorderColumn?: { id: string; label: string } | undefined;\n}\n\n/**\n * dnd-kit and Radix both describe the same trigger. Keep their ids together so\n * a draggable header retains drag guidance and its keyboard tooltip.\n */\nconst HeaderButton = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<\"button\"> & { dragDescription?: string }\n>(({ dragDescription, \"aria-describedby\": tooltipDescription, ...props }, ref) => {\n const descriptions = [tooltipDescription, dragDescription]\n .filter((value): value is string => Boolean(value))\n .join(\" \");\n return (\n <button\n ref={ref}\n {...props}\n {...(descriptions ? { \"aria-describedby\": descriptions } : {})}\n />\n );\n});\nHeaderButton.displayName = \"HeaderButton\";\n\nexport function ColumnHeaderCell({\n label,\n labelText,\n sortable,\n isSorted,\n sortDirection,\n onSortAsc,\n onSortDesc,\n onClearSort,\n onHeaderSortClick,\n filterKind,\n filterValue,\n onFilterChange,\n selectOptions = [],\n selectSingle = false,\n align = \"left\",\n className,\n compact = false,\n filterApplyLabel,\n filterShowCancel = false,\n filterFooterHint,\n allowNegation = false,\n allowNullModes = false,\n reorderColumn,\n}: ColumnHeaderCellProps) {\n const reorderEnabled = reorderColumn !== undefined;\n const { attributes: reorderAttributes, listeners: reorderListeners, setNodeRef } =\n useDraggable(\n reorderColumn\n ? {\n id: `matrx-column-header:${reorderColumn.id}`,\n data: { matrxDragKind: \"column-header\", columnId: reorderColumn.id },\n disabled: false,\n }\n : {\n id: `matrx-column-header:inactive:${labelText ?? \"column\"}`,\n disabled: true,\n },\n );\n const reorderLabel = reorderColumn?.label ?? labelText ?? \"column\";\n const { \"aria-describedby\": dragDescription, ...reorderAttributesWithoutDescription } =\n reorderAttributes;\n const reorderActivator = reorderEnabled\n ? {\n ...reorderAttributesWithoutDescription,\n ...reorderListeners,\n ref: setNodeRef,\n dragDescription,\n \"aria-description\": \"Drag this column label to reorder it.\",\n }\n : undefined;\n const reorderClass = reorderEnabled\n ? \"touch-none cursor-grab active:cursor-grabbing\"\n : undefined;\n const filterActive = isColumnFilterActive(filterValue);\n const deferredFilter =\n filterApplyLabel !== undefined || filterShowCancel || filterFooterHint !== undefined;\n const [filterOpen, setFilterOpen] = useState(false);\n const [draftFilter, setDraftFilter] = useState<ColumnFilterValue | undefined>(filterValue);\n useEffect(() => {\n if (!filterOpen) setDraftFilter(filterValue);\n }, [filterOpen, filterValue]);\n const applyFilter = () => {\n onFilterChange(draftFilter);\n setFilterOpen(false);\n };\n const cancelFilter = () => {\n setDraftFilter(filterValue);\n setFilterOpen(false);\n };\n const visibleFilter = deferredFilter ? draftFilter : filterValue;\n const setNegated = (negated: boolean) => {\n if (!visibleFilter) return;\n const next = { ...visibleFilter, ...(negated ? { negated: true } : {}) };\n if (!negated) delete next.negated;\n if (deferredFilter) setDraftFilter(next);\n else onFilterChange(next);\n };\n const menuLabel = labelText\n ? `Sort or filter ${labelText}`\n : \"Sort or filter column\";\n\n // ONE menu, rendered from ONE place, so the wide header and the icon header\n // can never end up offering different actions.\n const menuContent = (\n <PopoverContent\n align=\"start\"\n className=\"w-64 p-2\"\n onClick={(e) => e.stopPropagation()}\n onOpenAutoFocus={(event) => {\n const content = event.currentTarget;\n if (!(content instanceof HTMLElement)) return;\n\n const input = content.querySelector<HTMLInputElement>(\n \"[data-matrx-filter-autofocus]\",\n );\n if (!input) return;\n\n event.preventDefault();\n input.focus();\n }}\n >\n {sortable ? (\n <>\n <div className=\"flex flex-col gap-0.5 pb-2\">\n <Button\n variant={\n isSorted && sortDirection === \"asc\" ? \"secondary\" : \"ghost\"\n }\n size=\"sm\"\n className=\"h-8 justify-start gap-2 px-2 text-xs font-normal\"\n onClick={onSortAsc}\n >\n <ArrowUp className=\"h-3.5 w-3.5\" />\n Sort ascending\n </Button>\n <Button\n variant={\n isSorted && sortDirection === \"desc\" ? \"secondary\" : \"ghost\"\n }\n size=\"sm\"\n className=\"h-8 justify-start gap-2 px-2 text-xs font-normal\"\n onClick={onSortDesc}\n >\n <ArrowDown className=\"h-3.5 w-3.5\" />\n Sort descending\n </Button>\n {isSorted ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 justify-start gap-2 px-2 text-xs font-normal text-muted-foreground\"\n onClick={onClearSort}\n >\n <ListX className=\"h-3.5 w-3.5\" />\n Clear sort\n </Button>\n ) : null}\n </div>\n {filterKind ? <div className=\"mb-2 h-px bg-border\" /> : null}\n </>\n ) : null}\n {filterKind ? (\n <FilterBody\n kind={filterKind}\n value={visibleFilter}\n onChange={(next) => {\n const preservingNegation =\n next && visibleFilter?.negated\n ? { ...next, negated: true }\n : next;\n if (deferredFilter) setDraftFilter(preservingNegation);\n else onFilterChange(preservingNegation);\n }}\n selectOptions={selectOptions}\n selectSingle={selectSingle}\n allowNullModes={allowNullModes}\n />\n ) : null}\n {filterKind && visibleFilter && allowNegation ? (\n <div className=\"mt-2 border-t border-border pt-2\">\n <p className=\"mb-1 text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n Match mode\n </p>\n <div className=\"grid grid-cols-2 gap-1 rounded-md border p-0.5\">\n <button\n type=\"button\"\n aria-pressed={!visibleFilter.negated}\n onClick={() => setNegated(false)}\n className={cn(\n \"rounded px-2 py-1.5 text-xs transition-colors\",\n !visibleFilter.negated\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:bg-muted\",\n )}\n >\n Include\n </button>\n <button\n type=\"button\"\n aria-pressed={visibleFilter.negated === true}\n onClick={() => setNegated(true)}\n className={cn(\n \"rounded px-2 py-1.5 text-xs transition-colors\",\n visibleFilter.negated\n ? \"bg-destructive text-destructive-foreground\"\n : \"text-muted-foreground hover:bg-muted\",\n )}\n >\n Exclude\n </button>\n </div>\n </div>\n ) : null}\n {filterKind && deferredFilter ? (\n <div className=\"mt-2 border-t border-border pt-2\">\n {filterFooterHint ? (\n <div className=\"mb-2 text-xs text-muted-foreground\">{filterFooterHint}</div>\n ) : null}\n <div className=\"flex justify-end gap-2\">\n {filterShowCancel ? (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={cancelFilter}>\n Cancel\n </Button>\n ) : null}\n <Button type=\"button\" size=\"sm\" onClick={applyFilter}>\n {filterApplyLabel ?? \"Apply\"}\n </Button>\n </div>\n </div>\n ) : null}\n </PopoverContent>\n );\n\n // ICON COLUMN. A star/lock/dot column is 40px of glyph wrapped in ~30px of\n // header chrome, so the chrome collapses into the glyph itself: the label IS\n // the popover trigger, and the menu above still carries every sort action and\n // the whole filter body. Active state is a 2px marker, not a second control.\n if (compact) {\n if (!sortable && !filterKind) {\n if (!reorderEnabled) {\n return (\n <div className={cn(\"flex items-center justify-center\", className)}>\n {label}\n </div>\n );\n }\n return (\n <div className={cn(\"flex items-center justify-center\", className)}>\n <Tooltip>\n <TooltipTrigger asChild>\n <HeaderButton\n type=\"button\"\n {...reorderActivator}\n className={cn(\n \"inline-flex items-center justify-center rounded p-0.5 text-muted-foreground transition-colors hover:text-foreground\",\n reorderClass,\n )}\n >\n {label}\n </HeaderButton>\n </TooltipTrigger>\n <TooltipContent>Drag to reorder {reorderLabel}.</TooltipContent>\n </Tooltip>\n </div>\n );\n }\n return (\n <div\n className={cn(\n \"flex items-center\",\n align === \"right\" ? \"justify-end\" : \"justify-center\",\n className,\n )}\n >\n <Popover open={filterOpen} onOpenChange={setFilterOpen}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <HeaderButton\n type=\"button\"\n aria-label={menuLabel}\n data-matrx-canonical-signature=\"column-menu\"\n style={{ color: \"#60a5fa\" }}\n onClick={(event) => {\n event.stopPropagation();\n }}\n {...reorderActivator}\n className={cn(\n \"relative inline-flex items-center justify-center rounded p-0.5 transition-colors\",\n reorderClass,\n isSorted || filterActive\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {label}\n {isSorted ? (\n sortDirection === \"asc\" ? (\n <ArrowUp className=\"absolute -top-1 right-0 h-2 w-2 text-primary\" />\n ) : (\n <ArrowDown className=\"absolute -top-1 right-0 h-2 w-2 text-primary\" />\n )\n ) : null}\n {filterActive ? (\n <span\n aria-hidden\n className=\"absolute -bottom-0.5 right-0 h-1.5 w-1.5 rounded-full bg-primary\"\n />\n ) : null}\n </HeaderButton>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Canonical Matrx table · {menuLabel}</TooltipContent>\n </Tooltip>\n {menuContent}\n </Popover>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"flex items-center gap-0.5\",\n align === \"center\" && \"justify-center\",\n align === \"right\" && \"justify-end\",\n className,\n )}\n >\n {sortable ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <HeaderButton\n type=\"button\"\n onClick={onHeaderSortClick}\n {...reorderActivator}\n className={cn(\n \"inline-flex min-w-0 items-center gap-1 rounded px-0.5 py-0.5 text-left text-xs font-semibold uppercase tracking-wide transition-colors\",\n reorderClass,\n isSorted\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n <span className=\"truncate\">{label}</span>\n {isSorted ? (\n sortDirection === \"asc\" ? (\n <ArrowUp className=\"h-3 w-3 shrink-0 text-primary\" />\n ) : (\n <ArrowDown className=\"h-3 w-3 shrink-0 text-primary\" />\n )\n ) : (\n <ArrowUpDown className=\"h-3 w-3 shrink-0 opacity-40\" />\n )}\n </HeaderButton>\n </TooltipTrigger>\n <TooltipContent>\n {reorderEnabled\n ? `Drag to reorder ${reorderLabel}.`\n : (labelText ?? \"Sort column\")}\n </TooltipContent>\n </Tooltip>\n ) : reorderEnabled ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <HeaderButton\n type=\"button\"\n {...reorderActivator}\n className={cn(\n \"min-w-0 truncate rounded px-0.5 py-0.5 text-left text-xs font-semibold uppercase tracking-wide text-muted-foreground hover:text-foreground\",\n reorderClass,\n )}\n >\n {label}\n </HeaderButton>\n </TooltipTrigger>\n <TooltipContent>Drag to reorder {reorderLabel}.</TooltipContent>\n </Tooltip>\n ) : (\n <span className=\"truncate text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {label}\n </span>\n )}\n\n {filterKind || sortable ? (\n <div className=\"inline-flex items-center\">\n <Popover open={filterOpen} onOpenChange={setFilterOpen}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={menuLabel}\n onClick={(e) => e.stopPropagation()}\n className={cn(\n \"rounded p-0.5 transition-colors\",\n filterActive\n ? \"text-primary hover:text-primary/80\"\n : \"text-muted-foreground/40 hover:text-muted-foreground\",\n )}\n >\n {filterKind ? (\n <ListFilter className={cn(\"h-3 w-3\", filterActive && \"fill-primary/20\")} />\n ) : (\n <ArrowUpDown className=\"h-3 w-3\" />\n )}\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>{menuLabel}</TooltipContent>\n </Tooltip>\n {menuContent}\n </Popover>\n {filterActive ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={\n labelText ? `Clear ${labelText} filter` : \"Clear this filter\"\n }\n onClick={(e) => {\n e.stopPropagation();\n onFilterChange(undefined);\n }}\n className=\"rounded p-0.5 text-primary hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {labelText ? `Clear ${labelText} filter` : \"Clear this filter\"}\n </TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction FilterBody({\n kind,\n value,\n onChange,\n selectOptions,\n selectSingle = false,\n allowNullModes = false,\n}: {\n kind: ResolvedFilterKind;\n value: ColumnFilterValue | undefined;\n onChange: (next: ColumnFilterValue | undefined) => void;\n selectOptions: Array<{ value: string; label: string }>;\n selectSingle?: boolean;\n allowNullModes?: boolean;\n}) {\n if (kind === \"text\") {\n const text = value?.kind === \"text\" ? value.value : \"\";\n const mode =\n (value?.kind === \"text\" ? value.mode : undefined) ?? \"contains\";\n const setMode = (next: \"contains\" | \"empty\" | \"not_empty\" | \"null\" | \"not_null\") => {\n if (next === \"contains\") {\n onChange(text ? { kind: \"text\", value: text } : undefined);\n } else {\n onChange({ kind: \"text\", value: \"\", mode: next });\n }\n };\n return (\n <div className=\"space-y-1.5 px-1\">\n <p className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n Filter\n </p>\n <div className=\"flex gap-1\">\n {([\n [\"contains\", \"Contains\"],\n [\"empty\", \"(empty)\"],\n [\"not_empty\", \"(not empty)\"],\n ...(allowNullModes\n ? [[\"null\", \"(null)\"], [\"not_null\", \"(not null)\"]] as const\n : []),\n ] as const).map(([m, label]) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setMode(m)}\n aria-pressed={mode === m}\n className={cn(\n \"rounded border px-1.5 py-0.5 text-[10px] transition-colors\",\n mode === m\n ? \"border-primary/50 bg-primary/10 text-foreground\"\n : \"border-border text-muted-foreground hover:text-foreground\",\n )}\n >\n {label}\n </button>\n ))}\n </div>\n {mode === \"contains\" && (\n <div className=\"relative\">\n <Input\n data-matrx-filter-autofocus\n value={text}\n onChange={(e) =>\n onChange(\n e.target.value\n ? { kind: \"text\", value: e.target.value }\n : undefined,\n )\n }\n placeholder=\"Contains…\"\n className=\"h-8 pr-7 text-sm\"\n style={{ fontSize: \"16px\" }}\n />\n {text ? (\n <button\n type=\"button\"\n aria-label=\"Clear filter text\"\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2 rounded p-0.5 text-muted-foreground hover:text-foreground\"\n onClick={() => onChange(undefined)}\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n ) : null}\n </div>\n )}\n </div>\n );\n }\n\n if (kind === \"select\") {\n const selected =\n value?.kind === \"select\"\n ? (value.values ??\n (value.value && value.value !== \"__all__\" ? [value.value] : []))\n : [];\n return (\n <SearchableSelectFilter\n selected={selected}\n options={selectOptions}\n onChange={onChange}\n single={selectSingle}\n />\n );\n }\n\n if (kind === \"boolean\") {\n const current =\n value?.kind === \"boolean\" ? value.value : (\"__all__\" as const);\n return (\n <div className=\"space-y-1.5 px-1\">\n <p className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n Filter\n </p>\n <Select\n value={current === \"__all__\" ? \"__all__\" : current ? \"true\" : \"false\"}\n onValueChange={(v) => {\n if (v === \"__all__\") onChange(undefined);\n else onChange({ kind: \"boolean\", value: v === \"true\" });\n }}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__all__\">All</SelectItem>\n <SelectItem value=\"true\">Yes</SelectItem>\n <SelectItem value=\"false\">No</SelectItem>\n </SelectContent>\n </Select>\n </div>\n );\n }\n\n return <NumberFilterBody value={value} onChange={onChange} />;\n}\n\nfunction SearchableSelectFilter({\n selected,\n options,\n onChange,\n single = false,\n}: {\n selected: string[];\n options: Array<{ value: string; label: string }>;\n onChange: (next: ColumnFilterValue | undefined) => void;\n single?: boolean;\n}) {\n const [query, setQuery] = useState(\"\");\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return options;\n return options.filter(\n (o) =>\n o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q),\n );\n }, [options, query]);\n\n // Multi-select with OR semantics: toggling builds the `values` set; an\n // empty set clears the filter entirely. Single mode (mutually exclusive\n // options — a scope, a date bucket): choosing REPLACES, re-choosing clears.\n const toggle = (v: string) => {\n if (single) {\n onChange(\n selected.length === 1 && selected[0] === v\n ? undefined\n : { kind: \"select\", value: v },\n );\n return;\n }\n const next = selected.includes(v)\n ? selected.filter((x) => x !== v)\n : [...selected, v];\n onChange(\n next.length === 0\n ? undefined\n : { kind: \"select\", value: next[0] ?? \"\", values: next },\n );\n };\n\n return (\n <div className=\"space-y-1 px-0\">\n <div className=\"flex items-center justify-between px-1 pb-1\">\n <p className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n Filter{selected.length > 1 ? ` (any of ${selected.length})` : \"\"}\n </p>\n {selected.length > 0 ? (\n <button\n type=\"button\"\n className=\"text-[11px] text-muted-foreground hover:text-foreground\"\n onClick={() => onChange(undefined)}\n >\n clear\n </button>\n ) : null}\n </div>\n <Command className=\"rounded-md border border-border\" shouldFilter={false}>\n <CommandInput\n data-matrx-filter-autofocus\n value={query}\n onValueChange={setQuery}\n placeholder=\"Search options…\"\n className=\"h-8 text-sm\"\n />\n <CommandList className=\"max-h-48\">\n <CommandEmpty className=\"py-3 text-xs text-muted-foreground\">\n No matches\n </CommandEmpty>\n <CommandGroup>\n <CommandItem\n value=\"__all__\"\n onSelect={() => onChange(undefined)}\n className=\"text-xs\"\n >\n All\n </CommandItem>\n {filtered.map((o) => {\n const active = selected.includes(o.value);\n return (\n <CommandItem\n key={o.value}\n value={o.value}\n onSelect={() => toggle(o.value)}\n className={cn(\n \"gap-1.5 text-xs\",\n active && \"bg-accent text-accent-foreground\",\n )}\n >\n <span\n className={cn(\n \"flex h-3.5 w-3.5 shrink-0 items-center justify-center border\",\n single ? \"rounded-full\" : \"rounded-sm\",\n active\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-muted-foreground/40\",\n )}\n >\n {active && <CheckIcon className=\"h-2.5 w-2.5\" />}\n </span>\n {o.label}\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </div>\n );\n}\n\nfunction NumberFilterBody({\n value,\n onChange,\n}: {\n value: ColumnFilterValue | undefined;\n onChange: (next: ColumnFilterValue | undefined) => void;\n}) {\n const min = value?.kind === \"number\" ? value.min : undefined;\n const max = value?.kind === \"number\" ? value.max : undefined;\n const [minText, setMinText] = useState(min !== undefined ? String(min) : \"\");\n const [maxText, setMaxText] = useState(max !== undefined ? String(max) : \"\");\n\n const commit = (raw: string, which: \"min\" | \"max\") => {\n const nextMin = which === \"min\" ? parseOptionalNumber(raw) : min;\n const nextMax = which === \"max\" ? parseOptionalNumber(raw) : max;\n if (nextMin === undefined && nextMax === undefined) {\n onChange(undefined);\n return;\n }\n onChange({ kind: \"number\", min: nextMin, max: nextMax });\n };\n\n return (\n <div className=\"space-y-1.5 px-1\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n Range\n </p>\n {(min !== undefined || max !== undefined) && (\n <button\n type=\"button\"\n className=\"text-[11px] text-muted-foreground hover:text-foreground\"\n onClick={() => {\n setMinText(\"\");\n setMaxText(\"\");\n onChange(undefined);\n }}\n >\n clear\n </button>\n )}\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Input\n data-matrx-filter-autofocus\n value={minText}\n onChange={(e) => setMinText(e.target.value)}\n onBlur={(e) => commit(e.target.value, \"min\")}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.currentTarget.blur();\n }}\n placeholder=\"min\"\n className=\"h-8 font-mono text-xs\"\n style={{ fontSize: \"16px\" }}\n />\n <span className=\"text-xs text-muted-foreground\">–</span>\n <Input\n value={maxText}\n onChange={(e) => setMaxText(e.target.value)}\n onBlur={(e) => commit(e.target.value, \"max\")}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.currentTarget.blur();\n }}\n placeholder=\"max\"\n className=\"h-8 font-mono text-xs\"\n style={{ fontSize: \"16px\" }}\n />\n </div>\n </div>\n );\n}\n\nfunction parseOptionalNumber(raw: string): number | undefined {\n if (raw.trim() === \"\") return undefined;\n const n = Number(raw.replace(/[^0-9.-]/g, \"\"));\n return Number.isFinite(n) ? n : undefined;\n}\n","\"use client\";\n\n/**\n * Command — ported verbatim from matrx-frontend `components/ui/command.tsx`.\n *\n * `cmdk` is a SANCTIONED REAL DEPENDENCY (the vaul ↔ BottomSheet precedent):\n * the filtering/scoring/keyboard engine IS the component's product — there is\n * no Command palette without it, and reimplementing type-ahead ranking plus\n * roving keyboard selection would twin a maintained library rather than our\n * own code. See FEATURE.md.\n *\n * Seam inversions:\n * - `MagnifyingGlassIcon` comes from the package's inlined SVGs (C19), not\n * @radix-ui/react-icons.\n * - `CommandDialog` composed the host dialog module (`Dialog`, `DialogContent`,\n * `DialogTitle`). Those pieces are inlined privately below with identical\n * behavior — modal context, overlay, desktop card / mobile bottom-sheet\n * geometry, close control, portal — except the host's popout-aware\n * `DialogPortal` becomes the package's `PortalContainerProvider` seam\n * (plus an explicit `container` prop, which keeps top priority).\n * - The host's `useIsMobile` (a plain matchMedia breakpoint hook, not\n * host-shaped) became the package's own `./use-is-mobile`, with the same\n * 768px breakpoint. It started life inlined here; `Dialog` needed the same\n * answer, so it moved to a module both read rather than being copied.\n */\n\nimport type { DialogProps } from \"@radix-ui/react-dialog\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport {\n CENTERED_DIALOG,\n MOTION_BOTTOM_SHEET,\n MOTION_DIALOG,\n MOTION_OVERLAY,\n} from \"./motion\";\nimport { MagnifyingGlassIcon, XIcon } from \"./icons\";\nimport { usePortalContainer } from \"./portal-container\";\nimport {\n RadixDialogModalProvider,\n useRadixDialogModal,\n} from \"./radix-dialog-modal-context\";\nimport { useIsMobile } from \"./use-is-mobile\";\n\nexport const Command = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\n className,\n )}\n {...props}\n />\n));\nCommand.displayName = CommandPrimitive.displayName;\n\n/* ------------------------------------------------------------------ */\n/* Private dialog internals for CommandDialog (host dialog module, */\n/* behavior-identical, portal seam inverted). */\n/* ------------------------------------------------------------------ */\n\nconst DIALOG_DESKTOP_CLASSES =\n `fixed left-[50%] top-[50%] z-[10000] grid min-w-0 w-full max-w-lg ${CENTERED_DIALOG} gap-4 overflow-x-clip border bg-background p-6 shadow-lg [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full sm:rounded-lg`;\n\nconst DIALOG_MOBILE_SHEET_CLASSES =\n \"fixed inset-x-0 bottom-0 left-0 right-0 top-auto z-[10000] flex min-w-0 flex-col w-full max-w-full max-h-[90dvh] translate-x-0 translate-y-0 gap-4 overflow-x-clip border-t bg-background p-4 pb-safe shadow-lg [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full rounded-t-2xl rounded-b-none overflow-y-auto overscroll-contain\";\n\n// Re-asserted LAST so the sheet geometry always wins over any caller className.\nconst DIALOG_MOBILE_SHEET_OVERRIDE =\n \"inset-x-0 bottom-0 left-0 right-0 top-auto translate-x-0 translate-y-0 w-full max-w-full max-h-[90dvh] rounded-b-none rounded-t-2xl overflow-y-auto\";\n\nconst CommandDialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n container?: HTMLElement | null;\n }\n>(({ className, children, container, ...props }, ref) => {\n const isMobile = useIsMobile();\n const isModal = useRadixDialogModal();\n const portalContainer = usePortalContainer(container);\n return (\n <DialogPrimitive.Portal container={portalContainer}>\n {isModal ? (\n <DialogPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-[10000] bg-[var(--matrx-overlay-scrim-soft)]\",\n MOTION_OVERLAY,\n )}\n />\n ) : null}\n <DialogPrimitive.Content\n ref={ref}\n aria-modal={isModal || undefined}\n aria-describedby={undefined}\n className={cn(\n isMobile ? DIALOG_MOBILE_SHEET_CLASSES : DIALOG_DESKTOP_CLASSES,\n isMobile ? MOTION_BOTTOM_SHEET : MOTION_DIALOG,\n className,\n isMobile && DIALOG_MOBILE_SHEET_OVERRIDE,\n !isModal && \"z-[900]\",\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-2 top-4 flex h-10 w-10 items-center justify-center rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground sm:right-4\">\n <XIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n );\n});\nCommandDialogContent.displayName = \"CommandDialogContent\";\n\nexport interface CommandDialogProps extends DialogProps {\n /** Explicit portal target for the dialog; beats the injected seam. */\n container?: HTMLElement | null;\n}\n\nexport const CommandDialog = ({\n children,\n container,\n ...props\n}: CommandDialogProps) => {\n const modal = props.modal ?? true;\n return (\n <RadixDialogModalProvider modal={modal}>\n <DialogPrimitive.Root {...props} modal={modal}>\n <CommandDialogContent\n className=\"overflow-hidden p-0\"\n {...(container !== undefined ? { container } : {})}\n >\n <DialogPrimitive.Title className=\"sr-only\"></DialogPrimitive.Title>\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </CommandDialogContent>\n </DialogPrimitive.Root>\n </RadixDialogModalProvider>\n );\n};\n\nexport const CommandInput = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b px-3\" cmdk-input-wrapper=\"\">\n <MagnifyingGlassIcon className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n \"flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n </div>\n));\nCommandInput.displayName = CommandPrimitive.Input.displayName;\n\nexport const CommandList = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\n {...props}\n />\n));\nCommandList.displayName = CommandPrimitive.List.displayName;\n\nexport const CommandEmpty = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n));\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName;\n\nexport const CommandGroup = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\n className,\n )}\n {...props}\n />\n));\nCommandGroup.displayName = CommandPrimitive.Group.displayName;\n\nexport const CommandSeparator = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n));\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName;\n\nexport const CommandItem = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n));\nCommandItem.displayName = CommandPrimitive.Item.displayName;\n\nexport const CommandShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n};\nCommandShortcut.displayName = \"CommandShortcut\";\n","\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n} from \"react\";\nimport {\n clampColumnWidth,\n columnResizeCssVar,\n resolveColumnResizeBounds,\n} from \"./column-resize\";\n\nexport interface ColumnResizeHandleProps {\n columnId: string;\n label: string;\n tableRef: RefObject<HTMLTableElement | null>;\n minWidth?: number | undefined;\n maxWidth?: number | undefined;\n disabled?: boolean | undefined;\n /** Captures the table's rendered geometry before a pointer preview can affect auto layout. */\n onResizeStart?: (() => void) | undefined;\n /** Clears a parent-owned pointer snapshot when a resize is abandoned. */\n onResizeCancel?: (() => void) | undefined;\n /** Called once when a pointer resize is released, and once per keyboard adjustment. */\n onResizeCommit: (columnId: string, width: number) => void;\n}\n\ninterface ActiveResize {\n pointerId: number;\n startX: number;\n startWidth: number;\n priorPreview: string;\n}\n\nconst KEYBOARD_STEP = 8;\nconst KEYBOARD_LARGE_STEP = 24;\n\n/**\n * A standalone header-edge separator. Pointer moves write only a CSS variable\n * on the table in rAF; React state and the parent column state change only on\n * release, preventing a full table render for every physical pointer event.\n */\nexport function ColumnResizeHandle({\n columnId,\n label,\n tableRef,\n minWidth,\n maxWidth,\n disabled = false,\n onResizeStart,\n onResizeCancel,\n onResizeCommit,\n}: ColumnResizeHandleProps) {\n const handleRef = useRef<HTMLButtonElement | null>(null);\n const activeResizeRef = useRef<ActiveResize | null>(null);\n const previewRafRef = useRef<number | null>(null);\n const queuedWidthRef = useRef<number | null>(null);\n const keyboardWidthRef = useRef<number | null>(null);\n const [announcedWidth, setAnnouncedWidth] = useState<number | null>(null);\n const bounds = resolveColumnResizeBounds(minWidth, maxWidth);\n const cssVar = columnResizeCssVar(columnId);\n\n const readWidth = useCallback(() => {\n const header = handleRef.current?.closest(\"th\");\n const measured = header?.getBoundingClientRect().width ?? 0;\n const computed = header ? Number.parseFloat(getComputedStyle(header).width) : 0;\n return clampColumnWidth(measured || computed || keyboardWidthRef.current || bounds.minWidth, bounds);\n }, [bounds]);\n\n const writePreview = useCallback((width: number) => {\n tableRef.current?.style.setProperty(cssVar, `${width}px`);\n }, [cssVar, tableRef]);\n\n const queuePreview = useCallback((width: number) => {\n queuedWidthRef.current = width;\n if (previewRafRef.current !== null) return;\n previewRafRef.current = requestAnimationFrame(() => {\n previewRafRef.current = null;\n const nextWidth = queuedWidthRef.current;\n queuedWidthRef.current = null;\n if (nextWidth !== null) writePreview(nextWidth);\n });\n }, [writePreview]);\n\n const clearQueuedPreview = useCallback(() => {\n if (previewRafRef.current !== null) cancelAnimationFrame(previewRafRef.current);\n previewRafRef.current = null;\n queuedWidthRef.current = null;\n }, []);\n\n const finishPointerResize = useCallback((commit: boolean) => {\n const active = activeResizeRef.current;\n if (!active) return;\n activeResizeRef.current = null;\n clearQueuedPreview();\n const table = tableRef.current;\n const width = keyboardWidthRef.current ?? active.startWidth;\n if (!commit) {\n if (active.priorPreview) table?.style.setProperty(cssVar, active.priorPreview);\n else table?.style.removeProperty(cssVar);\n onResizeCancel?.();\n } else {\n writePreview(width);\n setAnnouncedWidth(width);\n onResizeCommit(columnId, width);\n }\n if (handleRef.current?.hasPointerCapture(active.pointerId)) {\n handleRef.current.releasePointerCapture(active.pointerId);\n }\n }, [clearQueuedPreview, columnId, cssVar, onResizeCancel, onResizeCommit, tableRef, writePreview]);\n\n useEffect(() => () => clearQueuedPreview(), [clearQueuedPreview]);\n\n const onPointerDown = (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (disabled || event.button !== 0 || !event.isPrimary) return;\n event.preventDefault();\n event.stopPropagation();\n const startWidth = readWidth();\n keyboardWidthRef.current = startWidth;\n // Native auto layout can redistribute sibling columns as soon as the\n // preview variable is written. Let the table capture all current widths\n // before that first write so switching to fixed layout preserves them.\n onResizeStart?.();\n activeResizeRef.current = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startWidth,\n priorPreview: tableRef.current?.style.getPropertyValue(cssVar) ?? \"\",\n };\n event.currentTarget.setPointerCapture(event.pointerId);\n };\n\n const onPointerMove = (event: ReactPointerEvent<HTMLButtonElement>) => {\n const active = activeResizeRef.current;\n if (!active || active.pointerId !== event.pointerId) return;\n event.preventDefault();\n event.stopPropagation();\n const width = clampColumnWidth(active.startWidth + event.clientX - active.startX, bounds);\n keyboardWidthRef.current = width;\n queuePreview(width);\n };\n\n const onPointerUp = (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (activeResizeRef.current?.pointerId !== event.pointerId) return;\n event.preventDefault();\n event.stopPropagation();\n finishPointerResize(true);\n };\n\n const onPointerCancel = (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (activeResizeRef.current?.pointerId !== event.pointerId) return;\n event.preventDefault();\n event.stopPropagation();\n finishPointerResize(false);\n };\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return;\n // Saved views and controlled owners can replace the width between keys.\n // Start from the rendered column rather than a previous gesture's cache.\n const current = readWidth();\n const step = event.shiftKey ? KEYBOARD_LARGE_STEP : KEYBOARD_STEP;\n const width = event.key === \"ArrowLeft\"\n ? current - step\n : event.key === \"ArrowRight\"\n ? current + step\n : event.key === \"Home\"\n ? bounds.minWidth\n : event.key === \"End\"\n ? bounds.maxWidth\n : null;\n if (width === null) return;\n event.preventDefault();\n event.stopPropagation();\n const nextWidth = clampColumnWidth(width, bounds);\n keyboardWidthRef.current = nextWidth;\n // Match pointer resizing: native auto layout must be measured before this\n // preview can redistribute sibling columns.\n onResizeStart?.();\n writePreview(nextWidth);\n setAnnouncedWidth(nextWidth);\n onResizeCommit(columnId, nextWidth);\n };\n\n const currentWidth = announcedWidth ?? keyboardWidthRef.current ?? bounds.minWidth;\n return (\n <button\n ref={handleRef}\n type=\"button\"\n role=\"separator\"\n aria-label={`Resize ${label}`}\n aria-orientation=\"vertical\"\n aria-valuemin={bounds.minWidth}\n aria-valuemax={bounds.maxWidth}\n aria-valuenow={currentWidth}\n aria-valuetext={`${currentWidth} pixels`}\n disabled={disabled}\n onFocus={() => {\n const width = readWidth();\n keyboardWidthRef.current = width;\n setAnnouncedWidth(width);\n }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerCancel}\n onLostPointerCapture={() => finishPointerResize(false)}\n onKeyDown={onKeyDown}\n className=\"absolute inset-y-0 right-0 z-20 hidden w-3 translate-x-1/2 cursor-col-resize touch-none select-none border-0 bg-transparent p-0 outline-none after:absolute after:inset-y-1 after:left-1/2 after:w-px after:-translate-x-1/2 after:bg-transparent hover:after:bg-primary focus-visible:after:bg-primary focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none sm:block\"\n />\n );\n}\n","export const DEFAULT_COLUMN_MIN_WIDTH = 80;\nexport const DEFAULT_COLUMN_MAX_WIDTH = 1200;\n\nexport interface ColumnResizeBounds {\n minWidth: number;\n maxWidth: number;\n}\n\n/** A CSS custom-property name that is stable for every valid table column id. */\nexport function columnResizeCssVar(columnId: string): string {\n const encoded = Array.from(columnId, (character) => character.codePointAt(0)!.toString(36)).join(\"-\");\n return `--matrx-col-resize-${encoded || \"column\"}`;\n}\n\nexport function resolveColumnResizeBounds(\n minWidth: number | undefined,\n maxWidth: number | undefined,\n): ColumnResizeBounds {\n const min = Number.isFinite(minWidth) ? Math.max(0, minWidth!) : DEFAULT_COLUMN_MIN_WIDTH;\n const requestedMax = Number.isFinite(maxWidth) ? maxWidth! : DEFAULT_COLUMN_MAX_WIDTH;\n return { minWidth: min, maxWidth: Math.max(min, requestedMax) };\n}\n\nexport function clampColumnWidth(width: number, bounds: ColumnResizeBounds): number {\n return Math.round(Math.min(bounds.maxWidth, Math.max(bounds.minWidth, width)));\n}\n\n/**\n * Saved widths are intentionally sparse: omitted values retain a column's\n * declared width/content-size behavior, which keeps old saved views valid.\n */\nexport function normalizeColumnWidthMap(\n widths: Record<string, unknown> | undefined,\n knownColumnIds: ReadonlySet<string>,\n): Record<string, number> {\n if (!widths) return {};\n const normalized: Record<string, number> = {};\n for (const [columnId, width] of Object.entries(widths)) {\n if (!knownColumnIds.has(columnId) || typeof width !== \"number\" || !Number.isFinite(width) || width <= 0) continue;\n normalized[columnId] = Math.round(width);\n }\n return normalized;\n}\n","export interface ColumnDragPreview {\n draggedId: string;\n targetId: string | null;\n after: boolean;\n}\n\n/**\n * Project a header drag without committing the caller-owned column order.\n * Rendering this order makes the drop destination a full column shadow and\n * shifts every sibling into the same position the eventual drop will commit.\n */\nexport function projectColumnDragOrder(\n orderedIds: readonly string[],\n preview: ColumnDragPreview | null,\n): string[] {\n const order = [...orderedIds];\n if (!preview?.targetId || preview.draggedId === preview.targetId) return order;\n\n const draggedIndex = order.indexOf(preview.draggedId);\n const targetIndex = order.indexOf(preview.targetId);\n if (draggedIndex < 0 || targetIndex < 0) return order;\n\n order.splice(draggedIndex, 1);\n const insertion = order.indexOf(preview.targetId) + (preview.after ? 1 : 0);\n order.splice(insertion, 0, preview.draggedId);\n return order;\n}\n","import { columnId, getFilterValue, matchesTableSearch, stringifyCellValue } from \"./filter-engine\";\nimport type { MatrxColumnDef, TableSearchMatchMode } from \"./types\";\n\nexport type TableSearchRole = \"id\" | \"name\" | \"description\" | \"other\";\nexport interface TableSearchScope { id: string; label: string; fields?: readonly string[]; }\nexport interface TableRankedSearchOptions {\n scope?: string;\n roles?: Readonly<Record<string, TableSearchRole>>;\n scopes?: readonly TableSearchScope[];\n matchMode?: TableSearchMatchMode;\n}\n\n/** Column metadata overrides inference; identity substrings always outrank prose. */\nexport function inferTableSearchRole(field: string): TableSearchRole {\n const key = field.replace(/([a-z])([A-Z])/g, \"$1_$2\").toLowerCase().replace(/[\\s-]+/g, \"_\");\n if (key === \"id\" || key === \"uuid\" || key.endsWith(\"_id\")) return \"id\";\n if (/^(name|alias|label|title|key|slug|display_name|common_name|model_name)$/.test(key) || /_(name|label|title)$/.test(key)) return \"name\";\n if (/^(description|summary|details|notes|blurb)$/.test(key) || key.endsWith(\"_description\")) return \"description\";\n return \"other\";\n}\n\nfunction searchableFields<T>(row: T, columns: readonly MatrxColumnDef<T>[]): Map<string, string> {\n const values = new Map<string, string>();\n // A hidden column remains searchable. Loaded fields without a visible column\n // also participate; this does not fetch or imply access to additional records.\n if (row !== null && typeof row === \"object\") {\n for (const [key, value] of Object.entries(row)) values.set(key, stringifyCellValue(value));\n }\n for (const column of columns) {\n if (column.accessorKey || column.accessorFn || column.filterValue) {\n values.set(columnId(column), stringifyCellValue(getFilterValue(row, column)));\n }\n }\n return values;\n}\n\nexport function resolveTableSearchScopes<T>(rows: readonly T[], columns: readonly MatrxColumnDef<T>[], options: TableRankedSearchOptions = {}): TableSearchScope[] {\n const fields = new Set(columns.filter(c => c.accessorKey || c.accessorFn || c.filterValue).map(columnId));\n for (const row of rows) if (row !== null && typeof row === \"object\") Object.keys(row).forEach(key => fields.add(key));\n const roles = new Set([...fields].map(key => options.roles?.[key] ?? inferTableSearchRole(key)));\n const scopes: TableSearchScope[] = [{ id: \"all\", label: \"All\" }];\n for (const [id, label] of [[\"id\", \"ID\"], [\"name\", \"Name\"], [\"description\", \"Description\"]] as const) {\n if (roles.has(id)) scopes.push({ id, label });\n }\n for (const scope of options.scopes ?? []) if (!scopes.some(s => s.id === scope.id) && scope.fields?.length) scopes.push(scope);\n return scopes;\n}\n\n/** Apply to the complete authorized result BEFORE slicing pages. Remote owners\n * must implement the same contract at their source, never on a partial page. */\nexport function rankTableSearchRows<T>(rows: readonly T[], columns: readonly MatrxColumnDef<T>[], query: string, options: TableRankedSearchOptions = {}, extraText?: (row: T) => string): T[] {\n const q = query.trim().toLocaleLowerCase();\n if (!q) return [...rows];\n const scope = options.scope ?? \"all\";\n const customScope = options.scopes?.find(s => s.id === scope);\n const mode = options.matchMode ?? \"contains\";\n return rows.flatMap((row, index) => {\n const fields = [...searchableFields(row, columns)].filter(([key]) => {\n if (scope === \"all\") return true;\n if (customScope) return customScope.fields?.includes(key) ?? false;\n return (options.roles?.[key] ?? inferTableSearchRole(key)) === scope;\n });\n const extra = scope === \"all\" ? extraText?.(row) : undefined;\n const texts = fields.map(([, value]) => value);\n if (extra) texts.push(extra);\n const matched = mode === \"whole_words\"\n ? matchesTableSearch(texts.join(\" \"), q, mode)\n : texts.some(value => matchesTableSearch(value, q, mode));\n if (!matched) return [];\n let rank = 3;\n for (const [key, value] of fields) {\n if (!matchesTableSearch(value, q, mode)) continue;\n const role = options.roles?.[key] ?? inferTableSearchRole(key);\n if (role === \"id\" || role === \"name\") rank = Math.min(rank, value.trim().toLocaleLowerCase() === q ? 0 : 1);\n else if (role === \"description\") rank = Math.min(rank, 2);\n }\n return [{ row, rank, index }];\n }).sort((a, b) => a.rank - b.rank || a.index - b.index).map(item => item.row);\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { useDndMonitor, useDraggable, useDroppable } from \"@dnd-kit/core\";\nimport { Button } from \"../button\";\nimport { Checkbox } from \"../checkbox\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../dialog\";\nimport { cn } from \"../cn\";\nimport { ArrowDown, ArrowUp, GripVertical } from \"./icons\";\nimport { columnId } from \"./filter-engine\";\nimport type { MatrxColumnDef } from \"./types\";\n\ninterface ColumnManagerProps<T> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n columns: MatrxColumnDef<T>[];\n order: string[];\n hidden: Set<string>;\n onApply: (order: string[], hidden: Set<string>) => void;\n}\n\n/** Package-owned column visibility and order editor shared by every table. */\nexport function ColumnManager<T>({\n open,\n onOpenChange,\n columns,\n order,\n hidden,\n onApply,\n}: ColumnManagerProps<T>) {\n const byId = useMemo(\n () => new Map(columns.map((column) => [columnId(column), column])),\n [columns],\n );\n const [draftOrder, setDraftOrder] = useState(order);\n const [draftHidden, setDraftHidden] = useState(() => new Set(hidden));\n const [draggedColumnId, setDraggedColumnId] = useState<string | null>(null);\n const [dropTarget, setDropTarget] = useState<string | null>(null);\n\n useEffect(() => {\n if (!open) return;\n setDraftOrder(order);\n setDraftHidden(new Set(hidden));\n }, [open, order, hidden]);\n\n const move = (id: string, direction: -1 | 1) => {\n setDraftOrder((current) => {\n const index = current.indexOf(id);\n const target = index + direction;\n if (index < 0 || target < 0 || target >= current.length) return current;\n const next = [...current];\n const displaced = next[target];\n if (displaced === undefined) return current;\n next[target] = id;\n next[index] = displaced;\n return next;\n });\n };\n\n const moveTo = (id: string, targetId: string) => {\n if (id === targetId) return;\n setDraftOrder((current) => {\n const from = current.indexOf(id);\n const target = current.indexOf(targetId);\n if (from < 0 || target < 0) return current;\n const next = [...current];\n next.splice(from, 1);\n const targetAfterRemoval = next.indexOf(targetId);\n next.splice(targetAfterRemoval, 0, id);\n return next;\n });\n };\n\n // This dialog is rendered inside the table's DndContext. Keeping the draft\n // order here means Cancel still discards a drag, while the shared pointer\n // sensor gives mouse, touch, and pen identical behavior.\n useDndMonitor({\n onDragStart(event) {\n if (event.active.data.current?.matrxDragKind !== \"column-manager\") return;\n setDraggedColumnId(String(event.active.data.current.columnId));\n },\n onDragOver(event) {\n if (event.active.data.current?.matrxDragKind !== \"column-manager\") return;\n const overData = event.over?.data.current;\n const target = overData?.matrxDragKind === \"column-manager\" ? overData.columnId : null;\n setDropTarget(target ? String(target) : null);\n },\n onDragCancel(event) {\n if (event.active.data.current?.matrxDragKind !== \"column-manager\") return;\n setDraggedColumnId(null);\n setDropTarget(null);\n },\n onDragEnd(event) {\n if (event.active.data.current?.matrxDragKind !== \"column-manager\") return;\n const dragged = String(event.active.data.current.columnId);\n const overData = event.over?.data.current;\n const target = overData?.matrxDragKind === \"column-manager\" ? overData.columnId : null;\n setDraggedColumnId(null);\n setDropTarget(null);\n if (target) moveTo(dragged, String(target));\n },\n });\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Columns</DialogTitle>\n <DialogDescription>\n Choose the columns to show and set their order.\n </DialogDescription>\n </DialogHeader>\n <div className=\"max-h-[55dvh] divide-y overflow-y-auto rounded-md border\">\n {draftOrder.map((id, index) => {\n const column = byId.get(id);\n if (!column) return null;\n const label = typeof column.header === \"string\" ? column.header : id;\n const hideable = column.hideable !== false;\n const visible = !draftHidden.has(id);\n return (\n <ColumnManagerDropTarget\n key={id}\n id={id}\n className={cn(\n \"flex items-center gap-2 px-2 py-2\",\n !visible && \"bg-muted/30 text-muted-foreground\",\n dropTarget === id && draggedColumnId !== id && \"border-t-2 border-primary\",\n )}\n >\n <ColumnManagerDragHandle id={id} label={label} />\n <Checkbox\n checked={visible}\n disabled={!hideable}\n aria-label={`${visible ? \"Hide\" : \"Show\"} ${label}`}\n onCheckedChange={(checked) => {\n if (!hideable) return;\n setDraftHidden((current) => {\n const next = new Set(current);\n if (checked) next.delete(id);\n else next.add(id);\n return next;\n });\n }}\n />\n <span className=\"min-w-0 flex-1 truncate text-sm\">{label}</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label={`Move ${label} earlier`}\n disabled={index === 0}\n onClick={() => move(id, -1)}\n >\n <ArrowUp className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label={`Move ${label} later`}\n disabled={index === draftOrder.length - 1}\n onClick={() => move(id, 1)}\n >\n <ArrowDown className=\"h-4 w-4\" />\n </Button>\n </ColumnManagerDropTarget>\n );\n })}\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n onApply(draftOrder, draftHidden);\n onOpenChange(false);\n }}\n >\n Apply columns\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ColumnManagerDropTarget({\n id,\n className,\n children,\n}: {\n id: string;\n className: string;\n children: ReactNode;\n}) {\n const { setNodeRef } = useDroppable({\n id: `matrx-column-manager:${id}`,\n data: { matrxDragKind: \"column-manager\", columnId: id },\n });\n return (\n <div ref={setNodeRef} data-matrx-column-manager-drop-target={id} className={className}>\n {children}\n </div>\n );\n}\n\nfunction ColumnManagerDragHandle({ id, label }: { id: string; label: string }) {\n const { attributes, listeners, setNodeRef } = useDraggable({\n id: `matrx-column-manager:${id}`,\n data: { matrxDragKind: \"column-manager\", columnId: id },\n });\n return (\n <button\n ref={setNodeRef}\n type=\"button\"\n className=\"flex h-10 w-10 shrink-0 touch-none cursor-grab items-center justify-center text-muted-foreground hover:text-foreground active:cursor-grabbing\"\n aria-label={`Reorder ${label}`}\n title={`Drag to reorder ${label}`}\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n );\n}\n","import { z } from \"zod\";\nimport { LAYERED_FILTER_OPERATORS } from \"./layered-filters\";\nimport type { ColumnFiltersState, TableViewSnapshot } from \"./types\";\n\nconst filterSchema = z.union([\n z.object({ kind: z.literal(\"text\"), value: z.string(), mode: z.enum([\"contains\", \"empty\", \"not_empty\", \"null\", \"not_null\"]).optional(), negated: z.boolean().optional() }),\n z.object({ kind: z.literal(\"select\"), value: z.string(), values: z.array(z.string()).optional(), negated: z.boolean().optional() }),\n z.object({ kind: z.literal(\"boolean\"), value: z.boolean(), negated: z.boolean().optional() }),\n z.object({ kind: z.literal(\"number\"), min: z.number().optional(), max: z.number().optional(), negated: z.boolean().optional() }),\n]);\nconst layeredRuleSchema = z.object({ id: z.string().min(1), field: z.string().min(1), operator: z.enum(LAYERED_FILTER_OPERATORS), value: z.string(), valueTo: z.string().optional() });\nconst snapshotSchema = z.object({\n __kind: z.literal(\"matrx-table-view\"), version: z.literal(1),\n query: z.object({ pageSize: z.number().int().positive(), search: z.string(), searchMatchMode: z.enum([\"contains\", \"whole_words\"]).optional(), searchScope: z.string().min(1).optional(), anyOf: z.string(), layeredFilters: z.array(layeredRuleSchema).optional(), columnFilters: z.record(z.string(), filterSchema.optional()), sort: z.object({ id: z.string().min(1), direction: z.enum([\"asc\", \"desc\"]) }).nullable() }),\n columns: z.object({\n order: z.array(z.string().min(1)).refine((order) => new Set(order).size === order.length, {\n message: \"Column order must not contain duplicate IDs\",\n }),\n hidden: z.array(z.string().min(1)),\n widths: z.record(z.string(), z.number().finite().positive()).optional(),\n }),\n});\n\nfunction normalizeFilters(raw: z.infer<typeof snapshotSchema>[\"query\"][\"columnFilters\"]): ColumnFiltersState {\n const filters: ColumnFiltersState = {};\n for (const [id, value] of Object.entries(raw)) {\n if (value === undefined) continue;\n if (value.kind === \"text\") filters[id] = { kind: \"text\", value: value.value, ...(value.mode === undefined ? {} : { mode: value.mode }), ...(value.negated === undefined ? {} : { negated: value.negated }) };\n else if (value.kind === \"select\") filters[id] = { kind: \"select\", value: value.value, ...(value.values === undefined ? {} : { values: value.values }), ...(value.negated === undefined ? {} : { negated: value.negated }) };\n else if (value.kind === \"boolean\") filters[id] = { kind: \"boolean\", value: value.value, ...(value.negated === undefined ? {} : { negated: value.negated }) };\n else filters[id] = { kind: \"number\", ...(value.min === undefined ? {} : { min: value.min }), ...(value.max === undefined ? {} : { max: value.max }), ...(value.negated === undefined ? {} : { negated: value.negated }) };\n }\n return filters;\n}\n\n/** Defensive decoder for persisted JSON. Invalid snapshots are ignored by adapters. */\nexport function parseTableViewSnapshot(raw: unknown): TableViewSnapshot | null {\n const parsed = snapshotSchema.safeParse(raw);\n if (!parsed.success) return null;\n const { query, columns } = parsed.data;\n return {\n __kind: \"matrx-table-view\",\n version: 1,\n query: {\n pageSize: query.pageSize,\n search: query.search,\n ...(query.searchMatchMode === undefined ? {} : { searchMatchMode: query.searchMatchMode }),\n ...(query.searchScope === undefined ? {} : { searchScope: query.searchScope }),\n anyOf: query.anyOf,\n ...(query.layeredFilters === undefined ? {} : { layeredFilters: query.layeredFilters }),\n columnFilters: normalizeFilters(query.columnFilters),\n sort: query.sort,\n },\n columns: {\n order: columns.order,\n hidden: columns.hidden,\n ...(columns.widths === undefined ? {} : { widths: columns.widths }),\n },\n };\n}\n","\"use client\";\n\n/**\n * MatrxUuidCell — canonical UUID / FK display for dense tables.\n *\n * Port of aidream `UuidDisplay` + AI Models `UuidCell` + tool-call `ShortId`:\n * short prefix (8 chars), full value on hover, always-visible copy of the full\n * id. Optional FK open: in-app WindowPanel (`onOpen`) and/or route (`href`).\n * Forbidden targets stay copyable but are not navigable.\n *\n * THE DOOR LAW: \"never render an id you can't open\". Pass `token` (the canonical\n * entity token this id points at) and the cell resolves its own doors from the\n * registries — route, new tab, and peek — with no per-callsite wiring. Prefer\n * `EntityRef` whenever the record's NAME is available; this is the fallback for\n * a raw FK column where it genuinely isn't.\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n type MouseEvent,\n type ReactNode,\n} from \"react\";\nimport {\n Check,\n Copy,\n ExternalLink,\n Lightbulb,\n PanelRight,\n ShieldOff,\n} from \"./icons\";\nimport { useTableNotice } from \"./useTableNotice\";\nimport { useMatrxDataTableHost } from \"./host\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../tooltip\";\nimport { cn } from \"../cn\";\n\nconst SHORT_LEN = 8;\n\nexport function shortUuid(id: string, len = SHORT_LEN): string {\n return id.slice(0, len);\n}\n\nasync function copyText(text: string): Promise<boolean> {\n try {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // fall through\n }\n try {\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.style.position = \"fixed\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n const ok = document.execCommand(\"copy\");\n document.body.removeChild(ta);\n return ok;\n } catch {\n return false;\n }\n}\n\nexport type MatrxUuidOpenResult = void | \"forbidden\";\n\nexport interface MatrxUuidCellProps {\n value: string | null | undefined;\n /** Tooltip / copy label prefix (e.g. column name). */\n label?: string | undefined;\n /**\n * Open the referenced record in-app (prefer WindowPanel).\n * Return `\"forbidden\"` to block navigation and show a muted state.\n */\n onOpen?: (id: string) => MatrxUuidOpenResult | Promise<MatrxUuidOpenResult>;\n /** Optional real href (new tab / cmd-click). Used when navigation is allowed. */\n href?: string | null | undefined;\n /**\n * Canonical entity token this id points at (`agent`, `note`, `task`, …).\n * Supplies the route and the peek automatically — THE DOOR LAW, resolved\n * from the registries instead of wired per callsite. An explicit `href` /\n * `onOpen` still wins.\n */\n token?: string | null | undefined;\n /** Force non-navigable (still copyable). */\n forbidden?: boolean;\n className?: string;\n trailing?: ReactNode;\n}\n\nexport function MatrxUuidCell({\n value,\n label,\n onOpen,\n href,\n token,\n forbidden = false,\n className,\n trailing,\n}: MatrxUuidCellProps) {\n const { resolveEntityDoors, ResourcePeek } = useMatrxDataTableHost();\n const { notify, notice } = useTableNotice();\n const [copied, setCopied] = useState(false);\n const [opening, setOpening] = useState(false);\n const [peekOpen, setPeekOpen] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (timer.current) clearTimeout(timer.current);\n },\n [],\n );\n\n if (!value) {\n return <span className=\"text-muted-foreground/40\">—</span>;\n }\n\n const doors = token ? resolveEntityDoors?.(token, value, href) ?? null : null;\n const resolvedHref = doors?.href ?? href ?? null;\n const canPeek = Boolean(doors?.canPeek) && !forbidden;\n const display = shortUuid(value);\n const tip = label ? `${label}: ${value}` : value;\n\n const stop = (e: MouseEvent) => {\n e.stopPropagation();\n };\n\n const onCopy = (e: MouseEvent) => {\n stop(e);\n e.preventDefault();\n void copyText(value).then((ok) => {\n if (!ok) {\n notify?.error(\"Couldn't copy ID\");\n return;\n }\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), 1500);\n });\n };\n\n const handleOpen = async (e: MouseEvent) => {\n stop(e);\n e.preventDefault();\n if (!onOpen || forbidden || opening) return;\n setOpening(true);\n try {\n const result = await onOpen(value);\n if (result === \"forbidden\") {\n // access-errors: ok — relays the onOpen contract's explicit verdict: the caller's opener returns \"forbidden\" only after ITS OWN access check; the cell performs no read and never guesses\n notify?.error(\"You don't have access to open this record\");\n }\n } catch (err) {\n notify?.error(\n `Couldn't open: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n setOpening(false);\n }\n };\n\n const idNode = (() => {\n if (forbidden) {\n return (\n <span className=\"inline-flex min-w-0 items-center gap-1 font-mono text-xs text-muted-foreground/70 tabular-nums\">\n <span className=\"min-w-0 truncate\">{display}</span>\n <ShieldOff className=\"h-3 w-3 shrink-0 opacity-60\" aria-hidden />\n </span>\n );\n }\n\n if (onOpen) {\n return (\n <button\n type=\"button\"\n aria-label={`Open ${label ?? \"record\"} ${display}`}\n onClick={(e) => void handleOpen(e)}\n disabled={opening}\n className=\"inline-flex min-w-0 items-center gap-1 font-mono text-xs text-sky-600 hover:underline dark:text-sky-400 disabled:opacity-60\"\n >\n <span className=\"min-w-0 truncate tabular-nums\">{display}</span>\n <PanelRight className=\"h-3 w-3 shrink-0 opacity-50\" />\n </button>\n );\n }\n\n if (resolvedHref) {\n return (\n <a\n href={resolvedHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`Open ${label ?? \"record\"} ${display} in a new tab`}\n onClick={stop}\n className=\"inline-flex min-w-0 items-center gap-1 font-mono text-xs text-sky-600 hover:underline dark:text-sky-400\"\n >\n <span className=\"min-w-0 truncate tabular-nums\">{display}</span>\n <ExternalLink className=\"h-3 w-3 shrink-0 opacity-50\" />\n </a>\n );\n }\n\n return (\n <span className=\"min-w-0 truncate font-mono text-xs text-muted-foreground tabular-nums select-all\">\n {display}\n </span>\n );\n })();\n\n return (\n <TooltipProvider delayDuration={200}>\n <span\n data-matrx-cell-control\n className={cn(\n \"inline-flex min-w-0 max-w-full items-center gap-0.5 whitespace-nowrap\",\n className,\n )}\n onClick={stop}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex min-w-0 max-w-full items-center\">\n {idNode}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-sm break-all font-mono\">\n {forbidden ? `No access · ${tip}` : tip}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onCopy}\n aria-label={copied ? \"Copied\" : `Copy ${label ?? \"id\"}`}\n className={cn(\n \"inline-flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:text-foreground focus:outline-none\",\n copied && \"text-primary\",\n )}\n >\n {copied ? <Check className=\"h-3 w-3\" /> : <Copy className=\"h-3 w-3\" />}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{copied ? \"Copied\" : `Copy ${label ?? \"id\"}: ${value}`}</TooltipContent>\n </Tooltip>\n {canPeek ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => {\n stop(e);\n setPeekOpen(true);\n }}\n aria-label={`Quick look at ${label ?? \"record\"}`}\n className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:text-foreground focus:outline-none\"\n >\n <Lightbulb className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Quick look at {label ?? \"record\"}</TooltipContent>\n </Tooltip>\n ) : null}\n {onOpen && resolvedHref && !forbidden ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <a\n href={resolvedHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={stop}\n aria-label={`Open ${label ?? \"record\"} in a new tab`}\n className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:text-foreground focus:outline-none\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Open {label ?? \"record\"} in a new tab</TooltipContent>\n </Tooltip>\n ) : null}\n {trailing}\n {notice}\n {canPeek && peekOpen && ResourcePeek ? (\n <ResourcePeek\n kind={doors?.peekKind ?? token ?? \"record\"}\n id={value}\n onClose={() => setPeekOpen(false)}\n // Same contract as `EntityDoorControls`: forward the CALLER's raw\n // `href` so the peek's \"Open\" cannot send the user somewhere this\n // cell's own link does not go. `doors.ts` names EntityRef and this\n // cell as the two presentations that must not drift — the peek\n // override shipped on one of them first, which is exactly the drift\n // that file warns about.\n {...(href == null ? {} : { href })}\n />\n ) : null}\n </span>\n </TooltipProvider>\n );\n}\n","export function isUuidValue(value: unknown): value is string {\n return typeof value === \"string\" && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);\n}\nexport function tokenFromColumnName(name: string): string | null {\n return name.endsWith(\"_id\") ? name.slice(0, -3) : null;\n}\n","import { stringifyCellValue } from \"./filter-engine\";\n\n/** Display formatting only; copy/export and persistence retain the original value. */\nexport function formatTableDisplayValue(value: unknown): string {\n if (typeof value === \"number\") return value.toLocaleString(undefined, { maximumFractionDigits: 12 });\n if (value instanceof Date) return value.toLocaleString();\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/.test(value) && !Number.isNaN(Date.parse(value))) {\n return new Date(value).toLocaleString();\n }\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n return stringifyCellValue(value) || \"—\";\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../cn\";\nimport { CopyButtons } from \"./copy\";\nimport { MatrxUuidCell } from \"./MatrxUuidCell\";\nimport { isUuidValue } from \"./entity\";\nimport { formatTableDisplayValue } from \"./display-value\";\n\n/** No field is a door unless the caller says which token it points at. */\nconst noFieldToken = (): string | null => null;\n\nfunction formatValue(value: unknown): string {\n if (value == null) return \"—\";\n if (typeof value === \"string\") return value || \"—\";\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value instanceof Date) return value.toISOString();\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date)\n );\n}\n\n/**\n * Default detail / window View body for any row. Renders a scannable key/value\n * inspector. UUID-shaped values use MatrxUuidCell (short + copy). Every field\n * row gets hover-revealed Copy + Copy-for-AI buttons (set `fieldCopy={false}`\n * to opt out). Pass a custom `renderView` / `renderDetail` to replace it.\n */\nexport function DataRowInspector<T = unknown>({\n row,\n title,\n className,\n fieldCopy = true,\n recordKind = \"record\",\n recordLabel,\n location,\n tokenForField = noFieldToken,\n}: {\n row: T;\n title?: ReactNode;\n className?: string;\n /** Hover Copy + Copy-for-AI on every field row. Default true. */\n fieldCopy?: boolean;\n /** Stable slug for the record type, used in field agent payloads. */\n recordKind?: string;\n /** Human label for the record, used in toasts (\"Backlink · anchor_text\"). */\n recordLabel?: string;\n /** Where the user is, in words, for field agent payloads. */\n location?: string;\n /**\n * Maps one of this record's field names to the entity token its id points at,\n * turning that field into a door (route + peek).\n *\n * Defaults to NO doors, because this inspector renders arbitrary tables and a\n * wrong door opens a different record. A caller that has checked its FKs can\n * pass `tokenFromColumnName` (from `components/official/entity-ref/doors`) to\n * open every `<token>_id` field, or its own stricter map.\n */\n tokenForField?: (key: string, row: T) => string | null;\n}) {\n const entries = isPlainObject(row)\n ? Object.entries(row)\n : [[\"value\", row] as const];\n\n const fieldButtons = (key: string, value: unknown) =>\n fieldCopy ? (\n <div className=\"absolute right-1 top-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover/field:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label={recordLabel ? `${recordLabel} · ${key}` : key}\n human={() => formatValue(value)}\n agent={() => ({\n kind: `${recordKind}-field`,\n location: location ?? \"Data row inspector\",\n description: `The \"${key}\" field of one ${recordLabel ?? recordKind}.`,\n data: { field: key, value, record: row },\n attributes: { field: key },\n })}\n />\n </div>\n ) : null;\n\n return (\n <div\n className={cn(\"flex h-full min-h-0 flex-col overflow-hidden\", className)}\n >\n {title ? (\n <div className=\"shrink-0 border-b border-border px-3 py-2 text-sm font-medium\">\n {title}\n </div>\n ) : null}\n <div className=\"min-h-0 flex-1 overflow-auto p-3\">\n <dl className=\"space-y-2\">\n {entries.map(([key, value]) => {\n if (isUuidValue(value)) {\n return (\n <div\n key={key}\n className=\"group/field relative grid grid-cols-[minmax(7rem,9rem)_1fr] gap-2 rounded-md border border-border/60 bg-muted/20 px-2.5 py-2\"\n >\n <dt className=\"truncate text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {key}\n </dt>\n <dd className=\"min-w-0\">\n <MatrxUuidCell\n value={value}\n label={key}\n token={tokenForField(key, row)}\n />\n </dd>\n </div>\n );\n }\n\n const formatted = value !== null && typeof value === \"object\" && !(value instanceof Date)\n ? formatValue(value)\n : formatTableDisplayValue(value);\n const multiline = formatted.includes(\"\\n\") || formatted.length > 80;\n return (\n <div\n key={key}\n className=\"group/field relative grid grid-cols-[minmax(7rem,9rem)_1fr] gap-2 rounded-md border border-border/60 bg-muted/20 py-2 pl-2.5 pr-12\"\n >\n <dt className=\"truncate text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {key}\n </dt>\n <dd\n className={cn(\n \"min-w-0 text-sm text-foreground break-words\",\n multiline &&\n \"whitespace-pre-wrap font-mono text-xs leading-relaxed\",\n )}\n >\n {formatted}\n </dd>\n {fieldButtons(key, value)}\n </div>\n );\n })}\n </dl>\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * DataRowWindow — generic WindowPanel for any table row.\n *\n * Uses WindowPanel's built-in sidebar for View / Edit tabs when an edit body\n * is provided. Page-local close via `onClose` (no overlay required) so custom\n * JSX never has to travel through Redux.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { DefaultTableWindow } from \"./default-host\";\nimport { Eye, Pencil } from \"./icons\";\nimport { useMatrxDataTableHost } from \"./host\";\nimport { cn } from \"../cn\";\nimport { DataRowInspector } from \"./DataRowInspector\";\n\nexport type DataRowWindowTab = \"view\" | \"edit\";\n\nexport interface DataRowWindowProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string | undefined;\n /** Serializable row for the default inspector. Ignored when viewContent set. */\n row?: unknown | undefined;\n /**\n * Full-body override (no tabs). Escape hatch — prefer viewContent +\n * editContent so the window stays editable.\n */\n children?: React.ReactNode | undefined;\n /** View tab body. Defaults to DataRowInspector. */\n viewContent?: React.ReactNode | undefined;\n /** Edit tab body. When set, View/Edit sidebar tabs are shown. */\n editContent?: React.ReactNode | undefined;\n /** Which tab to open. Default: \"edit\" when editContent exists, else \"view\". */\n defaultTab?: DataRowWindowTab | undefined;\n /** Right-side header actions (e.g. CopyButtons for the whole record). */\n headerActions?: React.ReactNode | undefined;\n width?: number | undefined;\n height?: number | undefined;\n windowId?: string | undefined;\n}\n\nexport function DataRowWindow({\n isOpen,\n onClose,\n title = \"Row details\",\n row,\n children,\n viewContent,\n editContent,\n defaultTab,\n headerActions,\n width = 720,\n height = 560,\n windowId = \"matrx-data-row-window\",\n}: DataRowWindowProps) {\n const host = useMatrxDataTableHost();\n const WindowPanel = host.WindowPanel ?? DefaultTableWindow;\n const hasEdit = editContent != null;\n const hasTabs = hasEdit && children == null;\n const initialTab: DataRowWindowTab =\n defaultTab ?? (hasEdit ? \"edit\" : \"view\");\n const [tab, setTab] = useState<DataRowWindowTab>(initialTab);\n\n // Reset tab when the window opens on a different row / edit availability.\n useEffect(() => {\n if (!isOpen) return;\n setTab(defaultTab ?? (hasEdit ? \"edit\" : \"view\"));\n }, [isOpen, windowId, hasEdit, defaultTab]);\n\n if (!isOpen) return null;\n\n const viewBody = viewContent ?? <DataRowInspector row={row} />;\n\n // Same contract as the side panel: `viewContent` / `editContent` are custom\n // bodies (usually the table's `detail.render`) that mostly do NOT own their\n // own scrolling, so `overflow-hidden` here cut them off at the fold. The\n // container owns the scroll; a body that already scrolls resolves to this\n // container's height and still shows a single scrollbar.\n const body = children ?? (\n <div className=\"flex h-full min-h-0 flex-1 flex-col overflow-hidden\">\n {hasTabs ? (\n tab === \"edit\" ? (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{editContent}</div>\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{viewBody}</div>\n )\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{viewBody}</div>\n )}\n </div>\n );\n\n return (\n <WindowPanel\n id={windowId}\n title={title}\n onClose={onClose}\n width={width}\n height={height}\n minWidth={420}\n minHeight={320}\n actionsRight={headerActions}\n bodyClassName=\"flex min-h-0 flex-1 flex-col overflow-hidden p-0\"\n sidebarDefaultSize={140}\n sidebarMinSize={110}\n sidebar={\n hasTabs ? (\n <nav\n aria-label=\"Row window tabs\"\n className=\"flex h-full flex-col gap-0.5 overflow-y-auto p-1.5\"\n >\n <TabButton\n active={tab === \"view\"}\n icon={<Eye className=\"h-4 w-4 shrink-0\" />}\n label=\"View\"\n onClick={() => setTab(\"view\")}\n />\n <TabButton\n active={tab === \"edit\"}\n icon={<Pencil className=\"h-4 w-4 shrink-0\" />}\n label=\"Edit\"\n onClick={() => setTab(\"edit\")}\n />\n </nav>\n ) : undefined\n }\n >\n {body}\n </WindowPanel>\n );\n}\n\nfunction TabButton({\n active,\n icon,\n label,\n onClick,\n}: {\n active: boolean;\n icon: React.ReactNode;\n label: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={onClick}\n className={cn(\n \"flex items-center gap-2 rounded-md px-2.5 py-2 text-left text-sm transition-colors\",\n active\n ? \"bg-accent font-medium text-foreground\"\n : \"text-muted-foreground hover:bg-muted/60 hover:text-foreground\",\n )}\n >\n {icon}\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n </button>\n );\n}\n","import { isUuidValue } from \"./entity\";\nimport { columnId, getCellValue } from \"./filter-engine\";\nimport { inferTableSearchRole } from \"./ranked-search\";\nimport type { MatrxColumnDef } from \"./types\";\n\n/** Use the same name-field inference as search; visual column order is not identity. */\nexport function defaultRowTitle<T>(row: T, columns: readonly MatrxColumnDef<T>[]): string {\n const values = columns.map((column) => ({\n id: columnId(column),\n value: getCellValue(row, column),\n })).filter((entry): entry is { id: string; value: string } =>\n typeof entry.value === \"string\" && entry.value.trim().length > 0,\n );\n const named = values.find(({ id, value }) =>\n inferTableSearchRole(id) === \"name\" && !isUuidValue(value),\n );\n const identity = values.find(({ id }) => id === \"id\" || id === \"uuid\") ??\n values.find(({ id }) => inferTableSearchRole(id) === \"id\");\n const value = (named ?? identity ?? values[0])?.value.trim();\n return value ? isUuidValue(value) ? value.slice(0, 8) : value : \"Details\";\n}\n","\"use client\";\n\nimport { Loader2, Save, X } from \"./icons\";\nimport { Button } from \"../button\";\nimport { cn } from \"../cn\";\n\n/**\n * Floating dirty-session pill — Save / Cancel after inline edits.\n * Fixed bottom-center so it stays visible while scrolling the table.\n */\nexport function DirtySavePill({\n changeCount,\n saving,\n onSave,\n onCancel,\n className,\n}: {\n changeCount: number;\n saving?: boolean;\n onSave: () => void;\n onCancel: () => void;\n className?: string;\n}) {\n if (changeCount <= 0) return null;\n\n return (\n <div\n className={cn(\n \"pointer-events-none fixed inset-x-0 bottom-6 z-50 flex justify-center pb-safe\",\n className,\n )}\n >\n <div className=\"pointer-events-auto flex items-center gap-2 rounded-full border border-border bg-card px-3 py-1.5 shadow-lg elevation-2\">\n <span className=\"px-1 text-xs font-medium text-muted-foreground\">\n {changeCount} unsaved change{changeCount === 1 ? \"\" : \"s\"}\n </span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 gap-1.5 rounded-full border-dashed border-destructive/60 text-xs text-destructive hover:text-destructive\"\n disabled={saving}\n onClick={onCancel}\n >\n <X className=\"h-3.5 w-3.5\" />\n Cancel\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-7 gap-1.5 rounded-full text-xs\"\n disabled={saving}\n onClick={onSave}\n >\n {saving ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Save className=\"h-3.5 w-3.5\" />\n )}\n Save\n </Button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Typed inline cell editor. Strings edit in-place; non-strings open a small\n * popover (Supabase-style). Commits into the parent draft map — never persists\n * until the floating Save pill fires.\n */\n\nimport { useState } from \"react\";\nimport { Check, ChevronDown, Pencil, X } from \"./icons\";\nimport { Button } from \"../button\";\nimport { Checkbox } from \"../checkbox\";\nimport { Input } from \"../input\";\nimport { useMatrxDataTableHost } from \"./host\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport { cn } from \"../cn\";\nimport type { CellEditType } from \"./types\";\nimport { stringifyCellValue } from \"./filter-engine\";\n\ninterface EditableTableCellProps {\n value: unknown;\n editType: Exclude<CellEditType, false>;\n editOptions?: Array<{ value: string; label: string }>;\n display: React.ReactNode;\n dirty?: boolean;\n onCommit: (next: unknown) => void;\n className?: string;\n /**\n * D112: when the cell doubles as the row's title link, the display renders\n * as a real anchor (keyboard focus, SR semantics, middle-click) and editing\n * moves to a hover/focus-revealed pencil instead of click-text-to-edit.\n */\n href?: string;\n /**\n * `\"pencil\"` (or any `href`) → hover pencil only. `\"click\"` (default) →\n * click the cell body to edit. Whole-row click owners use `\"pencil\"` so the\n * body doesn't steal the gesture into edit mode.\n */\n editTrigger?: \"click\" | \"pencil\";\n}\n\n/** Display + hover-pencil shell; optional real link when `href` is set. */\nfunction CellEditShell({\n href,\n display,\n dirty,\n className,\n editButton,\n}: {\n href?: string;\n display: React.ReactNode;\n dirty?: boolean;\n className?: string;\n editButton: React.ReactNode;\n}) {\n const { Link: HostLink } = useMatrxDataTableHost();\n const Link = HostLink ?? ((props: { href: string; children: React.ReactNode; className?: string; onClick?: React.MouseEventHandler<HTMLAnchorElement> }) => <a {...props} />);\n return (\n <span\n className={cn(\n // overflow-hidden + min-w-0: table cells grow to min-content by default,\n // so a 10-page description must be clipped here — never via truncate on\n // this flex row (nowrap would stretch the whole table horizontally).\n \"group/cell-link flex w-full min-w-0 max-w-full items-center gap-1 overflow-hidden rounded px-0.5\",\n dirty && \"ring-1 ring-primary/40 bg-primary/5\",\n className,\n )}\n >\n {href ? (\n <Link\n href={href}\n onClick={(e) => e.stopPropagation()}\n className=\"min-w-0 flex-1 overflow-hidden truncate rounded outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {display}\n </Link>\n ) : (\n <span className=\"block min-w-0 flex-1 overflow-hidden\">{display}</span>\n )}\n {editButton}\n </span>\n );\n}\n\nconst CELL_PENCIL_CLASS =\n \"shrink-0 rounded p-0.5 text-muted-foreground opacity-100 transition-opacity hover:bg-muted/60 focus-visible:opacity-100 lg:opacity-0 group-hover/cell-link:opacity-100\";\n\nexport function EditableTableCell({\n value,\n editType,\n editOptions = [],\n display,\n dirty,\n onCommit,\n className,\n href,\n editTrigger = \"click\",\n}: EditableTableCellProps) {\n const [open, setOpen] = useState(false);\n // A linked cell always edits via pencil — the body is a real navigable link.\n const usePencil = Boolean(href) || editTrigger === \"pencil\";\n\n if (editType === \"string\") {\n return (\n <InlineStringEditor\n value={stringifyCellValue(value)}\n display={display}\n {...(dirty === undefined ? {} : { dirty })}\n onCommit={onCommit}\n {...(className === undefined ? {} : { className })}\n {...(href === undefined ? {} : { href })}\n usePencil={usePencil}\n />\n );\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n {usePencil ? (\n <CellEditShell\n {...(href === undefined ? {} : { href })}\n display={display}\n {...(dirty === undefined ? {} : { dirty })}\n {...(className === undefined ? {} : { className })}\n editButton={\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Edit\"\n onClick={(e) => e.stopPropagation()}\n className={CELL_PENCIL_CLASS}\n >\n <Pencil className=\"h-3 w-3\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Edit</TooltipContent>\n </Tooltip>\n }\n />\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => e.stopPropagation()}\n className={cn(\n \"group/cell-select flex w-full items-center gap-1 rounded px-0.5 text-left hover:bg-muted/60\",\n dirty && \"ring-1 ring-primary/40 bg-primary/5\",\n className,\n )}\n >\n <span className=\"min-w-0 flex-1 overflow-hidden\">{display}</span>\n {/*\n * MSR-08: a typed cell that opens a picker must LOOK pickable —\n * a bare chip with no chevron reads as inert text, not an\n * editable field (Arman: \"a dropdown and pick the option\"). The\n * chevron stays dim until hover/focus so it doesn't compete with\n * the value, but it is always PRESENT, never opacity-0.\n */}\n {editType === \"select\" ? (\n <ChevronDown className=\"h-3 w-3 shrink-0 text-muted-foreground/70 transition-colors group-hover/cell-select:text-foreground\" />\n ) : null}\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Edit value</TooltipContent>\n </Tooltip>\n )}\n <PopoverContent\n align=\"start\"\n className=\"w-56 p-2\"\n onClick={(e) => e.stopPropagation()}\n >\n <TypedEditor\n editType={editType}\n value={value}\n editOptions={editOptions}\n onCommit={(next) => {\n onCommit(next);\n setOpen(false);\n }}\n onCancel={() => setOpen(false)}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction InlineStringEditor({\n value,\n display,\n dirty,\n onCommit,\n className,\n href,\n usePencil,\n}: {\n value: string;\n display: React.ReactNode;\n dirty?: boolean;\n onCommit: (next: unknown) => void;\n className?: string;\n href?: string;\n usePencil: boolean;\n}) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(value);\n\n if (!editing) {\n if (usePencil) {\n return (\n <CellEditShell\n {...(href === undefined ? {} : { href })}\n display={display}\n {...(dirty === undefined ? {} : { dirty })}\n {...(className === undefined ? {} : { className })}\n editButton={\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Edit\"\n onClick={(e) => {\n e.stopPropagation();\n setDraft(value);\n setEditing(true);\n }}\n className={CELL_PENCIL_CLASS}\n >\n <Pencil className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Edit</TooltipContent>\n </Tooltip>\n }\n />\n );\n }\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setDraft(value);\n setEditing(true);\n }}\n className={cn(\n \"w-full rounded px-0.5 text-left hover:bg-muted/60\",\n dirty && \"ring-1 ring-primary/40 bg-primary/5\",\n className,\n )}\n >\n {display}\n </button>\n </TooltipTrigger>\n <TooltipContent>Click to edit</TooltipContent>\n </Tooltip>\n );\n }\n\n return (\n <Input\n autoFocus\n value={draft}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => {\n onCommit(draft);\n setEditing(false);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n onCommit(draft);\n setEditing(false);\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setEditing(false);\n }\n }}\n className=\"h-7 text-sm\"\n style={{ fontSize: \"16px\" }}\n />\n );\n}\n\nfunction TypedEditor({\n editType,\n value,\n editOptions,\n onCommit,\n onCancel,\n}: {\n editType: Exclude<CellEditType, false | \"string\">;\n value: unknown;\n editOptions: Array<{ value: string; label: string }>;\n onCommit: (next: unknown) => void;\n onCancel: () => void;\n}) {\n if (editType === \"boolean\") {\n const checked = Boolean(value);\n return (\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-xs font-medium\">Value</span>\n <Checkbox\n checked={checked}\n onCheckedChange={(v) => onCommit(v === true)}\n />\n </div>\n );\n }\n\n if (editType === \"number\") {\n return (\n <NumberEditor\n value={typeof value === \"number\" ? value : Number(value) || 0}\n onCommit={onCommit}\n onCancel={onCancel}\n />\n );\n }\n\n if (editType === \"tags\") {\n return (\n <TagsEditor\n value={Array.isArray(value) ? value.map(String) : []}\n suggestions={editOptions}\n onCommit={onCommit}\n onCancel={onCancel}\n />\n );\n }\n\n if (editType === \"select\") {\n return (\n <Select\n value={stringifyCellValue(value)}\n onValueChange={(v) => onCommit(v)}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {editOptions.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n }\n\n // date\n return (\n <Input\n type=\"date\"\n defaultValue={stringifyCellValue(value).slice(0, 10)}\n className=\"h-8 text-xs\"\n style={{ fontSize: \"16px\" }}\n onChange={(e) => {\n if (e.target.value) onCommit(e.target.value);\n }}\n />\n );\n}\n\n/**\n * Chips + free text. Existing values are offered as suggestions but never\n * enforced — a tag vocabulary that cannot grow from the row it describes stops\n * being used.\n */\nfunction TagsEditor({\n value,\n suggestions,\n onCommit,\n onCancel,\n}: {\n value: string[];\n suggestions: Array<{ value: string; label: string }>;\n onCommit: (next: unknown) => void;\n onCancel: () => void;\n}) {\n const [tags, setTags] = useState<string[]>(value);\n const [draft, setDraft] = useState(\"\");\n\n const add = (raw: string) => {\n const next = raw.trim();\n if (!next || tags.includes(next)) return;\n setTags([...tags, next]);\n setDraft(\"\");\n };\n\n const matches = suggestions\n .filter(\n (s) =>\n !tags.includes(s.value) &&\n s.value !== \"__none__\" &&\n (!draft || s.label.toLowerCase().includes(draft.trim().toLowerCase())),\n )\n .slice(0, 6);\n\n return (\n <div className=\"space-y-2\" onClick={(e) => e.stopPropagation()}>\n <div className=\"flex flex-wrap gap-1\">\n {tags.length === 0 && (\n <span className=\"text-xs text-muted-foreground\">No tags</span>\n )}\n {tags.map((tag) => (\n <Tooltip key={tag}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setTags(tags.filter((t) => t !== tag))}\n aria-label={`Remove ${tag}`}\n className=\"inline-flex items-center gap-1 rounded-full border border-border px-2 py-0.5 text-[11px] hover:border-destructive hover:text-destructive\"\n >\n {tag}\n <X className=\"h-2.5 w-2.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Remove {tag}</TooltipContent>\n </Tooltip>\n ))}\n </div>\n\n <Input\n autoFocus\n value={draft}\n placeholder=\"Add tag, press Enter\"\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n add(draft);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel();\n } else if (e.key === \"Backspace\" && !draft && tags.length > 0) {\n setTags(tags.slice(0, -1));\n }\n }}\n className=\"h-8 text-xs\"\n />\n\n {matches.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {matches.map((s) => (\n <button\n key={s.value}\n type=\"button\"\n onClick={() => add(s.value)}\n className=\"rounded-full border border-dashed border-border px-2 py-0.5 text-[11px] text-muted-foreground hover:border-primary hover:text-primary\"\n >\n + {s.label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"flex justify-end gap-1 pt-1\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 px-2\"\n aria-label=\"Cancel edit\"\n onClick={onCancel}\n >\n <X className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n size=\"sm\"\n className=\"h-7 px-2\"\n aria-label=\"Apply tags\"\n onClick={() => onCommit(tags)}\n >\n <Check className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n );\n}\n\nfunction NumberEditor({\n value,\n onCommit,\n onCancel,\n}: {\n value: number;\n onCommit: (next: unknown) => void;\n onCancel: () => void;\n}) {\n const [draft, setDraft] = useState(String(value));\n return (\n <div className=\"flex flex-col gap-2\">\n <Input\n autoFocus\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n className=\"h-8 font-mono text-xs\"\n style={{ fontSize: \"16px\" }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n const n = Number(draft);\n if (Number.isFinite(n)) onCommit(n);\n }\n if (e.key === \"Escape\") onCancel();\n }}\n />\n <div className=\"flex justify-end gap-1\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7\"\n aria-label=\"Cancel edit\"\n onClick={onCancel}\n >\n <X className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-7\"\n aria-label=\"Apply value\"\n onClick={() => {\n const n = Number(draft);\n if (Number.isFinite(n)) onCommit(n);\n }}\n >\n <Check className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { X } from \"./icons\";\nimport { Button } from \"../button\";\nimport { cn } from \"../cn\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../tooltip\";\nimport type { ToolbarFacet } from \"./types\";\n\n/**\n * Extensible toolbar facet strip. Today: button-group + custom.\n * Active non-default options get a clear (X) so you don't hunt for \"All\".\n */\nexport function ToolbarFacets({ facets }: { facets: ToolbarFacet[] }) {\n if (facets.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n {facets.map((facet) => {\n if (facet.type === \"custom\") {\n return <div key={facet.id}>{facet.render()}</div>;\n }\n\n const defaultValue =\n facet.defaultValue ?? facet.options[0]?.value ?? \"\";\n const isNonDefault = facet.value !== defaultValue;\n\n return (\n <div\n key={facet.id}\n className=\"flex flex-wrap items-center gap-1.5 max-sm:grid max-sm:w-full max-sm:grid-cols-3\"\n >\n {facet.label ? (\n <span className=\"mr-0.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {facet.label}\n </span>\n ) : null}\n {facet.options.map((opt) => {\n const active = facet.value === opt.value;\n return (\n <Button\n key={opt.value}\n type=\"button\"\n size=\"sm\"\n variant={active ? \"default\" : \"outline\"}\n className={cn(\n \"h-7 gap-1 px-2.5 text-xs max-sm:w-full\",\n active && isNonDefault && \"pr-1.5\",\n )}\n onClick={() => facet.onChange(opt.value)}\n >\n {opt.icon}\n {opt.label}\n {active && isNonDefault ? (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n role=\"button\"\n tabIndex={0}\n aria-label={`Clear ${facet.label ?? opt.label} filter`}\n className=\"ml-0.5 inline-flex rounded-sm p-0.5 hover:bg-primary-foreground/20\"\n onClick={(e) => {\n e.stopPropagation();\n facet.onChange(defaultValue);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.stopPropagation();\n facet.onChange(defaultValue);\n }\n }}\n >\n <X className=\"h-3 w-3\" />\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Clear this filter</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : null}\n </Button>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n}\n\n/** Reset every button-group facet to its default. */\nexport function resetToolbarFacets(facets: ToolbarFacet[] | undefined): void {\n if (!facets) return;\n for (const facet of facets) {\n if (facet.type !== \"button-group\") continue;\n const def = facet.defaultValue ?? facet.options[0]?.value;\n if (def !== undefined && facet.value !== def) facet.onChange(def);\n }\n}\n","\"use client\";\n\nimport { useState, type DragEvent, type KeyboardEvent } from \"react\";\nimport { GripVertical, Plus, SlidersHorizontal, Trash2, X } from \"./icons\";\nimport { Button } from \"../button\";\nimport { Input } from \"../input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select\";\nimport { cn } from \"../cn\";\nimport {\n LAYERED_FILTER_OPERATOR_LABELS,\n isCompleteLayeredFilterRule,\n isLayeredFilterOperator,\n layeredFilterNeedsValue,\n layeredFilterRuleSummary,\n operatorsForLayeredField,\n type LayeredFilterField,\n type LayeredFilterRule,\n} from \"./layered-filters\";\n\nexport interface LayeredFilterBuilderProps {\n fields: readonly LayeredFilterField[];\n rules: readonly LayeredFilterRule[];\n onChange: (rules: LayeredFilterRule[]) => void;\n maxRules?: number | undefined;\n label?: string | undefined;\n}\n\nfunction moveRule(\n rules: readonly LayeredFilterRule[],\n from: number,\n to: number,\n): LayeredFilterRule[] {\n if (from === to || to < 0 || to >= rules.length) return [...rules];\n const next = [...rules];\n const [moved] = next.splice(from, 1);\n if (!moved) return next;\n next.splice(to, 0, moved);\n return next;\n}\n\nexport function LayeredFilterBuilder({\n fields,\n rules,\n onChange,\n maxRules = 20,\n label = \"Advanced filters\",\n}: LayeredFilterBuilderProps) {\n const [open, setOpen] = useState(false);\n const [draggedIndex, setDraggedIndex] = useState<number | null>(null);\n\n if (fields.length === 0) return null;\n\n const updateRule = (index: number, patch: Partial<LayeredFilterRule>) => {\n onChange(\n rules.map((rule, candidate) =>\n candidate === index ? { ...rule, ...patch } : rule,\n ),\n );\n };\n\n const addRule = () => {\n const field = fields[0];\n if (!field || rules.length >= maxRules) return;\n const operator = operatorsForLayeredField(field)[0] ?? \"contains\";\n onChange([\n ...rules,\n {\n id: `layer-${Date.now()}-${rules.length}`,\n field: field.id,\n operator,\n value: field.kind === \"select\" ? (field.options[0]?.value ?? \"\") : \"\",\n },\n ]);\n };\n\n const removeRule = (index: number) => {\n onChange(rules.filter((_, candidate) => candidate !== index));\n };\n\n const reorder = (from: number, to: number) => {\n onChange(moveRule(rules, from, to));\n };\n\n return (\n <div className=\"flex min-w-0 flex-wrap items-center gap-1\">\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) {\n const completeRules = rules.filter(isCompleteLayeredFilterRule);\n if (completeRules.length !== rules.length) onChange(completeRules);\n }\n }}\n >\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant={rules.length > 0 ? \"secondary\" : \"outline\"}\n size=\"sm\"\n className=\"h-8 gap-1.5 px-2 text-xs\"\n aria-label={label}\n >\n <SlidersHorizontal className=\"h-3.5 w-3.5\" />\n <span className=\"hidden sm:inline\">\n {rules.length > 0 ? `${rules.length} layers` : \"Advanced\"}\n </span>\n {rules.length > 0 ? (\n <span className=\"sm:hidden\">{rules.length}</span>\n ) : null}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n sideOffset={6}\n className=\"w-[min(46rem,calc(100vw-1rem))] p-0\"\n >\n <div className=\"flex items-start justify-between gap-3 border-b border-border px-3 py-2.5\">\n <div>\n <p className=\"text-sm font-semibold text-foreground\">\n Narrow these results\n </p>\n <p className=\"text-xs text-muted-foreground\">\n Every layer must match. Drag layers to put them in the order\n that makes sense to you.\n </p>\n </div>\n {rules.length > 0 ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 shrink-0 px-2 text-xs text-muted-foreground\"\n onClick={() => onChange([])}\n >\n Clear layers\n </Button>\n ) : null}\n </div>\n\n <div className=\"max-h-[min(28rem,65dvh)] space-y-1.5 overflow-y-auto p-2.5 scrollbar-thin\">\n {rules.length === 0 ? (\n <div className=\"rounded-md border border-dashed border-border px-3 py-5 text-center\">\n <p className=\"text-sm font-medium text-foreground\">\n Start with one simple layer\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n For example: Keyword contains ITAD, then Keyword doesn't\n have the word “what”.\n </p>\n </div>\n ) : (\n rules.map((rule, index) => (\n <LayeredRuleRow\n key={rule.id}\n index={index}\n rule={rule}\n fields={fields}\n dragging={draggedIndex === index}\n onChange={(patch) => updateRule(index, patch)}\n onRemove={() => removeRule(index)}\n onDragStart={() => setDraggedIndex(index)}\n onDragEnd={() => setDraggedIndex(null)}\n onDrop={(targetIndex) => {\n if (draggedIndex !== null)\n reorder(draggedIndex, targetIndex);\n setDraggedIndex(null);\n }}\n onKeyboardMove={(direction) =>\n reorder(index, index + direction)\n }\n />\n ))\n )}\n </div>\n\n <div className=\"flex items-center justify-between gap-2 border-t border-border px-3 py-2\">\n <p className=\"text-[11px] text-muted-foreground\">\n The regular search still works and is applied before these layers.\n </p>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 shrink-0 gap-1 px-2 text-xs\"\n disabled={rules.length >= maxRules}\n onClick={addRule}\n >\n <Plus className=\"h-3.5 w-3.5\" /> Add layer\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n\n {rules.map((rule, index) => (\n <span\n key={`summary-${rule.id}`}\n className={cn(\n \"inline-flex max-w-60 items-center gap-1 rounded-full border px-2 py-0.5 text-[11px]\",\n isCompleteLayeredFilterRule(rule)\n ? \"border-border bg-muted/50 text-foreground\"\n : \"border-dashed border-warning/50 bg-warning/10 text-warning\",\n )}\n >\n <button\n type=\"button\"\n className=\"min-w-0 truncate text-left\"\n onClick={() => setOpen(true)}\n title={\n isCompleteLayeredFilterRule(rule)\n ? layeredFilterRuleSummary(rule, fields)\n : `Layer ${index + 1} needs a value`\n }\n >\n <span className=\"mr-1 text-muted-foreground\">{index + 1}</span>\n {isCompleteLayeredFilterRule(rule)\n ? layeredFilterRuleSummary(rule, fields)\n : \"Choose a value\"}\n </button>\n <button\n type=\"button\"\n className=\"shrink-0 rounded-full p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground\"\n aria-label={`Remove filter layer ${index + 1}`}\n onClick={() => removeRule(index)}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))}\n </div>\n );\n}\n\nfunction LayeredRuleRow({\n index,\n rule,\n fields,\n dragging,\n onChange,\n onRemove,\n onDragStart,\n onDragEnd,\n onDrop,\n onKeyboardMove,\n}: {\n index: number;\n rule: LayeredFilterRule;\n fields: readonly LayeredFilterField[];\n dragging: boolean;\n onChange: (patch: Partial<LayeredFilterRule>) => void;\n onRemove: () => void;\n onDragStart: () => void;\n onDragEnd: () => void;\n onDrop: (targetIndex: number) => void;\n onKeyboardMove: (direction: -1 | 1) => void;\n}) {\n const field =\n fields.find((candidate) => candidate.id === rule.field) ?? fields[0];\n if (!field) return null;\n const operators = operatorsForLayeredField(field);\n const needsValue = layeredFilterNeedsValue(rule.operator);\n\n const handleMoveKey = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (event.key !== \"ArrowUp\" && event.key !== \"ArrowDown\") return;\n event.preventDefault();\n onKeyboardMove(event.key === \"ArrowUp\" ? -1 : 1);\n };\n\n return (\n <div\n className={cn(\n \"grid grid-cols-[1.75rem_minmax(7.5rem,1fr)_minmax(8.5rem,1fr)_minmax(9rem,1.4fr)_1.75rem] items-center gap-1 rounded-md border border-border bg-card p-1.5 max-sm:grid-cols-[1.75rem_1fr_1.75rem]\",\n dragging && \"opacity-50\",\n )}\n onDragOver={(event: DragEvent<HTMLDivElement>) => event.preventDefault()}\n onDrop={(event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n onDrop(index);\n }}\n >\n <button\n type=\"button\"\n draggable\n className=\"flex h-7 w-7 cursor-grab items-center justify-center rounded text-muted-foreground hover:bg-muted hover:text-foreground active:cursor-grabbing\"\n aria-label={`Move filter layer ${index + 1}. Use arrow keys or drag.`}\n title=\"Drag to reorder; arrow keys also work\"\n onDragStart={(event) => {\n event.dataTransfer.effectAllowed = \"move\";\n onDragStart();\n }}\n onDragEnd={onDragEnd}\n onKeyDown={handleMoveKey}\n >\n <GripVertical className=\"h-3.5 w-3.5\" />\n </button>\n\n <Select\n value={field.id}\n onValueChange={(nextFieldId) => {\n const nextField = fields.find(\n (candidate) => candidate.id === nextFieldId,\n );\n if (!nextField) return;\n const operator = operatorsForLayeredField(nextField)[0] ?? \"contains\";\n onChange({\n field: nextField.id,\n operator,\n value:\n nextField.kind === \"select\"\n ? (nextField.options[0]?.value ?? \"\")\n : \"\",\n valueTo: undefined,\n });\n }}\n >\n <SelectTrigger\n size=\"sm\"\n className=\"h-7 w-full text-xs max-sm:col-span-1\"\n aria-label={`Filter layer ${index + 1} field`}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {fields.map((candidate) => (\n <SelectItem\n key={candidate.id}\n value={candidate.id}\n className=\"text-xs\"\n >\n {candidate.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n <Select\n value={rule.operator}\n onValueChange={(operator) => {\n if (!isLayeredFilterOperator(operator)) return;\n onChange({\n operator,\n valueTo: operator === \"between\" ? rule.valueTo : undefined,\n });\n }}\n >\n <SelectTrigger\n size=\"sm\"\n className=\"h-7 w-full text-xs max-sm:col-start-2\"\n aria-label={`Filter layer ${index + 1} operator`}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {operators.map((operator) => (\n <SelectItem key={operator} value={operator} className=\"text-xs\">\n {LAYERED_FILTER_OPERATOR_LABELS[operator]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n <div className=\"min-w-0 max-sm:col-span-3 max-sm:col-start-1\">\n {!needsValue ? (\n <span className=\"flex h-7 items-center px-2 text-xs text-muted-foreground\">\n No value needed\n </span>\n ) : field.kind === \"select\" ? (\n <Select\n value={rule.value}\n onValueChange={(value) => onChange({ value })}\n >\n <SelectTrigger\n size=\"sm\"\n className=\"h-7 w-full text-xs\"\n aria-label={`Filter layer ${index + 1} value`}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {field.options.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n className=\"text-xs\"\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <div className=\"flex items-center gap-1\">\n <Input\n value={rule.value}\n onChange={(event) => onChange({ value: event.target.value })}\n inputMode={field.kind === \"number\" ? \"decimal\" : \"text\"}\n placeholder={\n field.kind === \"number\"\n ? (field.placeholder ?? \"Value\")\n : \"Value…\"\n }\n className=\"h-7 min-w-0 text-base sm:text-xs\"\n aria-label={`Filter layer ${index + 1} value`}\n />\n {rule.operator === \"between\" ? (\n <>\n <span className=\"text-[11px] text-muted-foreground\">and</span>\n <Input\n value={rule.valueTo ?? \"\"}\n onChange={(event) =>\n onChange({ valueTo: event.target.value })\n }\n inputMode=\"decimal\"\n placeholder=\"Value\"\n className=\"h-7 min-w-0 text-base sm:text-xs\"\n aria-label={`Filter layer ${index + 1} upper value`}\n />\n </>\n ) : null}\n </div>\n )}\n </div>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0 text-muted-foreground hover:text-destructive max-sm:col-start-3 max-sm:row-start-1\"\n aria-label={`Remove filter layer ${index + 1}`}\n onClick={onRemove}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n );\n}\n","import type { ColumnFilterKind, MatrxColumnDef } from \"./types\";\nimport {\n SELECT_EMPTY_VALUE,\n SELECT_NOT_EMPTY_VALUE,\n getCellValue,\n selectCellValues,\n} from \"./filter-engine\";\n\n/** Auto-inference switches to text above this many distinct values… */\nconst SELECT_CARDINALITY_CAP = 24;\n\nexport type ResolvedFilterKind = \"text\" | \"select\" | \"boolean\" | \"number\";\n\n/**\n * Infer a filter UI from sample row values. Prefer select for low-cardinality\n * string/enum columns, boolean for booleans, number for numeric, else text.\n */\nexport function resolveFilterKind<T>(\n col: MatrxColumnDef<T>,\n sampleRows: T[],\n): ResolvedFilterKind | null {\n if (col.filter === false) return null;\n if (col.filter && col.filter !== \"auto\") return col.filter;\n\n const values = sampleRows\n .slice(0, 200)\n .map((row) => getCellValue(row, col))\n .filter((v) => v != null);\n\n if (values.length === 0) return \"text\";\n\n if (values.every((v) => typeof v === \"boolean\")) return \"boolean\";\n if (values.every((v) => typeof v === \"number\" && Number.isFinite(v))) {\n return \"number\";\n }\n\n const strings = values.flatMap(selectCellValues);\n const unique = new Set(strings);\n if (\n unique.size >= 1 &&\n unique.size <= SELECT_CARDINALITY_CAP &&\n unique.size < strings.length * 0.6\n ) {\n return \"select\";\n }\n\n return \"text\";\n}\n\nexport function collectSelectOptions<T>(\n col: MatrxColumnDef<T>,\n rows: T[],\n): Array<{ value: string; label: string }> {\n const seen = new Set<string>();\n const options: Array<{ value: string; label: string }> = [];\n let hasEmpty = false;\n for (const row of rows) {\n const values = selectCellValues(getCellValue(row, col));\n if (values.length === 0) {\n hasEmpty = true;\n continue;\n }\n for (const value of values) {\n if (col.filterOptions?.length || seen.has(value)) continue;\n seen.add(value);\n options.push({ value, label: value });\n }\n }\n const base = col.filterOptions?.length\n ? [...col.filterOptions]\n : options.sort((a, b) => a.label.localeCompare(b.label));\n // Emptiness sentinels: whenever the column has blank cells, every select\n // filter can isolate them — or exclude them — with zero per-table config.\n if (hasEmpty) {\n base.unshift(\n { value: SELECT_EMPTY_VALUE, label: \"(empty)\" },\n { value: SELECT_NOT_EMPTY_VALUE, label: \"(not empty)\" },\n );\n }\n return base;\n}\n\nexport function filterKindLabel(\n kind: ColumnFilterKind | ResolvedFilterKind,\n): string {\n switch (kind) {\n case \"text\":\n return \"Text\";\n case \"select\":\n return \"Select\";\n case \"boolean\":\n return \"Boolean\";\n case \"number\":\n return \"Number\";\n case \"auto\":\n return \"Auto\";\n case false:\n return \"Off\";\n }\n}\n","import {\n collectSelectOptions,\n resolveFilterKind,\n type ResolvedFilterKind,\n} from \"./infer-filter\";\nimport type { MatrxColumnDef, MatrxDataTableQueryState } from \"./types\";\n\nexport interface QueryFilterMeta {\n kind: ResolvedFilterKind | null;\n options: Array<{ value: string; label: string }>;\n}\n\n/**\n * Resolve header-filter metadata without inferring remote cardinality from the\n * current page. Controlled callers must declare select options explicitly;\n * local tables preserve the original inference behavior.\n */\nexport function resolveQueryFilterMeta<T>(\n column: MatrxColumnDef<T>,\n rows: T[],\n controlled: boolean,\n): QueryFilterMeta {\n if (!controlled) {\n const kind = resolveFilterKind(column, rows);\n return {\n kind,\n options: kind === \"select\" ? collectSelectOptions(column, rows) : [],\n };\n }\n if (column.filter === false) return { kind: null, options: [] };\n const declared = column.filter;\n const kind: ResolvedFilterKind =\n declared && declared !== \"auto\"\n ? declared\n : column.filterOptions?.length\n ? \"select\"\n : \"text\";\n return {\n kind,\n options: kind === \"select\" ? (column.filterOptions ?? []) : [],\n };\n}\n\nexport interface QueryStateChangeOptions {\n /** Reset to the first page after a query-shape change. */\n resetPage?: boolean;\n}\n\n/**\n * Build the next controlled query state without mutating the caller's object.\n * Search, filters, sort, facets, and page-size changes pass `resetPage: true`;\n * direct pagination passes a page patch without resetting it.\n */\nexport function nextQueryState(\n current: MatrxDataTableQueryState,\n patch: Partial<MatrxDataTableQueryState>,\n options: QueryStateChangeOptions = {},\n): MatrxDataTableQueryState {\n return {\n ...current,\n ...patch,\n page: options.resetPage ? 1 : (patch.page ?? current.page),\n };\n}\n\n/** Resolve a safe one-based page for the latest remote total. */\nexport function safeQueryPage(\n requestedPage: number,\n totalItems: number,\n pageSize: number,\n): number {\n const safeTotal = Math.max(0, totalItems);\n const safeSize = Math.max(1, pageSize);\n const pageCount = Math.max(1, Math.ceil(safeTotal / safeSize));\n return Math.min(Math.max(1, requestedPage), pageCount);\n}\n\n","\"use client\";\n\nimport { useId, useState } from \"react\";\nimport { Button } from \"../button\";\nimport { Input } from \"../input\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../dropdown-menu\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"../dialog\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport { ChevronDown } from \"./icons\";\nimport type { TableViewSnapshot } from \"./types\";\n\nexport interface SavedViewsControlProps {\n views: ReadonlyArray<{ id: string; name: string; snapshot: TableViewSnapshot }>;\n activeId?: string | null;\n loading?: boolean;\n error?: string | null;\n dirty?: boolean;\n onSelect: (id: string | null) => void;\n onSaveNew: (name: string) => void | Promise<void>;\n onUpdate?: () => void | Promise<void>;\n onReload?: () => void | Promise<void>;\n}\n\n/** Shared named-view chooser. Persistence, authorization and validation stay host-side. */\nexport function SavedViewsControl({\n views,\n activeId = null,\n loading = false,\n error,\n dirty = false,\n onSelect,\n onSaveNew,\n onUpdate,\n onReload,\n}: SavedViewsControlProps) {\n const unsavedChangesId = useId();\n const [saveOpen, setSaveOpen] = useState(false);\n const [name, setName] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n const visibleError = actionError ?? error;\n const save = async () => {\n const next = name.trim();\n if (!next) return;\n setSaving(true);\n setActionError(null);\n try {\n await onSaveNew(next);\n setName(\"\");\n setSaveOpen(false);\n } catch (cause) {\n setActionError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setSaving(false);\n }\n };\n const update = async () => {\n if (!onUpdate) return;\n setSaving(true);\n setActionError(null);\n try {\n await onUpdate();\n } catch (cause) {\n setActionError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setSaving(false);\n }\n };\n const reload = async () => {\n if (!onReload) return;\n setSaving(true);\n setActionError(null);\n try {\n await onReload();\n } catch (cause) {\n setActionError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setSaving(false);\n }\n };\n const activeName = activeId ? views.find((view) => view.id === activeId)?.name : undefined;\n return (\n <div className=\"flex min-w-0 flex-wrap items-center gap-1\" data-matrx-table-saved-views>\n <DropdownMenu>\n <Tooltip><TooltipTrigger asChild><DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 min-w-0 max-w-52 gap-1 px-2 text-xs font-medium\"\n aria-label={`Table view: ${loading ? \"Loading views\" : (activeName ?? \"Default view\")}${dirty ? \", unsaved changes\" : \"\"}`}\n aria-describedby={dirty ? unsavedChangesId : undefined}\n disabled={saving}\n >\n <span className=\"min-w-0 flex-1 truncate\">{loading ? \"Loading views…\" : (activeName ?? \"Default view\")}</span>\n {dirty ? <span aria-hidden=\"true\" className=\"size-1.5 shrink-0 rounded-full bg-amber-500\" /> : null}\n <ChevronDown className=\"size-3.5 shrink-0\" />\n </Button>\n </DropdownMenuTrigger></TooltipTrigger><TooltipContent>Choose or save a table view</TooltipContent></Tooltip>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Views</DropdownMenuLabel>\n <DropdownMenuRadioGroup value={activeId ?? \"__default__\"} onValueChange={(value) => onSelect(value === \"__default__\" ? null : value)}>\n <DropdownMenuRadioItem value=\"__default__\">Default view</DropdownMenuRadioItem>\n {views.map((view) => <DropdownMenuRadioItem key={view.id} value={view.id}>{view.name}</DropdownMenuRadioItem>)}\n </DropdownMenuRadioGroup>\n <DropdownMenuSeparator />\n <DropdownMenuItem disabled={saving} onSelect={() => { setActionError(null); setSaveOpen(true); }}>Save current view…</DropdownMenuItem>\n {activeId && onUpdate ? <DropdownMenuItem disabled={saving} onSelect={() => void update()}>Update current view</DropdownMenuItem> : null}\n {onReload ? <DropdownMenuItem disabled={saving || loading} onSelect={() => void reload()}>Reload views</DropdownMenuItem> : null}\n </DropdownMenuContent>\n </DropdownMenu>\n {dirty ? <span id={unsavedChangesId} className=\"sr-only\">This table view has unsaved changes. Open the view menu to save or update it.</span> : null}\n {visibleError ? <p role=\"alert\" className=\"basis-full break-words text-xs text-destructive\">{visibleError}</p> : null}\n <Dialog open={saveOpen} onOpenChange={setSaveOpen}>\n <DialogContent>\n <DialogHeader><DialogTitle>Save current view</DialogTitle></DialogHeader>\n {visibleError ? <p role=\"alert\" className=\"text-sm text-destructive\">{visibleError}</p> : null}\n <Input aria-label=\"View name\" value={name} onChange={(event) => setName(event.target.value)} placeholder=\"View name\" autoFocus />\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setSaveOpen(false)}>Cancel</Button>\n <Button type=\"button\" disabled={!name.trim() || saving} onClick={() => void save()}>{saving ? \"Saving…\" : \"Save view\"}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * DropdownMenu — Radix dropdown with two behaviours the stock body lacks.\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. A wrapper in\n * matrx-frontend once deferred rendering until after hydration on a false\n * premise (Radix ids come from React's SSR-stable `useId`), which deleted\n * the always-visible trigger — buttons, `…` menus — from SSR and the first\n * client paint.\n *\n * 2. A LONG MENU SCROLLS INSTEAD OF GROWING OFF-SCREEN. Content and SubContent\n * cap at `--radix-dropdown-menu-content-available-height` — the space Radix\n * actually measured between the trigger and the viewport edge — and scroll\n * past it. Without the cap a menu longer than the viewport puts its last\n * items where no pointer can reach them, and on a short window that can be\n * the only exit from the surface.\n *\n * Portalling goes through the package's `usePortalContainer` seam, so a menu\n * opened inside a Dialog mounts INSIDE the dialog (staying in the scroll\n * shard, where its wheel events work) instead of at `document.body`. An\n * explicit `container` prop still wins.\n *\n * Icons are the package's inlined SVGs (C19) — no icon-library dependency.\n */\n\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { CheckIcon, DotFilledIcon, RadixChevronRightIcon } from \"./icons\";\nimport { usePortalContainer } from \"./portal-container\";\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nconst MENU_SURFACE_CLASS =\n \"z-[10001] min-w-[8rem] max-h-[var(--radix-dropdown-menu-content-available-height)] overflow-y-auto overflow-x-hidden overscroll-contain rounded-md border bg-popover p-1 text-popover-foreground\";\n\n\nconst MENU_ITEM_CLASS =\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\";\n\nconst MENU_INDICATOR_ITEM_CLASS =\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\";\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n data-slot=\"dropdown-menu-sub-trigger\"\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n >\n {children}\n <RadixChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName;\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(MENU_SURFACE_CLASS, \"shadow-lg\", MOTION_POPPER, className)}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName;\n\nexport interface DropdownMenuContentProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> {\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n}\n\nconst DropdownMenuContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n DropdownMenuContentProps\n>(({ className, sideOffset = 4, container, ...props }, ref) => {\n const portalContainer = usePortalContainer(container);\n return (\n <DropdownMenuPrimitive.Portal container={portalContainer}>\n <DropdownMenuPrimitive.Content\n ref={ref}\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n MENU_SURFACE_CLASS,\n \"shadow-md\",\n MOTION_POPPER,\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n});\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\nconst DropdownMenuItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n data-slot=\"dropdown-menu-item\"\n className={cn(MENU_ITEM_CLASS, inset && \"pl-8\", className)}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(MENU_INDICATOR_ITEM_CLASS, className)}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(MENU_INDICATOR_ITEM_CLASS, className)}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <DotFilledIcon className=\"h-4 w-4 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n data-slot=\"dropdown-menu-label\"\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", inset && \"pl-8\", className)}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n);\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\n\nexport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n};\n","import * as XLSX from \"xlsx\";\n\nimport { columnId, getCellValue, stringifyCellValue } from \"./filter-engine\";\nimport type { MatrxColumnDef } from \"./types\";\n\n/**\n * Download the same visible columns and rendered cell values used by the\n * canonical table's CSV export as a real Excel workbook. This module is loaded\n * only after the user chooses Excel from the unified action menu.\n */\nexport function downloadTableAsXlsx<T>({\n rows,\n columns,\n label,\n}: {\n rows: T[];\n columns: MatrxColumnDef<T>[];\n label: string;\n}) {\n const visibleColumns = columns.filter(\n (column) => column.filter !== false || column.accessorKey,\n );\n const headers = visibleColumns.map((column) =>\n typeof column.header === \"string\" ? column.header : columnId(column),\n );\n const values = rows.map((row) =>\n visibleColumns.map((column) =>\n stringifyCellValue(getCellValue(row, column)),\n ),\n );\n const worksheet = XLSX.utils.aoa_to_sheet([headers, ...values]);\n const workbook = XLSX.utils.book_new();\n const sheetName = label.replace(/[\\\\/?*[\\]:]/g, \" \").trim().slice(0, 31) || \"Data\";\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);\n const bytes = XLSX.write(workbook, {\n type: \"array\",\n bookType: \"xlsx\",\n compression: true,\n });\n const blob = new Blob([bytes], { type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\" });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = `${label.toLowerCase().replace(/[^a-z0-9]+/g, \"-\") || \"table\"}.xlsx`;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n"],"mappings":"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","names":["import_react","import_core","import_jsx_runtime","import_format","React","import_jsx_runtime","import_jsx_runtime","React","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","import_class_variance_authority","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","React","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_react_tree","React","React","import_jsx_runtime","CONTEXT_SLOT","contextRegistry","React","import_jsx_runtime","CONTEXT_SLOT","contextRegistry","import_react_tree","import_class_variance_authority","React","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_content_transfer","import_format","React","import_jsx_runtime","resolve","React","import_content_transfer","React","import_jsx_runtime","import_react","cn","import_jsx_runtime","cn","TapTargetButton","TapTargetButtonTransparent","TapTargetButtonSolid","TapTargetButtonDestructive","TapTargetButtonForGroup","import_jsx_runtime","Icon","path","XLSX","label","import_jsx_runtime","import_jsx_runtime","import_react","import_content_transfer","import_jsx_runtime","import_react","import_react","import_url_state","import_react","DialogPrimitive","React","import_jsx_runtime","CommandPrimitive","DIALOG_DESKTOP_CLASSES","DIALOG_MOBILE_SHEET_CLASSES","DIALOG_MOBILE_SHEET_OVERRIDE","CommandPrimitive","import_jsx_runtime","import_react","columnId","import_jsx_runtime","columnId","preview","import_react","import_core","import_jsx_runtime","import_zod","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","value","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","kind","import_jsx_runtime","columns","columnId","preview","resolve","import_react","React","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/data-table/index.ts","../../src/data-table/MatrxDataTable.tsx","../../src/data-table/icons.tsx","../../src/button.tsx","../../src/cn.ts","../../src/data-table/use-column-reorder-animation.ts","../../src/checkbox.tsx","../../src/icons.tsx","../../src/alert-dialog.tsx","../../src/motion.ts","../../src/portal-container.tsx","../../src/confirm-dialog.tsx","../../src/input.tsx","../../src/select.tsx","../../src/skeleton.tsx","../../src/data-table/TableTitleRow.tsx","../../src/data-table/TableSearch.tsx","../../src/tooltip.tsx","../../src/data-table/useScrollPagination.ts","../../src/data-table/useProgressiveTableRows.ts","../../src/dialog.tsx","../../src/radix-dialog-modal-context.tsx","../../src/use-is-mobile.ts","../../src/sheet.tsx","../../src/data-table/default-host.tsx","../../src/data-table/useTableNotice.tsx","../../src/data-table/host.tsx","../../src/data-table/pagination.tsx","../../src/data-table/TableViewTabs.tsx","../../src/content-transfer/matrx-copy.tsx","../../src/content-transfer/email-review.tsx","../../src/content-transfer/index.tsx","../../src/popover.tsx","../../src/tap-target/tap-target-button.tsx","../../src/tap-target/cn.ts","../../src/tap-target/link.ts","../../src/content-transfer/icon.ts","../../src/content-transfer/extensions.ts","../../src/data-table/copy-payload.ts","../../src/data-table/copy.tsx","../../src/data-table/CopySubset.tsx","../../src/data-table/layered-filters.ts","../../src/data-table/filter-engine.ts","../../src/data-table/tableCopy.ts","../../src/data-table/clipping.ts","../../src/data-table/url-state.ts","../../src/data-table/ColumnHeaderCell.tsx","../../src/command.tsx","../../src/data-table/ColumnResizeHandle.tsx","../../src/data-table/column-resize.ts","../../src/data-table/column-drag-preview.ts","../../src/data-table/ranked-search.ts","../../src/data-table/ColumnManager.tsx","../../src/data-table/saved-view-snapshot.ts","../../src/data-table/MatrxUuidCell.tsx","../../src/data-table/entity.ts","../../src/data-table/display-value.ts","../../src/data-table/DataRowInspector.tsx","../../src/data-table/DataRowWindow.tsx","../../src/data-table/row-title.ts","../../src/data-table/DirtySavePill.tsx","../../src/data-table/EditableTableCell.tsx","../../src/data-table/ToolbarFacets.tsx","../../src/data-table/LayeredFilterBuilder.tsx","../../src/data-table/infer-filter.ts","../../src/data-table/query-control.ts","../../src/data-table/SavedViewsControl.tsx","../../src/dropdown-menu.tsx","../../src/data-table/tableXlsx.ts"],"sourcesContent":["export { MatrxDataTable } from \"./MatrxDataTable\";\nexport { TableTitleRow } from \"./TableTitleRow\";\nexport type { TableTitleRowProps } from \"./TableTitleRow\";\nexport { SavedViewsControl } from \"./SavedViewsControl\";\nexport type { SavedViewsControlProps } from \"./SavedViewsControl\";\nexport { parseTableViewSnapshot } from \"./saved-view-snapshot\";\nexport { MatrxDataTableProvider, useMatrxDataTableHost } from \"./host\";\nexport type {\n MatrxDataTableHost,\n TableDoors,\n TableEntityRefProps,\n TableLinkProps,\n TablePeekProps,\n TableSidePanelProps,\n TableToolbarActionProps,\n TableWindowPanelProps,\n} from \"./host\";\nexport { DataRowInspector } from \"./DataRowInspector\";\nexport { DataRowWindow } from \"./DataRowWindow\";\nexport type { DataRowWindowProps, DataRowWindowTab } from \"./DataRowWindow\";\nexport { MatrxUuidCell, shortUuid } from \"./MatrxUuidCell\";\nexport type { MatrxUuidCellProps, MatrxUuidOpenResult } from \"./MatrxUuidCell\";\nexport { default as GenericTablePagination } from \"./pagination\";\nexport type { GenericTablePaginationProps } from \"./pagination\";\nexport {\n buildRowAgentInput,\n buildViewAgentInput,\n buildViewHuman,\n rowsToCsvFromColumns,\n rowsToMarkdownTable,\n rowsToRecordsFromColumns,\n} from \"./tableCopy\";\nexport { downloadTableAsXlsx } from \"./tableXlsx\";\nexport {\n collectSelectOptions,\n filterKindLabel,\n resolveFilterKind,\n} from \"./infer-filter\";\nexport type { ResolvedFilterKind } from \"./infer-filter\";\nexport { useScrollPagination } from \"./useScrollPagination\";\nexport type {\n ScrollPaginationContainer,\n UseScrollPaginationOptions,\n UseScrollPaginationResult,\n} from \"./useScrollPagination\";\nexport { useTableUrlState, tableUrlParamPrefix } from \"./url-state\";\nexport * from \"./types\";\n\nexport { TableViewTabs } from \"./TableViewTabs\";\nexport type { TableViewTab, TableViewTabsProps } from \"./TableViewTabs\";\n","\"use client\";\n\nimport {\n cloneElement,\n Fragment,\n isValidElement,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ComponentType,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n type Ref,\n type RefObject,\n type SetStateAction,\n} from \"react\";\nimport {\n DndContext,\n DragOverlay,\n MeasuringStrategy,\n PointerSensor,\n pointerWithin,\n useDndMonitor,\n useDraggable,\n useDroppable,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragMoveEvent,\n} from \"@dnd-kit/core\";\nimport {\n ChevronLeft,\n ChevronRight,\n Eraser,\n GripVertical,\n Loader2,\n RefreshControlIcon,\n PanelRight,\n PanelRightOpen,\n Search,\n SlidersHorizontal,\n Plus,\n WholeWord,\n X,\n} from \"./icons\";\nimport { Button } from \"../button\";\nimport { useColumnReorderAnimation } from \"./use-column-reorder-animation\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\nimport { Checkbox } from \"../checkbox\";\nimport { ConfirmDialog } from \"../confirm-dialog\";\nimport { Input } from \"../input\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select\";\nimport { Skeleton } from \"../skeleton\";\nimport { TableTitleRow } from \"./TableTitleRow\";\nimport { TableSearch } from \"./TableSearch\";\nimport {\n Tooltip,\n TooltipProvider,\n TooltipTrigger,\n TooltipContent,\n} from \"../tooltip\";\nimport { useScrollPagination } from \"./useScrollPagination\";\nimport { useProgressiveTableRows } from \"./useProgressiveTableRows\";\nimport { DefaultTableLink, DefaultTableSidePanel } from \"./default-host\";\nimport { useTableNotice } from \"./useTableNotice\";\nimport GenericTablePagination from \"./pagination\";\nimport { TableViewWorkspace } from \"./TableViewTabs\";\nimport { CopyButtons, type CopySubsetColumn } from \"./copy\";\nimport { useCopySubsetVariant } from \"./CopySubset\";\nimport { cn } from \"../cn\";\nimport { useClippedContentGuard } from \"./clipping\";\nimport { useTableUrlState } from \"./url-state\";\nimport {\n jsonUrlCodec,\n stringUrlCodec,\n useUrlState,\n} from \"@ai-matrx/kit/url-state\";\nimport { useMatrxDataTableHost, type TableToolbarActionProps } from \"./host\";\nimport { ColumnHeaderCell } from \"./ColumnHeaderCell\";\nimport { ColumnResizeHandle } from \"./ColumnResizeHandle\";\nimport {\n clampColumnWidth,\n columnResizeCssVar,\n normalizeColumnWidthMap,\n resolveColumnResizeBounds,\n} from \"./column-resize\";\nimport {\n projectColumnDragOrder,\n type ColumnDragPreview,\n} from \"./column-drag-preview\";\nimport { inferTableSearchRole, rankTableSearchRows, resolveTableSearchScopes } from \"./ranked-search\";\nimport { ColumnManager } from \"./ColumnManager\";\nimport { parseTableViewSnapshot } from \"./saved-view-snapshot\";\nimport { DataRowInspector } from \"./DataRowInspector\";\nimport { DataRowWindow } from \"./DataRowWindow\";\nimport { defaultRowTitle } from \"./row-title\";\nimport { formatTableDisplayValue } from \"./display-value\";\nimport { DirtySavePill } from \"./DirtySavePill\";\nimport { EditableTableCell } from \"./EditableTableCell\";\nimport { tokenFromColumnName, isUuidValue } from \"./entity\";\nimport { MatrxUuidCell } from \"./MatrxUuidCell\";\nimport { ToolbarFacets, resetToolbarFacets } from \"./ToolbarFacets\";\nimport { LayeredFilterBuilder } from \"./LayeredFilterBuilder\";\nimport {\n completeLayeredFilterRules,\n type LayeredFilterRule,\n} from \"./layered-filters\";\nimport {\n applyRowEdits,\n columnId,\n countActiveColumnFilters,\n filterAndSortRows,\n getCellValue,\n} from \"./filter-engine\";\nimport {\n buildRowAgentInput,\n buildDefaultTableRowAgentInput,\n buildDefaultTableViewAgentInput,\n buildViewAgentInput,\n buildViewHuman,\n formatDefaultTableCopyRecord,\n projectDefaultTableCopyRow,\n} from \"./tableCopy\";\nimport {\n nextQueryState,\n resolveQueryFilterMeta,\n safeQueryPage,\n type QueryFilterMeta,\n} from \"./query-control\";\n\nfunction TableToolbarAction({\n HostAction,\n ariaLabel,\n tooltip,\n disabled,\n busy,\n onClick,\n children,\n}: TableToolbarActionProps & { HostAction: ComponentType<TableToolbarActionProps> | undefined }) {\n if (HostAction) {\n return <span data-matrx-table-toolbar-action><HostAction ariaLabel={ariaLabel} tooltip={tooltip} disabled={disabled} busy={busy} onClick={onClick}>{children}</HostAction></span>;\n }\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span data-matrx-table-toolbar-action className=\"inline-flex\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon\"\n data-matrx-table-icon-action className=\"h-11 w-11 [&_svg]:size-5\" aria-label={ariaLabel} aria-busy={busy || undefined} disabled={disabled} onClick={onClick}>\n {isValidElement<{ className?: string }>(children)\n ? cloneElement(children, { className: cn(\"h-5 w-5\", children.props.className) })\n : children}\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>{tooltip ?? ariaLabel}</TooltipContent>\n </Tooltip>\n );\n}\nimport type {\n CellEditsMap,\n ColumnFilterValue,\n ColumnFiltersState,\n MatrxColumnDef,\n MatrxDataTableCopyConfig,\n MatrxDataTableHierarchyMove,\n TableViewSnapshot,\n MatrxDataTableProps,\n MatrxDataTableQueryState,\n SortState,\n TableSearchMatchMode,\n} from \"./types\";\n\ninterface TableRowCopyControlProps<T> {\n sourceId: string;\n copy: MatrxDataTableCopyConfig<T>;\n row: T;\n size: \"xs\" | \"icon\" | \"toolbar\";\n defaultColumns?: MatrxColumnDef<T>[];\n}\n\n/**\n * `processed` is intentionally an array result, so harmless caller prop\n * churn (for example an inline `toolbar` object) can rebuild its container on\n * every render. View subscribers care about the ordered records, not that\n * disposable array. Keep callback-driven parent state from feeding that\n * allocation back into another render forever.\n */\nfunction hasSameRowReferences<T>(previous: readonly T[], next: readonly T[]) {\n return (\n previous.length === next.length &&\n previous.every((row, index) => row === next[index])\n );\n}\n\n/** One row-copy seam shared by cards, desktop rows, panels, and windows. */\nfunction TableRowCopyControl<T>({\n copy,\n row,\n size,\n sourceId,\n defaultColumns,\n}: TableRowCopyControlProps<T>) {\n return (\n <CopyButtons\n size={size}\n sourceId={sourceId}\n label={copy.label}\n {...(copy.rowReferences ? { references: copy.rowReferences(row) } : {})}\n {...(copy.triggerVariant ? { triggerVariant: copy.triggerVariant } : {})}\n human={() => copy.humanRow(row)}\n json={() => (copy.agentRow ? copy.agentRow(row) : row)}\n agent={() => defaultColumns\n ? buildDefaultTableRowAgentInput(copy, row, defaultColumns)\n : buildRowAgentInput(copy, row)}\n {...(copy.rowAiVariants?.(row) === undefined ? {} : { aiVariants: copy.rowAiVariants?.(row) })}\n />\n );\n}\n\ninterface HierarchyDropPreview {\n move: MatrxDataTableHierarchyMove;\n targetId: string | null;\n position: \"before\" | \"after\" | \"inside\" | \"root\";\n depth: number;\n targetLabel: string | null;\n}\n\n/** Current pointer Y in viewport coords: drag-start position plus travel. */\nfunction dragPointerY(event: DragMoveEvent | DragEndEvent): number {\n const activator = event.activatorEvent;\n return \"clientY\" in activator && typeof activator.clientY === \"number\"\n ? activator.clientY + event.delta.y\n : 0;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return (\n Array.isArray(value) && value.every((item) => typeof item === \"string\")\n );\n}\n\nconst activeUrlTableIds = new Set<string>();\n\n/**\n * MatrxDataTable — the official canonical data table.\n *\n * Sticky headers · every-column sort/filter (searchable selects) · toolbar\n * facets with per-facet + global clear · any-of cross-column search ·\n * Copy/Copy-for-AI (row + this view) · inline edit with dirty Save/Cancel pill ·\n * row → SidePanelSurface or WindowPanel · trailing icon → the secondary view.\n */\nexport function MatrxDataTable<T>(props: MatrxDataTableProps<T>) {\n if (!props.urlState) return <MatrxDataTableCore {...props} />;\n return <MatrxDataTableWithUrlState {...props} urlState={props.urlState} />;\n}\n\nfunction MatrxDataTableWithUrlState<T>({\n urlState,\n ...props\n}: MatrxDataTableProps<T> & {\n urlState: NonNullable<MatrxDataTableProps<T>[\"urlState\"]>;\n}) {\n if (props.query && props.query.mode !== \"local\") {\n throw new Error(\n `MatrxDataTable \"${urlState.id}\" cannot combine urlState with controlled query mode. Use useTableUrlState({ tableId: \"${urlState.id}\" }) in the remote query owner.`,\n );\n }\n\n const table = useTableUrlState({\n tableId: urlState.id,\n ...(urlState.defaultSort === undefined ? {} : { defaultSort: urlState.defaultSort }),\n defaultPageSize: props.pageSize ?? 25,\n ...(urlState.history === undefined ? {} : { history: urlState.history }),\n ...(urlState.textHistory === undefined ? {} : { textHistory: urlState.textHistory }),\n });\n useEffect(() => {\n if (activeUrlTableIds.has(urlState.id)) {\n throw new Error(\n `Duplicate MatrxDataTable urlState.id \"${urlState.id}\" on one page. Give every table a unique stable id.`,\n );\n }\n activeUrlTableIds.add(urlState.id);\n return () => {\n activeUrlTableIds.delete(urlState.id);\n };\n }, [urlState.id]);\n const prefix = `table.${urlState.id}`;\n const [urlSelectedId, setUrlSelectedId] = useUrlState(\n `${prefix}.row`,\n stringUrlCodec(),\n );\n const [urlWindowRowId, setUrlWindowRowId] = useUrlState(\n `${prefix}.window`,\n stringUrlCodec(),\n );\n const [urlSelection, setUrlSelection] = useUrlState(\n `${prefix}.selection`,\n jsonUrlCodec<string[]>([], isStringArray),\n );\n const syncSelectedRow = urlState.selectedRow !== false;\n const syncWindowRow = urlState.windowRow !== false;\n const syncSelection = urlState.selection === true && Boolean(props.selection);\n const selectedId = syncSelectedRow ? urlSelectedId || null : props.selectedId;\n const windowRowId = syncWindowRow\n ? urlWindowRowId || null\n : props.windowRowId;\n const selection =\n syncSelection && props.selection\n ? {\n ...props.selection,\n selectedIds: urlSelection,\n onSelectedIdsChange: (ids: string[]) => {\n setUrlSelection(ids, { history: urlState.history });\n props.selection?.onSelectedIdsChange(ids);\n },\n }\n : props.selection;\n\n return (\n <MatrxDataTableCore\n {...props}\n urlState={urlState}\n query={{\n mode: \"controlled-local\",\n state: table.state,\n onStateChange: table.onStateChange,\n }}\n {...(selectedId === undefined ? {} : { selectedId })}\n onSelectedIdChange={(id) => {\n if (syncSelectedRow) {\n setUrlSelectedId(id === null ? \"\" : id, {\n ...(urlState.history === undefined ? {} : { history: urlState.history }),\n });\n }\n props.onSelectedIdChange?.(id);\n }}\n {...(windowRowId === undefined ? {} : { windowRowId })}\n onWindowRowIdChange={(id) => {\n if (syncWindowRow) {\n setUrlWindowRowId(id === null ? \"\" : id, {\n ...(urlState.history === undefined ? {} : { history: urlState.history }),\n });\n }\n props.onWindowRowIdChange?.(id);\n }}\n {...(selection === undefined ? {} : { selection })}\n />\n );\n}\n\nconst COLUMN_REORDER_ACTIVATION_DISTANCE = 6;\n\nfunction MatrxDataTableCore<T>({\n data: suppliedData,\n columns,\n tableId,\n defaultViewSnapshot,\n viewTabs = true,\n relatedTableActions,\n columnState,\n reorderableColumns = true,\n resizableColumns = true,\n columnManager: controlledColumnManager,\n getRowId,\n searchText,\n processLocalRows,\n defaultSort = null,\n isLoading: suppliedLoading = false,\n isFetching: suppliedFetching = false,\n query,\n urlState,\n toolbar,\n hideToolbar = false,\n hidePagination = false,\n filterUi,\n detail,\n window: windowConfig,\n copy,\n edit,\n hierarchy,\n selectedId: controlledSelectedId,\n onSelectedIdChange,\n windowRowId: controlledWindowRowId,\n onWindowRowIdChange,\n selection: selectionConfig,\n rowActions,\n footerRows = [],\n rowClassName,\n highlightedIndex,\n onViewChange,\n rowWrapper,\n emptyState,\n pageSize: defaultPageSize = 25,\n localPagination,\n pageSizeOptions = [10, 25, 50, 100, 200, 500, 1000, 2000],\n zebra = true,\n className,\n tableClassName,\n mobileCards,\n mobileCardsBreakpoint = \"sm\",\n onRowOpen,\n density,\n }: MatrxDataTableProps<T>) {\n const appendQuery = query?.mode === \"controlled-append\" ? query : null;\n const appendQueryKey = appendQuery?.pagination.queryKey ?? null;\n // Effects run after paint. Keep the last committed source identity in a ref\n // so a new append source cannot render a prior source's local UI state for\n // that first frame (including when the records happen to share ids).\n const committedAppendQueryKey = useRef<string | null>(appendQueryKey);\n const appendSourceChanged =\n appendQuery !== null && committedAppendQueryKey.current !== appendQueryKey;\n const data = appendQuery ? appendQuery.pagination.rows : suppliedData;\n const isLoading = appendQuery ? appendQuery.pagination.loading : suppliedLoading;\n const isFetching = appendQuery ? appendQuery.pagination.isFetchingNextPage : suppliedFetching;\n const host = useMatrxDataTableHost();\n const resolvedDensity = density ?? host.defaultDensity ?? \"normal\";\n const SavedViews = host.SavedViews;\n const Link = host.Link ?? DefaultTableLink;\n const SidePanelSurface = host.SidePanelSurface ?? DefaultTableSidePanel;\n const { notify: toast, notice } = useTableNotice();\n const [savedViewError, setSavedViewError] = useState<string | null>(null);\n const [toolbarActionError, setToolbarActionError] = useState<string | null>(null);\n const [toolbarActionPending, setToolbarActionPending] = useState({ refresh: false, add: false });\n const toolbarActionPendingRef = useRef({ refresh: false, add: false });\n // Coarse pointers receive a real, non-overlapping target from the shared\n // table density stylesheet. Do not add a pseudo-element hit zone here: it\n // overlaps neighboring cells and makes the visual table lie about targets.\n const CHECKBOX_TAP_AREA = \"h-4 w-4 touch-manipulation\";\n const mobileCardsClass =\n mobileCardsBreakpoint === \"lg\" ? \"lg:hidden\" : \"sm:hidden\";\n const tableWithCardsClass =\n mobileCardsBreakpoint === \"lg\" ? \"max-lg:hidden\" : \"max-sm:hidden\";\n const controlledQuery =\n query?.mode === \"controlled\" || query?.mode === \"controlled-local\" || query?.mode === \"controlled-append\"\n ? query\n : null;\n const remoteQuery = query?.mode === \"controlled\" || query?.mode === \"controlled-append\" ? query : null;\n const sourceProcessing = query?.mode === \"controlled\" || query?.mode === \"controlled-local\"\n ? query.sourceProcessing\n : appendQuery?.sourceProcessing;\n const appendUsesLocalProcessing = appendQuery !== null && sourceProcessing !== undefined;\n const sourceOwnsColumnFilters = appendQuery !== null && sourceProcessing === undefined\n ? true\n : sourceProcessing?.columnFilters === \"source\";\n const sourceOwnsSort = appendQuery !== null && sourceProcessing === undefined\n ? true\n : sourceProcessing?.sort === \"source\";\n // A source-owned query can only expose scope intent when it explicitly\n // declares support for ranking that scope. Controlled-local retains the\n // complete loaded rows only while ordinary search stays local.\n const sourceOwnsIntelligentSearch = sourceProcessing?.intelligentSearch === \"source\";\n const sourceOwnsSearch = remoteQuery?.mode === \"controlled\" ||\n (appendQuery !== null && sourceProcessing === undefined) ||\n sourceProcessing?.search === \"source\" || sourceOwnsIntelligentSearch;\n const intelligentSearchEnabled = toolbar?.intelligentSearch !== undefined &&\n (sourceOwnsIntelligentSearch || (remoteQuery === null && !sourceOwnsSearch));\n const emitControlledQueryChange = useCallback(\n (\n patch: Partial<MatrxDataTableQueryState>,\n options?: { resetPage?: boolean },\n ) => {\n if (!controlledQuery) return;\n controlledQuery.onStateChange(\n nextQueryState(controlledQuery.state, patch, options),\n );\n },\n [controlledQuery],\n );\n\n const [internalSearch, setInternalSearch] = useState(\"\");\n const [draggedRowId, setDraggedRowId] = useState<string | null>(null);\n const hierarchySensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: { distance: COLUMN_REORDER_ACTIVATION_DISTANCE },\n }),\n );\n const toolbarSearchControlled = toolbar?.searchValue !== undefined;\n const searchValue = controlledQuery\n ? controlledQuery.state.search\n : toolbarSearchControlled\n ? (toolbar?.searchValue ?? \"\")\n : internalSearch;\n const setSearchValue = (v: string) => {\n if (controlledQuery) {\n emitControlledQueryChange({ search: v }, { resetPage: true });\n } else if (!toolbarSearchControlled) {\n setInternalSearch(v);\n }\n toolbar?.onSearchChange?.(v);\n };\n const [internalSearchMatchMode, setInternalSearchMatchMode] =\n useState<TableSearchMatchMode>(\n toolbar?.searchMatch?.defaultMode ?? \"contains\",\n );\n const searchMatchMode = controlledQuery\n ? (controlledQuery.state.searchMatchMode ??\n toolbar?.searchMatch?.defaultMode ??\n \"contains\")\n : internalSearchMatchMode;\n const setSearchMatchMode = (mode: TableSearchMatchMode) => {\n if (controlledQuery) {\n emitControlledQueryChange({ searchMatchMode: mode }, { resetPage: true });\n return;\n }\n setInternalSearchMatchMode(mode);\n };\n const [internalSearchScope, setInternalSearchScope] = useState(\"all\");\n const searchScope = controlledQuery\n ? (controlledQuery.state.searchScope ?? \"all\")\n : internalSearchScope;\n const setSearchScope = (scope: string) => {\n if (controlledQuery) {\n emitControlledQueryChange({ searchScope: scope }, { resetPage: true });\n return;\n }\n setInternalSearchScope(scope);\n };\n\n const [internalAnyOf, setInternalAnyOf] = useState(\"\");\n const toolbarAnyOfControlled = toolbar?.anyOf?.value !== undefined;\n const anyOfValue = controlledQuery\n ? controlledQuery.state.anyOf\n : toolbarAnyOfControlled\n ? (toolbar?.anyOf?.value ?? \"\")\n : internalAnyOf;\n const setAnyOfValue = (v: string) => {\n if (controlledQuery) {\n emitControlledQueryChange({ anyOf: v }, { resetPage: true });\n } else if (!toolbarAnyOfControlled) {\n setInternalAnyOf(v);\n }\n toolbar?.anyOf?.onChange?.(v);\n };\n\n const [internalLayeredFilters, setInternalLayeredFilters] = useState<\n LayeredFilterRule[]\n >([]);\n const layeredFilters = controlledQuery\n ? (controlledQuery.state.layeredFilters ?? [])\n : internalLayeredFilters;\n const setLayeredFilters = (next: LayeredFilterRule[]) => {\n if (controlledQuery) {\n emitControlledQueryChange({ layeredFilters: next }, { resetPage: true });\n return;\n }\n setInternalLayeredFilters(next);\n };\n\n const [internalColumnFilters, setInternalColumnFilters] =\n useState<ColumnFiltersState>({});\n const columnFilters = controlledQuery\n ? controlledQuery.state.columnFilters\n : internalColumnFilters;\n const setColumnFilter = (id: string, next: ColumnFilterValue | undefined) => {\n const nextFilters = { ...columnFilters, [id]: next };\n if (controlledQuery) {\n emitControlledQueryChange(\n { columnFilters: nextFilters },\n { resetPage: true },\n );\n return;\n }\n setInternalColumnFilters(nextFilters);\n };\n\n const [internalSort, setInternalSort] = useState<SortState | null>(defaultSort);\n const sort = controlledQuery ? controlledQuery.state.sort : internalSort;\n const setSort = (next: SortState | null) => {\n if (controlledQuery) {\n emitControlledQueryChange({ sort: next }, { resetPage: true });\n return;\n }\n setInternalSort(next);\n };\n\n const [internalPage, setInternalPage] = useState(1);\n const page = controlledQuery ? controlledQuery.state.page : internalPage;\n const setPage = (next: number) => {\n if (controlledQuery) {\n emitControlledQueryChange({ page: next });\n return;\n }\n setInternalPage(next);\n };\n\n const [internalPageSize, setInternalPageSize] = useState(\n defaultPageSize === 0 ? Math.max(data.length, 1) : defaultPageSize,\n );\n const pageSize = controlledQuery\n ? controlledQuery.state.pageSize\n : internalPageSize;\n const setPageSize = (next: number) => {\n if (controlledQuery) {\n emitControlledQueryChange({ pageSize: next }, { resetPage: true });\n return;\n }\n setInternalPageSize(next);\n };\n\n const [uncontrolledSelectedId, setUncontrolledSelectedId] = useState<\n string | null\n >(null);\n const rawSelectedId =\n controlledSelectedId !== undefined\n ? controlledSelectedId\n : uncontrolledSelectedId;\n const selectedId = appendSourceChanged ? null : rawSelectedId;\n const setSelectedId = (id: string | null) => {\n if (controlledSelectedId === undefined) setUncontrolledSelectedId(id);\n onSelectedIdChange?.(id);\n };\n\n const [uncontrolledWindowRowId, setUncontrolledWindowRowId] = useState<\n string | null\n >(null);\n const rawWindowRowId =\n controlledWindowRowId !== undefined\n ? controlledWindowRowId\n : uncontrolledWindowRowId;\n const windowRowId = appendSourceChanged ? null : rawWindowRowId;\n const setWindowRowId = (id: string | null) => {\n if (controlledWindowRowId === undefined) setUncontrolledWindowRowId(id);\n onWindowRowIdChange?.(id);\n };\n const [windowRowSnapshot, setWindowRowSnapshot] = useState<{\n queryKey: string | null;\n row: T;\n } | null>(null);\n const editScopeKey = appendQueryKey === null ? \"\\u0000local\" : `append:${appendQueryKey}`;\n const [editsByScope, setEditsByScope] = useState<Record<string, {\n sourceKey: string | null;\n values: CellEditsMap;\n rows: T[];\n revisions: Record<string, Record<string, number>>;\n }>>({});\n const editRevisionRef = useRef<Record<string, Record<string, Record<string, number>>>>({});\n const [savingByScope, setSavingByScope] = useState<Record<string, number>>({});\n const [confirmForeignDraftDiscard, setConfirmForeignDraftDiscard] = useState(false);\n const edits = editsByScope[editScopeKey]?.values ?? {};\n const saving = (savingByScope[editScopeKey] ?? 0) > 0;\n const setEdits = (next: SetStateAction<CellEditsMap>) => {\n const scope = editScopeKey;\n setEditsByScope((current) => {\n const previous = current[scope];\n const values = typeof next === \"function\"\n ? next(previous?.values ?? {})\n : next;\n return {\n ...current,\n [scope]: {\n sourceKey: appendQueryKey,\n values,\n rows: appendQueryKey === null ? data : [...data],\n revisions: previous?.revisions ?? {},\n },\n };\n });\n };\n const setCellEdit = (rowId: string, field: string, value: unknown) => {\n const scope = editScopeKey;\n const scopeRevisions = editRevisionRef.current[scope] ?? {};\n const revision = (scopeRevisions[rowId]?.[field] ?? 0) + 1;\n editRevisionRef.current[scope] = {\n ...scopeRevisions,\n [rowId]: { ...(scopeRevisions[rowId] ?? {}), [field]: revision },\n };\n setEditsByScope((current) => {\n const previous = current[scope];\n const values = {\n ...(previous?.values ?? {}),\n [rowId]: { ...(previous?.values[rowId] ?? {}), [field]: value },\n };\n const revisions = {\n ...(previous?.revisions ?? {}),\n [rowId]: { ...(previous?.revisions[rowId] ?? {}), [field]: revision },\n };\n return {\n ...current,\n [scope]: {\n sourceKey: appendQueryKey,\n values,\n rows: appendQueryKey === null ? data : [...data],\n revisions,\n },\n };\n });\n return revision;\n };\n const startSaving = (scope: string) => {\n setSavingByScope((current) => ({ ...current, [scope]: (current[scope] ?? 0) + 1 }));\n };\n const finishSaving = (scope: string) => {\n setSavingByScope((current) => {\n const remaining = Math.max(0, (current[scope] ?? 1) - 1);\n const next = { ...current };\n if (remaining === 0) delete next[scope];\n else next[scope] = remaining;\n return next;\n });\n };\n const foreignDrafts = Object.entries(editsByScope)\n .filter(([scope, draft]) => scope !== editScopeKey && Object.keys(draft.values).length > 0)\n .map(([, draft]) => draft);\n const foreignDraftPayload = foreignDrafts.map((draft) => ({\n sourceKey: draft.sourceKey,\n rows: Object.entries(draft.values).map(([rowId, columns]) => ({ rowId, columns })),\n }));\n const selection =\n appendSourceChanged && selectionConfig\n ? { ...selectionConfig, selectedIds: [] }\n : selectionConfig;\n\n useEffect(() => {\n const previous = committedAppendQueryKey.current;\n committedAppendQueryKey.current = appendQueryKey;\n // A first append render and leaving append mode do not replace one remote\n // result set with another. A changed non-null key does.\n if (previous === null || appendQueryKey === null || previous === appendQueryKey) {\n return;\n }\n setUncontrolledSelectedId(null);\n setUncontrolledWindowRowId(null);\n setWindowRowSnapshot(null);\n onSelectedIdChange?.(null);\n onWindowRowIdChange?.(null);\n selectionConfig?.onSelectedIdsChange([]);\n }, [\n appendQueryKey,\n onSelectedIdChange,\n onWindowRowIdChange,\n selectionConfig,\n ]);\n\n // Mobile scroll affordance: edge fades (+ chevron) show that more columns\n // exist off-screen. Recomputed on scroll/resize; desktop hides them via CSS.\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const tableRef = useRef<HTMLTableElement | null>(null);\n const cardsScrollRef = useRef<HTMLDivElement | null>(null);\n const previousAppendKeyForScrollReset = useRef<string | null>(appendQueryKey);\n\n // A source replacement (filter, sort, refresh, or organization change) starts\n // at the first result before it paints. Preserve horizontal position: it is a\n // deliberate column-reading choice, not part of the source window.\n useLayoutEffect(() => {\n const previous = previousAppendKeyForScrollReset.current;\n previousAppendKeyForScrollReset.current = appendQueryKey;\n if (\n previous === null ||\n appendQueryKey === null ||\n previous === appendQueryKey\n ) {\n return;\n }\n if (scrollRef.current) scrollRef.current.scrollTop = 0;\n if (cardsScrollRef.current) cardsScrollRef.current.scrollTop = 0;\n }, [appendQueryKey]);\n\n const appendScrollPolicy = appendQuery?.scroll;\n const scrollPagination = useScrollPagination({\n containers: [scrollRef, cardsScrollRef],\n queryKey: appendQuery?.pagination.queryKey ?? \"\",\n hasNextPage: appendQuery?.pagination.hasNextPage ?? false,\n isFetchingNextPage: appendQuery?.pagination.isFetchingNextPage ?? false,\n loading: appendQuery?.pagination.loading ?? false,\n error: appendQuery?.pagination.error ?? null,\n loadNextPage: appendQuery?.pagination.loadNextPage ?? (() => undefined),\n enabled: appendQuery !== null,\n // Suspended policy is deliberately manual at the hook boundary: its\n // reason remains visible in the footer while automatic listeners stay off.\n mode: appendScrollPolicy?.mode === \"suspended\" ? \"manual\" : appendScrollPolicy?.mode ?? \"scroll\",\n ...(appendScrollPolicy?.mode === \"scroll\" && appendScrollPolicy.thresholdPx !== undefined\n ? { thresholdPx: appendScrollPolicy.thresholdPx }\n : {}),\n ...(appendScrollPolicy?.mode === \"scroll\" && appendScrollPolicy.intentTimeoutMs !== undefined\n ? { intentTimeoutMs: appendScrollPolicy.intentTimeoutMs }\n : {}),\n });\n // The table bounds itself with `h-full`, which is inert unless every\n // ancestor is a flex column. When one is not, the table grows past the page\n // and an `overflow-hidden` ancestor clips it: no scrollbar, unreachable\n // rows, no error anywhere. This screams instead.\n const rootRef = useRef<HTMLDivElement | null>(null);\n useClippedContentGuard(rootRef, {\n label: typeof copy === \"object\" && copy.listLabel ? `Table: ${copy.listLabel}` : \"MatrxDataTable\",\n });\n const [scrollHintRight, setScrollHintRight] = useState(false);\n const [scrollHintLeft, setScrollHintLeft] = useState(false);\n const updateScrollHint = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n setScrollHintRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 2);\n setScrollHintLeft(el.scrollLeft > 2);\n }, []);\n const scrollTableHorizontally = (direction: \"left\" | \"right\") => {\n const el = scrollRef.current;\n if (!el) return;\n el.scrollBy({\n left:\n (direction === \"right\" ? 1 : -1) *\n Math.max(Math.round(el.clientWidth * 0.72), 240),\n behavior: \"smooth\",\n });\n };\n useEffect(() => {\n updateScrollHint();\n window.addEventListener(\"resize\", updateScrollHint);\n // The window is not the only thing that changes this container's width —\n // a collapsing sidebar, an opening panel, or a column set that arrives a\n // tick later all do, and each one silently invalidated the hint before.\n const el = scrollRef.current;\n const observer =\n el && typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(updateScrollHint)\n : null;\n if (el && observer) {\n observer.observe(el);\n const table = el.querySelector(\"table\");\n if (table) observer.observe(table);\n }\n return () => {\n window.removeEventListener(\"resize\", updateScrollHint);\n observer?.disconnect();\n };\n }, [updateScrollHint, data, columns]);\n\n const [columnOrder, setColumnOrder] = useState(() => columnState?.order ?? columns.map(columnId));\n const [hiddenColumnIds, setHiddenColumnIds] = useState(\n () => new Set(columnState?.hidden ?? columns.filter((column) => column.hidden).map(columnId)),\n );\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>(\n () => normalizeColumnWidthsForColumns(columnState?.widths, columns),\n );\n const [fixedTableGeometry, setFixedTableGeometry] = useState<FixedTableGeometry | null>(null);\n const knownColumnIds = useRef(new Set(columns.map(columnId)));\n const draggedColumnId = useRef<string | null>(null);\n const columnDragActive = useRef(false);\n const columnDragRaf = useRef<number | null>(null);\n const columnDragScrollDirection = useRef<-1 | 0 | 1>(0);\n const [columnDragPreview, setColumnDragPreview] = useState<ColumnDragPreview | null>(null);\n const stopColumnDragScroll = useCallback(() => {\n if (columnDragRaf.current !== null) cancelAnimationFrame(columnDragRaf.current);\n columnDragRaf.current = null;\n columnDragScrollDirection.current = 0;\n }, []);\n useEffect(() => () => {\n columnDragActive.current = false;\n stopColumnDragScroll();\n }, [stopColumnDragScroll]);\n const startColumnDragScroll = useCallback(() => {\n if (!columnDragActive.current || columnDragRaf.current !== null) return;\n const scrollStep = () => {\n const scroll = scrollRef.current;\n const direction = columnDragScrollDirection.current;\n if (!columnDragActive.current || !scroll || direction === 0) {\n columnDragRaf.current = null;\n return;\n }\n const nextScrollLeft = Math.max(\n 0,\n Math.min(scroll.scrollLeft + direction * 18, scroll.scrollWidth - scroll.clientWidth),\n );\n if (nextScrollLeft === scroll.scrollLeft) {\n columnDragRaf.current = null;\n columnDragScrollDirection.current = 0;\n return;\n }\n scroll.scrollLeft = nextScrollLeft;\n if (!columnDragActive.current || columnDragScrollDirection.current === 0) {\n columnDragRaf.current = null;\n return;\n }\n columnDragRaf.current = requestAnimationFrame(scrollStep);\n };\n columnDragRaf.current = requestAnimationFrame(scrollStep);\n }, []);\n const commitColumnState = useCallback((order: string[], hidden: Set<string>) => {\n if (columnState) columnState.onChange({ order, hidden: [...hidden] });\n else {\n setColumnOrder(order);\n setHiddenColumnIds(hidden);\n }\n }, [columnState]);\n const [internalColumnManagerOpen, setInternalColumnManagerOpen] = useState(false);\n const columnManagerOpen = controlledColumnManager?.open ?? internalColumnManagerOpen;\n const setColumnManagerOpen = controlledColumnManager?.onOpenChange ?? setInternalColumnManagerOpen;\n const columnIds = useMemo(() => columns.map(columnId), [columns]);\n const effectiveColumnOrder = useMemo(() => columnState\n ? [...columnState.order.filter((id, index, values) => columnIds.includes(id) && values.indexOf(id) === index), ...columnIds.filter((id) => !columnState.order.includes(id))]\n : columnOrder, [columnIds, columnOrder, columnState]);\n const effectiveHiddenColumnIds = useMemo(() => columnState\n ? new Set(columnState.hidden.filter((id) => columnIds.includes(id)))\n : hiddenColumnIds, [columnIds, columnState, hiddenColumnIds]);\n const effectiveColumnWidths = useMemo(\n () => normalizeColumnWidthsForColumns(columnState?.widths ?? columnWidths, columns),\n [columns, columnState?.widths, columnWidths],\n );\n const resizeGestureSnapshotRef = useRef<{\n widths: Record<string, number>;\n geometry: FixedTableGeometry;\n } | null>(null);\n const measureVisibleColumnWidths = useCallback(() => {\n const measured: Record<string, number> = {};\n const headers = tableRef.current\n ? Array.from(tableRef.current.querySelectorAll<HTMLTableCellElement>(\n \"thead th[data-matrx-table-column-id]\",\n ))\n : [];\n for (const header of headers) {\n const columnId = header.dataset.matrxTableColumnId;\n const width = header.getBoundingClientRect().width;\n if (columnId && Number.isFinite(width) && width > 0) {\n measured[columnId] = Math.round(width);\n }\n }\n return normalizeColumnWidthsForColumns(measured, columns);\n }, [columns]);\n const measureFixedTableGeometry = useCallback((): FixedTableGeometry => {\n const table = tableRef.current;\n const headers = table\n ? Array.from(table.querySelectorAll<HTMLTableCellElement>(\"thead th\"))\n : [];\n const widthFor = (selector: string) => {\n const header = table?.querySelector<HTMLTableCellElement>(selector);\n const width = header?.getBoundingClientRect().width ?? 0;\n return Number.isFinite(width) && width > 0 ? Math.round(width) : undefined;\n };\n const headerTotal = headers.reduce(\n (total, header) => total + Math.max(0, header.getBoundingClientRect().width),\n 0,\n );\n const selectionWidth = widthFor(\"th[data-matrx-table-selection-column]\");\n const headerActionsWidth = widthFor(\"th[data-matrx-table-actions-column]\");\n // A fixed-width actions header can report the previous density while its\n // inline action strip is clipped. scrollWidth remains the strip's natural\n // width, so it is the authoritative lower bound after a density change.\n const visibleActionStrips = Array.from(\n table?.querySelectorAll<HTMLElement>(\"[data-matrx-table-row-actions]\") ?? [],\n ).filter(\n (element) =>\n element.closest(\"table\") === table && element.getClientRects().length > 0,\n );\n const actionContentWidth = Math.max(\n 0,\n ...visibleActionStrips.map((element) => Math.ceil(element.scrollWidth)),\n );\n // A visible strip is authoritative: the header can still be constrained\n // by the preceding density. Hidden mobile-card strips never participate.\n const actionsWidth = actionContentWidth || headerActionsWidth;\n return {\n ...(headerTotal > 0 ? { tableWidth: Math.ceil(headerTotal) } : {}),\n ...(selectionWidth === undefined ? {} : { selectionWidth }),\n ...(actionsWidth === undefined ? {} : { actionsWidth }),\n };\n }, [resolvedDensity]);\n const captureResizeGestureSnapshot = useCallback(() => {\n resizeGestureSnapshotRef.current = {\n widths: measureVisibleColumnWidths(),\n geometry: measureFixedTableGeometry(),\n };\n }, [measureFixedTableGeometry, measureVisibleColumnWidths]);\n const clearResizeGestureSnapshot = useCallback(() => {\n resizeGestureSnapshotRef.current = null;\n }, []);\n const commitColumnWidths = useCallback((next: Record<string, number>, captureInitialWidths = false) => {\n // Initial rendering deliberately uses native auto layout. On the first\n // resize, use every visible data-column width captured at gesture start\n // before the preview can redistribute native auto layout, then switch to\n // fixed layout; a single fixed hint would otherwise redistribute the\n // unspecified columns. Utility columns are measured separately and remain\n // non-resizable.\n const gestureSnapshot = captureInitialWidths ? resizeGestureSnapshotRef.current : null;\n resizeGestureSnapshotRef.current = null;\n const normalized = normalizeColumnWidthsForColumns(\n captureInitialWidths\n ? { ...(gestureSnapshot?.widths ?? measureVisibleColumnWidths()), ...next }\n : next,\n columns,\n );\n if (captureInitialWidths) {\n setFixedTableGeometry(gestureSnapshot?.geometry ?? measureFixedTableGeometry());\n }\n else setFixedTableGeometry(null);\n for (const id of columnIds) {\n tableRef.current?.style.removeProperty(columnResizeCssVar(id));\n }\n if (columnState) {\n columnState.onWidthsChange?.(normalized);\n return;\n }\n setColumnWidths(normalized);\n }, [columnIds, columnState, columns, measureFixedTableGeometry, measureVisibleColumnWidths]);\n useEffect(() => {\n const ids = columns.map(columnId);\n if (columnState) return;\n const previousIds = knownColumnIds.current;\n setColumnOrder((current) => [\n ...current.filter((id) => ids.includes(id)),\n ...ids.filter((id) => !current.includes(id)),\n ]);\n setHiddenColumnIds((current) => {\n const next = new Set([...current].filter((id) => ids.includes(id)));\n for (const column of columns) {\n const id = columnId(column);\n if (column.hidden && !previousIds.has(id)) next.add(id);\n }\n return next;\n });\n setColumnWidths((current) => normalizeColumnWidthsForColumns(current, columns));\n knownColumnIds.current = new Set(ids);\n }, [columns, columnState]);\n // Pointer moves are imperative previews. A committed, restored, or\n // externally controlled width must remove that transient override so the\n // declarative per-column fallback is the sole source of truth.\n useLayoutEffect(() => {\n for (const id of columnIds) {\n tableRef.current?.style.removeProperty(columnResizeCssVar(id));\n }\n });\n const previewColumnOrder = useMemo(\n () => projectColumnDragOrder(effectiveColumnOrder, columnDragPreview),\n [columnDragPreview, effectiveColumnOrder],\n );\n useColumnReorderAnimation(tableRef, previewColumnOrder.join(\"\\0\"), columnDragPreview !== null);\n const visibleColumns = useMemo(() => {\n const byId = new Map(columns.map((column) => [columnId(column), column]));\n return previewColumnOrder\n .map((id) => byId.get(id))\n .filter(\n (column): column is MatrxColumnDef<T> =>\n column !== undefined && !effectiveHiddenColumnIds.has(columnId(column)),\n );\n }, [columns, effectiveHiddenColumnIds, previewColumnOrder]);\n const usesMeasuredFixedLayout = visibleColumns.length > 0 &&\n visibleColumns.every((column) => effectiveColumnWidths[columnId(column)] !== undefined);\n useLayoutEffect(() => {\n if (!usesMeasuredFixedLayout) {\n if (fixedTableGeometry !== null) setFixedTableGeometry(null);\n return;\n }\n if (fixedTableGeometry === null) setFixedTableGeometry(measureFixedTableGeometry());\n }, [fixedTableGeometry, measureFixedTableGeometry, usesMeasuredFixedLayout]);\n // Utility columns are content-sized before the first resize. When table\n // density changes, remeasure only that fixed utility geometry; the explicit\n // data-column widths remain the source of truth and siblings never rebalance.\n useLayoutEffect(() => {\n if (!usesMeasuredFixedLayout) return;\n const table = tableRef.current;\n if (!table) return;\n const utilityHeaders = Array.from(table.querySelectorAll<HTMLTableCellElement>(\n \"th[data-matrx-table-selection-column], th[data-matrx-table-actions-column]\",\n ));\n const utilityStyles = utilityHeaders.map((header) => header.getAttribute(\"style\"));\n const resizedWidth = table.style.getPropertyValue(\"--matrx-resized-table-width\");\n // Fixed-layout utility widths describe the prior density. Temporarily\n // release only those constraints (and the table total) so this measure\n // sees the current action content. Data-column width state is untouched.\n for (const header of utilityHeaders) header.removeAttribute(\"style\");\n table.style.removeProperty(\"--matrx-resized-table-width\");\n void table.getBoundingClientRect();\n const geometry = measureFixedTableGeometry();\n utilityHeaders.forEach((header, index) => {\n const style = utilityStyles[index];\n if (style == null) header.removeAttribute(\"style\");\n else header.setAttribute(\"style\", style);\n });\n table.style.setProperty(\"--matrx-resized-table-width\", resizedWidth);\n setFixedTableGeometry(geometry);\n }, [resolvedDensity, measureFixedTableGeometry, usesMeasuredFixedLayout]);\n const fixedLayoutActive = usesMeasuredFixedLayout && fixedTableGeometry !== null;\n const declaredVisibleCopyColumns = useMemo(\n () => visibleColumns.filter((column) => column.accessorFn !== undefined || column.accessorKey !== undefined),\n [visibleColumns],\n );\n const tableCopySourceNamespace = useId();\n // dnd-kit otherwise assigns its screen-reader description from a module-global\n // counter, which differs between SSR and the browser bundle during hydration.\n const tableDndContextId = useId();\n const defaultCopyTitle = toolbar?.title || \"Table\";\n const defaultCopy = useMemo<MatrxDataTableCopyConfig<T>>(() => ({\n label: defaultCopyTitle,\n listLabel: defaultCopyTitle,\n location: defaultCopyTitle,\n rowKind: \"table-row\",\n listKind: \"table-view\",\n listDescription: `${defaultCopyTitle} — ${remoteQuery ? \"current filtered/sorted loaded view\" : \"current filtered/sorted view\"}.`,\n listAttributes: (_visible, loaded) => remoteQuery\n ? { coverage: \"loaded-current-view\", loaded_count: loaded.length }\n : { coverage: \"current-view\" },\n humanRow: (row) => formatDefaultTableCopyRecord(\n projectDefaultTableCopyRow(row, declaredVisibleCopyColumns),\n declaredVisibleCopyColumns,\n ),\n agentRow: (row) => projectDefaultTableCopyRow(row, declaredVisibleCopyColumns),\n }), [defaultCopyTitle, declaredVisibleCopyColumns, remoteQuery]);\n // The built-in table source is the normal contract; false is the only opt-out.\n // Keep this after visibleColumns so the default captures the effective order and visibility.\n const effectiveCopy = copy === false ? undefined : copy ?? defaultCopy;\n const effectiveCopyColumns = copy === undefined ? declaredVisibleCopyColumns : visibleColumns;\n\n /**\n * \"Filter & sort before copying…\" — every table with a `copy` config\n * offers the copy-subset door on its view copy AND its selected-rows copy.\n * Suppressed in remote controlled mode: there `data` is one server page,\n * and a door promising \"exactly what you want from the data\" over one page\n * would be a lie (a fetch-all seam is the honest prerequisite).\n */\n const copySubsetVariant = useCopySubsetVariant<T>();\n const copySubsetColumns = (): CopySubsetColumn<T>[] =>\n effectiveCopyColumns\n .filter((c) => c.filter !== false || c.accessorKey || c.accessorFn)\n .map((c) => ({\n id: columnId(c),\n header: typeof c.header === \"string\" ? c.header : columnId(c),\n ...(c.accessorKey === undefined ? {} : { accessorKey: c.accessorKey }),\n ...(c.accessorFn === undefined ? {} : { accessorFn: c.accessorFn }),\n ...(c.filter === undefined ? {} : { filter: c.filter }),\n }));\n const copySubsetVariantFor = (\n rows: () => T[],\n scope: \"view\" | \"selected\",\n ) =>\n effectiveCopy && !remoteQuery\n ? [\n copySubsetVariant(() => ({\n label:\n scope === \"selected\"\n ? `${rows().length} selected ${selectionNoun}${rows().length === 1 ? \"\" : \"s\"}`\n : (effectiveCopy.listLabel ?? `${effectiveCopy.label} view`),\n location: effectiveCopy.location,\n kind: effectiveCopy.listKind,\n rows: rows(),\n columns: copySubsetColumns(),\n getRowId,\n serializer: (shaped: T[]) =>\n buildViewAgentInput(effectiveCopy, shaped, data, { scope: \"custom\" }),\n })),\n ]\n : [];\n\n const filterMeta = useMemo(() => {\n const meta = new Map<string, QueryFilterMeta>();\n for (const col of visibleColumns) {\n const id = columnId(col);\n meta.set(id, resolveQueryFilterMeta(col, data, Boolean(remoteQuery)));\n }\n return meta;\n }, [visibleColumns, data, remoteQuery]);\n const intelligentSearchScopes = useMemo(\n () => resolveTableSearchScopes(data, columns, {\n ...(toolbar?.intelligentSearch?.roles === undefined\n ? {}\n : { roles: toolbar.intelligentSearch.roles }),\n ...(toolbar?.intelligentSearch?.scopes === undefined\n ? {}\n : { scopes: toolbar.intelligentSearch.scopes }),\n }),\n [columns, data, toolbar?.intelligentSearch?.roles, toolbar?.intelligentSearch?.scopes],\n );\n\n const processed = useMemo(() => {\n if (remoteQuery && !appendUsesLocalProcessing) return data;\n if (processLocalRows) {\n return processLocalRows(data, {\n page,\n pageSize,\n search: searchValue,\n searchMatchMode,\n ...(intelligentSearchEnabled ? { searchScope } : {}),\n anyOf: anyOfValue,\n layeredFilters,\n columnFilters,\n sort,\n });\n }\n const locallyFiltered = filterAndSortRows(\n data,\n intelligentSearchEnabled ? columns : visibleColumns,\n sourceOwnsColumnFilters ? {} : columnFilters,\n sourceOwnsSort ? null : sort,\n intelligentSearchEnabled || toolbar?.search === false || sourceOwnsSearch ? \"\" : searchValue,\n toolbar?.anyOf\n ? { columnIds: toolbar.anyOf.columnIds, query: anyOfValue }\n : undefined,\n layeredFilters,\n searchMatchMode,\n searchText,\n );\n if (!intelligentSearchEnabled || sourceOwnsSearch) return locallyFiltered;\n return rankTableSearchRows(\n locallyFiltered,\n columns,\n searchValue,\n {\n scope: searchScope,\n ...(toolbar?.intelligentSearch?.roles === undefined\n ? {}\n : { roles: toolbar.intelligentSearch.roles }),\n ...(toolbar?.intelligentSearch?.scopes === undefined\n ? {}\n : { scopes: toolbar.intelligentSearch.scopes }),\n matchMode: searchMatchMode,\n },\n searchText,\n );\n }, [\n data,\n visibleColumns,\n columnFilters,\n sort,\n searchValue,\n toolbar,\n anyOfValue,\n layeredFilters,\n searchMatchMode,\n searchText,\n columns,\n processLocalRows,\n page,\n pageSize,\n remoteQuery,\n appendUsesLocalProcessing,\n sourceOwnsColumnFilters,\n sourceOwnsSort,\n sourceOwnsSearch,\n intelligentSearchEnabled,\n searchScope,\n ]);\n\n const lastNotifiedViewRows = useRef<T[] | null>(null);\n useEffect(() => {\n if (!onViewChange) {\n lastNotifiedViewRows.current = null;\n return;\n }\n const changed =\n lastNotifiedViewRows.current === null ||\n !hasSameRowReferences(lastNotifiedViewRows.current, processed);\n lastNotifiedViewRows.current = processed;\n if (changed) onViewChange(processed);\n }, [processed, onViewChange]);\n\n useEffect(() => {\n if (controlledQuery) return;\n // eslint-disable-next-line react-hooks/set-state-in-effect -- Preserve the original local-mode contract: every query-shape change returns to page one, including externally controlled toolbar values.\n setInternalPage(1);\n }, [\n searchValue,\n searchMatchMode,\n anyOfValue,\n layeredFilters,\n columnFilters,\n sort,\n pageSize,\n controlledQuery,\n ]);\n\n const totalItems = appendQuery\n ? (appendQuery.pagination.totalItems ?? processed.length)\n : remoteQuery?.mode === \"controlled\"\n ? Math.max(0, remoteQuery.totalItems)\n : processed.length;\n const sourceTotal = sourceProcessing?.sourceTotal;\n const allRowsAreLoaded =\n !remoteQuery && (sourceTotal === undefined || sourceTotal <= data.length);\n // `0` is the table's local-only All sentinel. A remote source is never\n // handed that sentinel: it has only one loaded page (or an append receipt),\n // so showing all would lie and could turn into an unbounded request.\n const effectivePageSize = remoteQuery\n ? Math.max(pageSize, 1)\n : pageSize === 0\n ? Math.max(totalItems, 1)\n : Math.max(pageSize, 1);\n const pageCount = Math.max(1, Math.ceil(totalItems / effectivePageSize));\n const safePage = appendQuery ? 1 : remoteQuery\n ? safeQueryPage(page, totalItems, effectivePageSize)\n : Math.min(page, pageCount);\n // A source-owned projection without a completeness receipt is not a full\n // local dataset. Its source must supply the controlled-append contract.\n const sourceOwnsProcessing = sourceOwnsSearch || sourceOwnsSort || sourceOwnsColumnFilters;\n const localProgressiveEnabled = !remoteQuery && !hidePagination &&\n allRowsAreLoaded && (!sourceOwnsProcessing || sourceTotal !== undefined) &&\n localPagination?.mode !== \"numbered\";\n const progressiveRows = useProgressiveTableRows({\n rows: processed,\n pageSize,\n onPageSizeChange: (size) => {\n setPageSize(size);\n if (!controlledQuery) setPage(1);\n },\n requestedPage: safePage,\n queryKey: JSON.stringify({ tableId, searchValue, searchMatchMode, searchScope,\n anyOfValue, layeredFilters, columnFilters, sort }),\n containers: [scrollRef, cardsScrollRef],\n enabled: localProgressiveEnabled,\n numberedPageHasMore: !hidePagination && !isLoading && !isFetching &&\n processed.length > 0 && safePage < pageCount &&\n (remoteQuery?.mode === \"controlled\" ||\n (!remoteQuery && localPagination?.mode === \"numbered\")),\n onPageAdvance: setPage,\n });\n const paginated = useMemo(() => {\n if (remoteQuery) return processed;\n if (hidePagination) return processed;\n if (localProgressiveEnabled) return [...progressiveRows.rows];\n if (pageSize === 0) return processed;\n const start = (safePage - 1) * effectivePageSize;\n return processed.slice(start, start + effectivePageSize);\n }, [processed, safePage, effectivePageSize, pageSize, remoteQuery, hidePagination, localProgressiveEnabled, progressiveRows.rows]);\n\n // A deletion or narrower filter can leave a controlled URL on a page that\n // no longer exists. Emit the clamped page once the new total arrives.\n useEffect(() => {\n if (!controlledQuery || controlledQuery.state.page === safePage) return;\n emitControlledQueryChange({ page: safePage });\n }, [controlledQuery, emitControlledQueryChange, safePage]);\n\n const selectedRow = useMemo(() => {\n if (!selectedId) return null;\n return data.find((r) => getRowId(r) === selectedId) ?? null;\n }, [data, selectedId, getRowId]);\n\n const windowRow = useMemo(() => {\n if (!windowRowId) return null;\n return (\n data.find((r) => getRowId(r) === windowRowId) ??\n (windowRowSnapshot &&\n windowRowSnapshot.queryKey === appendQueryKey &&\n getRowId(windowRowSnapshot.row) === windowRowId\n ? windowRowSnapshot.row\n : null)\n );\n }, [data, windowRowId, windowRowSnapshot, getRowId, appendQueryKey]);\n\n const detailEnabled = detail?.enabled !== false;\n const windowEnabled =\n windowConfig?.enabled !== false && (detailEnabled || Boolean(windowConfig));\n const opensWindowOnRowClick = Boolean(\n windowEnabled && windowConfig?.openOnRowClick !== false,\n );\n const editEnabled = Boolean(edit?.enabled && edit.onSave);\n const showRowCopy = effectiveCopy !== undefined && effectiveCopy.showRow !== false;\n const showToolbarCopy = effectiveCopy !== undefined && effectiveCopy.showToolbar !== false;\n\n const activeFilterCount = countActiveColumnFilters(columnFilters);\n const facetActive = (toolbar?.facets ?? []).some((f) => {\n if (f.type !== \"button-group\") return false;\n const def = f.defaultValue ?? f.options[0]?.value;\n return def !== undefined && f.value !== def;\n });\n const hasActiveFilters =\n activeFilterCount > 0 ||\n Boolean(searchValue.trim()) ||\n (intelligentSearchEnabled && searchScope !== \"all\") ||\n Boolean(anyOfValue.trim()) ||\n completeLayeredFilterRules(layeredFilters).length > 0 ||\n facetActive;\n\n const changeCount = useMemo(() => {\n let n = 0;\n for (const fields of Object.values(edits)) {\n n += Object.keys(fields).length;\n }\n return n;\n }, [edits]);\n\n const showSearch = toolbar?.search !== false;\n\n const openDetail = (row: T) => {\n if (!detailEnabled) {\n onRowOpen?.(row);\n return;\n }\n setSelectedId(getRowId(row));\n onRowOpen?.(row);\n };\n\n const openWindow = (row: T, e?: React.MouseEvent) => {\n e?.stopPropagation();\n // Prefer window.onOpen so consumers can hydrate the Edit tab without also\n // opening the side panel (onRowOpen is reserved for row-click → detail).\n if (windowConfig?.onOpen) {\n windowConfig.onOpen(row);\n } else if (!windowConfig?.openOnRowClick) {\n onRowOpen?.(row);\n }\n setWindowRowSnapshot({ queryKey: appendQueryKey, row });\n setWindowRowId(getRowId(row));\n };\n\n const closeWindow = () => {\n setWindowRowId(null);\n setWindowRowSnapshot(null);\n };\n\n const openRow = (row: T) => {\n if (opensWindowOnRowClick) {\n openWindow(row);\n return;\n }\n openDetail(row);\n };\n\n const clearAllFilters = () => {\n if (controlledQuery) {\n emitControlledQueryChange(\n {\n search: \"\",\n searchMatchMode: toolbar?.searchMatch?.defaultMode ?? \"contains\",\n ...(intelligentSearchEnabled ? { searchScope: \"all\" } : {}),\n anyOf: \"\",\n layeredFilters: [],\n columnFilters: {},\n },\n { resetPage: true },\n );\n toolbar?.onSearchChange?.(\"\");\n toolbar?.anyOf?.onChange?.(\"\");\n } else {\n setInternalColumnFilters({});\n setSearchValue(\"\");\n setInternalSearchMatchMode(\n toolbar?.searchMatch?.defaultMode ?? \"contains\",\n );\n setInternalSearchScope(\"all\");\n setAnyOfValue(\"\");\n setInternalLayeredFilters([]);\n }\n resetToolbarFacets(toolbar?.facets);\n };\n\n const commitCell = (rowId: string, field: string, next: unknown) => {\n const scope = editScopeKey;\n const nextEdits = { [rowId]: { [field]: next } };\n const revision = setCellEdit(rowId, field, next);\n if (edit?.autoSave && edit.onSave) {\n const rowsAtCommit = appendQueryKey === null ? data : [...data];\n const save = edit.onSave;\n startSaving(scope);\n void Promise.resolve().then(() => save(nextEdits, rowsAtCommit))\n .then(() => {\n setEditsByScope((current) => {\n const draft = current[scope];\n if (!draft || draft.revisions[rowId]?.[field] !== revision) return current;\n const rowDraft = draft.values[rowId];\n if (!rowDraft) return current;\n const { [field]: _saved, ...remainingFields } = rowDraft;\n const values = { ...draft.values };\n if (Object.keys(remainingFields).length === 0) delete values[rowId];\n else values[rowId] = remainingFields;\n return { ...current, [scope]: { ...draft, values } };\n });\n toast.success(\"Change saved\");\n })\n .catch((error: unknown) => {\n toast.error(\n `Couldn't save: ${error instanceof Error ? error.message : String(error)}`,\n );\n })\n .finally(() => finishSaving(scope));\n }\n };\n\n const discardRowEdits = (rowId: string) => {\n setEdits((previous) => {\n if (!previous[rowId]) return previous;\n const next = { ...previous };\n delete next[rowId];\n return next;\n });\n };\n\n const hierarchyRows = hierarchy?.rows ?? data;\n const hierarchyGetParentId = hierarchy?.getParentId;\n // O(1) lookups for everything the drag path needs. The previous\n // implementation walked ancestor chains with linear `.find`s per row per\n // render — quadratic work re-run on every drag event.\n const hierarchyIndex = useMemo(() => {\n if (!hierarchyGetParentId) return null;\n const byId = new Map<string, T>();\n const parentById = new Map<string, string | null>();\n for (const row of hierarchyRows) {\n const id = getRowId(row);\n byId.set(id, row);\n parentById.set(id, hierarchyGetParentId(row));\n }\n const depthById = new Map<string, number>();\n const depthOf = (id: string): number => {\n const known = depthById.get(id);\n if (known !== undefined) return known;\n // Iterative walk with cycle guard — bad data must not hang the tab.\n const chain: string[] = [];\n let cursor: string | null = id;\n while (\n cursor !== null &&\n !depthById.has(cursor) &&\n chain.length <= byId.size\n ) {\n chain.push(cursor);\n const parent: string | null = parentById.get(cursor) ?? null;\n cursor = parent !== null && byId.has(parent) ? parent : null;\n }\n let depth = cursor !== null ? (depthById.get(cursor) ?? 0) : -1;\n for (let i = chain.length - 1; i >= 0; i -= 1) {\n depth += 1;\n const chainId = chain[i];\n if (chainId !== undefined) depthById.set(chainId, depth);\n }\n return depthById.get(id) ?? 0;\n };\n for (const id of byId.keys()) depthOf(id);\n return { byId, parentById, depthById };\n }, [hierarchyGetParentId, hierarchyRows, getRowId]);\n const draggedRow =\n draggedRowId && hierarchyIndex\n ? hierarchyIndex.byId.get(draggedRowId)\n : undefined;\n // The dragged row plus its whole subtree: every id a drop may not land\n // inside. Built once per drag, not re-derived per row per render.\n const hierarchyBlockedIds = useMemo(() => {\n if (!draggedRowId || !hierarchyIndex) return null;\n const childrenById = new Map<string, string[]>();\n for (const [id, parentId] of hierarchyIndex.parentById) {\n if (parentId === null) continue;\n const siblings = childrenById.get(parentId);\n if (siblings) siblings.push(id);\n else childrenById.set(parentId, [id]);\n }\n const blocked = new Set<string>([draggedRowId]);\n const queue = [draggedRowId];\n while (queue.length > 0) {\n const id = queue.pop();\n if (id === undefined) break;\n for (const child of childrenById.get(id) ?? []) {\n if (!blocked.has(child)) {\n blocked.add(child);\n queue.push(child);\n }\n }\n }\n return blocked;\n }, [draggedRowId, hierarchyIndex]);\n const hierarchyDropZones = (\n targetId: string,\n ): { insideOk: boolean; siblingOk: boolean } => {\n if (!hierarchyIndex || !hierarchyBlockedIds || targetId === draggedRowId) {\n return { insideOk: false, siblingOk: false };\n }\n const parentId = hierarchyIndex.parentById.get(targetId) ?? null;\n return {\n insideOk: !hierarchyBlockedIds.has(targetId),\n siblingOk:\n Boolean(hierarchy?.manualOrder) &&\n (parentId === null || !hierarchyBlockedIds.has(parentId)),\n };\n };\n const canDropOn = (target: T): boolean => {\n const zones = hierarchyDropZones(getRowId(target));\n return zones.insideOk || zones.siblingOk;\n };\n const persistHierarchyMove = (row: T, move: MatrxDataTableHierarchyMove) => {\n if (!hierarchy) return;\n void Promise.resolve(hierarchy.onMove(row, move)).catch(\n (error: unknown) => {\n toast.error(\n `Couldn't move row: ${error instanceof Error ? error.message : String(error)}`,\n );\n },\n );\n };\n /**\n * One resolver for the live indicator AND the final drop, measuring the\n * target row's REAL on-screen rect (never dnd-kit's drag-start snapshot, the\n * source of drops landing on the wrong row after any mid-drag scroll).\n * Standard tree zones: top third = above, bottom third = below, middle =\n * nest inside; invalid zones fall back to whichever remains valid.\n */\n const resolveHierarchyMove = (\n overId: string,\n pointerY: number,\n ): HierarchyDropPreview | null => {\n if (!hierarchy || !hierarchyIndex || !scrollRef.current) return null;\n if (overId === \"__root__\") {\n return {\n move: {\n parentId: null,\n beforeId: null,\n position: \"root\",\n targetId: null,\n },\n targetId: null,\n position: \"root\",\n depth: 0,\n targetLabel: null,\n };\n }\n const target = hierarchyIndex.byId.get(overId);\n if (!target) return null;\n const zones = hierarchyDropZones(overId);\n if (!zones.insideOk && !zones.siblingOk) return null;\n const rowElement = scrollRef.current.querySelector(\n `tr[data-row-id=\"${CSS.escape(overId)}\"]`,\n );\n if (!rowElement) return null;\n const rect = rowElement.getBoundingClientRect();\n const ratio = rect.height > 0 ? (pointerY - rect.top) / rect.height : 0.5;\n let position: \"before\" | \"after\" | \"inside\";\n if (!zones.siblingOk) {\n position = \"inside\";\n } else if (!zones.insideOk) {\n position = ratio < 0.5 ? \"before\" : \"after\";\n } else if (ratio < 1 / 3) {\n position = \"before\";\n } else if (ratio > 2 / 3) {\n position = \"after\";\n } else {\n position = \"inside\";\n }\n const targetDepth = hierarchyIndex.depthById.get(overId) ?? 0;\n if (position === \"inside\") {\n return {\n move: {\n parentId: overId,\n beforeId: null,\n position: \"inside\",\n targetId: overId,\n },\n targetId: overId,\n position,\n depth: targetDepth + 1,\n targetLabel: hierarchy.itemLabel?.(target) ?? \"row\",\n };\n }\n const parentId = hierarchyIndex.parentById.get(overId) ?? null;\n // \"after\" resolves to \"before the next visible sibling\" so consumers keep\n // one insertion semantic; a target with no successor means insert last.\n let beforeId: string | null = overId;\n if (position === \"after\") {\n beforeId = null;\n const targetIndex = paginated.findIndex(\n (row) => getRowId(row) === overId,\n );\n for (\n let i = targetIndex + 1;\n targetIndex >= 0 && i < paginated.length;\n i += 1\n ) {\n const candidate = paginated[i];\n if (!candidate) continue;\n const candidateId = getRowId(candidate);\n if (candidateId === draggedRowId) continue;\n if ((hierarchyIndex.parentById.get(candidateId) ?? null) === parentId) {\n beforeId = candidateId;\n break;\n }\n // Left the sibling group (shallower row) — target is the last sibling.\n if (\n (hierarchyIndex.depthById.get(candidateId) ?? 0) <= targetDepth &&\n (hierarchyIndex.parentById.get(candidateId) ?? null) !== parentId\n ) {\n break;\n }\n }\n }\n return {\n move: { parentId, beforeId, position, targetId: overId },\n targetId: overId,\n position,\n depth: targetDepth,\n targetLabel: hierarchy.itemLabel?.(target) ?? \"row\",\n };\n };\n const endHierarchyDrag = (event: DragEndEvent) => {\n const source = hierarchyIndex?.byId.get(String(event.active.id));\n const preview = event.over\n ? resolveHierarchyMove(String(event.over.id), dragPointerY(event))\n : null;\n if (source && preview) {\n persistHierarchyMove(source, preview.move);\n }\n setDraggedRowId(null);\n };\n\n const handleSaveEdits = async () => {\n if (!edit?.onSave || changeCount === 0) return;\n const scope = editScopeKey;\n const draft = editsByScope[scope];\n if (!draft) return;\n const values = draft.values;\n const revisions = draft.revisions;\n const rows = appendQueryKey === null ? data : draft.rows;\n const save = edit.onSave;\n startSaving(scope);\n try {\n await Promise.resolve().then(() => save(values, rows));\n setEditsByScope((current) => {\n const currentDraft = current[scope];\n if (!currentDraft) return current;\n const nextValues: CellEditsMap = {};\n for (const [rowId, rowValues] of Object.entries(currentDraft.values)) {\n const savedRow = values[rowId];\n const savedRevisions = revisions[rowId];\n const currentRevisions = currentDraft.revisions[rowId];\n const remaining = Object.fromEntries(\n Object.entries(rowValues).filter(([field]) =>\n !Object.hasOwn(savedRow ?? {}, field)\n || currentRevisions?.[field] !== savedRevisions?.[field],\n ),\n );\n if (Object.keys(remaining).length > 0) nextValues[rowId] = remaining;\n }\n return { ...current, [scope]: { ...currentDraft, values: nextValues } };\n });\n toast.success(\"Changes saved\");\n } catch (e) {\n toast.error(\n `Couldn't save: ${e instanceof Error ? e.message : String(e)}`,\n );\n } finally {\n finishSaving(scope);\n }\n };\n\n const handleCancelEdits = () => {\n setEdits({});\n edit?.onCancel?.();\n };\n\n const showActionsCol = windowEnabled || Boolean(rowActions) || showRowCopy;\n\n // ── Multi-row selection ───────────────────────────────────────────────────\n // Controlled by the consumer (see MatrxDataTableSelectionConfig). Everything\n // here derives from `selection.selectedIds` — the table keeps no shadow copy\n // that could disagree with the surface after a re-fetch.\n const selectedIdSet = useMemo(\n () => new Set(selection?.selectedIds ?? []),\n [selection?.selectedIds],\n );\n const selectableRows = paginated.filter(\n (row) => selection?.isRowSelectable?.(row) ?? true,\n );\n const selectedOnPage = selectableRows.filter((row) =>\n selectedIdSet.has(getRowId(row)),\n );\n const allOnPageSelected =\n selectableRows.length > 0 &&\n selectedOnPage.length === selectableRows.length;\n const someOnPageSelected = selectedOnPage.length > 0 && !allOnPageSelected;\n const selectedRows = useMemo(\n () => data.filter((row) => selectedIdSet.has(getRowId(row))),\n [data, selectedIdSet, getRowId],\n );\n // Anchor for shift-click range selection — the thing that makes clearing 40\n // rows of noise one gesture instead of forty.\n const lastToggledIndex = useRef<number | null>(null);\n\n const setSelectedIds = (next: Set<string>) =>\n selection?.onSelectedIdsChange([...next]);\n\n const toggleRowSelected = (index: number, shiftKey: boolean) => {\n if (!selection) return;\n const row = paginated[index];\n if (!row) return;\n const id = getRowId(row);\n const next = new Set(selectedIdSet);\n const turningOn = !next.has(id);\n const anchor = lastToggledIndex.current;\n const from = shiftKey && anchor !== null ? Math.min(anchor, index) : index;\n const to = shiftKey && anchor !== null ? Math.max(anchor, index) : index;\n for (let i = from; i <= to; i += 1) {\n const target = paginated[i];\n if (!target) continue;\n if (!(selection.isRowSelectable?.(target) ?? true)) continue;\n const targetId = getRowId(target);\n if (turningOn) next.add(targetId);\n else next.delete(targetId);\n }\n lastToggledIndex.current = index;\n setSelectedIds(next);\n };\n\n const toggleAllOnPage = () => {\n if (!selection) return;\n const next = new Set(selectedIdSet);\n for (const row of selectableRows) {\n const id = getRowId(row);\n if (allOnPageSelected) next.delete(id);\n else next.add(id);\n }\n lastToggledIndex.current = null;\n setSelectedIds(next);\n };\n\n const selectionNoun = selection?.noun ?? \"row\";\n const selectionCount = selection?.selectedIds.length ?? 0;\n const leadingCols = selection ? 1 : 0;\n const renderedFacets = controlledQuery\n ? toolbar?.facets?.map((facet) =>\n facet.type === \"button-group\"\n ? {\n ...facet,\n onChange: (value: string) => {\n facet.onChange(value);\n emitControlledQueryChange({ page: 1 });\n },\n }\n : facet,\n )\n : toolbar?.facets;\n const renderRecordCell = (row: T, col: MatrxColumnDef<T>, index: number) => {\n const id = getRowId(row);\n const field = col.accessorKey ? String(col.accessorKey) : columnId(col);\n const rowEdits = edits[id];\n const display = renderCell(applyRowEdits(row, rowEdits), col, index);\n const href = col.href?.(row) ?? undefined;\n if (editEnabled && col.editable && (col.editableIf?.(row) ?? true)) {\n return <EditableTableCell\n value={rowEdits && field in rowEdits ? rowEdits[field] : getCellValue(row, col)}\n editType={col.editable}\n {...(col.editOptions === undefined ? {} : { editOptions: col.editOptions })}\n display={display}\n dirty={Boolean(rowEdits && field in rowEdits)}\n onCommit={(next) => commitCell(id, field, next)}\n {...(href === undefined ? {} : { href })}\n {...(col.editTrigger === undefined ? {} : { editTrigger: col.editTrigger })}\n />;\n }\n return href ? <Link href={href} onClick={(event) => event.stopPropagation()} className=\"block w-full min-w-0 rounded outline-none focus-visible:ring-2 focus-visible:ring-ring\">{display}</Link> : display;\n };\n\n const currentViewSnapshot = useMemo<TableViewSnapshot>(\n () => ({\n __kind: \"matrx-table-view\",\n version: 1,\n query: {\n pageSize,\n search: searchValue,\n ...(searchMatchMode === \"contains\" ? {} : { searchMatchMode }),\n ...(intelligentSearchEnabled && searchScope !== \"all\" ? { searchScope } : {}),\n anyOf: anyOfValue,\n ...(layeredFilters.length ? { layeredFilters } : {}),\n columnFilters,\n sort,\n },\n columns: {\n order: effectiveColumnOrder,\n hidden: [...effectiveHiddenColumnIds],\n ...(Object.keys(effectiveColumnWidths).length ? { widths: effectiveColumnWidths } : {}),\n },\n }),\n [\n anyOfValue,\n columnFilters,\n effectiveColumnOrder,\n effectiveColumnWidths,\n effectiveHiddenColumnIds,\n layeredFilters,\n pageSize,\n searchMatchMode,\n intelligentSearchEnabled,\n searchScope,\n searchValue,\n sort,\n ],\n );\n const declaredDefaultViewSnapshot = useMemo<TableViewSnapshot>(\n () => defaultViewSnapshot ?? {\n __kind: \"matrx-table-view\",\n version: 1,\n query: {\n pageSize: defaultPageSize,\n search: \"\",\n anyOf: \"\",\n layeredFilters: [],\n columnFilters: {},\n sort: defaultSort,\n },\n columns: {\n order: columns.map(columnId),\n hidden: columns.filter((column) => column.hidden).map(columnId),\n },\n },\n [columns, defaultPageSize, defaultSort, defaultViewSnapshot],\n );\n const applySavedView = useCallback(\n (rawSnapshot: TableViewSnapshot) => {\n const snapshot = parseTableViewSnapshot(rawSnapshot);\n if (!snapshot) {\n const message = \"This saved view has an unsupported format. The current table was left unchanged.\";\n setSavedViewError(message);\n throw new Error(message);\n }\n const knownColumns = new Set(columns.map(columnId));\n const staleScope = snapshot.query.searchScope !== undefined &&\n snapshot.query.searchScope !== \"all\" &&\n (!intelligentSearchEnabled || !intelligentSearchScopes.some((scope) => scope.id === snapshot.query.searchScope));\n if (staleScope) {\n const message = \"This saved view uses a search field that is no longer available. The current table was left unchanged.\";\n setSavedViewError(message);\n throw new Error(message);\n }\n const unknown = [...snapshot.columns.order, ...snapshot.columns.hidden,\n ...Object.keys(snapshot.query.columnFilters),\n ...(snapshot.query.sort ? [snapshot.query.sort.id] : []),\n ...(snapshot.query.layeredFilters?.map((rule) => rule.field) ?? [])]\n .filter((id, index, values) => !knownColumns.has(id) && values.indexOf(id) === index);\n if (unknown.length > 0) {\n const message = `This saved view refers to unavailable columns: ${unknown.join(\", \")}. The current table was left unchanged.`;\n setSavedViewError(message);\n throw new Error(message);\n }\n setSavedViewError(null);\n const nextQuery = { ...snapshot.query, page: 1 };\n const nextOrder = [...snapshot.columns.order, ...columns.map(columnId).filter((id) => !snapshot.columns.order.includes(id))];\n if (controlledQuery) {\n controlledQuery.onStateChange(nextQuery);\n toolbar?.onSearchChange?.(nextQuery.search);\n toolbar?.anyOf?.onChange?.(nextQuery.anyOf);\n }\n else {\n setSearchValue(nextQuery.search);\n setInternalSearchMatchMode(nextQuery.searchMatchMode ?? \"contains\");\n setInternalSearchScope(nextQuery.searchScope ?? \"all\");\n setAnyOfValue(nextQuery.anyOf);\n setInternalLayeredFilters(nextQuery.layeredFilters ?? []);\n setInternalColumnFilters(nextQuery.columnFilters);\n setInternalSort(nextQuery.sort);\n setInternalPageSize(nextQuery.pageSize);\n setInternalPage(1);\n }\n commitColumnState(nextOrder, new Set(snapshot.columns.hidden));\n commitColumnWidths(normalizeColumnWidthMap(snapshot.columns.widths, knownColumns));\n },\n [columns, commitColumnState, commitColumnWidths, controlledQuery, intelligentSearchEnabled, intelligentSearchScopes, toolbar],\n );\n\n return (\n <TooltipProvider>\n <DndContext\n id={tableDndContextId}\n sensors={hierarchySensors}\n collisionDetection={pointerWithin}\n accessibility={{\n screenReaderInstructions: {\n draggable: \"Drag with a pointer. To reorder columns with a keyboard, open Columns and use Move earlier or Move later.\",\n },\n }}\n // Re-measure droppables while dragging: the root drop strip mounts at\n // drag start and shifts every row, so drag-start-only rects would leave\n // collision detection one row off for the whole drag.\n measuring={{ droppable: { strategy: MeasuringStrategy.Always } }}\n onDragStart={(event) => {\n const kind = event.active.data.current?.matrxDragKind;\n if (kind === \"column-header\") {\n const draggedId = String(event.active.data.current?.columnId);\n draggedColumnId.current = draggedId;\n columnDragActive.current = true;\n setColumnDragPreview({ draggedId, targetId: null, after: false });\n return;\n }\n if (kind === \"column-manager\") return;\n setDraggedRowId(String(event.active.id));\n }}\n onDragMove={(event) => {\n if (\n !columnDragActive.current ||\n event.active.data.current?.matrxDragKind !== \"column-header\"\n ) return;\n const overData = event.over?.data.current;\n const overId = overData?.matrxDragKind === \"column-header\" ? overData.columnId : null;\n const activeRect = event.active.rect.current.translated;\n const overRect = event.over?.rect;\n if (!overId || !activeRect || !overRect) {\n setColumnDragPreview((current) =>\n current?.targetId === null ? current : current ? { ...current, targetId: null } : current,\n );\n columnDragScrollDirection.current = 0;\n stopColumnDragScroll();\n return;\n }\n const after = activeRect.left + activeRect.width / 2 >= overRect.left + overRect.width / 2;\n setColumnDragPreview((current) => {\n if (!current) return current;\n return current.targetId === overId && current.after === after\n ? current\n : { ...current, targetId: String(overId), after };\n });\n const scroll = scrollRef.current;\n if (!scroll) return;\n const bounds = scroll.getBoundingClientRect();\n const center = activeRect.left + activeRect.width / 2;\n columnDragScrollDirection.current = center - bounds.left < 80 ? -1 : bounds.right - center < 80 ? 1 : 0;\n if (columnDragScrollDirection.current === 0) stopColumnDragScroll();\n else startColumnDragScroll();\n }}\n onDragCancel={() => {\n columnDragActive.current = false;\n draggedColumnId.current = null;\n setColumnDragPreview(null);\n stopColumnDragScroll();\n setDraggedRowId(null);\n }}\n onDragEnd={(event) => {\n const kind = event.active.data.current?.matrxDragKind;\n if (kind === \"column-manager\") return;\n if (kind !== \"column-header\") {\n endHierarchyDrag(event);\n return;\n }\n const from = String(event.active.data.current?.columnId);\n const targetData = event.over?.data.current;\n const target = targetData?.matrxDragKind === \"column-header\" ? targetData.columnId : null;\n const activeRect = event.active.rect.current.translated;\n const overRect = event.over?.rect;\n columnDragActive.current = false;\n draggedColumnId.current = null;\n setColumnDragPreview(null);\n stopColumnDragScroll();\n if (\n columnDragPreview?.draggedId === from &&\n columnDragPreview.targetId !== null &&\n columnDragPreview.targetId !== from\n ) {\n commitColumnState(\n projectColumnDragOrder(effectiveColumnOrder, columnDragPreview),\n effectiveHiddenColumnIds,\n );\n return;\n }\n if (!target || from === target || !activeRect || !overRect) return;\n const order = [...effectiveColumnOrder];\n const fromIndex = order.indexOf(from);\n const targetIndex = order.indexOf(String(target));\n if (fromIndex < 0 || targetIndex < 0) return;\n order.splice(fromIndex, 1);\n const after = activeRect.left + activeRect.width / 2 >= overRect.left + overRect.width / 2;\n const insertion = order.indexOf(String(target)) + (after ? 1 : 0);\n order.splice(insertion, 0, from);\n commitColumnState(order, effectiveHiddenColumnIds);\n }}\n >\n <div\n ref={rootRef}\n data-matrx-table\n data-matrx-table-implementation=\"@ai-matrx/design-system\"\n data-matrx-table-density={resolvedDensity}\n data-url-state-table={urlState?.id}\n className={cn(\n \"flex h-full min-h-0 flex-col gap-2 px-0 py-2\",\n className,\n )}\n >\n {viewTabs && !hideToolbar && <TableViewWorkspace key={tableId ?? \"table\"} snapshot={currentViewSnapshot} onApply={applySavedView} related={relatedTableActions} />}\n {notice}\n {savedViewError ? <p role=\"alert\" className=\"shrink-0 text-xs text-destructive\">{savedViewError}</p> : null}\n {toolbarActionError ? <p role=\"alert\" className=\"shrink-0 text-xs text-destructive\">{toolbarActionError}</p> : null}\n {/* Toolbar */}\n {!hideToolbar && (toolbar?.title || showSearch ||\n toolbar?.anyOf ||\n toolbar?.layeredFilters ||\n (toolbar?.facets && toolbar.facets.length > 0) ||\n toolbar?.leading ||\n toolbar?.actions ||\n toolbar?.refresh ||\n toolbar?.add ||\n (tableId && SavedViews) ||\n hasActiveFilters ||\n showToolbarCopy ||\n columns.length > 0) && (\n <TableTitleRow\n {...(toolbar?.title === undefined ? {} : { title: toolbar.title })}\n context={\n tableId && SavedViews ? (\n <span data-matrx-table-view-control>\n <SavedViews\n tableId={tableId}\n snapshot={currentViewSnapshot}\n defaultSnapshot={declaredDefaultViewSnapshot}\n onApply={applySavedView}\n />\n </span>\n ) : undefined\n }\n search={\n showSearch ? intelligentSearchEnabled ? (\n <TableSearch\n value={searchValue}\n onChange={setSearchValue}\n scope={searchScope}\n onScopeChange={setSearchScope}\n scopes={intelligentSearchScopes}\n {...(toolbar?.searchPlaceholder === undefined\n ? {}\n : { placeholder: toolbar.searchPlaceholder })}\n />\n ) : (\n <div\n data-matrx-table-search\n className={cn(\n \"flex min-w-0 flex-1 sm:w-full sm:flex-none\",\n toolbar?.searchMatch ? \"sm:max-w-md\" : \"sm:max-w-xs\",\n )}\n >\n <div className=\"relative min-w-0 flex-1\">\n <Search className=\"absolute left-2 top-1/2 h-5 w-5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n placeholder={toolbar?.searchPlaceholder ?? \"Search…\"}\n className={cn(\n \"h-8 pl-7 pr-7 text-sm\",\n toolbar?.searchMatch && \"rounded-r-none\",\n )}\n style={{ fontSize: \"16px\" }}\n />\n {searchValue ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Clear search\"\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2 rounded p-0.5 text-muted-foreground hover:text-foreground\"\n onClick={() => setSearchValue(\"\")}\n >\n <X className=\"h-5 w-5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Clear search</TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n {toolbar?.searchMatch ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant={searchMatchMode === \"whole_words\" ? \"secondary\" : \"outline\"}\n size=\"sm\"\n className=\"h-8 shrink-0 gap-1 rounded-l-none border-l-0 px-2 text-xs\"\n aria-pressed={searchMatchMode === \"whole_words\"}\n aria-label={`Search match: ${searchMatchMode === \"whole_words\" ? \"whole words\" : \"contains text\"}`}\n onClick={() =>\n setSearchMatchMode(\n searchMatchMode === \"whole_words\" ? \"contains\" : \"whole_words\",\n )\n }\n >\n <WholeWord className=\"h-5 w-5\" />\n {searchMatchMode === \"whole_words\" ? \"Whole words\" : \"Contains\"}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {searchMatchMode === \"whole_words\"\n ? \"Whole words — click to match text anywhere\"\n : \"Contains text — click to require whole words\"}\n </TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n ) : null\n }\n >\n {toolbar?.layeredFilters ? (\n <LayeredFilterBuilder\n fields={toolbar.layeredFilters.fields}\n rules={layeredFilters}\n onChange={setLayeredFilters}\n maxRules={toolbar.layeredFilters.maxRules}\n label={toolbar.layeredFilters.label}\n />\n ) : null}\n\n {toolbar?.anyOf ? (\n <div className=\"relative w-full max-w-xs\">\n <Search className=\"absolute left-2 top-1/2 h-5 w-5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={anyOfValue}\n onChange={(e) => setAnyOfValue(e.target.value)}\n placeholder={toolbar.anyOf.placeholder ?? \"Match any of…\"}\n className=\"h-8 pl-7 pr-7 text-sm\"\n style={{ fontSize: \"16px\" }}\n />\n {anyOfValue ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Clear match-any search\"\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2 rounded p-0.5 text-muted-foreground hover:text-foreground\"\n onClick={() => setAnyOfValue(\"\")}\n >\n <X className=\"h-5 w-5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Clear match-any search</TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n ) : null}\n\n {renderedFacets ? <ToolbarFacets facets={renderedFacets} /> : null}\n {toolbar?.leading ? (\n <div\n data-matrx-table-toolbar-extras\n className=\"order-last flex w-full min-w-0 flex-wrap items-center gap-2\"\n >\n {toolbar.leading}\n </div>\n ) : null}\n\n <div\n data-matrx-table-actions\n className=\"ml-auto flex min-w-0 flex-wrap items-center gap-0\"\n >\n {sourceTotal !== undefined ? (\n <span\n data-matrx-table-source-total\n className=\"text-xs tabular-nums text-muted-foreground\"\n >\n {data.length.toLocaleString()} loaded of{\" \"}\n {Math.max(0, sourceTotal).toLocaleString()} ·{\" \"}\n {processed.length.toLocaleString()} matched\n </span>\n ) : null}\n <TableToolbarAction\n HostAction={host.ToolbarAction}\n ariaLabel=\"Clear all filters\"\n tooltip={hasActiveFilters ? \"Clear search and filters; keep columns and sort\" : \"No search or filters to clear\"}\n disabled={!hasActiveFilters}\n onClick={clearAllFilters}\n >\n <Eraser />\n </TableToolbarAction>\n {showToolbarCopy && effectiveCopy ? (\n <CopyButtons\n size=\"toolbar\"\n sourceId={`${tableCopySourceNamespace}:view`}\n label={effectiveCopy.listLabel ?? `${effectiveCopy.label} view`}\n {...(effectiveCopy.references ? { references: effectiveCopy.references(processed, data) } : {})}\n {...(effectiveCopy.triggerVariant ? { triggerVariant: effectiveCopy.triggerVariant } : {})}\n {...(copy === undefined ? {} : {\n human: () => buildViewHuman(effectiveCopy, processed, effectiveCopyColumns),\n json: () => processed.map((r) => (effectiveCopy.agentRow ? effectiveCopy.agentRow(r) : r)),\n })}\n agent={() =>\n copy === undefined\n ? buildDefaultTableViewAgentInput(effectiveCopy, processed, data, declaredVisibleCopyColumns, {\n search: searchValue,\n searchMatchMode,\n anyOf: anyOfValue,\n filterCount:\n activeFilterCount +\n completeLayeredFilterRules(layeredFilters).length,\n sort: sort ? `${sort.id}:${sort.direction}` : null,\n })\n : buildViewAgentInput(effectiveCopy, processed, data, {\n search: searchValue,\n searchMatchMode,\n anyOf: anyOfValue,\n filterCount:\n activeFilterCount +\n completeLayeredFilterRules(layeredFilters).length,\n sort: sort ? `${sort.id}:${sort.direction}` : null,\n })\n }\n aiVariants={[\n ...(effectiveCopy.aiVariants?.(processed, data) ?? []),\n ...copySubsetVariantFor(() => processed, \"view\"),\n ]}\n {...(effectiveCopy.aiCustom\n ? { aiCustom: effectiveCopy.aiCustom(processed, data) }\n : {})}\n export={{\n items: [],\n sheetRows: () => processed.map((row) =>\n projectDefaultTableCopyRow(row, declaredVisibleCopyColumns),\n ),\n sheetColumns: () => declaredVisibleCopyColumns.map((column) => ({\n id: columnId(column),\n label: column.label ?? (typeof column.header === \"string\" ? column.header : columnId(column)),\n })),\n }}\n />\n ) : null}\n {columns.length > 0 ? (\n <TableToolbarAction\n HostAction={host.ToolbarAction}\n ariaLabel=\"Columns\"\n tooltip=\"Show, hide, or reorder columns\"\n onClick={() => setColumnManagerOpen(true)}\n >\n <SlidersHorizontal />\n </TableToolbarAction>\n ) : null}\n {toolbar?.refresh ? (\n <TableToolbarAction\n HostAction={host.ToolbarAction}\n ariaLabel={toolbar.refresh.label ?? \"Refresh\"}\n tooltip={isFetching ? \"Refreshing table data\" : (toolbar.refresh.label ?? \"Refresh\")}\n disabled={isFetching || toolbarActionPending.refresh}\n busy={isFetching || toolbarActionPending.refresh}\n onClick={() => {\n if (toolbarActionPendingRef.current.refresh) return;\n toolbarActionPendingRef.current.refresh = true;\n setToolbarActionPending((current) => ({ ...current, refresh: true }));\n setToolbarActionError(null);\n void Promise.resolve()\n .then(() => toolbar.refresh?.onRefresh())\n .catch((cause: unknown) => {\n const message = cause instanceof Error ? cause.message : String(cause);\n setToolbarActionError(`Refresh failed: ${message}`);\n toast.error(`Refresh failed: ${message}`);\n })\n .finally(() => {\n toolbarActionPendingRef.current.refresh = false;\n setToolbarActionPending((current) => ({ ...current, refresh: false }));\n });\n }}\n >\n <RefreshControlIcon spinning={isFetching || toolbarActionPending.refresh} />\n </TableToolbarAction>\n ) : null}\n {toolbar?.add ? (\n <TableToolbarAction\n HostAction={host.ToolbarAction}\n ariaLabel=\"Add\"\n tooltip={toolbar.add.disabled ? (toolbar.add.disabledReason ?? \"Add unavailable\") : \"Add\"}\n disabled={toolbar.add.disabled || toolbarActionPending.add}\n busy={toolbarActionPending.add}\n onClick={() => {\n if (toolbarActionPendingRef.current.add) return;\n toolbarActionPendingRef.current.add = true;\n setToolbarActionPending((current) => ({ ...current, add: true }));\n setToolbarActionError(null);\n void Promise.resolve()\n .then(() => toolbar.add?.onAdd())\n .catch((cause: unknown) => {\n const message = cause instanceof Error ? cause.message : String(cause);\n setToolbarActionError(`Add failed: ${message}`);\n toast.error(`Add failed: ${message}`);\n })\n .finally(() => {\n toolbarActionPendingRef.current.add = false;\n setToolbarActionPending((current) => ({ ...current, add: false }));\n });\n }}\n >\n <Plus />\n </TableToolbarAction>\n ) : null}\n {toolbar?.actions}\n </div>\n </TableTitleRow>\n )}\n\n {/* Bulk bar — present only while rows are checked, so the toolbar's\n normal actions never compete with a selection that isn't there. */}\n {selection && selectionCount > 0 ? (\n <div className=\"flex shrink-0 flex-wrap items-center gap-2 rounded-md border border-primary/30 bg-primary/5 px-2 py-1.5\">\n <span className=\"text-xs font-medium text-foreground\">\n {formatCount(selectionCount)} {selectionNoun}\n {selectionCount === 1 ? \"\" : \"s\"} selected\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 gap-1 px-2 text-xs\"\n onClick={() => {\n lastToggledIndex.current = null;\n selection.onSelectedIdsChange([]);\n }}\n >\n <X className=\"h-3.5 w-3.5\" />\n Clear\n </Button>\n <div className=\"ml-auto flex flex-wrap items-center gap-1.5\">\n {effectiveCopy && selectedRows.length > 0 ? (\n <CopyButtons\n size=\"icon\"\n data-matrx-table-icon-action\n sourceId={`${tableCopySourceNamespace}:selection`}\n {...(effectiveCopy.references ? { references: effectiveCopy.references(selectedRows, data) } : {})}\n {...(effectiveCopy.triggerVariant ? { triggerVariant: effectiveCopy.triggerVariant } : {})}\n label={`${selectedRows.length} selected ${selectionNoun}${selectedRows.length === 1 ? \"\" : \"s\"}`}\n {...(copy === undefined ? {} : {\n human: () => buildViewHuman(effectiveCopy, selectedRows, effectiveCopyColumns),\n json: () => selectedRows.map((row) => (effectiveCopy.agentRow ? effectiveCopy.agentRow(row) : row)),\n })}\n agent={() =>\n copy === undefined\n ? buildDefaultTableViewAgentInput(effectiveCopy, selectedRows, data, declaredVisibleCopyColumns, { scope: \"selected\" })\n : buildViewAgentInput(effectiveCopy, selectedRows, data, { scope: \"selected\" })\n }\n aiVariants={copySubsetVariantFor(\n () => selectedRows,\n \"selected\",\n )}\n export={{\n items: [],\n sheetRows: () => selectedRows.map((row) =>\n projectDefaultTableCopyRow(row, declaredVisibleCopyColumns),\n ),\n sheetColumns: () => declaredVisibleCopyColumns.map((column) => ({\n id: columnId(column),\n label: column.label ?? (typeof column.header === \"string\" ? column.header : columnId(column)),\n })),\n }}\n />\n ) : null}\n {selection.actions?.(selectedRows, selection.selectedIds)}\n </div>\n </div>\n ) : null}\n\n {/* The shell's vertical P2 inset and P2 region gap are separate contracts.\n Controls retain accessible hit targets; visible-icon equality depends\n on their internal geometry and is verified at the rendered surface. */}\n <div data-matrx-table-body-region className=\"flex min-h-0 flex-1 flex-col gap-2\">\n <div className=\"relative min-h-0 flex-1\">\n {mobileCards ? (\n <div\n ref={cardsScrollRef}\n data-matrx-table-cards-scroll\n aria-busy={isLoading || isFetching}\n {...(appendQuery === null\n ? {}\n : { style: { containerType: \"inline-size\" } })}\n className={cn(\n \"flex h-full min-h-0 flex-col gap-2 overflow-y-auto rounded-md border border-border bg-card p-2\",\n mobileCardsClass,\n )}\n >\n {isFetching && !isLoading && appendQuery === null ? (\n <div\n role=\"status\"\n className=\"h-0.5 shrink-0 overflow-hidden rounded-full bg-primary/15\"\n >\n <div className=\"h-full w-full animate-pulse bg-primary\" />\n <span className=\"sr-only\">Refreshing table data</span>\n </div>\n ) : null}\n {isLoading ? (\n Array.from({ length: 4 }).map((_, index) => (\n <Skeleton\n key={`mobile-card-sk-${index}`}\n className=\"h-52 w-full shrink-0 rounded-lg\"\n />\n ))\n ) : paginated.length === 0 ? (\n <div className=\"flex min-h-48 flex-1 items-center justify-center px-4 py-12 text-center\">\n <div className=\"flex max-w-sm flex-col items-center gap-2\">\n {emptyState?.icon}\n <p className=\"text-sm font-medium text-foreground\">\n {emptyState?.title ?? \"No rows\"}\n </p>\n {emptyState?.description ? (\n <p className=\"text-xs text-muted-foreground\">\n {emptyState.description}\n </p>\n ) : null}\n {emptyState?.action}\n </div>\n </div>\n ) : (\n paginated.map((row, index) => {\n const id = getRowId(row);\n const displayRow = applyRowEdits(row, edits[id]);\n const selectable =\n selection?.isRowSelectable?.(row) ?? Boolean(selection);\n return (\n <Fragment key={id}>\n {mobileCards(displayRow, index, {\n renderCell: (columnKey) => {\n const column = columns.find((candidate) => columnId(candidate) === columnKey);\n return column ? renderRecordCell(row, column, index) : null;\n },\n selected: selectedIdSet.has(id),\n selectable,\n onSelectedChange: (nextSelected) => {\n if (\n !selection ||\n !selectable ||\n nextSelected === selectedIdSet.has(id)\n ) {\n return;\n }\n const next = new Set(selectedIdSet);\n if (nextSelected) next.add(id);\n else next.delete(id);\n setSelectedIds(next);\n },\n actions:\n showRowCopy || rowActions ? (\n <div\n data-matrx-table-row-actions\n className=\"inline-flex items-center justify-end gap-0\"\n onClick={(event) => event.stopPropagation()}\n >\n {showRowCopy && effectiveCopy ? (\n <TableRowCopyControl\n size=\"toolbar\"\n copy={effectiveCopy}\n row={displayRow}\n sourceId={`${tableCopySourceNamespace}:row:${getRowId(displayRow)}`}\n {...(copy === undefined ? { defaultColumns: declaredVisibleCopyColumns } : {})}\n />\n ) : null}\n {rowActions?.(displayRow, {\n closeDetail: () => setSelectedId(null),\n openDetail: () => openDetail(displayRow),\n openWindow: () => openWindow(displayRow),\n closeWindow,\n hasPendingEdits: Boolean(edits[id]),\n discardPendingEdits: () =>\n discardRowEdits(id),\n })}\n </div>\n ) : null,\n })}\n </Fragment>\n );\n })\n )}\n {appendQuery !== null && isFetching && !isLoading ? (\n <div\n data-matrx-table-append-loading-card\n role=\"status\"\n aria-live=\"polite\"\n className=\"sticky bottom-0 z-20 flex h-16 w-full max-w-[100cqw] shrink-0 items-center justify-center gap-2 rounded-md border border-border bg-card/95 px-3 text-sm font-medium text-foreground shadow-sm backdrop-blur-sm\"\n >\n <Loader2\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0 animate-spin text-primary motion-reduce:animate-none\"\n />\n Loading more rows…\n </div>\n ) : null}\n </div>\n ) : null}\n <div\n ref={scrollRef}\n data-matrx-table-scroll\n onScroll={updateScrollHint}\n aria-busy={isLoading || isFetching}\n {...(appendQuery === null\n ? {}\n : { style: { containerType: \"inline-size\" } })}\n className={cn(\n \"relative h-full w-full overflow-auto rounded-md border border-border bg-card\",\n mobileCards && tableWithCardsClass,\n tableClassName,\n )}\n >\n {hierarchy && draggedRow ? (\n <HierarchyRootDropTarget\n label={\n hierarchy.rootDropLabel ??\n \"Drop here to move to the top level\"\n }\n draggedLabel={\n hierarchy.itemLabel?.(draggedRow) ?? \"Moving row\"\n }\n />\n ) : null}\n {hierarchy && draggedRowId ? (\n <HierarchyDragIndicatorLayer\n scrollRef={scrollRef}\n resolve={resolveHierarchyMove}\n />\n ) : null}\n {isFetching && !isLoading && appendQuery === null ? (\n <div\n role=\"status\"\n className=\"sticky left-0 top-0 z-20 h-0.5 w-full overflow-hidden bg-primary/15\"\n >\n <div className=\"h-full w-full animate-pulse bg-primary\" />\n <span className=\"sr-only\">Refreshing table data</span>\n </div>\n ) : null}\n {/* Below `sm` the table sizes to its CONTENT (w-max + max-w-none — a\n global `table { max-width: 100% }` otherwise clamps it and silently\n kills the scroll) so the container scrolls horizontally instead of\n crushing every column into an unreadable wrap. Cells go nowrap, and\n the WHOLE row scrolls as one surface. A mobile column may never pin\n over the remaining data: a wide identity cell can otherwise consume\n the viewport and make every later value functionally unreachable.\n Written mobile-first rather than with `max-sm:` because a base\n `w-full` outranks `max-sm:w-max`; `sm:` restores the exact desktop\n rendering.\n The `table` + `overflow-visible` utilities are LOAD-BEARING: a\n globals.css base rule makes every `table` `display:block;\n overflow-x:auto` under 768px, which would turn the table into a\n second nested scroller. Utilities outrank the `@layer base` rule\n and restore real table layout. */}\n <table\n ref={tableRef}\n style={!fixedLayoutActive ? undefined : {\n // Track the same preview variables as the cells. A stale\n // pre-resize total redistributes spare width under fixed\n // layout and defeats both exact shrinking and max bounds.\n \"--matrx-resized-table-width\": `calc(${visibleColumns.map(column => {\n const id = columnId(column);\n return resizableColumns && column.resizable !== false\n ? `var(${columnResizeCssVar(id)}, ${effectiveColumnWidths[id]}px)`\n : `${effectiveColumnWidths[id]}px`;\n }).join(\" + \")} + ${(selection ? fixedTableGeometry?.selectionWidth ?? 0 : 0) + (showActionsCol ? fixedTableGeometry?.actionsWidth ?? 0 : 0)}px)`,\n } as CSSProperties}\n className={cn(\n \"table w-max min-w-full max-w-none caption-bottom overflow-visible text-sm sm:w-full sm:min-w-0 sm:max-w-full\",\n fixedLayoutActive && \"sm:table-fixed sm:max-w-none sm:w-[var(--matrx-resized-table-width)]\",\n )}\n >\n <thead className=\"sticky top-0 z-10 border-b border-border bg-muted/90 shadow-[0_1px_0_0_var(--border)] backdrop-blur-sm\">\n <tr>\n {selection ? (\n <th\n data-matrx-table-selection-column\n className=\"h-9 w-9 px-2 text-left align-middle\"\n style={fixedUtilityWidth(fixedTableGeometry?.selectionWidth)}\n >\n <div\n data-matrx-table-selection-target\n onClick={(event) => {\n // A coarse-pointer layout target must activate the\n // real checkbox without stealing its focus or\n // forwarding a checkbox-originated click twice.\n if (event.target === event.currentTarget) {\n event.currentTarget\n .querySelector<HTMLButtonElement>('[role=\"checkbox\"]')\n ?.click();\n }\n }}\n >\n <Checkbox\n className={CHECKBOX_TAP_AREA}\n checked={\n allOnPageSelected\n ? true\n : someOnPageSelected\n ? \"indeterminate\"\n : false\n }\n disabled={selectableRows.length === 0}\n onCheckedChange={toggleAllOnPage}\n aria-label={\n allOnPageSelected\n ? \"Clear selection on this page\"\n : \"Select every row on this page\"\n }\n />\n </div>\n </th>\n ) : null}\n {visibleColumns.map((col) => {\n const id = columnId(col);\n const meta = filterMeta.get(id);\n const isSorted = sort?.id === id;\n const headerLabel =\n col.label ??\n (typeof col.header === \"string\" ? col.header : id);\n const defaultSortDirection =\n col.defaultSortDirection ?? \"asc\";\n const isColumnDragShadow =\n columnDragPreview?.draggedId === id &&\n columnDragPreview.targetId !== null;\n const columnResizable = resizableColumns && col.resizable !== false;\n return (\n <th\n key={id}\n data-matrx-table-column-id={id}\n data-matrx-column-drag-shadow={\n isColumnDragShadow ? \"true\" : undefined\n }\n aria-sort={\n isSorted\n ? sort?.direction === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : undefined\n }\n className={cn(\n \"relative h-9 text-left align-middle max-sm:whitespace-nowrap\",\n // ICON COLUMN (MatrxColumnDef.compact): a 40px star\n // column cannot honor `width: 40` while paying 16px of\n // padding for a 14px glyph.\n col.compact ? \"px-1\" : \"px-2\",\n // An intentional mobile column set (see\n // MatrxColumnDef.mobileHidden). CSS, not a JS\n // breakpoint — no hydration mismatch, and the column\n // stays sortable/filterable from the toolbar.\n col.mobileHidden && \"max-sm:hidden\",\n // Consumer widths are desktop tuning: applied from `sm`\n // up via a CSS var. The minimum is load-bearing: without\n // it, a crowded table crushes a declared 190px column to a\n // few characters wide instead of using the canonical\n // horizontal-scroll surface.\n (col.width !== undefined || columnResizable) &&\n \"sm:w-[var(--matrx-col-w)] sm:min-w-[var(--matrx-col-w)]\",\n col.headerClassName,\n isColumnDragShadow &&\n \"bg-primary/10 shadow-[inset_2px_0_0_var(--primary),inset_-2px_0_0_var(--primary)]\",\n col.align === \"center\" && \"text-center\",\n col.align === \"right\" && \"text-right\",\n )}\n style={columnWidthVar(col.width, effectiveColumnWidths[id], id, columnResizable)}\n >\n <ColumnHeaderDropZone id={id} enabled={reorderableColumns}>\n <ColumnHeaderCell\n label={col.header}\n labelText={headerLabel}\n sortable={col.sortable !== false}\n isSorted={Boolean(isSorted)}\n sortDirection={sort?.direction ?? defaultSortDirection}\n onSortAsc={() => setSort({ id, direction: \"asc\" })}\n onSortDesc={() =>\n setSort({ id, direction: \"desc\" })\n }\n onClearSort={() => setSort(null)}\n onHeaderSortClick={() => {\n if (!isSorted) {\n setSort({ id, direction: defaultSortDirection });\n return;\n }\n if (sort?.direction === \"asc\") {\n setSort({ id, direction: \"desc\" });\n return;\n }\n // Header clicks always toggle direction. Clearing\n // remains an explicit menu action, so a table\n // whose default is descending never appears to\n // ignore the user's first click.\n setSort({ id, direction: \"asc\" });\n }}\n filterKind={meta?.kind ?? null}\n filterValue={columnFilters[id]}\n onFilterChange={(next) => setColumnFilter(id, next)}\n selectOptions={meta?.options}\n selectSingle={col.filterSingle}\n filterApplyLabel={filterUi?.applyLabel}\n filterShowCancel={filterUi?.showCancel}\n filterFooterHint={filterUi?.footerHint}\n allowNegation={filterUi?.allowNegation}\n allowNullModes={filterUi?.allowNullModes}\n align={col.align}\n compact={col.compact}\n reorderColumn={\n reorderableColumns ? { id, label: headerLabel } : undefined\n }\n />\n </ColumnHeaderDropZone>\n {columnResizable ? (\n <ColumnResizeHandle\n columnId={id}\n label={headerLabel}\n tableRef={tableRef}\n minWidth={col.minWidth}\n maxWidth={col.maxWidth}\n onResizeStart={captureResizeGestureSnapshot}\n onResizeCancel={clearResizeGestureSnapshot}\n onResizeCommit={(columnId, width) =>\n commitColumnWidths(\n { ...effectiveColumnWidths, [columnId]: width },\n true,\n )\n }\n />\n ) : null}\n </th>\n );\n })}\n {showActionsCol && (\n <th\n data-matrx-table-actions-column\n className=\"h-9 w-px px-2 text-right align-middle text-xs font-semibold uppercase tracking-wide text-muted-foreground\"\n style={fixedUtilityWidth(fixedTableGeometry?.actionsWidth)}\n >\n Actions\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {isLoading ? (\n Array.from({ length: 6 }).map((_, i) => (\n <tr key={`sk-${i}`} className=\"border-b border-border/60\">\n {selection ? (\n <td className=\"px-2 py-2\" style={fixedUtilityWidth(fixedTableGeometry?.selectionWidth)}>\n <Skeleton className=\"h-3.5 w-3.5\" />\n </td>\n ) : null}\n {visibleColumns.map((col) => (\n <td\n key={columnId(col)}\n className={cn(\n \"py-2\",\n col.compact ? \"px-1\" : \"px-2\",\n col.mobileHidden && \"max-sm:hidden\",\n )}\n >\n <Skeleton className=\"h-5 w-full\" />\n </td>\n ))}\n {showActionsCol && (\n <td className=\"text-right align-middle\" style={fixedUtilityWidth(fixedTableGeometry?.actionsWidth)}>\n <Skeleton className=\"ml-auto h-5 w-10\" />\n </td>\n )}\n </tr>\n ))\n ) : paginated.length === 0 ? (\n <tr>\n <td\n colSpan={\n visibleColumns.length +\n leadingCols +\n (showActionsCol ? 1 : 0)\n }\n className=\"px-4 py-12 text-center\"\n >\n <div className=\"mx-auto flex max-w-sm flex-col items-center gap-2\">\n {emptyState?.icon}\n <p className=\"text-sm font-medium text-foreground\">\n {emptyState?.title ?? \"No rows\"}\n </p>\n {emptyState?.description ? (\n <p className=\"text-xs text-muted-foreground\">\n {emptyState.description}\n </p>\n ) : null}\n {emptyState?.action}\n </div>\n </td>\n </tr>\n ) : (\n paginated.map((row, index) => {\n const id = getRowId(row);\n const isSelected = selectedId === id;\n const rowEdits = edits[id];\n const displayRow = applyRowEdits(row, rowEdits);\n const isChecked = selectedIdSet.has(id);\n const rowNode = (\n <tr\n key={id}\n data-row-id={id}\n data-state={isSelected ? \"selected\" : undefined}\n onClick={(e) => {\n // A click that started on a real link (the D112 title\n // anchor, an FK cell link) must not ALSO fire the\n // row-open — the anchor owns that navigation.\n if ((e.target as HTMLElement).closest(\"a\")) return;\n openRow(row);\n }}\n className={cn(\n // Keep the mobile row opaque while the complete row scrolls\n // horizontally. The translucent zebra/hover tints remain\n // desktop-only so densely layered mobile content stays crisp.\n \"border-b border-border/60 bg-card transition-colors\",\n (detailEnabled || Boolean(onRowOpen)) &&\n \"cursor-pointer sm:hover:bg-muted/50\",\n isSelected && \"bg-muted\",\n isChecked && \"bg-primary/5\",\n highlightedIndex === index &&\n \"bg-muted ring-1 ring-inset ring-primary/60\",\n rowClassName?.(row, index),\n draggedRowId === id && \"opacity-40\",\n zebra &&\n index % 2 === 1 &&\n !isSelected &&\n !isChecked &&\n \"sm:bg-muted/20\",\n )}\n >\n {selection ? (\n <td\n className=\"px-2 py-1.5 align-middle lg:py-0.5\"\n style={fixedUtilityWidth(fixedTableGeometry?.selectionWidth)}\n onClick={(e) => e.stopPropagation()}\n >\n {/*\n 🚨 An unselectable row gets NO CONTROL AT ALL — not a\n greyed one. `isRowSelectable` returning false means the\n surface beneath will refuse this row, and a checkbox\n that renders (even faded) still says \"this is a thing\n you pick\"; the cell stays for column alignment, the\n control does not exist. Absent, not disabled, not\n hidden — nothing in the DOM to find or tick.\n */}\n {(selection.isRowSelectable?.(row) ?? true) ? (\n <div\n data-matrx-table-selection-target\n onClick={(event) => {\n if (event.target === event.currentTarget) {\n event.currentTarget\n .querySelector<HTMLButtonElement>('[role=\"checkbox\"]')\n ?.click();\n }\n }}\n >\n <Checkbox\n className={CHECKBOX_TAP_AREA}\n checked={isChecked}\n aria-label={`Select this ${selectionNoun}`}\n // Radix hands the checkbox's own click through here;\n // shift-range needs the native event's modifier, so\n // the row toggles from onClick, not onCheckedChange.\n onClick={(e) =>\n toggleRowSelected(index, e.shiftKey)\n }\n />\n </div>\n ) : null}\n </td>\n ) : null}\n {visibleColumns.map((col, colIdx) => {\n const isColumnDragShadow =\n columnDragPreview?.draggedId === columnId(col) &&\n columnDragPreview.targetId !== null;\n return (\n <td\n key={columnId(col)}\n data-matrx-table-column-id={columnId(col)}\n data-matrx-column-drag-shadow={\n isColumnDragShadow ? \"true\" : undefined\n }\n className={cn(\n \"py-1.5 align-middle lg:py-0.5\",\n col.compact ? \"px-1\" : \"px-2\",\n // nowrap (NOT truncate — truncate clips the cell and\n // defeats w-max, killing the horizontal scroll).\n \"max-sm:whitespace-nowrap\",\n col.mobileHidden && \"max-sm:hidden\",\n (col.width !== undefined || (resizableColumns && col.resizable !== false)) &&\n \"sm:w-[var(--matrx-col-w)] sm:min-w-[var(--matrx-col-w)] sm:max-w-[var(--matrx-col-w)]\",\n col.className,\n isColumnDragShadow &&\n \"bg-primary/10 shadow-[inset_2px_0_0_var(--primary),inset_-2px_0_0_var(--primary)]\",\n col.align === \"center\" && \"text-center\",\n col.align === \"right\" && \"text-right\",\n )}\n style={columnWidthVar(\n col.width,\n effectiveColumnWidths[columnId(col)],\n columnId(col),\n resizableColumns && col.resizable !== false,\n )}\n >\n <div\n className={cn(\n colIdx === 0 &&\n hierarchy &&\n \"flex min-w-0 items-center\",\n )}\n >\n {colIdx === 0 && hierarchy ? (\n <HierarchyDragHandle\n id={id}\n label={\n hierarchy.itemLabel?.(row) ?? \"row\"\n }\n disabled={\n !(hierarchy.canReparent?.(row) ?? true)\n }\n />\n ) : null}\n {/* Desktop cells are a hard wrapping boundary. `overflow-wrap:\n anywhere` lowers the text min-content width for identifiers,\n URLs, and snake_case values; the descendant selector also\n defeats a consumer's accidental `whitespace-nowrap`. Mark\n compact interactive chrome with `data-matrx-cell-control` so\n its label stays intact. Mobile intentionally keeps\n content-sized horizontal scrolling. */}\n <div\n data-matrx-cell-content\n className=\"min-w-0 max-w-full flex-1 whitespace-normal break-words [overflow-wrap:anywhere] sm:[&_*]:min-w-0 sm:[&_*]:whitespace-normal sm:[&_*]:[overflow-wrap:anywhere] sm:[&_.truncate]:whitespace-nowrap sm:[&_[data-slot=badge]]:whitespace-nowrap sm:[&_[data-slot=badge]]:[overflow-wrap:normal] sm:[&_[data-matrx-cell-control]]:w-max sm:[&_[data-matrx-cell-control]]:min-w-max sm:[&_[data-matrx-cell-control]]:max-w-none sm:[&_[data-matrx-cell-control]]:whitespace-nowrap sm:[&_[data-matrx-cell-control]]:[overflow-wrap:normal] sm:[&_[data-matrx-cell-control]_*]:whitespace-nowrap sm:[&_[data-matrx-cell-control]_*]:[overflow-wrap:normal]\"\n >\n {renderRecordCell(row, col, index)}\n </div>\n </div>\n </td>\n );\n })}\n {showActionsCol && (\n <td\n data-matrx-table-row-action-cell\n className=\"text-right align-middle\"\n style={fixedUtilityWidth(fixedTableGeometry?.actionsWidth)}\n >\n <div\n data-matrx-table-row-actions\n className=\"inline-flex items-center justify-end gap-0\"\n onClick={(e) => e.stopPropagation()}\n >\n {showRowCopy && effectiveCopy ? (\n <TableRowCopyControl\n size=\"toolbar\"\n copy={effectiveCopy}\n row={displayRow}\n sourceId={`${tableCopySourceNamespace}:row:${getRowId(displayRow)}`}\n {...(copy === undefined ? { defaultColumns: declaredVisibleCopyColumns } : {})}\n />\n ) : null}\n {rowActions?.(displayRow, {\n closeDetail: () => setSelectedId(null),\n openDetail: () => openDetail(displayRow),\n openWindow: () => openWindow(displayRow),\n closeWindow,\n hasPendingEdits: Boolean(rowEdits),\n discardPendingEdits: () =>\n discardRowEdits(id),\n })}\n {windowEnabled ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n data-matrx-table-icon-action\n className=\"h-11 w-11 text-muted-foreground hover:text-foreground [&_svg]:size-5\"\n aria-label={\n windowConfig?.openOnRowClick === true ? \"Open in side panel\" : \"Open in window\"\n }\n onClick={(e) => {\n e.stopPropagation();\n if (windowConfig?.openOnRowClick === true) openDetail(row);\n else openWindow(row);\n }}\n >\n {opensWindowOnRowClick ? (\n <PanelRightOpen className=\"h-5 w-5\" />\n ) : (\n <PanelRight className=\"h-5 w-5\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {windowConfig?.openOnRowClick === true ? \"Open in side panel\" : \"Open in window\"}\n </TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n </td>\n )}\n </tr>\n );\n // The seam that keeps a surface from forking the table for a\n // right-click menu / drag handle / drop target. The wrapper\n // must emit the <tr> unchanged (Radix `asChild` does).\n const wrappedRow = rowWrapper\n ? rowWrapper(row, rowNode)\n : rowNode;\n return hierarchy ? (\n <HierarchyDroppableRow\n key={id}\n id={id}\n disabled={!canDropOn(row)}\n >\n {wrappedRow}\n </HierarchyDroppableRow>\n ) : (\n <Fragment key={id}>{wrappedRow}</Fragment>\n );\n })\n )}\n {appendQuery !== null && isFetching && !isLoading ? (\n <tr data-matrx-table-append-loading-row>\n <td\n colSpan={\n visibleColumns.length +\n leadingCols +\n (showActionsCol ? 1 : 0)\n }\n className=\"sticky bottom-0 z-20 h-16 border-y border-border bg-card/95 px-0 py-0 text-left shadow-sm backdrop-blur-sm\"\n >\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"sticky left-0 flex h-16 w-fit max-w-[100cqw] items-center justify-center gap-2 px-3 text-sm font-medium text-foreground\"\n >\n <Loader2\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0 animate-spin text-primary motion-reduce:animate-none\"\n />\n Loading more rows…\n </div>\n </td>\n </tr>\n ) : null}\n </tbody>\n {footerRows.length > 0 ? (\n <tfoot className=\"border-t-2 border-border bg-muted/50 font-semibold\">\n {footerRows.map((row, index) => (\n <tr key={`footer-${index}`}>\n {selection ? <td className=\"px-2 py-2\" /> : null}\n {visibleColumns.map((column) => (\n <td\n key={columnId(column)}\n className={cn(\n \"px-2 py-2 align-middle\",\n column.compact && \"px-1\",\n column.className,\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n )}\n style={columnWidthVar(\n column.width,\n effectiveColumnWidths[columnId(column)],\n columnId(column),\n resizableColumns && column.resizable !== false,\n )}\n >\n {renderCell(row, column, index)}\n </td>\n ))}\n {showActionsCol ? <td /> : null}\n </tr>\n ))}\n </tfoot>\n ) : null}\n </table>\n </div>\n {/* THE OFF-SCREEN COLUMNS MUST BE DISCOVERABLE ON DESKTOP.\n These measured, glass edge controls remain fixed over the scroll\n viewport while the table moves beneath them. On phones native touch\n scrolling plus the visible next-column edge provides discovery;\n floating 44px controls covered the very row data they were meant to\n reveal, so the buttons begin at `sm`.\n\n Measured 2026-08-25 on Search\n Console → Queries at 1362px: 1,662px of table in a 1,284px\n container — Position, Score and Level were entirely off the right\n edge with NOTHING on screen saying so. A desktop viewport is not a\n promise that everything fits. */}\n {scrollHintLeft ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n data-matrx-table-icon-action\n aria-label=\"Scroll table left\"\n data-matrx-table-scroll-control=\"left\"\n className=\"absolute left-1.5 top-1/2 z-30 hidden h-11 w-11 -translate-y-1/2 rounded-full border border-glass-edge bg-glass p-0 text-foreground shadow-glass backdrop-blur-glass backdrop-saturate-glass hover:bg-glass-hover active:bg-glass-active sm:inline-flex\"\n onClick={() => scrollTableHorizontally(\"left\")}\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>More columns to the left</TooltipContent>\n </Tooltip>\n ) : null}\n {scrollHintRight ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n data-matrx-table-icon-action\n aria-label=\"Scroll table right\"\n data-matrx-table-scroll-control=\"right\"\n className=\"absolute right-1.5 top-1/2 z-30 hidden h-11 w-11 -translate-y-1/2 rounded-full border border-glass-edge bg-glass p-0 text-foreground shadow-glass backdrop-blur-glass backdrop-saturate-glass hover:bg-glass-hover active:bg-glass-active sm:inline-flex\"\n onClick={() => scrollTableHorizontally(\"right\")}\n >\n <ChevronRight className=\"h-5 w-5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>More columns to the right</TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n\n {appendQuery ? (\n <div\n data-matrx-table-footer\n className=\"flex min-h-11 shrink-0 flex-wrap items-center gap-0 border-t border-border\"\n aria-busy={isLoading || isFetching}\n >\n <div\n {...(isFetching && !isLoading\n ? {}\n : { role: \"status\", \"aria-live\": \"polite\" })}\n className=\"flex w-full min-w-0 items-center gap-2 text-xs text-muted-foreground sm:w-auto sm:flex-1 sm:text-sm\"\n >\n {isLoading ? (\n <Loader2\n data-matrx-table-append-loader\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0 animate-spin text-primary motion-reduce:animate-none\"\n />\n ) : null}\n <div className=\"min-w-0 flex-1\">\n <p className=\"font-medium text-foreground\">\n {isLoading\n ? \"Loading rows…\"\n : `${formatCount(data.length)} loaded${appendQuery.pagination.totalItems === undefined ? \"\" : ` of ${formatCount(appendQuery.pagination.totalItems)}`}`}\n </p>\n {appendQuery.pagination.sourceUntil ? (\n <p>\n Source fixed through{\" \"}\n {new Date(appendQuery.pagination.sourceUntil).toLocaleString()}.\n </p>\n ) : null}\n {!isLoading &&\n !isFetching &&\n !appendQuery.pagination.loadAll?.isLoading &&\n !scrollPagination.error &&\n !appendQuery.pagination.hasNextPage &&\n appendQuery.pagination.totalItems !== undefined &&\n data.length === appendQuery.pagination.totalItems ? (\n <p>All source rows are loaded.</p>\n ) : appendUsesLocalProcessing ? (\n <p>Local search and filters cover loaded rows.</p>\n ) : null}\n {scrollPagination.error ? (\n <p role=\"alert\" className=\"text-destructive\">\n {scrollPagination.error.message}\n </p>\n ) : null}\n {appendScrollPolicy?.mode === \"suspended\" ? (\n <p role=\"status\">\n {appendScrollPolicy.reason} Load more remains available.\n </p>\n ) : null}\n </div>\n </div>\n {appendQuery.pagination.sourcePageSize ? (\n <Select\n value={String(appendQuery.pagination.sourcePageSize.value)}\n onValueChange={(value) =>\n appendQuery.pagination.sourcePageSize?.onChange(Number(value))\n }\n >\n <SelectTrigger\n aria-label=\"Rows per load\"\n className=\"h-11 min-w-20 shrink-0 rounded-md border border-border bg-card px-3 text-sm [&_svg]:size-5\"\n disabled={\n isLoading || isFetching || appendQuery.pagination.loadAll?.isLoading\n }\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {appendQuery.pagination.sourcePageSize.options.map((size) => (\n <SelectItem key={size} value={String(size)}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n {appendQuery.pagination.loadAll?.isLoading ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"h-11 shrink-0 px-3 text-sm\"\n onClick={appendQuery.pagination.loadAll.stop}\n >\n Stop loading\n </Button>\n ) : scrollPagination.error ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"h-11 shrink-0 px-3 text-sm\"\n onClick={\n appendQuery.pagination.retrySource ??\n (appendQuery.pagination.hasNextPage\n ? appendQuery.pagination.loadNextPage\n : appendQuery.pagination.refresh)\n }\n >\n {appendQuery.pagination.retrySource\n ? \"Retry source\"\n : appendQuery.pagination.hasNextPage\n ? \"Retry\"\n : \"Reload rows\"}\n </Button>\n ) : appendQuery.pagination.hasNextPage || scrollPagination.error ? (\n <div className=\"flex min-w-0 max-w-full flex-wrap gap-0\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"h-11 px-3 text-sm\"\n disabled={isLoading || isFetching}\n onClick={() => void scrollPagination.requestNextPage()}\n >\n Load more\n </Button>\n {appendQuery.pagination.loadAll ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-11 px-3 text-sm\"\n disabled={isLoading || isFetching}\n onClick={appendQuery.pagination.loadAll.request}\n >\n Load all\n </Button>\n ) : null}\n </div>\n ) : !isLoading &&\n appendQuery.pagination.totalItems !== undefined &&\n data.length === appendQuery.pagination.totalItems ? (\n <span className=\"min-w-0 max-w-full break-words whitespace-normal px-3 text-xs text-muted-foreground sm:text-sm\">All rows loaded</span>\n ) : null}\n </div>\n ) : !hidePagination && totalItems > 0 ? (\n <div className=\"shrink-0\">\n <GenericTablePagination\n totalItems={totalItems}\n {...(localProgressiveEnabled ? { progressive: {\n shownCount: progressiveRows.shownCount,\n loadedCount: data.length,\n hasMore: progressiveRows.hasMore,\n onShowMore: () => void progressiveRows.showMore(),\n } } : {})}\n itemsPerPage={\n pageSize === 0 && allRowsAreLoaded ? 0 : effectivePageSize\n }\n currentPage={safePage}\n onPageChange={setPage}\n onItemsPerPageChange={(n) => {\n setPageSize(n);\n if (!controlledQuery) setPage(1);\n }}\n pageSizeOptions={pageSizeOptions.filter((size) => size > 0)}\n showAllOption={allRowsAreLoaded}\n allValue={0}\n allOptionLabel=\"All loaded\"\n compact\n hideEntriesInfo={false}\n />\n </div>\n ) : null}\n </div>\n\n <ColumnManager\n open={columnManagerOpen}\n onOpenChange={setColumnManagerOpen}\n columns={columns}\n order={effectiveColumnOrder}\n hidden={effectiveHiddenColumnIds}\n onApply={commitColumnState}\n />\n\n {detailEnabled && selectedRow ? (\n <SidePanelSurface\n // `title` stays a plain string (it is the accessible name), while\n // `titleNode` / `description` carry whatever the caller actually\n // rendered — an `EntityRef` door included. These used to be coerced\n // through string-only resolvers, so a detail config returning JSX had\n // its door silently dropped.\n title={resolveStringTitle(\n detail?.title?.(selectedRow),\n defaultRowTitle(selectedRow, columns),\n )}\n titleNode={detail?.title?.(selectedRow)}\n description={detail?.description?.(selectedRow)}\n onClose={() => setSelectedId(null)}\n defaultWidth={detail?.defaultWidth ?? 480}\n headerActions={\n <div className=\"flex items-center gap-1\">\n {effectiveCopy && showRowCopy ? (\n <TableRowCopyControl\n size=\"icon\"\n data-matrx-table-icon-action\n copy={effectiveCopy}\n sourceId={`${tableCopySourceNamespace}:row:${getRowId(selectedRow)}`}\n row={selectedRow}\n {...(copy === undefined ? { defaultColumns: declaredVisibleCopyColumns } : {})}\n />\n ) : null}\n {detail?.headerActions?.(selectedRow)}\n {windowEnabled ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n data-matrx-table-icon-action\n className=\"h-7 w-7\"\n aria-label=\"Open in window\"\n onClick={() => openWindow(selectedRow)}\n >\n <PanelRight className=\"h-5 w-5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Open in window</TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n }\n >\n {detail?.render ? (\n // The panel hands children a `min-h-0 flex-1 overflow-hidden` cell\n // and expects the child to own scrolling. `DataRowInspector` does;\n // custom `detail.render` bodies mostly did not, so their content\n // silently cut off at the fold with no scrollbar. Owning it here\n // fixes the whole class at once — a custom body that already\n // scrolls (`h-full` + `overflow-y-auto` root) still resolves to\n // this container's height, so no second scrollbar appears.\n <div className=\"h-full min-h-0 overflow-y-auto\">\n {detail.render(selectedRow, {\n closeDetail: () => setSelectedId(null),\n openDetail: () => openDetail(selectedRow),\n openWindow: () => openWindow(selectedRow),\n closeWindow,\n hasPendingEdits: Boolean(edits[getRowId(selectedRow)]),\n discardPendingEdits: () =>\n discardRowEdits(getRowId(selectedRow)),\n })}\n </div>\n ) : (\n <DataRowInspector\n row={selectedRow}\n {...(effectiveCopy?.rowKind === undefined ? {} : { recordKind: effectiveCopy?.rowKind })}\n {...(effectiveCopy?.label === undefined ? {} : { recordLabel: effectiveCopy?.label })}\n {...(effectiveCopy?.location === undefined ? {} : { location: effectiveCopy?.location })}\n {...(detail?.tokenForField === undefined ? {} : { tokenForField: detail?.tokenForField })}\n />\n )}\n </SidePanelSurface>\n ) : null}\n\n {windowRow ? (\n <DataRowWindow\n isOpen\n onClose={closeWindow}\n title={\n windowConfig?.title?.(windowRow) ??\n defaultRowTitle(windowRow, columns)\n }\n row={windowRow}\n width={windowConfig?.width}\n height={windowConfig?.height}\n windowId={`matrx-data-row-${urlState?.id ?? \"local\"}-${getRowId(windowRow)}`}\n defaultTab={windowConfig?.defaultTab}\n headerActions={\n <div className=\"flex items-center gap-1\">\n {windowConfig?.openOnRowClick === true && detail?.enabled === true ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n data-matrx-table-icon-action\n className=\"h-7 w-7\"\n aria-label=\"Open in side panel\"\n onClick={() => {\n closeWindow();\n openDetail(windowRow);\n }}\n >\n <PanelRightOpen className=\"h-5 w-5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Open in side panel</TooltipContent>\n </Tooltip>\n ) : null}\n {effectiveCopy && showRowCopy ? (\n <TableRowCopyControl\n size=\"icon\"\n data-matrx-table-icon-action\n copy={effectiveCopy}\n sourceId={`${tableCopySourceNamespace}:row:${getRowId(windowRow)}`}\n row={windowRow}\n {...(copy === undefined ? { defaultColumns: declaredVisibleCopyColumns } : {})}\n />\n ) : null}\n </div>\n }\n viewContent={\n windowConfig?.renderView?.(windowRow, {\n closeDetail: () => setSelectedId(null),\n openDetail: () => openDetail(windowRow),\n openWindow: () => openWindow(windowRow),\n closeWindow,\n hasPendingEdits: Boolean(edits[getRowId(windowRow)]),\n discardPendingEdits: () => discardRowEdits(getRowId(windowRow)),\n }) ??\n <DataRowInspector\n row={windowRow}\n recordKind={effectiveCopy?.rowKind ?? \"record\"}\n recordLabel={effectiveCopy?.label ?? \"Record\"}\n location={effectiveCopy?.location ?? \"Table\"}\n fieldCopy={copy !== false}\n {...(detail?.tokenForField === undefined ? {} : { tokenForField: detail?.tokenForField })}\n />\n }\n editContent={\n windowConfig?.renderEdit === false\n ? undefined\n : windowConfig?.renderEdit\n ? windowConfig.renderEdit(windowRow, {\n closeDetail: () => setSelectedId(null),\n openDetail: () => openDetail(windowRow),\n openWindow: () => openWindow(windowRow),\n closeWindow,\n hasPendingEdits: Boolean(edits[getRowId(windowRow)]),\n discardPendingEdits: () =>\n discardRowEdits(getRowId(windowRow)),\n })\n : detail?.render?.(windowRow, {\n closeDetail: () => setSelectedId(null),\n openDetail: () => openDetail(windowRow),\n openWindow: () => openWindow(windowRow),\n closeWindow,\n hasPendingEdits: Boolean(edits[getRowId(windowRow)]),\n discardPendingEdits: () =>\n discardRowEdits(getRowId(windowRow)),\n })\n }\n >\n {windowConfig?.render?.(windowRow, {\n closeDetail: () => setSelectedId(null),\n openDetail: () => openDetail(windowRow),\n openWindow: () => openWindow(windowRow),\n closeWindow,\n hasPendingEdits: Boolean(edits[getRowId(windowRow)]),\n discardPendingEdits: () => discardRowEdits(getRowId(windowRow)),\n })}\n </DataRowWindow>\n ) : null}\n\n {editEnabled ? (\n <>\n {foreignDrafts.length > 0 ? (\n <div\n data-matrx-foreign-drafts\n className=\"fixed inset-x-3 bottom-20 z-50 flex flex-wrap items-center justify-center gap-2 rounded-lg border border-amber-500/40 bg-card px-3 py-2 text-xs shadow-lg sm:inset-x-auto sm:left-1/2 sm:-translate-x-1/2 sm:flex-nowrap\"\n >\n <span>Unsaved edits from previous results</span>\n <CopyButtons\n size=\"xs\"\n label=\"retained drafts\"\n human={() => JSON.stringify(foreignDraftPayload, null, 2)}\n json={() => foreignDraftPayload}\n />\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-7 text-xs text-destructive\" onClick={() => setConfirmForeignDraftDiscard(true)}>\n Discard drafts\n </Button>\n </div>\n ) : null}\n <ConfirmDialog\n open={confirmForeignDraftDiscard}\n onOpenChange={setConfirmForeignDraftDiscard}\n title=\"Discard unsaved edits from previous results?\"\n description=\"This permanently removes edits retained for other result sets. Copy drafts first if you may need them.\"\n confirmLabel=\"Discard drafts\"\n cancelLabel=\"Keep drafts\"\n variant=\"destructive\"\n onConfirm={() => {\n setEditsByScope((current) =>\n Object.fromEntries(\n Object.entries(current).filter(([scope]) => scope === editScopeKey),\n ),\n );\n setConfirmForeignDraftDiscard(false);\n }}\n />\n <DirtySavePill\n changeCount={changeCount}\n saving={saving}\n onSave={() => void handleSaveEdits()}\n onCancel={handleCancelEdits}\n />\n </>\n ) : null}\n </div>\n <DragOverlay>\n {draggedRow ? (\n // w-max: the overlay inherits the ACTIVE node's size, and the active\n // node is the 16px grip handle — without it the label wraps to one\n // character per line.\n <div className=\"w-max max-w-xs truncate rounded border border-border bg-card px-2.5 py-1.5 text-sm font-medium text-foreground shadow-md\">\n {hierarchy?.itemLabel?.(draggedRow) ?? \"Moving row\"}\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n </TooltipProvider>\n );\n}\n\nfunction HierarchyDragHandle({\n id,\n label,\n disabled,\n}: {\n id: string;\n label: string;\n disabled: boolean;\n}) {\n const { attributes, listeners, setNodeRef } = useDraggable({\n id,\n disabled,\n });\n return (\n <button\n ref={setNodeRef}\n type=\"button\"\n disabled={disabled}\n className=\"flex h-11 w-11 shrink-0 touch-none cursor-grab items-center justify-center text-muted-foreground hover:text-foreground active:cursor-grabbing disabled:cursor-default disabled:opacity-40 lg:h-7 lg:w-4\"\n aria-label={`Move ${label}`}\n title=\"Drag to move\"\n onClick={(event) => event.stopPropagation()}\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"h-3.5 w-3.5\" />\n </button>\n );\n}\n\nfunction HierarchyRootDropTarget({\n label,\n draggedLabel,\n}: {\n label: string;\n draggedLabel: string;\n}) {\n const { isOver, setNodeRef } = useDroppable({ id: \"__root__\" });\n return (\n <div\n ref={setNodeRef}\n data-matrx-hierarchy-root\n className={cn(\n \"sticky left-0 top-0 z-40 flex h-8 w-full items-center gap-2 border border-dashed border-primary/50 bg-primary/10 px-3 text-xs font-medium text-primary shadow-sm shadow-primary/20\",\n isOver && \"border-solid bg-primary/20 shadow-md shadow-primary/25\",\n )}\n >\n <span className=\"truncate\">{draggedLabel}</span>\n <span className=\"text-primary/75\">{label}</span>\n </div>\n );\n}\n\ninterface HierarchyIndicatorRect {\n preview: HierarchyDropPreview;\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/**\n * The live drop indicator, isolated so per-mousemove state re-renders ONLY\n * this leaf — never the table (the old design set preview state on the whole\n * table component, re-rendering every row on every pointer move). It draws in\n * the scroll container's own coordinate space, so it scrolls and clips with\n * the rows and can never float over the sticky header or off the table.\n */\nfunction HierarchyDragIndicatorLayer({\n scrollRef,\n resolve,\n}: {\n scrollRef: RefObject<HTMLDivElement | null>;\n resolve: (overId: string, pointerY: number) => HierarchyDropPreview | null;\n}) {\n const [indicator, setIndicator] = useState<HierarchyIndicatorRect | null>(\n null,\n );\n useDndMonitor({\n onDragMove(event) {\n const container = scrollRef.current;\n const overId = event.over ? String(event.over.id) : null;\n const preview =\n container && overId ? resolve(overId, dragPointerY(event)) : null;\n if (!container || !preview || preview.targetId === null) {\n setIndicator(null);\n return;\n }\n const rowElement = container.querySelector(\n `tr[data-row-id=\"${CSS.escape(preview.targetId)}\"]`,\n );\n if (!rowElement) {\n setIndicator(null);\n return;\n }\n const rowRect = rowElement.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n setIndicator({\n preview,\n top: rowRect.top - containerRect.top + container.scrollTop,\n left: rowRect.left - containerRect.left + container.scrollLeft,\n width: rowRect.width,\n height: rowRect.height,\n });\n },\n onDragCancel() {\n setIndicator(null);\n },\n onDragEnd() {\n setIndicator(null);\n },\n });\n if (!indicator) return null;\n const { preview } = indicator;\n const indent = indicator.left + 10 + preview.depth * 12;\n if (preview.position === \"inside\") {\n return (\n <div\n aria-hidden=\"true\"\n data-matrx-hierarchy-indicator=\"inside\"\n className=\"pointer-events-none absolute z-[5] rounded-sm bg-primary/10 ring-2 ring-inset ring-primary/60\"\n style={{\n top: indicator.top,\n left: indicator.left + 2,\n width: Math.max(0, indicator.width - 4),\n height: indicator.height,\n }}\n >\n {/* Left-anchored at the row's indent: the row can be far wider than\n the viewport, so a right-edge label would sit off-screen. */}\n <span\n className=\"absolute top-1/2 -translate-y-1/2 whitespace-nowrap rounded bg-card/95 px-1.5 py-0.5 text-[10px] font-medium text-primary\"\n style={{ left: 32 + preview.depth * 12 }}\n >\n Inside {preview.targetLabel}\n </span>\n </div>\n );\n }\n const lineTop =\n preview.position === \"before\"\n ? indicator.top - 1\n : indicator.top + indicator.height - 1;\n return (\n <div\n aria-hidden=\"true\"\n data-matrx-hierarchy-indicator={preview.position}\n className=\"pointer-events-none absolute z-[5]\"\n style={{\n top: lineTop,\n left: indent,\n width: Math.max(0, indicator.left + indicator.width - indent - 8),\n }}\n >\n <div className=\"relative h-0.5 rounded-full bg-primary\">\n <span className=\"absolute -left-1 top-1/2 h-2 w-2 -translate-y-1/2 rounded-full border-2 border-primary bg-card\" />\n <span\n className={cn(\n \"absolute left-2 rounded bg-card/95 px-1.5 py-0.5 text-[10px] font-medium text-primary\",\n preview.position === \"before\" ? \"top-1\" : \"bottom-1\",\n )}\n >\n {preview.position === \"before\" ? \"Above\" : \"Below\"}{\" \"}\n {preview.targetLabel}\n </span>\n </div>\n </div>\n );\n}\n\ntype HierarchyRowElementProps = HTMLAttributes<HTMLTableRowElement> & {\n ref?: Ref<HTMLTableRowElement>;\n};\n\nfunction HierarchyDroppableRow({\n id,\n disabled,\n children,\n}: {\n id: string;\n disabled: boolean;\n children: ReactNode;\n}) {\n const { setNodeRef } = useDroppable({ id, disabled });\n if (!isValidElement(children) || children.type !== \"tr\") return children;\n const row = children as ReactElement<HierarchyRowElementProps>;\n return cloneElement(row, {\n ref: setNodeRef,\n className: row.props.className,\n });\n}\n\nfunction ColumnHeaderDropZone({\n id,\n enabled,\n children,\n}: {\n id: string;\n enabled: boolean;\n children: ReactNode;\n}) {\n const { setNodeRef } = useDroppable({\n id: `matrx-column-header:${id}`,\n disabled: !enabled,\n data: { matrxDragKind: \"column-header\", columnId: id },\n });\n return <div ref={setNodeRef} className=\"flex min-w-0 items-center\">{children}</div>;\n}\n\n/**\n * Consumer column widths apply ONLY from `sm` up (via the paired\n * `sm:w-[var(--matrx-col-w)]` utilities) — below `sm` the table is\n * content-sized, and a hard width plus nowrap would bleed text across cells.\n */\ninterface FixedTableGeometry {\n tableWidth?: number;\n selectionWidth?: number;\n actionsWidth?: number;\n}\n\nfunction fixedUtilityWidth(width: number | undefined): CSSProperties | undefined {\n return width === undefined\n ? undefined\n : { width: `${width}px`, minWidth: `${width}px`, maxWidth: `${width}px` };\n}\n\nfunction normalizeColumnWidthsForColumns<T>(\n widths: Record<string, unknown> | undefined,\n columns: readonly MatrxColumnDef<T>[],\n): Record<string, number> {\n const byId = new Map(columns.map((column) => [columnId(column), column]));\n const normalized = normalizeColumnWidthMap(widths, new Set(byId.keys()));\n return Object.fromEntries(\n Object.entries(normalized).map(([id, width]) => {\n const column = byId.get(id);\n const bounds = resolveColumnResizeBounds(column?.minWidth, column?.maxWidth);\n return [id, clampColumnWidth(width, bounds)];\n }),\n );\n}\n\nfunction columnWidthVar(\n width: string | number | undefined,\n resizedWidth: number | undefined,\n id: string,\n resizable: boolean,\n): CSSProperties | undefined {\n if (width === undefined && resizedWidth === undefined && !resizable) return undefined;\n // Identity labels need a useful starting width even in an otherwise unconfigured table.\n // Explicit widths and saved/user resizing still win.\n const inferredWidth = resizable && inferTableSearchRole(id) === \"name\" ? \"12rem\" : \"auto\";\n const fallback = resizedWidth === undefined\n ? (width === undefined ? inferredWidth : typeof width === \"number\" ? `${width}px` : width)\n : `${resizedWidth}px`;\n return {\n \"--matrx-col-w\": resizable\n ? `var(${columnResizeCssVar(id)}, ${fallback})`\n : fallback,\n } as CSSProperties;\n}\n\nfunction DefaultJsonCell({ value }: { value: object }) {\n const [open, setOpen] = useState(false);\n const host = useMatrxDataTableHost();\n const Viewer = host.JsonViewer;\n const text = JSON.stringify(value, null, 2);\n const summary = Array.isArray(value) ? `${value.length} items` : Object.keys(value).slice(0, 3).join(\", \") || \"Empty object\";\n return <>\n <Tooltip><TooltipTrigger asChild><button type=\"button\" className=\"block max-w-full truncate text-left text-sm text-foreground\" onClick={(event) => { event.stopPropagation(); setOpen(true); }} style={{ display: \"-webkit-box\", WebkitLineClamp: 2, WebkitBoxOrient: \"vertical\", overflow: \"hidden\", whiteSpace: \"normal\", overflowWrap: \"anywhere\" }} aria-label=\"Open JSON value\">{Array.isArray(value) ? \"[ ]\" : \"{ }\"} {summary}</button></TooltipTrigger><TooltipContent className=\"max-w-md max-h-80 overflow-auto whitespace-pre-wrap break-words\">{text}</TooltipContent></Tooltip>\n <DataRowWindow isOpen={open} onClose={() => setOpen(false)} title=\"JSON value\" row={value} viewContent={Viewer ? <Viewer data={value} /> : <pre className=\"overflow-auto whitespace-pre-wrap p-3 text-xs\">{text}</pre>} />\n </>;\n}\n\nfunction renderCell<T>(\n row: T,\n col: MatrxColumnDef<T>,\n index: number,\n): ReactNode {\n if (col.cell) return col.cell(row, index);\n\n const raw = getCellValue(row, col);\n const kind = col.cellKind ?? \"auto\";\n const asUuid =\n kind === \"uuid\" || kind === \"fk\" || (kind === \"auto\" && isUuidValue(raw));\n\n if (asUuid && typeof raw === \"string\") {\n const forbidden =\n typeof col.fk?.forbidden === \"function\"\n ? col.fk.forbidden(raw, row)\n : Boolean(col.fk?.forbidden);\n const declaredToken =\n typeof col.fk?.token === \"function\" ? col.fk.token(row) : col.fk?.token;\n return (\n <MatrxUuidCell\n value={raw}\n label={\n col.fk?.label ??\n (typeof col.header === \"string\" ? col.header : col.id)\n }\n forbidden={forbidden}\n // `token: \"auto\"` opts INTO the column-name guess. It is opt-in, not\n // the default, because the guess is only safe when the author has\n // checked the FK: `scheduler.sch_run.task_id` points at\n // `scheduler.sch_task`, not the workspace `task` the name implies, and\n // `app_id` / `conversation_id` / `file_id` / `workflow_id` each have\n // several candidate tables. A wrong door sends the user to a different\n // record and is worse than no door at all.\n token={\n declaredToken === \"auto\"\n ? tokenFromColumnName(col.id ?? col.accessorKey ?? \"\")\n : declaredToken\n }\n href={col.fk?.href?.(raw, row)}\n {...(col.fk?.onOpen ? { onOpen: (id: string) => col.fk?.onOpen?.(id, row) } : {})}\n />\n );\n }\n\n if (raw !== null && typeof raw === \"object\" && !(raw instanceof Date)) return <DefaultJsonCell value={raw} />;\n if (typeof raw === \"boolean\") {\n return <span className={raw ? \"rounded bg-emerald-500/10 px-1.5 py-0.5 text-xs text-emerald-600\" : \"rounded bg-slate-500/10 px-1.5 py-0.5 text-xs text-muted-foreground\"}>{raw ? \"Yes\" : \"No\"}</span>;\n }\n const formatted = formatTableDisplayValue(raw);\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"block text-sm text-foreground\" style={{ display: \"-webkit-box\", WebkitLineClamp: 2, WebkitBoxOrient: \"vertical\", overflow: \"hidden\", overflowWrap: \"anywhere\" }}>{formatted}</span>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-md whitespace-pre-wrap break-words max-h-80 overflow-auto\">{typeof raw === \"object\" && raw !== null ? JSON.stringify(raw, null, 2) : formatted}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction resolveStringTitle(\n title: ReactNode | undefined,\n fallback: string,\n): string {\n if (typeof title === \"string\" && title.trim()) return title;\n if (typeof title === \"number\") return String(title);\n return fallback;\n}\n\nexport default MatrxDataTable;\n","import type { SVGProps } from \"react\";\n\ntype IconProps = SVGProps<SVGSVGElement>;\nfunction Icon({ children, ...props }: IconProps) {\n return <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" {...props}>{children}</svg>;\n}\nconst path = <path d=\"M4 12h16M12 4v16\" />;\nexport const ChevronLeft = (p: IconProps) => <Icon {...p}><path d=\"m15 18-6-6 6-6\" /></Icon>;\nexport const ChevronRight = (p: IconProps) => <Icon {...p}><path d=\"m9 18 6-6-6-6\" /></Icon>;\nexport const ChevronDown = (p: IconProps) => <Icon {...p}><path d=\"m6 9 6 6 6-6\" /></Icon>;\nexport const ArrowDown = (p: IconProps) => <Icon {...p}><path d=\"M12 4v16m-6-6 6 6 6-6\" /></Icon>;\nexport const ArrowUp = (p: IconProps) => <Icon {...p}><path d=\"M12 20V4m-6 6 6-6 6 6\" /></Icon>;\nexport const ArrowUpDown = (p: IconProps) => <Icon {...p}><path d=\"M12 4v16m-4-12 4-4 4 4m-8 8 4 4 4-4\" /></Icon>;\nexport const Check = (p: IconProps) => <Icon {...p}><path d=\"m5 12 4 4L19 6\" /></Icon>;\nexport const X = (p: IconProps) => <Icon {...p}><path d=\"M6 6l12 12M18 6 6 18\" /></Icon>;\nexport const Search = (p: IconProps) => <Icon {...p}><circle cx=\"11\" cy=\"11\" r=\"6\" /><path d=\"m16 16 4 4\" /></Icon>;\nexport const Plus = (p: IconProps) => <Icon {...p}>{path}</Icon>;\nexport const Minus = (p: IconProps) => <Icon {...p}><path d=\"M4 12h16\" /></Icon>;\nexport const Eraser = (p: IconProps) => <Icon {...p}><path d=\"m16 3 5 5-11 11H5l-3-3L13 5l3-2Z M8 10l6 6 M10 19h12\" /></Icon>;\nexport const GripVertical = (p: IconProps) => <Icon {...p}><circle cx=\"9\" cy=\"6\" r=\"1\" /><circle cx=\"15\" cy=\"6\" r=\"1\" /><circle cx=\"9\" cy=\"12\" r=\"1\" /><circle cx=\"15\" cy=\"12\" r=\"1\" /><circle cx=\"9\" cy=\"18\" r=\"1\" /><circle cx=\"15\" cy=\"18\" r=\"1\" /></Icon>;\n/** lucide `sliders-horizontal` — used for the table column manager. */\nexport const SlidersHorizontal = (p: IconProps) => <Icon {...p}>\n <path d=\"M21 4h-7M10 4H3M21 12h-9M8 12H3M21 20h-5M12 20H3M14 2v4M8 10v4M16 18v4\" />\n</Icon>;\nexport const Trash2 = (p: IconProps) => <Icon {...p}><path d=\"M4 7h16M10 11v6M14 11v6M9 7l1-2h4l1 2M6 7l1 13h10l1-13\" /></Icon>;\n/**\n * Spinner-only incomplete arc. Never a resting glyph — at rest this reads as a\n * broken half-circle. Pair it with `animate-spin` / `matrx-spin` only while\n * work is actually running. Refresh controls use `RefreshControlIcon`.\n */\nexport const Loader2 = (p: IconProps) => <Icon {...p}><path d=\"M20 12a8 8 0 1 1-2.3-5.7\" /></Icon>;\n/** lucide `refresh-cw` — the resting refresh arrows. */\nexport const RefreshCw = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n </Icon>\n);\n/** Refresh affordance: arrows at rest, spinner only while busy. */\nexport function RefreshControlIcon({\n spinning = false,\n className,\n ...props\n}: IconProps & { spinning?: boolean }) {\n if (spinning) {\n return (\n <Loader2\n className={[className, \"animate-spin\"].filter(Boolean).join(\" \")}\n {...props}\n />\n );\n }\n return <RefreshCw className={className} {...props} />;\n}\nexport const Save = (p: IconProps) => <Icon {...p}><path d=\"M5 3h12l2 2v16H5zM8 3v6h8V3M8 21v-7h8v7\" /></Icon>;\nexport const Pencil = (p: IconProps) => <Icon {...p}><path d=\"m4 20 4-1 11-11-3-3L5 16l-1 4z\" /></Icon>;\nexport const Eye = (p: IconProps) => <Icon {...p}><path d=\"M2 12s3-6 10-6 10 6 10 6-3 6-10 6S2 12 2 12z\" /><circle cx=\"12\" cy=\"12\" r=\"2\" /></Icon>;\nexport const PanelRight = (p: IconProps) => <Icon {...p}><rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M15 4v16\" /></Icon>;\nexport const PanelRightOpen = PanelRight;\nexport const WholeWord = (p: IconProps) => <Icon {...p}><path d=\"M4 6l3 12 3-8 3 8 3-12M17 15h4\" /></Icon>;\nexport const ExternalLink = (p: IconProps) => <Icon {...p}><path d=\"M14 4h6v6M20 4l-9 9M19 13v6H5V5h6\" /></Icon>;\nexport const Copy = (p: IconProps) => <Icon {...p}><rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\" /><path d=\"M15 9V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h3\" /></Icon>;\nexport const Lightbulb = (p: IconProps) => <Icon {...p}><path d=\"M9 18h6M10 22h4M8 14a6 6 0 1 1 8 0c-1 1-1 2-1 3H9c0-1 0-2-1-3z\" /></Icon>;\nexport const ShieldOff = (p: IconProps) => <Icon {...p}><path d=\"m3 3 18 18M12 3l7 3v5c0 4-3 7-7 9-4-2-7-5-7-9V6l4-2\" /></Icon>;\nexport const ListFilter = SlidersHorizontal;\nexport const ListX = X;\n\nexport const ChevronsLeft = (p: IconProps) => <Icon {...p}><path d=\"m11 18-6-6 6-6m8 12-6-6 6-6\" /></Icon>;\nexport const ChevronsRight = (p: IconProps) => <Icon {...p}><path d=\"m5 18 6-6-6-6m8 12 6-6-6-6\" /></Icon>;\n","\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport const buttonVariants = cva(\n \"inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-0 disabled:pointer-events-none disabled:opacity-50 active:scale-[0.98] [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90\",\n /**\n * An explicit spelling of `default`, identical by construction. It is\n * not decoration: matrx-frontend's `ButtonMine` fork carried it, ~17\n * call sites say `variant=\"primary\"`, and the alternative to keeping\n * the word was a host shim translating a prop — the massage C22 bans.\n */\n primary: \"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n /** The affirmative twin of `destructive` — confirm, approve, publish. */\n success:\n \"bg-success text-success-foreground shadow-sm hover:bg-success/90\",\n outline:\n \"border border-border bg-card shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n subtle:\n \"border border-transparent bg-muted/50 text-foreground hover:border-border hover:bg-muted\",\n },\n /**\n * ONE size scale, xs → 3xl, plus the two icon boxes. The top and bottom\n * of the scale came in from matrx-frontend's `ButtonMine` fork (2026-09-07):\n * a dense toolbar needs `xs`, and a marketing/hero call to action needs\n * `xl`+. A host that has to reach outside this scale forks the button,\n * which is exactly how `ButtonMine` was born.\n */\n size: {\n xs: \"h-6 rounded-md px-1 text-xs\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n default: \"h-9 px-4 py-2\",\n /** An explicit spelling of `default` (the fork's middle rung). */\n md: \"h-9 px-4 py-2\",\n lg: \"h-10 rounded-md px-6\",\n xl: \"h-12 px-8 py-3 text-base\",\n \"2xl\": \"h-14 px-10 py-3 text-base\",\n \"3xl\": \"h-16 px-12 py-3 text-base\",\n icon: \"h-9 w-9\",\n \"icon-sm\": \"h-7 w-7\",\n /** A circular icon box — an avatar-shaped control, not a square one. */\n roundIcon: \"h-8 w-8 rounded-full p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Component = asChild ? Slot : \"button\";\n return (\n <Component\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import { useLayoutEffect, useRef, type RefObject } from \"react\";\n\n/** Animate full columns into the projected drop order without changing layout. */\nexport function useColumnReorderAnimation(\n tableRef: RefObject<HTMLTableElement | null>,\n order: string,\n dragging: boolean,\n) {\n const previous = useRef<{ positions: Map<string, number>; dragging: boolean }>({ positions: new Map(), dragging: false });\n const animations = useRef<Animation[]>([]);\n\n useLayoutEffect(() => {\n const table = tableRef.current;\n if (!table) return;\n const headers = Array.from(table.querySelectorAll<HTMLTableCellElement>(\"th[data-matrx-table-column-id]\"));\n const positions = new Map(headers.map(header => [header.dataset.matrxTableColumnId!, header.offsetLeft]));\n const prefersReducedMotion =\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n const shouldAnimate =\n (dragging || previous.current.dragging) && !prefersReducedMotion;\n const offsets = new Map<string, number>();\n for (const header of headers) {\n const id = header.dataset.matrxTableColumnId!;\n const oldLeft = previous.current.positions.get(id);\n if (oldLeft === undefined) continue;\n // Carry unfinished travel forward when the pointer crosses several columns quickly.\n const transform = getComputedStyle(header).transform;\n const remaining = transform && transform !== \"none\" ? new DOMMatrixReadOnly(transform).m41 : 0;\n offsets.set(id, oldLeft - header.offsetLeft + remaining);\n }\n animations.current.forEach(animation => animation.cancel());\n animations.current = [];\n if (shouldAnimate) {\n for (const cell of Array.from(table.querySelectorAll<HTMLElement>(\"[data-matrx-table-column-id]\"))) {\n const offset = offsets.get(cell.dataset.matrxTableColumnId!);\n if (!offset || typeof cell.animate !== \"function\") continue;\n animations.current.push(cell.animate(\n [{ transform: `translateX(${offset}px)` }, { transform: \"translateX(0)\" }],\n { duration: 180, easing: \"cubic-bezier(0.2, 0.8, 0.2, 1)\" },\n ));\n }\n }\n previous.current = { positions, dragging };\n }, [tableRef, order, dragging]);\n\n useLayoutEffect(() => () => {\n animations.current.forEach(animation => animation.cancel());\n }, []);\n}\n","\"use client\";\n\n/**\n * Checkbox — Radix checkbox, and the indeterminate ruling that came with it.\n *\n * RADIX RENDERS THE INDICATOR FOR BOTH `checked` AND `\"indeterminate\"`. The\n * stock shadcn body puts a full check inside it either way, so a half-selected\n * \"select all\" tells the user every row is selected — a screen stating\n * something false. The two states get different glyphs here, always.\n *\n * `size` carries the two boxes the hosts had forked into: matrx-frontend's\n * dense 14px control and the stock 16px one.\n */\n\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { CheckIcon, DividerHorizontalIcon } from \"./icons\";\n\nexport type CheckboxSize = \"sm\" | \"md\";\n\nconst CHECKBOX_SIZES: Record<CheckboxSize, { root: string; glyph: string }> = {\n sm: { root: \"h-3.5 w-3.5 rounded-xs\", glyph: \"h-3 w-3\" },\n md: { root: \"h-4 w-4 rounded-sm\", glyph: \"h-3.5 w-3.5\" },\n};\n\nexport interface CheckboxProps\n extends React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> {\n /** Box size. Default `md` (the stock 16px control); `sm` is the dense 14px one. */\n size?: CheckboxSize;\n}\n\nconst Checkbox = React.forwardRef<\n React.ComponentRef<typeof CheckboxPrimitive.Root>,\n CheckboxProps\n>(({ className, size = \"md\", ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n data-slot=\"checkbox\"\n className={cn(\n \"peer shrink-0 cursor-pointer border border-primary shadow focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground\",\n CHECKBOX_SIZES[size].root,\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current\"\n >\n {props.checked === \"indeterminate\" ? (\n <DividerHorizontalIcon className={CHECKBOX_SIZES[size].glyph} />\n ) : (\n <CheckIcon className={CHECKBOX_SIZES[size].glyph} />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport { Checkbox };\n","/**\n * Internal inlined SVG icons (policy C19: no icon-library dependency, ever).\n *\n * Each icon is copied from the exact glyph the ported originals rendered:\n * lucide-react's Loader2 / ChevronLeft / ChevronRight / MoreHorizontal and\n * @radix-ui/react-icons' Cross2Icon. Same viewBoxes, same paths, same default\n * stroke geometry — a host swapping the import sees pixel-identical output.\n *\n * Not exported from the package entry; components consume them directly.\n */\n\nimport * as React from \"react\";\n\ntype IconProps = React.SVGAttributes<SVGSVGElement>;\n\nfunction lucideProps(props: IconProps): React.SVGAttributes<SVGSVGElement> {\n return {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n \"aria-hidden\": true,\n ...props,\n };\n}\n\n/**\n * lucide `loader-2` — the spinner glyph. Callers add `matrx-spin`.\n * Never a resting icon: at rest this incomplete arc reads as a broken\n * half-circle. Refresh controls use arrows, then swap to this only while busy.\n */\nexport function Loader2Icon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\n/** lucide `chevron-left`. */\nexport function ChevronLeftIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n );\n}\n\n/** lucide `chevron-right`. */\nexport function ChevronRightIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n );\n}\n\n/** lucide `chevron-down` — the disclosure's open glyph. */\nexport function ChevronDownIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\n/** lucide `archive` — the archived-rows glyph (ArchivedDisclosure). */\nexport function ArchiveIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <rect width=\"20\" height=\"5\" x=\"2\" y=\"3\" rx=\"1\" />\n <path d=\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8\" />\n <path d=\"M10 12h4\" />\n </svg>\n );\n}\n\n/** lucide `more-horizontal` — the kebab/ellipsis glyph. */\nexport function MoreHorizontalIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n </svg>\n );\n}\n\n/** lucide `check` — the selected-row tick (CreatablePicker). */\nexport function LucideCheckIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\n/** lucide `chevrons-up-down` — the combobox trigger glyph. */\nexport function ChevronsUpDownIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m7 15 5 5 5-5\" />\n <path d=\"m7 9 5-5 5 5\" />\n </svg>\n );\n}\n\n/** lucide `external-link` — the manage-in-new-tab glyph. */\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n </svg>\n );\n}\n\n/** lucide `lock` — the platform-governed vocabulary glyph. */\nexport function LockIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n );\n}\n\n/** lucide `plus` — the create/add glyph. */\nexport function PlusIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </svg>\n );\n}\n\n/** lucide `x` — the dialog close glyph (host dialog module used lucide X). */\nexport function XIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\n/**\n * @radix-ui/react-icons components default to width/height 15 — the bare\n * `<ChevronUpIcon />` renders in Select's scroll buttons rely on it.\n */\nfunction radixProps(props: IconProps): React.SVGAttributes<SVGSVGElement> {\n return {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 15 15\",\n width: 15,\n height: 15,\n fill: \"none\",\n \"aria-hidden\": true,\n ...props,\n };\n}\n\n/** @radix-ui/react-icons `MagnifyingGlassIcon` — the command search glyph. */\nexport function MagnifyingGlassIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M10 6.5C10 8.433 8.433 10 6.5 10C4.567 10 3 8.433 3 6.5C3 4.567 4.567 3 6.5 3C8.433 3 10 4.567 10 6.5ZM9.30884 10.0159C8.53901 10.6318 7.56251 11 6.5 11C4.01472 11 2 8.98528 2 6.5C2 4.01472 4.01472 2 6.5 2C8.98528 2 11 4.01472 11 6.5C11 7.56251 10.6318 8.53901 10.0159 9.30884L12.8536 12.1464C13.0488 12.3417 13.0488 12.6583 12.8536 12.8536C12.6583 13.0488 12.3417 13.0488 12.1464 12.8536L9.30884 10.0159Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `CheckIcon` — the select item indicator glyph. */\nexport function CheckIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M11.4669 3.72684C11.7558 3.91574 11.8369 4.30308 11.648 4.59198L7.39799 11.092C7.29783 11.2452 7.13556 11.3467 6.95402 11.3699C6.77247 11.3931 6.58989 11.3355 6.45446 11.2124L3.70446 8.71241C3.44905 8.48022 3.43023 8.08494 3.66242 7.82953C3.89461 7.57412 4.28989 7.55529 4.5453 7.78749L6.75292 9.79441L10.6018 3.90792C10.7907 3.61902 11.178 3.53795 11.4669 3.72684Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/**\n * @radix-ui/react-icons `DividerHorizontalIcon` — the INDETERMINATE checkbox\n * glyph. Radix renders the indicator for both `true` and `\"indeterminate\"`, so\n * a half-selected \"select all\" that shows a full check states something false;\n * the two states get different glyphs on purpose.\n */\nexport function DividerHorizontalIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M2 7.5C2 7.22386 2.22386 7 2.5 7H12.5C12.7761 7 13 7.22386 13 7.5C13 7.77614 12.7761 8 12.5 8H2.5C2.22386 8 2 7.77614 2 7.5Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `DotFilledIcon` — the menu radio-item indicator. */\nexport function DotFilledIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M9.875 7.5C9.875 8.81168 8.81168 9.875 7.5 9.875C6.18832 9.875 5.125 8.81168 5.125 7.5C5.125 6.18832 6.18832 5.125 7.5 5.125C8.81168 5.125 9.875 6.18832 9.875 7.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `ChevronRightIcon` — the submenu-trigger glyph. */\nexport function RadixChevronRightIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M6.1584 3.13508C6.35985 2.94621 6.67627 2.95642 6.86514 3.15788L10.6151 7.15788C10.7954 7.3502 10.7954 7.64949 10.6151 7.84182L6.86514 11.8418C6.67627 12.0433 6.35985 12.0535 6.1584 11.8646C5.95694 11.6757 5.94673 11.3593 6.1356 11.1579L9.565 7.49985L6.1356 3.84182C5.94673 3.64036 5.95694 3.32394 6.1584 3.13508Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `ChevronDownIcon` — the select trigger/scroll glyph. */\nexport function RadixChevronDownIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `ChevronUpIcon` — the select scroll-up glyph. */\nexport function RadixChevronUpIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M3.13523 8.84197C3.3241 9.04343 3.64052 9.05363 3.84197 8.86477L7.5 5.43536L11.158 8.86477C11.3595 9.05363 11.6759 9.04343 11.8648 8.84197C12.0536 8.64051 12.0434 8.32409 11.842 8.13523L7.84197 4.38523C7.64964 4.20492 7.35036 4.20492 7.15803 4.38523L3.15803 8.13523C2.95657 8.32409 2.94637 8.64051 3.13523 8.84197Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `Cross2Icon` — the dialog/sheet close glyph. */\nexport function Cross2Icon(props: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 15 15\"\n fill=\"none\"\n aria-hidden\n {...props}\n >\n <path\n d=\"M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/**\n * @radix-ui/react-icons `DragHandleDots2Icon` — the grip on `ResizableHandle`.\n * Inlined per C19: this package depends on no icon library.\n */\nexport function DragHandleDots2Icon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M4.5 2.5C5.05228 2.5 5.5 2.05228 5.5 1.5C5.5 0.947715 5.05228 0.5 4.5 0.5C3.94772 0.5 3.5 0.947715 3.5 1.5C3.5 2.05228 3.94772 2.5 4.5 2.5ZM4.5 6.5C5.05228 6.5 5.5 6.05229 5.5 5.5C5.5 4.94771 5.05228 4.5 4.5 4.5C3.94772 4.5 3.5 4.94771 3.5 5.5C3.5 6.05229 3.94772 6.5 4.5 6.5ZM5.5 9.5C5.5 10.0523 5.05228 10.5 4.5 10.5C3.94772 10.5 3.5 10.0523 3.5 9.5C3.5 8.94771 3.94772 8.5 4.5 8.5C5.05228 8.5 5.5 8.94771 5.5 9.5ZM4.5 14.5C5.05228 14.5 5.5 14.0523 5.5 13.5C5.5 12.9477 5.05228 12.5 4.5 12.5C3.94772 12.5 3.5 12.9477 3.5 13.5C3.5 14.0523 3.94772 14.5 4.5 14.5ZM11.5 1.5C11.5 2.05228 11.0523 2.5 10.5 2.5C9.94771 2.5 9.5 2.05228 9.5 1.5C9.5 0.947715 9.94771 0.5 10.5 0.5C11.0523 0.5 11.5 0.947715 11.5 1.5ZM10.5 6.5C11.0523 6.5 11.5 6.05229 11.5 5.5C11.5 4.94771 11.0523 4.5 10.5 4.5C9.94771 4.5 9.5 4.94771 9.5 5.5C9.5 6.05229 9.94771 6.5 10.5 6.5ZM11.5 9.5C11.5 10.0523 11.0523 10.5 10.5 10.5C9.94771 10.5 9.5 10.0523 9.5 9.5C9.5 8.94771 9.94771 8.5 10.5 8.5C11.0523 8.5 11.5 8.94771 11.5 9.5ZM10.5 14.5C11.0523 14.5 11.5 14.0523 11.5 13.5C11.5 12.9477 11.0523 12.5 10.5 12.5C9.94771 12.5 9.5 12.9477 9.5 13.5C9.5 14.0523 9.94771 14.5 10.5 14.5Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** lucide `star` — the default-organization badge (OrganizationPicker). */\nexport function StarIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\" />\n </svg>\n );\n}\n\n/** lucide `building-2` — the organization glyph (OrganizationPicker trigger). */\nexport function Building2Icon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z\" />\n <path d=\"M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2\" />\n <path d=\"M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2\" />\n <path d=\"M10 6h4\" />\n <path d=\"M10 10h4\" />\n <path d=\"M10 14h4\" />\n <path d=\"M10 18h4\" />\n </svg>\n );\n}\n","\"use client\";\n\n/**\n * AlertDialog — the confirm/destroy surface (78 host import sites).\n *\n * Ported from matrx-frontend `components/ui/alert-dialog.tsx`, which was the\n * only variant in the fleet that had been hardened. Its rulings, kept verbatim:\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. The gate a\n * wrapper once carried (\"Radix ids differ between SSR and client\") was\n * false, and it deleted always-visible Triggers (delete buttons, mostly)\n * from SSR and the first client paint.\n *\n * 2. AN UNDESCRIBED ALERT DIALOG STILL DESCRIBES ITSELF. A confirm dialog with\n * no `AlertDialogDescription` gets a screen-reader-only one rather than a\n * console warning — the surface where a blind user is about to destroy\n * something is the wrong place to ship an accessibility gap.\n *\n * ADDED HERE, from the same doctrine `Dialog` already carries and this\n * component demonstrably needed:\n *\n * 3. IT IS CLAMPED TO THE VIEWPORT AND SCROLLS INSIDE ITSELF\n * (`max-h-[85dvh] overflow-y-auto`). The host copy was NOT — an alert\n * dialog whose body listed what is about to be deleted pushed Cancel and\n * Continue below the fold on a short viewport, and the only way out was a\n * backdrop click. On an ALERT dialog Radix does not dismiss on backdrop\n * click, so the surface was a genuine dead end. Recorded in CHANGELOG as a\n * real defect fixed in the port, not \"preserved\".\n *\n * 4. THE ACTIONS ARE 44px TALL ON COARSE POINTERS. `AlertDialogAction` and\n * `AlertDialogCancel` inherit the package Button's own target rules through\n * `buttonVariants`; the footer keeps them safe-area padded on mobile.\n *\n * 5. THE STICKY FOOTER NEVER PAINTS OVER THE BODY (0.11.3). Ruling 3's footer\n * bled over the card's bottom padding with a negative block margin, and\n * `position: sticky` clamps a box to its containing block — so the footer\n * was dragged UP by `--dialog-pad` against the card's `gap-4`, covering the\n * last 8px of the consequence copy at every length, unreachable because the\n * card did not scroll. The bleed is now the card's RESERVATION\n * (`.matrx-dialog-card` hands its bottom padding to the footer), which\n * sticky has nothing to clamp. See `sticky-footer-geometry.test.tsx`.\n *\n * SEAM INVERSION. The host resolved its portal target through\n * `usePopoutContainer` (its window-panel popout body); here that is the\n * package's `PortalContainerProvider`, with an explicit `container` prop still\n * winning.\n */\n\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\nimport { treeContainsComponent } from \"@ai-matrx/kit/react-tree\";\nimport * as React from \"react\";\n\nimport { buttonVariants } from \"./button\";\nimport { cn } from \"./cn\";\nimport { CENTERED_DIALOG, MOTION_DIALOG, MOTION_OVERLAY } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\n\nconst AlertDialog = AlertDialogPrimitive.Root;\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\n\n/**\n * Portal-seam-aware AlertDialogPortal. Explicit `container` wins; with none,\n * the injected container; with neither, Radix's `document.body`.\n */\nconst AlertDialogPortal = ({\n container,\n ...props\n}: Omit<\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Portal>,\n \"container\"\n> & {\n /** `undefined` → use the injected container; `null` → force document.body. */\n container?: HTMLElement | null | undefined;\n}) => {\n const resolved = usePortalContainer(container);\n return (\n <AlertDialogPrimitive.Portal container={resolved ?? null} {...props} />\n );\n};\nAlertDialogPortal.displayName = \"AlertDialogPortal\";\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n ref={ref}\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-[10000] bg-[var(--matrx-overlay-scrim)]\",\n MOTION_OVERLAY,\n className,\n )}\n {...props}\n />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\n/**\n * Unstyled, non-portalling Content for custom layouts. AlertDialog is always\n * modal, so `aria-modal` is stated rather than derived.\n */\nconst AlertDialogContentPrimitive = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>((props, ref) => (\n <AlertDialogPrimitive.Content {...props} ref={ref} aria-modal=\"true\" />\n));\nAlertDialogContentPrimitive.displayName = \"AlertDialogContentPrimitive\";\n\nconst AlertDialogDescription = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n ref={ref}\n data-slot=\"alert-dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nAlertDialogDescription.displayName =\n AlertDialogPrimitive.Description.displayName;\n\nexport interface AlertDialogContentProps\n extends React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content> {\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly. It is NOT the reduced-motion switch;\n * `styles.css` already honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nconst AlertDialogContent = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Content>,\n AlertDialogContentProps\n>(({ className, children, container, animated = true, ...props }, ref) => {\n const hasDescription =\n treeContainsComponent(children, AlertDialogDescription) ||\n treeContainsComponent(children, AlertDialogPrimitive.Description);\n return (\n <AlertDialogPortal container={container}>\n <AlertDialogOverlay />\n <AlertDialogContentPrimitive\n ref={ref}\n data-slot=\"alert-dialog-content\"\n className={cn(\n `matrx-dialog-card fixed left-[50%] top-[50%] z-[10000] grid min-w-0 w-full max-w-lg ${CENTERED_DIALOG} gap-4 border bg-background p-6 shadow-lg`,\n // Ruling 3 — never taller than the viewport, always scrollable, and\n // the footer stays reachable via --dialog-pad like Dialog's.\n // Ruling 5 (0.11.3) — `matrx-dialog-card` hands the bottom padding to\n // a sticky footer when there is one, so the footer's box matches the\n // space the grid gave it and sticky never clamps it up over the\n // consequence copy.\n \"max-h-[85dvh] overflow-y-auto overscroll-contain [--dialog-pad:1.5rem] overflow-x-clip [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full\",\n \"sm:rounded-lg\",\n animated && MOTION_DIALOG,\n className,\n )}\n {...props}\n >\n {hasDescription ? null : (\n <AlertDialogPrimitive.Description className=\"sr-only\">\n Please confirm the action described in this dialog.\n </AlertDialogPrimitive.Description>\n )}\n {children}\n </AlertDialogContentPrimitive>\n </AlertDialogPortal>\n );\n});\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nconst AlertDialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\"flex flex-col space-y-2 text-center sm:text-left\", className)}\n {...props}\n />\n);\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\nconst AlertDialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n // Ruling 3/4 — sticky to the card edges so a scrolled body never shows\n // through under the actions, and safe-area padded on a phone.\n //\n // 🚨 THERE IS NO `mb-[…]` HERE, AND THERE MUST NEVER BE ONE AGAIN\n // (0.11.3, feedback bf8fb00b). The bleed over the card's bottom padding\n // used to be a NEGATIVE BLOCK MARGIN, which makes this box taller than\n // the grid area the card allocates it — and `position: sticky` CLAMPS a\n // box to its containing block, so the browser yanked the footer UP by\n // `--dialog-pad` against the card's `gap-4` and painted 8px of opaque\n // footer over the last line of the consequence, at every length. The\n // card now RESERVES this footer's block size instead (`matrx-dialog-card`\n // in styles.css hands over its `padding-bottom`), so the bleed costs no\n // margin at all. Guard: `sticky-footer-geometry.test.tsx`.\n //\n // These stay UTILITIES rather than a shipped rule so a caller's\n // `className` still wins through tailwind-merge — a shipped rule would\n // have to be unlayered to survive Tailwind preflight (§ THE PREFLIGHT\n // RULE in styles.css) and would then override every caller's padding.\n \"sticky bottom-0 z-10 bg-background pt-3\",\n \"mx-[calc(var(--dialog-pad,0px)*-1)] px-[var(--dialog-pad,0px)] pb-[var(--dialog-pad,0px)]\",\n className,\n )}\n {...props}\n />\n);\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n\nconst AlertDialogTitle = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title\n ref={ref}\n data-slot=\"alert-dialog-title\"\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nconst AlertDialogAction = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action\n ref={ref}\n data-slot=\"alert-dialog-action\"\n className={cn(buttonVariants(), className)}\n {...props}\n />\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nconst AlertDialogCancel = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n data-slot=\"alert-dialog-cancel\"\n className={cn(\n buttonVariants({ variant: \"outline\" }),\n \"mt-2 sm:mt-0\",\n className,\n )}\n {...props}\n />\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogContentPrimitive,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n};\n","/**\n * THE MOTION CONTRACT (0.10.0) — the class names every animated surface in\n * this package puts on the DOM, in ONE place.\n *\n * Why a module and not ten inline strings: the sweep that produced this file\n * found the same defect ten times over, and it was invisible each time\n * because each primitive spelled its animation out by hand. Ten hand-written\n * copies of `data-[state=open]:animate-in data-[state=closed]:animate-out\n * data-[state=closed]:fade-out-0 …` meant ten chances to reach for a utility\n * nothing in the package defines — which is exactly what happened. A single\n * exported constant per motion SHAPE means the next primitive cannot invent\n * an eleventh spelling, and `styles.test.ts` can prove every one of them\n * resolves to a rule in the shipped stylesheet.\n *\n * Every rule these name lives in `styles.css` under the package's own\n * keyframes. NONE of them is a Tailwind utility, and none requires a host\n * plugin — see that file's header for the measurement that made this\n * necessary.\n */\n\n/** Modal scrims: Dialog, AlertDialog, Sheet, CommandDialog. Fade only. */\nexport const MOTION_OVERLAY = \"matrx-motion-overlay\";\n\n/** The centred dialog card. Fades and scales; centring is not its business. */\nexport const MOTION_DIALOG = \"matrx-motion-dialog\";\n\n/**\n * THE CENTRING OF A CENTRED DIALOG CARD — package-owned, in the `translate`\n * property, and NEVER a Tailwind `translate-x-[-50%] translate-y-[-50%]` pair.\n *\n * Those utilities do not compile to the same thing in every host: Tailwind v3\n * writes them into `transform`, Tailwind v4 writes them into the independent\n * `translate` property, which COMPOSES with `transform` instead of being\n * replaced by it. 0.10.0's keyframes restated the centring inside `transform`,\n * which was harmless on v3 and doubled the centring on v4 — the card flew in\n * from off the top-left of the viewport for the animation's whole duration and\n * snapped into place at the end (fixed in 0.10.1).\n *\n * Owning it here means one spelling that reads the same on both, and it frees\n * `transform` so the keyframes carry ONLY the delta. Put this on every centred\n * surface UNCONDITIONALLY — it is geometry, so unlike {@link MOTION_DIALOG} it\n * must survive `animated={false}`. Its rule ships in `styles.css`.\n */\nexport const CENTERED_DIALOG = \"matrx-dialog-centered\";\n\n/**\n * The resting gap between a `popper`-positioned surface and its trigger, for\n * the primitives that want one (today: `Select`). Same law and same reason as\n * {@link CENTERED_DIALOG} — a position an animated surface holds AT REST is\n * the `translate` property's job, never a Tailwind translate utility, because\n * those land in `transform` on a v3 host and in `translate` on a v4 one while\n * the keyframes animate `transform` either way. Sizes from\n * `--matrx-popper-offset`; keys off Radix's `data-side`.\n */\nexport const POPPER_OFFSET = \"matrx-popper-offset\";\n\n/** The mobile Dialog / CommandDialog bottom sheet. Slides up and fades. */\nexport const MOTION_BOTTOM_SHEET = \"matrx-motion-bottom-sheet\";\n\n/**\n * Radix-popper surfaces: Popover, DropdownMenu, ContextMenu, HoverCard,\n * Select, Tooltip. Reads `--radix-popper-transform-origin` so the surface\n * grows out of its trigger, and `data-side` so it travels from it.\n */\nexport const MOTION_POPPER = \"matrx-motion-popper\";\n\n/** Edge sheets, one class per `sheetVariants` side. */\nexport const MOTION_SHEET = {\n top: \"matrx-motion-sheet-top\",\n bottom: \"matrx-motion-sheet-bottom\",\n left: \"matrx-motion-sheet-left\",\n right: \"matrx-motion-sheet-right\",\n center: \"matrx-motion-sheet-center\",\n} as const;\n\n/** Skeleton's breathing loop. */\nexport const MOTION_PULSE = \"matrx-pulse\";\n\n/** The spinner loop, for every inline busy indicator in the package. */\nexport const MOTION_SPIN = \"matrx-spin\";\n\n/**\n * Every motion class the package ships, for the guards. If a rule for one of\n * these is missing from `styles.css`, a component animates in no consumer and\n * says nothing about it — the C26 failure this list exists to make loud.\n */\nexport const ALL_MOTION_CLASSES = [\n MOTION_OVERLAY,\n MOTION_DIALOG,\n MOTION_BOTTOM_SHEET,\n MOTION_POPPER,\n ...Object.values(MOTION_SHEET),\n MOTION_PULSE,\n MOTION_SPIN,\n] as const;\n\n/**\n * The host-plugin utilities this package is forbidden to emit. They are\n * supplied by `tailwindcss-animate` / `tw-animate-css`, which is a HOST CSS\n * entry concern a package cannot declare a dependency on: three of the four\n * AI Matrx consumers never loaded it, so every surface wearing these appeared\n * with no animation and no error. `styles.test.ts` fails the build if one\n * comes back.\n */\nexport const FORBIDDEN_HOST_MOTION_UTILITIES = [\n \"animate-in\",\n \"animate-out\",\n \"fade-in\",\n \"fade-out\",\n \"zoom-in\",\n \"zoom-out\",\n \"slide-in-from\",\n \"slide-out-to\",\n \"animate-accordion\",\n \"animate-slide-down\",\n \"animate-slide-up\",\n \"animate-pulse\",\n \"animate-spin\",\n] as const;\n","\"use client\";\n\n/**\n * Injected portal-container seam.\n *\n * The matrx-frontend original resolved nested portal targets through\n * `useNestedPortalContainer` (explicit prop > dialog content > popout body >\n * document.body) — a host-shaped hook wired to that app's dialog and\n * window-panel systems. The package inverts the seam: hosts provide the\n * resolved container through `PortalContainerProvider`; an explicit\n * `container` prop on a component still wins, and with neither the portal\n * falls through to `document.body` (Radix default). Priority semantics are\n * unchanged from the original.\n */\n\nimport * as React from \"react\";\n\n// Shared identity across independently bundled public entrypoints/loaders.\nconst CONTEXT_SLOT = Symbol.for(\"ai-matrx.design-system.portal-container-context\");\nconst contextRegistry = globalThis as typeof globalThis & { [CONTEXT_SLOT]?: React.Context<HTMLElement | null | undefined> };\nconst PortalContainerContext = contextRegistry[CONTEXT_SLOT] ??= React.createContext<HTMLElement | null | undefined>(undefined);\n\nexport interface PortalContainerProviderProps {\n /** Where nested Radix portals (Popover, etc.) should mount. `null`/`undefined` → document.body. */\n container: HTMLElement | null | undefined;\n children: React.ReactNode;\n}\n\nexport function PortalContainerProvider({\n container,\n children,\n}: PortalContainerProviderProps) {\n return (\n <PortalContainerContext.Provider value={container ?? undefined}>\n {children}\n </PortalContainerContext.Provider>\n );\n}\n\n/**\n * Resolve a portal target: explicit prop (including an explicit `null`,\n * meaning \"the default body\") beats the injected container.\n */\nexport function usePortalContainer(\n explicit?: HTMLElement | null,\n): HTMLElement | undefined {\n const injected = React.useContext(PortalContainerContext);\n\n if (explicit !== undefined) {\n return explicit ?? undefined;\n }\n\n return injected ?? undefined;\n}\n","\"use client\";\n\n/**\n * ConfirmDialog — the `window.confirm` replacement, declarative half.\n *\n * WHY IT LIVES HERE AND NOT IN `@ai-matrx/kit` (census row 19i, decided by the\n * package-graph ruling of 2026-09-07, on the row-20a Tooltip precedent).\n *\n * kit shipped this dialog with its own inlined AlertDialog, its own inlined\n * button class strings, a hardcoded 80%-opaque black scrim, and\n * `data-[state=open]:animate-in … zoom-in-95 … slide-in-from-top-[48%]` —\n * host-plugin utilities `tailwindcss-animate`/`tw-animate-css` supply and a\n * package cannot ship. kit ships NO stylesheet at all, so in three of the four\n * consumers the most consequential surface in the app (the one standing\n * between a user and a destroyed thing) appeared with no animation, no error,\n * and a scrim that ignored the theme. kit could not import the fix:\n * `@ai-matrx/design-system` depends on `@ai-matrx/kit`, so importing back is a\n * cycle; giving kit its own sheet would invent a second required-CSS contract\n * no consumer performs (the C26 silent host contract, one layer down).\n *\n * The resolution is the one row 20a already proved: the surface moves to the\n * package that owns the surface. This file is built on THIS package's\n * `AlertDialog` — so it inherits, for free and forever:\n *\n * - the package motion layer (`matrx-motion-overlay` / `matrx-motion-dialog`),\n * whose rules ship in `styles.css` and are proven present in the tarball;\n * - `--matrx-overlay-scrim`, a token that answers to the host's theme,\n * instead of an opaque black literal;\n * - AlertDialog ruling 3 — clamped to `max-h-[85dvh]`, scrolling inside\n * itself, with a sticky footer. **This is what makes the consequence-first\n * copy law survivable**: a confirmation that names everything it is about\n * to destroy can be long, and in kit's copy a long one pushed Cancel and\n * Continue below the fold of a short viewport with no backdrop dismissal —\n * a dead end on a destructive action;\n * - `buttonVariants` as the ONE source of button appearance, including the\n * 44px coarse-pointer target;\n * - `PortalContainerProvider`, so a dialog opened inside a popped-out window\n * panel renders in THAT window's document.\n *\n * kit keeps `./confirm-opener` — the pure, React-free imperative `confirm()`\n * and its `globalThis`-slotted host registry — and re-exports nothing of this.\n * Consumers mount `<ConfirmDialogHost />` from here and call `confirm()` from\n * there. See `confirm-host.tsx` for the join.\n *\n * BEHAVIOR IS THE KIT PORT, VERBATIM. Every prop, default and interaction is\n * unchanged; only the chrome underneath it is the package's.\n *\n * Pattern: hold the pending target in state, render `<ConfirmDialog />` once at\n * the bottom of the component, and open it by setting the target. When busy\n * state is meaningful (a network delete that should hold the dialog open with a\n * spinner), use THIS component inline; the imperative `confirm()` closes\n * immediately on click.\n */\n\nimport * as React from \"react\";\n\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"./alert-dialog\";\nimport { buttonVariants } from \"./button\";\nimport { cn } from \"./cn\";\nimport { Loader2Icon } from \"./icons\";\nimport { MOTION_SPIN } from \"./motion\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: React.ReactNode;\n /**\n * THE CONSEQUENCE. Per the platform's destructive-and-expensive-actions law,\n * a confirmation must name what is lost, what is duplicated, and/or what it\n * costs — \"Are you sure?\" is not a confirmation. This renders as the dialog's\n * accessible description, so a screen-reader user is told the consequence\n * too, and it is never clamped or truncated.\n */\n description?: React.ReactNode | undefined;\n /**\n * Rich body rendered between the header and the footer. Use it for\n * supplementary or interactive content that is not part of the dialog's\n * accessible consequence description.\n */\n content?: React.ReactNode | undefined;\n /** Extra classes for the dialog content (e.g. a wider max-w for diffs). */\n contentClassName?: string | undefined;\n confirmLabel?: string | undefined;\n /**\n * `null` hides the cancel button entirely — for acknowledge-only dialogs\n * where there is nothing to cancel. Anything else labels it.\n */\n cancelLabel?: string | null | undefined;\n variant?: \"default\" | \"destructive\" | undefined;\n busy?: boolean | undefined;\n /**\n * Blocks confirming without pretending work is in flight. For a dialog whose\n * `content` asks the user something the action cannot proceed without — the\n * choice is missing, not loading — `busy` would show a misleading spinner.\n */\n confirmDisabled?: boolean | undefined;\n /**\n * Explicit portal target. Default (undefined): the container injected by\n * `PortalContainerProvider`, else `document.body`. Hosts with retargeting\n * needs (a popped-out browser window whose dialog must render in THAT\n * window's document) may still pass the element directly.\n */\n portalContainer?: HTMLElement | null | undefined;\n onConfirm: () => void | Promise<void>;\n}\n\n/**\n * Drop-in replacement for `window.confirm`. Use this anywhere you would\n * otherwise reach for a browser-level confirm dialog.\n */\nexport function ConfirmDialog({\n open,\n onOpenChange,\n title,\n description,\n content,\n contentClassName,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n variant = \"default\",\n busy = false,\n confirmDisabled = false,\n portalContainer,\n onConfirm,\n}: ConfirmDialogProps) {\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent\n className={contentClassName}\n {...(portalContainer === undefined ? {} : { container: portalContainer })}\n >\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n {description ? (\n <AlertDialogDescription asChild>\n <div>{description}</div>\n </AlertDialogDescription>\n ) : null}\n </AlertDialogHeader>\n {content ?? null}\n <AlertDialogFooter>\n {cancelLabel === null ? null : (\n <AlertDialogCancel className=\"max-lg:min-h-11\" disabled={busy}>\n {cancelLabel}\n </AlertDialogCancel>\n )}\n <AlertDialogAction\n disabled={busy || confirmDisabled}\n onClick={(event) => {\n event.preventDefault();\n void onConfirm();\n }}\n className={cn(\n \"max-lg:min-h-11\",\n // One source of button appearance: the destructive look comes\n // from `buttonVariants`, not a second hand-written copy of it.\n // tailwind-merge makes it WIN over the default variant classes.\n variant === \"destructive\" &&\n buttonVariants({ variant: \"destructive\" }),\n )}\n >\n {busy ? (\n <Loader2Icon className={cn(\"mr-2 h-4 w-4\", MOTION_SPIN)} />\n ) : null}\n {confirmLabel}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","\"use client\";\n\n/**\n * Input family — ported verbatim from matrx-frontend `components/ui/input.tsx`.\n *\n * Seam inversions:\n * - `MatrxVariant` (host `components/ui/types`) becomes the structural\n * `InputVariant` union with the identical members, so host call sites are\n * drop-in compatible.\n * - The host file's `CopyInput` / `FancyInput` / `DeleteInput` are\n * deliberately NOT absorbed (C8 split-out law): they carry a `motion/react`\n * dependency (and clipboard behavior) that plain-Input consumers must not\n * pay for. They stay host-owned until sanctioned separately.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport type InputVariant =\n | \"default\"\n | \"destructive\"\n | \"success\"\n | \"outline\"\n | \"secondary\"\n | \"ghost\"\n | \"link\"\n | \"primary\";\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n variant?: InputVariant;\n}\n\nconst getVariantStyles = (variant: InputVariant = \"default\") => {\n const baseStyles = `flex h-10 w-full border border-border bg-background text-foreground shadow-input rounded-md px-3 py-2 text-sm file:border-0 file:bg-transparent\n file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground\n focus-visible:outline-none focus-visible:ring-[2px] focus-visible:ring-ring\n disabled:cursor-not-allowed disabled:opacity-50\n dark:shadow-none\n transition duration-400\n [&:-webkit-autofill]:bg-background [&:-webkit-autofill]:shadow-[0_0_0_1000px_hsl(var(--background))_inset] [&:-webkit-autofill]:[caret-color:currentColor]\n dark:[&:-webkit-autofill]:shadow-[0_0_0_1000px_hsl(var(--background))_inset] dark:[&:-webkit-autofill]:[-webkit-text-fill-color:hsl(var(--foreground))]\n [&:-webkit-autofill:hover]:shadow-[0_0_0_1000px_hsl(var(--background))_inset] [&:-webkit-autofill:focus]:shadow-[0_0_0_1000px_hsl(var(--background))_inset]`;\n\n switch (variant) {\n case \"destructive\":\n return `${baseStyles} bg-destructive text-destructive-foreground`;\n case \"outline\":\n return `${baseStyles} border-2`;\n case \"secondary\":\n return `${baseStyles} bg-secondary text-secondary-foreground`;\n case \"ghost\":\n return `${baseStyles} bg-transparent shadow-none`;\n case \"link\":\n return `${baseStyles} bg-transparent underline-offset-4 hover:underline`;\n case \"primary\":\n return `${baseStyles} bg-primary text-primary-foreground`;\n default:\n return baseStyles;\n }\n};\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, variant = \"default\", ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(getVariantStyles(variant), className)}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport interface EnterInputProps extends InputProps {\n onEnter?: () => void;\n}\n\nexport const EnterInput = React.forwardRef<HTMLInputElement, EnterInputProps>(\n ({ onEnter, ...props }, ref) => {\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && onEnter) {\n e.preventDefault();\n onEnter();\n }\n };\n\n return (\n <Input\n {...props}\n ref={ref}\n onKeyDown={(e) => {\n handleKeyDown(e);\n if (props.onKeyDown) {\n props.onKeyDown(e);\n }\n }}\n />\n );\n },\n);\n\nEnterInput.displayName = \"EnterInput\";\n\nexport const BasicInput = React.forwardRef<HTMLInputElement, InputProps>(\n // `variant` is accepted (prop-compatible with Input) but intentionally\n // unused — and destructured so it never leaks onto the DOM element.\n ({ className, type, variant: _variant = \"default\", ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nBasicInput.displayName = \"BasicInput\";\n\nexport interface InputWithPrefixProps extends Omit<InputProps, \"prefix\"> {\n prefix?: React.ReactNode;\n wrapperClassName?: string;\n}\n\nexport const InputWithPrefix = React.forwardRef<\n HTMLInputElement,\n InputWithPrefixProps\n>(({ prefix, className, wrapperClassName, ...props }, ref) => {\n return (\n <div className={cn(\"relative\", wrapperClassName)}>\n {prefix && (\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground\">\n {prefix}\n </div>\n )}\n <Input\n ref={ref}\n className={cn(prefix && \"pl-10\", className)}\n {...props}\n />\n </div>\n );\n});\nInputWithPrefix.displayName = \"InputWithPrefix\";\n","\"use client\";\n\n/**\n * Select — ported verbatim from matrx-frontend `components/ui/select.tsx`.\n *\n * Seam inversions:\n * - The host's `useNestedPortalContainer` (dialog/popout aware) becomes the\n * injected `PortalContainerProvider` seam (`portal-container.tsx`); the\n * explicit `container` prop keeps top priority, exactly as before.\n * - `ChevronDownIcon` / `ChevronUpIcon` / `CheckIcon` come from the package's\n * inlined SVGs (C19), not @radix-ui/react-icons — same glyphs, same\n * viewBoxes. (The origin also imported `CaretSortIcon` without ever using\n * it; the dead import is not carried along.)\n *\n * THE ROOT RENDERS UNCONDITIONALLY — no mount gate. This wrapper used to defer\n * rendering until after hydration (\"Radix generates dynamic aria-controls ids\n * that differ between SSR and client\"), and that justification was false:\n * Radix ids come from React's SSR-stable `useId` (verified against\n * @radix-ui/react-select 2.3.1 / react-id 1.1.2). The gate was actively\n * harmful — it deleted the ALWAYS-VISIBLE select trigger (a form control)\n * from SSR and the first client paint.\n */\n\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER, POPPER_OFFSET } from \"./motion\";\nimport {\n CheckIcon,\n RadixChevronDownIcon,\n RadixChevronUpIcon,\n} from \"./icons\";\nimport { usePortalContainer } from \"./portal-container\";\n\nexport const Select = SelectPrimitive.Root;\n\nexport const SelectGroup = SelectPrimitive.Group;\n\nexport const SelectValue = SelectPrimitive.Value;\n\nexport const selectTriggerVariants = cva(\n \"flex w-full items-center justify-between gap-2 whitespace-nowrap rounded-md border border-border bg-card text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground transition-colors hover:bg-accent hover:border-accent-foreground/20 focus:outline-none focus:ring-1 focus:ring-primary/30 focus:border-primary/40 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:min-w-0 [&>span]:line-clamp-1\",\n {\n variants: {\n size: {\n sm: \"h-7 px-2 py-1 text-xs\",\n default: \"h-9 px-3 py-1\",\n lg: \"h-10 px-3 py-2\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n },\n);\n\nexport interface SelectTriggerProps\n extends\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>,\n VariantProps<typeof selectTriggerVariants> {\n hideArrow?: boolean;\n}\n\nexport const SelectTrigger = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Trigger>,\n SelectTriggerProps\n>(({ className, children, hideArrow = false, size, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(selectTriggerVariants({ size, className }))}\n {...props}\n >\n {children}\n {!hideArrow && (\n <SelectPrimitive.Icon asChild>\n <RadixChevronDownIcon className=\"h-4 w-4 shrink-0 opacity-50\" />\n </SelectPrimitive.Icon>\n )}\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nexport const SelectScrollUpButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <RadixChevronUpIcon />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nexport const SelectScrollDownButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <RadixChevronDownIcon />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName;\n\nexport interface SelectContentProps\n extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> {\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly. It is NOT the reduced-motion switch;\n * `styles.css` already honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nexport const SelectContent = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Content>,\n SelectContentProps\n>(\n (\n {\n className,\n children,\n position = \"popper\",\n container,\n animated = true,\n ...props\n },\n ref,\n ) => {\n const portalContainer = usePortalContainer(container);\n return (\n <SelectPrimitive.Portal container={portalContainer}>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-[10001] max-h-96 min-w-[8rem] max-w-[calc(100vw-2rem)] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n animated && MOTION_POPPER,\n // The resting gap from the trigger. It is the `translate` property\n // (POPPER_OFFSET), never Tailwind translate utilities: those compose\n // with `transform` on a v4 host and are REPLACED by it on a v3 one,\n // so on v3 the animation ate the gap and the surface snapped 4px at\n // the end. Same law as the centred dialog card — see motion.ts.\n position === \"popper\" && POPPER_OFFSET,\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"max-w-full overflow-y-auto p-0.5\",\n position === \"popper\" &&\n \"w-full min-w-[var(--radix-select-trigger-width)] max-h-[var(--radix-select-content-available-height)]\",\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n});\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nexport const SelectLabel = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nexport const SelectItem = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item> & {\n /**\n * Secondary line shown under the label IN THE LIST ONLY. Rendered outside\n * Radix `ItemText` on purpose: everything inside `ItemText` is what the\n * closed trigger displays, so a description passed as `children` gets\n * squeezed into the fixed-height trigger and clipped. This prop keeps the\n * trigger to the one-line label while the open list shows both lines.\n */\n description?: React.ReactNode;\n }\n>(({ className, children, description, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full min-w-0 cursor-default select-none rounded-sm py-1 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n description ? \"flex-col items-start gap-0.5 py-1.5\" : \"items-center\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <span className=\"min-w-0 whitespace-normal break-words [overflow-wrap:anywhere]\">\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </span>\n {description ? (\n <span className=\"block min-w-0 break-words text-xs leading-snug text-muted-foreground [overflow-wrap:anywhere]\">\n {description}\n </span>\n ) : null}\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nexport const SelectSeparator = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n","/**\n * Skeleton — the \"content is coming\" placeholder.\n *\n * Ported from matrx-frontend `components/ui/skeleton.tsx`; no seams, pure\n * markup over semantic tokens. ONE change from the original (0.10.0): the\n * breathing loop is `.matrx-pulse`, a package-owned keyframe, not Tailwind's\n * `animate-pulse`. A Skeleton that does not pulse is indistinguishable from an\n * empty grey box — it stops saying \"loading\" and starts saying \"nothing here\"\n * — so the motion is part of the component's meaning and ships with it (see\n * `styles.css` § THE MOTION LAYER).\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_PULSE } from \"./motion\";\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Package-owned pulse. Default `true`. Pass `false` for a static\n * placeholder — a print/PDF render, or a screenshot fixture where the\n * animation makes the output non-deterministic. `prefers-reduced-motion`\n * already SLOWS the pulse rather than stopping it (a still skeleton would\n * lose the information), so this is not the accessibility switch.\n */\n animated?: boolean;\n}\n\nexport function Skeleton({ className, animated = true, ...props }: SkeletonProps) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\n \"rounded-md bg-primary/10\",\n animated && MOTION_PULSE,\n className,\n )}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../cn\";\n\nexport interface TableTitleRowProps {\n title?: string;\n /** A page owns h1; tables nested within a page use the default h2. */\n headingLevel?: 1 | 2;\n /** Optional real context, such as a schema link or saved-view selector. */\n context?: ReactNode;\n count?: { value: number; label: string };\n search?: ReactNode;\n actions?: ReactNode;\n children?: ReactNode;\n className?: string;\n}\n\n/** Shared responsive title composition. Hosts retain their existing query,\n * navigation and persistence controllers; this component owns layout only. */\nexport function TableTitleRow({\n title,\n headingLevel = 2,\n context,\n count,\n search,\n actions,\n children,\n className,\n}: TableTitleRowProps) {\n const Heading = headingLevel === 1 ? \"h1\" : \"h2\";\n return (\n <div\n data-matrx-table-toolbar\n className={cn(\n \"relative flex min-w-0 shrink-0 flex-wrap items-center gap-2\",\n className,\n )}\n >\n {title ? (\n <Heading className=\"min-w-0 break-words text-sm font-semibold\">\n {title}\n </Heading>\n ) : null}\n {count ? (\n <span\n className=\"shrink-0 rounded-md bg-muted px-2 py-0.5 text-xs tabular-nums\"\n aria-label={`${count.value.toLocaleString()} ${count.label}`}\n >\n {count.value.toLocaleString()}\n </span>\n ) : null}\n {search ? (\n <div\n data-matrx-table-title-search\n className=\"order-last w-full min-w-0 sm:order-none sm:w-auto sm:min-w-64 sm:max-w-md\"\n >\n {search}\n </div>\n ) : null}\n {context}\n {children}\n {actions ? (\n <div\n data-matrx-table-actions\n className=\"ml-auto flex min-w-0 flex-wrap items-center gap-0\"\n >\n {actions}\n </div>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport { useRef, useState } from \"react\";\nimport { Input } from \"../input\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport { Search, X } from \"./icons\";\nimport type { TableSearchScope } from \"./ranked-search\";\n\nexport interface TableSearchProps {\n value: string;\n onChange: (value: string) => void;\n scope: string;\n onScopeChange: (scope: string) => void;\n scopes: readonly TableSearchScope[];\n placeholder?: string;\n}\n\n/** The title row is the positioning parent. The placeholder keeps its original\n * height and width while the focused control overlays the complete toolbar. */\nexport function TableSearch({ value, onChange, scope, onScopeChange, scopes, placeholder = \"Search…\" }: TableSearchProps) {\n const [expanded, setExpanded] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n return (\n <div data-matrx-table-search className=\"h-11 min-w-0 w-full sm:max-w-xs\">\n <div\n data-matrx-table-search-expanded={expanded || undefined}\n className=\"flex h-11 min-w-0 items-center rounded-md border border-input bg-background shadow-input\"\n style={expanded ? { position: \"absolute\", insetInline: 0, top: 0, zIndex: 30 } : { position: \"relative\" }}\n onFocus={() => setExpanded(true)}\n onBlur={event => {\n if (!event.currentTarget.contains(event.relatedTarget)) setExpanded(false);\n }}\n onKeyDown={event => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n setExpanded(false);\n inputRef.current?.blur();\n }\n }}\n >\n <Search aria-hidden=\"true\" className=\"ml-2 h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <Input\n ref={inputRef}\n value={value}\n onChange={event => onChange(event.target.value)}\n placeholder={placeholder}\n aria-label={placeholder.replace(/[…\\.]+$/, \"\") || \"Search table\"}\n className=\"h-full min-w-0 flex-1 border-0 bg-transparent px-2 shadow-none focus-visible:ring-0\"\n style={{ fontSize: \"16px\" }}\n />\n {value ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\" aria-label=\"Clear search\" className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-md hover:bg-muted\" onClick={() => { onChange(\"\"); inputRef.current?.focus(); }}>\n <X aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Clear search</TooltipContent>\n </Tooltip>\n ) : null}\n {expanded ? (\n <div role=\"group\" aria-label=\"Search fields\" className=\"flex shrink-0 items-center overflow-x-auto\" style={{ maxWidth: \"min(60%, max(0px, calc(100% - 12rem)))\" }}>\n {scopes.map(option => (\n <button key={option.id} type=\"button\" aria-pressed={scope === option.id} className=\"flex h-11 shrink-0 items-center justify-center px-1 text-xs\" onClick={() => onScopeChange(option.id)}>\n <span className={scope === option.id ? \"rounded-full bg-primary px-2 py-1 text-primary-foreground\" : \"rounded-full px-2 py-1 text-muted-foreground hover:bg-muted\"}>{option.label}</span>\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Tooltip — the ONE tooltip in the fleet.\n *\n * THE COLLAPSE (0.6.0). Two implementations existed: matrx-frontend's\n * `components/ui/tooltip.tsx` (182 import sites) and `@ai-matrx/tap-target`'s\n * `src/tooltip.tsx` — the latter an explicit inlined PORT of the former,\n * carrying a header that said so. tap-target shipped it only because its ~60\n * tap buttons need a tooltip and no shared package owned one; four repos then\n * adopted `TooltipProvider` from tap-target. That made tap-target — a\n * button-geometry package — the accidental owner of a design-system primitive,\n * with a second copy living in the biggest host.\n *\n * A tooltip is a design-system surface, so it lives here. tap-target now takes\n * `@ai-matrx/design-system` as an ordinary sibling dependency and imports this\n * file; its own copy is deleted, and its re-export removed. The DAG already\n * ordered design-system before tap-target, so no cycle is introduced.\n *\n * BEHAVIOUR is matrx-frontend's, verbatim, including the ruling both copies\n * carried in prose:\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. The gate the\n * host wrapper once carried (\"Radix generates dynamic aria-controls ids that\n * differ between SSR and client\") was false: Radix ids come from React's\n * SSR-stable `useId`. It was actively harmful — a Trigger wraps\n * ALWAYS-VISIBLE content, so `return null` deleted that subtree from SSR and\n * the first client paint.\n *\n * 2. THE SURFACE IS NEUTRAL, NOT BRANDED. Popover tokens, not `bg-primary`:\n * rich tooltip content using `text-muted-foreground` was illegible on a\n * brand-coloured background in one theme or the other.\n *\n * SEAM INVERSION. The host resolved nested portal targets through\n * `useNestedPortalContainer` (an app hook wired to its dialog + window-panel\n * systems); tap-target's port dropped that seam entirely and always portalled\n * to `document.body` — which is why a tooltip inside a popped-out panel landed\n * in the wrong window. Here it is the package's `PortalContainerProvider`\n * seam: an explicit `container` prop wins, then the injected container, then\n * `document.body`. Both prior behaviours are reachable; neither is forked.\n */\n\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\n\n/**\n * Mount once near the app root. Every tooltip in the tree shares its\n * `delayDuration` / `skipDelayDuration` timing.\n */\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nexport interface TooltipContentProps\n extends React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> {\n /**\n * Explicit portal target; wins over the injected `PortalContainerProvider`\n * value. Pass `null` to force `document.body`.\n */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly. It is NOT the reduced-motion switch;\n * `styles.css` already honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nconst TooltipContent = React.forwardRef<\n React.ComponentRef<typeof TooltipPrimitive.Content>,\n TooltipContentProps\n>(({ className, sideOffset = 4, container, animated = true, ...props }, ref) => {\n const resolved = usePortalContainer(container);\n return (\n <TooltipPrimitive.Portal container={resolved ?? null}>\n <TooltipPrimitive.Content\n ref={ref}\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-[10001] overflow-hidden rounded-md border border-border bg-popover px-3 py-1.5 text-xs text-popover-foreground shadow-md\",\n animated && MOTION_POPPER,\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n );\n});\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport type ScrollPaginationContainer =\n | HTMLElement\n | RefObject<HTMLElement | null>\n | null;\n\nexport interface UseScrollPaginationOptions {\n /** Every visible desktop/mobile scroll container that may present this table. */\n containers: readonly ScrollPaginationContainer[];\n /** Immutable identity of every source-affecting query value. */\n queryKey: string;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n loading: boolean;\n /** Automatic scrolling never retries a failed append. */\n error: Error | null;\n loadNextPage: () => Promise<void> | void;\n /** Manual mode exposes the explicit request only; it installs no listeners. */\n mode?: \"scroll\" | \"manual\";\n /** Distance from the bottom at which a qualifying user scroll may append. */\n thresholdPx?: number;\n /** How long an input may authorize the following real scroll movement. */\n intentTimeoutMs?: number;\n enabled?: boolean;\n}\n\nexport interface UseScrollPaginationResult {\n /** For the table's accessible Load more / Retry control. */\n requestNextPage: () => Promise<void>;\n canLoadMore: boolean;\n /** Includes an unexpected loader rejection until the person explicitly retries. */\n error: Error | null;\n}\n\ninterface ScrollOwner { element: HTMLElement; document: boolean; }\ninterface ScrollIntent {\n queryKey: string;\n source: HTMLElement;\n owner: ScrollOwner;\n startTop: number;\n sequence: number;\n expiresAt: number;\n}\n\nconst DEFAULT_THRESHOLD_PX = 96;\nconst DEFAULT_INTENT_TIMEOUT_MS = 1_200;\n\nfunction resolveContainer(container: ScrollPaginationContainer): HTMLElement | null {\n if (!container) return null;\n return container instanceof HTMLElement ? container : container.current;\n}\n\nfunction isVisibleContainer(container: HTMLElement): boolean {\n if (!container.isConnected) return false;\n for (let node: HTMLElement | null = container; node; node = node.parentElement) {\n const style = window.getComputedStyle(node);\n if (style.display === \"none\" || style.visibility === \"hidden\") return false;\n }\n return true;\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n return target.isContentEditable || Boolean(target.closest(\"input, textarea, select, [contenteditable='true']\"));\n}\n\nfunction isDownwardKeyboardInput(event: KeyboardEvent): boolean {\n if (isEditableTarget(event.target)) return false;\n return [\"ArrowDown\", \"PageDown\", \"End\", \" \", \"Spacebar\"].includes(event.key);\n}\n\nfunction isNearBottom(container: HTMLElement, thresholdPx: number): boolean {\n return container.scrollHeight - container.clientHeight - container.scrollTop <= thresholdPx;\n}\n\nfunction isVerticallyScrollable(element: HTMLElement): boolean {\n const overflowY = window.getComputedStyle(element).overflowY;\n return (overflowY === \"auto\" || overflowY === \"scroll\" || overflowY === \"overlay\") && element.scrollHeight > element.clientHeight;\n}\nfunction resolveScrollOwner(source: HTMLElement): ScrollOwner {\n const documentOwner = document.scrollingElement instanceof HTMLElement\n ? document.scrollingElement\n : document.documentElement;\n for (let node: HTMLElement | null = source; node; node = node.parentElement) {\n if (node === documentOwner || node === document.documentElement || node === document.body) {\n return { element: documentOwner, document: true };\n }\n if ((node === source && node.scrollHeight > node.clientHeight) || isVerticallyScrollable(node)) {\n return { element: node, document: false };\n }\n }\n return { element: documentOwner, document: true };\n}\nfunction ownerScrollTop(owner: ScrollOwner): number {\n return owner.document\n ? window.scrollY || document.documentElement.scrollTop || document.body.scrollTop || 0\n : owner.element.scrollTop;\n}\nfunction sourceBottomIsNearOwnerViewport(source: HTMLElement, owner: ScrollOwner, thresholdPx: number): boolean {\n if (!owner.document && owner.element === source) return isNearBottom(source, thresholdPx);\n const sourceRect = source.getBoundingClientRect();\n const ownerRect = owner.document ? { top: 0, bottom: window.innerHeight } : owner.element.getBoundingClientRect();\n return sourceRect.bottom > ownerRect.top && sourceRect.top < ownerRect.bottom && sourceRect.bottom <= ownerRect.bottom + thresholdPx;\n}\n\nfunction isNativeScrollbarPointer(event: PointerEvent, container: HTMLElement): boolean {\n // Overlay scrollbars expose no measurable gutter. Do not guess: Load more is\n // the accessible, reliable fallback there. A content click must never grant\n // permission for a later programmatic scroll to append rows.\n if (event.pointerType !== \"mouse\" || event.button !== 0 || !event.isPrimary) return false;\n const gutterWidth = container.offsetWidth - container.clientWidth;\n if (gutterWidth <= 0 || container.scrollHeight <= container.clientHeight) return false;\n const rect = container.getBoundingClientRect();\n return event.clientX >= rect.right - gutterWidth && event.clientX <= rect.right;\n}\n\n/**\n * Gates automatic append behind a fresh, real downward user scroll. The hook\n * owns neither fetching nor row state: callers feed it the data hook receipt\n * and render its explicit request as the accessible fallback control.\n */\nexport function useScrollPagination({\n containers,\n queryKey,\n hasNextPage,\n isFetchingNextPage,\n loading,\n error,\n loadNextPage,\n mode = \"scroll\",\n thresholdPx = DEFAULT_THRESHOLD_PX,\n intentTimeoutMs = DEFAULT_INTENT_TIMEOUT_MS,\n enabled = true,\n}: UseScrollPaginationOptions): UseScrollPaginationResult {\n const [requestError, setRequestError] = useState<Error | null>(null);\n const latestRef = useRef({\n queryKey,\n hasNextPage,\n isFetchingNextPage,\n loading,\n error,\n loadNextPage,\n mode,\n thresholdPx,\n enabled,\n });\n latestRef.current = {\n queryKey,\n hasNextPage,\n isFetchingNextPage,\n loading,\n error,\n loadNextPage,\n mode,\n thresholdPx,\n enabled,\n };\n\n const intentRef = useRef<ScrollIntent | null>(null);\n const inputSequenceRef = useRef(0);\n const consumedSequenceRef = useRef(0);\n const requestGenerationRef = useRef(0);\n const inFlightGenerationRef = useRef<number | null>(null);\n const requestErrorRef = useRef<Error | null>(null);\n const mountedRef = useRef(false);\n // Listener effects reattach when consumers recreate their container arrays.\n // Keep the last real scroll position with the element, not with one effect.\n const observedTopRef = useRef<WeakMap<HTMLElement, number>>(new WeakMap());\n const effectiveError = error ?? requestError;\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const requestNextPage = async () => {\n const current = latestRef.current;\n if (\n !current.enabled ||\n (!current.hasNextPage && effectiveError === null) ||\n current.loading ||\n current.isFetchingNextPage ||\n inFlightGenerationRef.current !== null\n ) {\n return;\n }\n const generation = ++requestGenerationRef.current;\n inFlightGenerationRef.current = generation;\n requestErrorRef.current = null;\n setRequestError(null);\n try {\n await current.loadNextPage();\n } catch (raw) {\n const nextError = raw instanceof Error ? raw : new Error(String(raw));\n if (inFlightGenerationRef.current === generation && latestRef.current.queryKey === current.queryKey) {\n requestErrorRef.current = nextError;\n if (mountedRef.current) setRequestError(nextError);\n }\n } finally {\n if (inFlightGenerationRef.current === generation) {\n inFlightGenerationRef.current = null;\n intentRef.current = null;\n }\n }\n };\n\n useEffect(() => {\n intentRef.current = null;\n observedTopRef.current = new WeakMap();\n consumedSequenceRef.current = inputSequenceRef.current;\n requestErrorRef.current = null;\n setRequestError(null);\n // A query change makes every existing completion stale. Its finally block\n // cannot clear a new request because generations are monotonically unique.\n inFlightGenerationRef.current = null;\n requestGenerationRef.current += 1;\n }, [queryKey]);\n\n useEffect(() => {\n if (mode !== \"scroll\" || !enabled || typeof window === \"undefined\") return;\n const attachable = containers.map(resolveContainer).filter((container): container is HTMLElement => container !== null);\n const ownerCleanups = new Map<HTMLElement, () => void>();\n const handleScroll = (source: HTMLElement, owner: ScrollOwner) => {\n const intent = intentRef.current;\n const current = latestRef.current;\n if (!intent || intent.queryKey !== current.queryKey || intent.source !== source || intent.owner.element !== owner.element || intent.owner.document !== owner.document || Date.now() > intent.expiresAt || ownerScrollTop(owner) <= intent.startTop || intent.sequence <= consumedSequenceRef.current || !isVisibleContainer(source) || !sourceBottomIsNearOwnerViewport(source, owner, current.thresholdPx) || !current.hasNextPage || current.loading || current.isFetchingNextPage || current.error !== null || requestErrorRef.current !== null || inFlightGenerationRef.current !== null) return;\n consumedSequenceRef.current = intent.sequence;\n void requestNextPage();\n };\n const ensureOwnerListener = (owner: ScrollOwner) => {\n if (ownerCleanups.has(owner.element)) return;\n const onOwnerScroll = () => {\n const intent = intentRef.current;\n if (intent && intent.owner.element === owner.element && intent.owner.document === owner.document) handleScroll(intent.source, owner);\n observedTopRef.current.set(owner.element, ownerScrollTop(owner));\n };\n if (owner.document) window.addEventListener(\"scroll\", onOwnerScroll, { passive: true });\n else owner.element.addEventListener(\"scroll\", onOwnerScroll, { passive: true });\n ownerCleanups.set(owner.element, () => {\n if (owner.document) window.removeEventListener(\"scroll\", onOwnerScroll);\n else owner.element.removeEventListener(\"scroll\", onOwnerScroll);\n });\n };\n const setIntent = (source: HTMLElement) => {\n const current = latestRef.current;\n const owner = resolveScrollOwner(source);\n if (!isVisibleContainer(source) || current.loading || current.isFetchingNextPage || inFlightGenerationRef.current !== null) return;\n inputSequenceRef.current += 1;\n const currentOwnerTop = ownerScrollTop(owner);\n const observedOwnerTop = observedTopRef.current.get(owner.element) ?? currentOwnerTop;\n observedTopRef.current.set(owner.element, currentOwnerTop);\n intentRef.current = { queryKey: current.queryKey, source, owner, startTop: Math.min(observedOwnerTop, currentOwnerTop), sequence: inputSequenceRef.current, expiresAt: Date.now() + intentTimeoutMs };\n ensureOwnerListener(owner);\n };\n const cleanups = attachable.map((source) => {\n if (!observedTopRef.current.has(source)) observedTopRef.current.set(source, source.scrollTop);\n const onWheel = (event: WheelEvent) => { if (event.deltaY > 0 && Math.abs(event.deltaY) > Math.abs(event.deltaX)) setIntent(source); };\n const onTouchStart = (event: TouchEvent) => { const touch = event.touches.item(0); if (touch) source.dataset.matrxPaginationTouchY = String(touch.clientY); };\n const onTouchMove = (event: TouchEvent) => { const touch = event.touches.item(0); const startY = Number(source.dataset.matrxPaginationTouchY); if (touch && Number.isFinite(startY) && startY - touch.clientY > 0) setIntent(source); };\n const onTouchEnd = () => { delete source.dataset.matrxPaginationTouchY; };\n const onKeyDown = (event: KeyboardEvent) => { if (isDownwardKeyboardInput(event)) setIntent(source); };\n const onPointerDown = (event: PointerEvent) => { if (isNativeScrollbarPointer(event, source)) setIntent(source); };\n const onScroll = () => { handleScroll(source, { element: source, document: false }); observedTopRef.current.set(source, source.scrollTop); };\n source.addEventListener(\"wheel\", onWheel, { passive: true }); source.addEventListener(\"touchstart\", onTouchStart, { passive: true }); source.addEventListener(\"touchmove\", onTouchMove, { passive: true }); source.addEventListener(\"touchend\", onTouchEnd, { passive: true }); source.addEventListener(\"touchcancel\", onTouchEnd, { passive: true }); source.addEventListener(\"keydown\", onKeyDown); source.addEventListener(\"pointerdown\", onPointerDown, { passive: true }); source.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => { delete source.dataset.matrxPaginationTouchY; source.removeEventListener(\"wheel\", onWheel); source.removeEventListener(\"touchstart\", onTouchStart); source.removeEventListener(\"touchmove\", onTouchMove); source.removeEventListener(\"touchend\", onTouchEnd); source.removeEventListener(\"touchcancel\", onTouchEnd); source.removeEventListener(\"keydown\", onKeyDown); source.removeEventListener(\"pointerdown\", onPointerDown); source.removeEventListener(\"scroll\", onScroll); };\n });\n return () => { cleanups.forEach((cleanup) => cleanup()); ownerCleanups.forEach((cleanup) => cleanup()); };\n }, [containers, enabled, intentTimeoutMs, mode]);\n\n return {\n requestNextPage,\n canLoadMore: enabled && !loading && !isFetchingNextPage && (hasNextPage || effectiveError !== null),\n error: effectiveError,\n };\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useScrollPagination,\n type ScrollPaginationContainer,\n} from \"./useScrollPagination\";\n\nexport interface UseProgressiveTableRowsOptions<T> {\n /** Complete, locally-held rows after local search/filter/sort processing. */\n rows: readonly T[];\n /** The normal local page size; `0` means all rows. */\n pageSize: number;\n /** Resize the actual setting when a fixed viewport needs a larger first batch. */\n onPageSizeChange?: ((size: number) => void) | undefined;\n /** A one-based URL/local page intent; its prefix must be visible on first paint. */\n requestedPage?: number | undefined;\n /**\n * Stable identity for the complete query shape (source, search, filters,\n * sort, and any other input that changes `rows`). A changed key resets to\n * its first batch synchronously, before the reset effect runs.\n */\n queryKey: string;\n /** The table's existing physical scroll surfaces. */\n containers?: readonly ScrollPaginationContainer[] | undefined;\n /**\n * Controlled-local only: persist a progressive append as the next one-based\n * page intent. Omit for ordinary local state; never supply for a remote page.\n */\n onPageAdvance?: ((nextPage: number) => void) | undefined;\n enabled?: boolean | undefined;\n thresholdPx?: number | undefined;\n /** Diagnose a numbered page that leaves space while later pages exist. */\n numberedPageHasMore?: boolean | undefined;\n}\n\nexport interface UseProgressiveTableRowsResult<T> {\n rows: readonly T[];\n shownCount: number;\n hasMore: boolean;\n /** Accessible explicit fallback for users who do not scroll. */\n showMore: () => Promise<void>;\n}\n\ninterface ProgressionState {\n key: string;\n shownCount: number;\n requestedPage: number;\n}\n\nfunction safePageSize(pageSize: number): number {\n return Number.isFinite(pageSize) && pageSize > 0 ? Math.floor(pageSize) : 0;\n}\n\nfunction safeRequestedPage(page: number | undefined): number {\n return Number.isFinite(page) && page! > 0 ? Math.floor(page!) : 1;\n}\n\nfunction startCount(pageSize: number, requestedPage: number): number {\n return pageSize === 0 ? Number.MAX_SAFE_INTEGER : pageSize * requestedPage;\n}\n\n/**\n * Reveals a complete local result set in batches. It never owns fetching and\n * must not receive a remote controlled page: a remote page cannot prove that\n * its next rows belong to the same response identity.\n */\nexport function useProgressiveTableRows<T>({\n rows,\n pageSize: rawPageSize,\n onPageSizeChange,\n requestedPage: rawRequestedPage,\n queryKey,\n containers = [],\n onPageAdvance,\n enabled = true,\n thresholdPx,\n numberedPageHasMore = false,\n}: UseProgressiveTableRowsOptions<T>): UseProgressiveTableRowsResult<T> {\n const pageSize = safePageSize(rawPageSize);\n const hasExplicitRequestedPage = rawRequestedPage !== undefined;\n const requestedPage = safeRequestedPage(rawRequestedPage);\n // A changed query/page size starts from its first batch. A later page intent\n // for the same query is authoritative (back/forward and delayed hydration),\n // except when it acknowledges the next page we just emitted optimistically.\n const initialRequestedPageRef = useRef(requestedPage);\n const latestRequestedPageRef = useRef(requestedPage);\n const optimisticAdvancePageRef = useRef<number | null>(null);\n latestRequestedPageRef.current = requestedPage;\n const progressionKey = `${queryKey}\\u0000${pageSize}`;\n const initialShownCount = startCount(pageSize, initialRequestedPageRef.current);\n const resetShownCount = startCount(pageSize, 1);\n const queryStartShownCount = hasExplicitRequestedPage\n ? startCount(pageSize, requestedPage)\n : resetShownCount;\n const [progression, setProgression] = useState<ProgressionState>(() => ({\n key: progressionKey,\n shownCount: initialShownCount,\n requestedPage,\n }));\n const pageIntentChanged =\n progression.key === progressionKey &&\n progression.requestedPage !== requestedPage;\n const acknowledgedOptimisticAdvance =\n pageIntentChanged &&\n optimisticAdvancePageRef.current === requestedPage;\n const externallyRequestedPage =\n pageIntentChanged && !acknowledgedOptimisticAdvance;\n\n // Do not briefly render the preceding query's visible count or a stale page\n // after history navigation. An explicit incoming page is authoritative even\n // when the query key changes; query owners that omit it reset to batch one.\n const shownCount = progression.key !== progressionKey\n ? queryStartShownCount\n : externallyRequestedPage\n ? startCount(pageSize, requestedPage)\n : Math.max(progression.shownCount, resetShownCount);\n const visibleCount = Math.min(rows.length, shownCount);\n const hasMore = enabled && pageSize > 0 && visibleCount < rows.length;\n\n useEffect(() => {\n setProgression((current) => {\n if (current.key !== progressionKey) {\n optimisticAdvancePageRef.current = null;\n return {\n key: progressionKey,\n shownCount: queryStartShownCount,\n requestedPage,\n };\n }\n if (current.requestedPage === requestedPage) return current;\n const acknowledged = optimisticAdvancePageRef.current === requestedPage;\n optimisticAdvancePageRef.current = null;\n return {\n key: progressionKey,\n shownCount: acknowledged\n ? Math.max(current.shownCount, resetShownCount)\n : startCount(pageSize, requestedPage),\n requestedPage,\n };\n });\n }, [pageSize, progressionKey, queryStartShownCount, requestedPage, resetShownCount]);\n\n const appendBatch = () => {\n if (!enabled || pageSize === 0) return;\n if (onPageSizeChange) {\n onPageSizeChange(Math.min(rows.length, visibleCount + pageSize));\n return;\n }\n setProgression((current) => {\n const baseline = current.key === progressionKey\n ? Math.max(current.shownCount, resetShownCount)\n : resetShownCount;\n return {\n key: progressionKey,\n shownCount: baseline + pageSize,\n requestedPage: latestRequestedPageRef.current,\n };\n });\n const nextPage = latestRequestedPageRef.current + 1;\n if (onPageAdvance) {\n optimisticAdvancePageRef.current = nextPage;\n onPageAdvance(nextPage);\n }\n };\n\n const warnedUnderfill = useRef<string | null>(null);\n\n // Fill genuinely unused viewport space from rows already held in memory.\n // Comparing content bounds (not scrollHeight, which is at least clientHeight)\n // avoids mistaking an unconstrained, content-sized table for spare capacity.\n useEffect(() => {\n if (!hasMore && !numberedPageHasMore) return;\n const surfaces = containers.map((entry) => entry && \"current\" in entry ? entry.current : entry)\n .filter((entry): entry is HTMLElement => entry !== null);\n const fillViewport = () => {\n for (const surface of surfaces) {\n if (surface.clientHeight <= 0 || surface.getClientRects().length === 0) continue;\n const content = surface.querySelector(\"table\") ?? surface.lastElementChild;\n if (!content) continue;\n const bounds = surface.getBoundingClientRect();\n const contentBottom = content.getBoundingClientRect().bottom - bounds.top + surface.scrollTop;\n if (contentBottom <= 0 || contentBottom >= surface.clientHeight - 1) continue;\n if (warnedUnderfill.current !== progressionKey) {\n warnedUnderfill.current = progressionKey;\n if (numberedPageHasMore) {\n console.warn(\"[MatrxDataTable] Numbered pagination leaves unused table height while later pages exist. Increase the page size, use a content-sized layout, or use progressive pagination to fill available height. The explicit numbered-page setting has been preserved.\");\n } else console.warn(\"[MatrxDataTable] The initial local batch leaves unused table height while more rows are already loaded. Increasing the page-size setting to fill the viewport; this is not a network fetch.\");\n }\n if (numberedPageHasMore) break;\n // The footer, URL and saved view must share the same size setting.\n // Never reveal an extra hidden batch solely to fill the viewport.\n onPageSizeChange?.(pageSize + Math.max(1, Math.ceil(\n (surface.clientHeight - contentBottom) / (contentBottom / Math.max(visibleCount, 1)),\n )));\n break;\n }\n };\n fillViewport();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(fillViewport);\n for (const surface of surfaces) observer?.observe(surface);\n return () => observer?.disconnect();\n }, [containers, hasMore, numberedPageHasMore, onPageSizeChange, pageSize, progressionKey, rows.length, visibleCount]);\n\n const scroll = useScrollPagination({\n containers,\n queryKey: progressionKey,\n hasNextPage: hasMore,\n isFetchingNextPage: false,\n loading: false,\n error: null,\n loadNextPage: appendBatch,\n enabled: enabled && pageSize > 0,\n ...(thresholdPx === undefined ? {} : { thresholdPx }),\n });\n\n return {\n rows: useMemo(() => rows.slice(0, visibleCount), [rows, visibleCount]),\n shownCount: visibleCount,\n hasMore,\n showMore: scroll.requestNextPage,\n };\n}\n","\"use client\";\n\n/**\n * Dialog — the modal surface, carrying every ruling the host forks paid for.\n *\n * Four hosts shipped four dialogs. Three were the stock shadcn body: a\n * fixed-size centered card with `overflow: visible`. matrx-frontend's had been\n * hardened, incident by incident, and those hardenings are the reason this\n * component belongs in the package rather than being copied a fifth time:\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. The gate a\n * wrapper once carried (\"Radix ids differ between SSR and client\") was\n * false — Radix ids come from React's SSR-stable `useId` — and it deleted\n * the always-visible Trigger from SSR and the first client paint.\n *\n * 2. THE DIALOG IS CLAMPED TO THE VIEWPORT AND SCROLLS INSIDE ITSELF. Proven\n * live: an admin \"Create Category\" dialog rendered 851px tall in a 657px\n * viewport with `overflow-y: visible`, so its Create button sat below the\n * fold, unreachable. The only way out was a backdrop click — which\n * dismisses WITHOUT writing, and is indistinguishable from a silent save\n * failure. `max-h-[85dvh] overflow-y-auto` is the cap.\n *\n * 3. THE PRIMARY ACTION IS ALWAYS PRESSABLE — AND NEVER ON TOP OF THE BODY.\n * `DialogFooter` is sticky and bleeds to the card's edges using\n * `--dialog-pad`. Until 0.11.3 that bleed was a NEGATIVE BLOCK MARGIN,\n * which sticky clamps: the footer was dragged up over the row above it by\n * `--dialog-pad` minus the card gap. The card now RESERVES the footer's\n * block size instead (`.matrx-dialog-card` in `styles.css` hands its bottom\n * padding to the footer), so scrolled content never shows through beneath\n * the actions AND the footer never covers the row above it. Outside a\n * DialogContent both variables are unset, the padding falls back to `0px`,\n * and the footer is the plain row it always was.\n *\n * 4. ON MOBILE THE SAME DIALOG IS A BOTTOM SHEET — full width, bottom\n * anchored, height-capped, internally scrollable, safe-area padded. Opt out\n * with `mobileSheet={false}` only for the rare surface that must stay\n * centered (a tiny spinner). The sheet geometry is re-asserted AFTER the\n * caller's className so a desktop `max-w-2xl` cannot un-fullscreen it.\n *\n * 5. AN UNTITLED DIALOG IS STILL ACCESSIBLE. Radix warns (correctly) that\n * every dialog needs a title; rather than let hosts ship the warning, a\n * visually-hidden title is injected when the tree has none, and\n * `aria-describedby` is dropped when there is no description rather than\n * pointing at nothing.\n *\n * SEAM INVERSIONS. The host original resolved its portal target through\n * app-shaped hooks (a popped-out window-panel body). Here that is the\n * package's `PortalContainerProvider` seam, with an explicit `container` prop\n * keeping top priority. And DialogContent PROVIDES that seam to its own\n * children, so a Popover or menu opened inside a dialog portals INTO the\n * dialog — staying inside the scroll shard, where its wheel events work.\n * `useDialogContainer` exposes the same element for host code that needs it.\n */\n\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport * as VisuallyHidden from \"@radix-ui/react-visually-hidden\";\nimport { treeContainsComponent } from \"@ai-matrx/kit/react-tree\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport {\n MOTION_BOTTOM_SHEET,\n MOTION_DIALOG,\n MOTION_OVERLAY,\n} from \"./motion\";\nimport { XIcon } from \"./icons\";\nimport { usePortalContainer, PortalContainerProvider } from \"./portal-container\";\nimport {\n RadixDialogModalProvider,\n useRadixDialogModal,\n} from \"./radix-dialog-modal-context\";\nimport { useIsMobile } from \"./use-is-mobile\";\n\nconst Dialog = ({\n children,\n ...props\n}: React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>) => {\n const modal = props.modal ?? true;\n return (\n <RadixDialogModalProvider modal={modal}>\n <DialogPrimitive.Root {...props} modal={modal}>\n {children}\n </DialogPrimitive.Root>\n </RadixDialogModalProvider>\n );\n};\nDialog.displayName = \"Dialog\";\n\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogClose = DialogPrimitive.Close;\n\n/**\n * Portal-seam-aware DialogPortal. An explicit `container` always wins; with\n * none, the injected `PortalContainerProvider` value decides; with neither,\n * Radix's `document.body`.\n */\nconst DialogPortal = ({\n container,\n ...props\n}: Omit<\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Portal>,\n \"container\"\n> & {\n /** `undefined` → use the injected container; `null` → force document.body. */\n container?: HTMLElement | null | undefined;\n}) => {\n const resolved = usePortalContainer(container);\n return <DialogPrimitive.Portal container={resolved ?? null} {...props} />;\n};\nDialogPortal.displayName = \"DialogPortal\";\n\n// Shared identity across independently bundled public entrypoints/loaders.\nconst CONTEXT_SLOT = Symbol.for(\"ai-matrx.design-system.dialog-container-context\");\nconst contextRegistry = globalThis as typeof globalThis & { [CONTEXT_SLOT]?: React.Context<HTMLElement | null> };\nconst DialogContainerContext = contextRegistry[CONTEXT_SLOT] ??= React.createContext<HTMLElement | null>(null);\n\n/** The DialogContent element, for host code that portals into the dialog. */\nexport const useDialogContainer = (): HTMLElement | null =>\n React.useContext(DialogContainerContext);\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(\n // Page context behind the modal stays readable; separation comes from a\n // light token scrim, not a blur.\n \"fixed inset-0 z-[10000] bg-[var(--matrx-overlay-scrim-soft)]\",\n MOTION_OVERLAY,\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\n/**\n * Unstyled, non-portalling Content for custom dialog layouts. Preserves Radix\n * focus/background behavior and derives `aria-modal` from the Root.\n */\nconst DialogContentPrimitive = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>((props, ref) => {\n const isModal = useRadixDialogModal();\n return (\n <DialogPrimitive.Content\n {...props}\n ref={ref}\n aria-modal={isModal || undefined}\n />\n );\n});\nDialogContentPrimitive.displayName = \"DialogContentPrimitive\";\n\nconst DIALOG_DESKTOP_CLASSES =\n \"matrx-dialog-card fixed inset-0 z-[10000] m-auto grid h-fit min-w-0 w-full max-w-lg gap-4 max-h-[85dvh] overflow-y-auto overscroll-contain [--dialog-pad:1.5rem] overflow-x-clip border bg-background p-6 shadow-lg [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full sm:rounded-lg\";\n\nconst DIALOG_MOBILE_SHEET_CLASSES =\n \"matrx-mobile-sheet matrx-dialog-card fixed inset-x-0 bottom-0 left-0 right-0 top-auto z-[10000] flex min-w-0 flex-col w-full max-w-full max-h-[90dvh] gap-4 [--dialog-pad:1rem] overflow-x-clip border-t bg-background p-4 pb-safe shadow-lg [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full rounded-t-2xl rounded-b-none overflow-y-auto overscroll-contain\";\n\n// Re-asserted LAST so sheet geometry always wins over a caller className.\nconst DIALOG_MOBILE_SHEET_OVERRIDE =\n \"inset-x-0 bottom-0 left-0 right-0 top-auto translate-none w-full max-w-full max-h-[90dvh] rounded-b-none rounded-t-2xl overflow-y-auto\";\n\nexport interface DialogContentProps\n extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n /** Render as a bottom sheet below the mobile breakpoint. Default `true`. */\n mobileSheet?: boolean;\n /** Render the built-in close control. Default `true`. */\n showCloseButton?: boolean;\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly. It is NOT the reduced-motion switch;\n * `styles.css` already honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(\n (\n {\n className,\n children,\n mobileSheet = true,\n animated = true,\n showCloseButton = true,\n container,\n ...props\n },\n ref,\n ) => {\n const isMobile = useIsMobile();\n const isModal = useRadixDialogModal();\n // Falls through to the injected container while `containerEl` is unset\n // (pre-mount) — the original's dialog > popout > body priority.\n const injectedContainer = usePortalContainer(container);\n const asSheet = mobileSheet && isMobile;\n const [containerEl, setContainerEl] = React.useState<HTMLElement | null>(\n null,\n );\n\n const mergedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setContainerEl(node);\n if (typeof ref === \"function\") ref(node);\n else if (ref)\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n\n const hasTitle =\n treeContainsComponent(children, DialogTitle) ||\n treeContainsComponent(children, DialogPrimitive.Title);\n const hasDescription =\n treeContainsComponent(children, DialogDescription) ||\n treeContainsComponent(children, DialogPrimitive.Description);\n\n return (\n <DialogPortal container={container}>\n {isModal ? <DialogOverlay /> : null}\n <DialogContentPrimitive\n ref={mergedRef}\n data-slot=\"dialog-content\"\n className={cn(\n asSheet ? DIALOG_MOBILE_SHEET_CLASSES : DIALOG_DESKTOP_CLASSES,\n animated && (asSheet ? MOTION_BOTTOM_SHEET : MOTION_DIALOG),\n className,\n asSheet && DIALOG_MOBILE_SHEET_OVERRIDE,\n // A non-modal dialog is the coexistence contract for content that\n // can sit beside a host's floating window manager (which starts at\n // z=1000); staying below that boundary makes a newly focused window\n // usable without coupling the two systems.\n !isModal && \"z-[900]\",\n )}\n {...(hasDescription ? {} : { \"aria-describedby\": undefined })}\n {...props}\n >\n {hasTitle ? null : (\n <VisuallyHidden.Root>\n <DialogPrimitive.Title>Dialog</DialogPrimitive.Title>\n </VisuallyHidden.Root>\n )}\n <DialogContainerContext.Provider value={containerEl}>\n <PortalContainerProvider\n container={containerEl ?? injectedContainer ?? null}\n >\n {children}\n </PortalContainerProvider>\n </DialogContainerContext.Provider>\n {showCloseButton ? (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n aria-label=\"Close\"\n className=\"absolute right-2 top-4 flex h-11 w-11 items-center justify-center rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground sm:right-4 lg:h-10 lg:w-10\"\n >\n <XIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n ) : null}\n </DialogContentPrimitive>\n </DialogPortal>\n );\n },\n);\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"dialog-header\"\n className={cn(\n // DialogContent owns an absolute close control. Reserve its hit area in\n // every header so trailing actions never render underneath it.\n \"flex flex-col space-y-1.5 pr-12 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n // Ruling 3/4 — sticky to the card edges so a scrolled body never shows\n // through under the actions, and safe-area padded on a phone.\n //\n // 🚨 THERE IS NO `mb-[…]` HERE, AND THERE MUST NEVER BE ONE AGAIN\n // (0.11.3, feedback bf8fb00b). The bleed over the card's bottom padding\n // used to be a NEGATIVE BLOCK MARGIN, which makes this box taller than\n // the grid area the card allocates it — and `position: sticky` CLAMPS a\n // box to its containing block, so the browser yanked the footer UP by\n // `--dialog-pad` against the card's `gap-4` and painted 8px of opaque\n // footer over the last line of the consequence, at every length. The\n // card now RESERVES this footer's block size instead (`matrx-dialog-card`\n // in styles.css hands over its `padding-bottom`), so the bleed costs no\n // margin at all. Guard: `sticky-footer-geometry.test.tsx`.\n //\n // These stay UTILITIES rather than a shipped rule so a caller's\n // `className` still wins through tailwind-merge — a shipped rule would\n // have to be unlayered to survive Tailwind preflight (§ THE PREFLIGHT\n // RULE in styles.css) and would then override every caller's padding.\n \"sticky bottom-0 z-10 bg-background pt-3\",\n \"mx-[calc(var(--dialog-pad,0px)*-1)] px-[var(--dialog-pad,0px)] pb-[var(--dialog-pad,0px)]\",\n className,\n )}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n data-slot=\"dialog-title\"\n className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n data-slot=\"dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogContentPrimitive,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","\"use client\";\n\n/**\n * Ported verbatim from matrx-frontend `components/ui/radix-dialog-modal-context.tsx`.\n * Shared by the Sheet and BottomSheet families (and available to hosts that\n * compose their own Radix Dialog-derived wrappers around these primitives).\n */\n\nimport * as React from \"react\";\n\n// Shared identity across independently bundled public entrypoints/loaders.\nconst CONTEXT_SLOT = Symbol.for(\"ai-matrx.design-system.dialog-modal-context\");\nconst contextRegistry = globalThis as typeof globalThis & { [CONTEXT_SLOT]?: React.Context<boolean> };\nconst RadixDialogModalContext = contextRegistry[CONTEXT_SLOT] ??= React.createContext<boolean>(true);\n\nexport interface RadixDialogModalProviderProps {\n children: React.ReactNode;\n modal: boolean;\n}\n\n/**\n * Keeps our Radix-based content wrappers aligned with the owning Root's\n * modality so ARIA semantics cannot drift from focus/pointer behavior.\n */\nexport function RadixDialogModalProvider({\n children,\n modal,\n}: RadixDialogModalProviderProps) {\n return (\n <RadixDialogModalContext.Provider value={modal}>\n {children}\n </RadixDialogModalContext.Provider>\n );\n}\n\n/** Returns whether the nearest Radix Dialog-derived root is modal. */\nexport function useRadixDialogModal(): boolean {\n return React.useContext(RadixDialogModalContext);\n}\n","\"use client\";\n\n/**\n * useIsMobile — the ONE breakpoint hook the package's responsive primitives\n * read (CommandDialog and Dialog both auto-render as a bottom sheet below it).\n *\n * Lifted out of `command.tsx`, where it lived privately, when Dialog arrived\n * and needed the SAME answer: two copies of a breakpoint hook is exactly the\n * duplication this package exists to end, and a Dialog that disagreed with a\n * CommandDialog about what \"mobile\" means would render two different sheet\n * geometries on one screen.\n *\n * SSR-safe by construction: `false` until mounted, so the server and the first\n * client paint agree and the desktop geometry is what hydrates. The mobile\n * geometry swaps in on the effect pass.\n *\n * The breakpoint is the host-original 768px (Tailwind `md`). It is exported so\n * a host can branch on the same number instead of inventing a second one.\n */\n\nimport * as React from \"react\";\n\n/** Viewport width (px) below which the package treats a surface as mobile. */\nexport const MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile(): boolean {\n const [isMobile, setIsMobile] = React.useState(false);\n const [hasMounted, setHasMounted] = React.useState(false);\n\n React.useEffect(() => {\n setHasMounted(true);\n\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n onChange();\n\n // NO ENVIRONMENT MAY CRASH ON THIS HOOK. `matchMedia` is absent in older\n // jsdom setups and in some embedded webviews, and a primitive that throws\n // there takes the whole host's test suite (or screen) down over a\n // breakpoint — a cost wildly out of proportion to the answer. Without it\n // the width read above still gives a correct first answer; only live\n // resize tracking is lost, which is exactly what is unavailable.\n if (typeof window.matchMedia !== \"function\") {\n return undefined;\n }\n\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n\n if (!hasMounted) {\n return false;\n }\n return isMobile;\n}\n","\"use client\";\n\n/**\n * Sheet — ported verbatim from matrx-frontend `components/ui/sheet.tsx`.\n *\n * Seam inversions:\n * - The host's `DialogContentPrimitive` (from its dialog module) is inlined\n * here as a private wrapper with identical behavior: unstyled non-portalling\n * Radix Content that derives `aria-modal` from the owning Root's modality.\n * - `Cross2Icon` comes from the package's inlined SVGs (C19), not\n * @radix-ui/react-icons.\n * - `treeContainsComponent` stays the ONE kit implementation\n * (@ai-matrx/kit/react-tree) — never a vendored twin.\n *\n * THE ROOT RENDERS UNCONDITIONALLY — no mount gate. This wrapper used to defer\n * rendering until after hydration (\"Radix generates dynamic aria-controls ids\n * that differ between SSR and client\"), and that justification was false:\n * Radix ids come from React's SSR-stable `useId` (verified against\n * @radix-ui/react-dialog 1.1.17 / react-id 1.1.2). The gate was actively\n * harmful — the Trigger wraps ALWAYS-VISIBLE content, so `return null`\n * deleted it from SSR and the first client paint.\n * The RadixDialogModalProvider wrapper stays — it is unrelated to hydration.\n */\n\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\";\nimport { treeContainsComponent } from \"@ai-matrx/kit/react-tree\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_OVERLAY, MOTION_SHEET } from \"./motion\";\nimport { Cross2Icon } from \"./icons\";\nimport {\n RadixDialogModalProvider,\n useRadixDialogModal,\n} from \"./radix-dialog-modal-context\";\n\n/**\n * Unstyled, non-portalling Content for Sheet layouts. It preserves Radix\n * focus/background behavior and derives `aria-modal` from the owning Root\n * (identical to the host dialog module's DialogContentPrimitive).\n */\nconst SheetContentBase = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>\n>(({ ...props }, ref) => {\n const isModal = useRadixDialogModal();\n return (\n <SheetPrimitive.Content\n {...props}\n ref={ref}\n aria-modal={isModal || undefined}\n />\n );\n});\nSheetContentBase.displayName = \"SheetContentBase\";\n\nexport const Sheet = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Root>\n>(({ children, ...props }, _ref) => {\n const modal = props.modal ?? true;\n\n return (\n <RadixDialogModalProvider modal={modal}>\n <SheetPrimitive.Root {...props} modal={modal}>\n {children}\n </SheetPrimitive.Root>\n </RadixDialogModalProvider>\n );\n});\nSheet.displayName = \"Sheet\";\n\nexport const SheetTrigger = SheetPrimitive.Trigger;\n\nexport const SheetClose = SheetPrimitive.Close;\n\nexport const SheetPortal = SheetPrimitive.Portal;\n\nexport const SheetOverlay = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-[var(--matrx-overlay-scrim)]\",\n MOTION_OVERLAY,\n className,\n )}\n {...props}\n ref={ref}\n />\n));\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName;\n\nexport const sheetVariants = cva(\n // Motion is NOT stated here (0.10.0). The `data-[state=*]:animate-in/out`\n // + `slide-in-from-*` pairs this base and its side variants used to carry\n // came from the `tailwindcss-animate` HOST plugin, which three of four\n // consumers never loaded — every sheet in them slammed open with no\n // animation and no error. `SheetContent` now applies the package-owned\n // `MOTION_SHEET[side]` class alongside these variants; the keyframes,\n // durations and reduced-motion handling all live in `styles.css`.\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b\",\n bottom: \"inset-x-0 bottom-0 border-t\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n right: \"inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n center: \"inset-0 m-auto max-h-full max-w-full border rounded-lg\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n },\n);\n\nexport interface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> {\n hideCloseButton?: boolean;\n /** Skip the dimming overlay — for non-modal side panels (e.g. chat canvas). */\n hideOverlay?: boolean;\n /** Optional className for the overlay when shown. */\n overlayClassName?: string;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a panel\n * that must appear instantly — a persistent side rail toggled by a keyboard\n * shortcut, say. It is NOT the reduced-motion switch; `styles.css` already\n * honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nexport const SheetDescription = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nSheetDescription.displayName = SheetPrimitive.Description.displayName;\n\nexport const SheetContent = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(\n (\n {\n side = \"right\",\n className,\n children,\n hideCloseButton = false,\n hideOverlay = false,\n overlayClassName,\n animated = true,\n ...props\n },\n ref,\n ) => {\n const hasDescription =\n treeContainsComponent(children, SheetDescription) ||\n treeContainsComponent(children, SheetPrimitive.Description);\n return (\n <SheetPortal>\n {!hideOverlay && <SheetOverlay className={overlayClassName} />}\n <SheetContentBase\n ref={ref}\n className={cn(\n sheetVariants({ side }),\n animated && MOTION_SHEET[side ?? \"right\"],\n className,\n )}\n {...(hasDescription ? {} : { \"aria-describedby\": undefined })}\n {...props}\n >\n {!hideCloseButton && (\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <Cross2Icon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n {children}\n </SheetContentBase>\n </SheetPortal>\n );\n },\n);\nSheetContent.displayName = SheetPrimitive.Content.displayName;\n\nexport const SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n);\nSheetHeader.displayName = \"SheetHeader\";\n\nexport const SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className,\n )}\n {...props}\n />\n);\nSheetFooter.displayName = \"SheetFooter\";\n\nexport const SheetTitle = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...props}\n />\n));\nSheetTitle.displayName = SheetPrimitive.Title.displayName;\n","\"use client\";\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from \"../dialog\";\nimport { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from \"../sheet\";\nimport type { TableLinkProps, TableSidePanelProps, TableWindowPanelProps } from \"./host\";\n\nexport function DefaultTableLink(props: TableLinkProps) { return <a {...props} />; }\nexport function DefaultTableSidePanel({ title, titleNode, description, defaultWidth = 480, onClose, headerActions, children }: TableSidePanelProps) {\n return <Sheet open onOpenChange={(open) => { if (!open) onClose(); }}><SheetContent side=\"right\" className=\"flex h-full flex-col\" style={{ width: `min(${defaultWidth}px, 100vw)` }}><SheetHeader><SheetTitle>{titleNode ?? title}</SheetTitle>{description ? <SheetDescription>{description}</SheetDescription> : null}{headerActions}</SheetHeader><div className=\"min-h-0 flex-1 overflow-auto\">{children}</div></SheetContent></Sheet>;\n}\nexport function DefaultTableWindow({ title, onClose, width = 720, height = 560, actionsRight, sidebar, children }: TableWindowPanelProps) {\n return <Dialog open onOpenChange={(open) => { if (!open) onClose(); }}><DialogContent className=\"flex flex-col overflow-hidden\" style={{ width: `min(${width}px, calc(100vw - 2rem))`, height: `min(${height}px, 85dvh)` }}><DialogHeader><DialogTitle>{title}</DialogTitle>{actionsRight}</DialogHeader><div className=\"flex min-h-0 flex-1\">{sidebar ? <aside className=\"shrink-0 border-r pr-2\">{sidebar}</aside> : null}<div className=\"min-h-0 min-w-0 flex-1 overflow-auto\">{children}</div></div></DialogContent></Dialog>;\n}\n","\"use client\";\nimport { useState } from \"react\";\nimport { useMatrxDataTableHost } from \"./host\";\n\n/** Every portable async action has visible feedback even without a host toast system. */\nexport function useTableNotice() {\n const host = useMatrxDataTableHost();\n const [message, setMessage] = useState<{ text: string; error: boolean } | null>(null);\n const notify = {\n success(text: string) { if (host.notify) host.notify.success(text); else setMessage({ text, error: false }); },\n error(text: string) { if (host.notify) host.notify.error(text); else setMessage({ text, error: true }); },\n };\n const notice = message ? <span role={message.error ? \"alert\" : \"status\"} className={message.error ? \"text-xs text-destructive\" : \"text-xs text-muted-foreground\"}>{message.text}<button type=\"button\" aria-label=\"Dismiss notification\" className=\"ml-2 underline\" onClick={() => setMessage(null)}>Dismiss</button></span> : null;\n return { notify, notice };\n}\n","\"use client\";\nimport { createContext, useContext, type Context, type ComponentType, type ReactNode, type MouseEventHandler } from \"react\";\nimport type { CopyControlProps } from \"./copy-types\";\nimport type { MatrxDataTableDensity, TableSavedViewsProps } from \"./types\";\n\nexport type {\n AgentPayloadInput,\n AiCustomSource,\n AiVariant,\n CopyControlProps,\n CopyExportConfig,\n} from \"./copy-types\";\n\nexport interface TableLinkProps { href: string; children: ReactNode; className?: string; onClick?: MouseEventHandler<HTMLAnchorElement>; }\n/**\n * Host-owned toolbar affordance. The table package keeps operation state and\n * labels; an application can supply its canonical icon-button primitive\n * without making the shared package depend on an application UI package.\n */\nexport interface TableToolbarActionProps { ariaLabel: string; tooltip?: string | undefined; disabled?: boolean | undefined; busy?: boolean | undefined; /** Indicates a selected mutually-exclusive action such as the current page. */ active?: boolean | undefined; onClick: () => void; children: ReactNode; }\nexport interface TableSidePanelProps { title: string; titleNode?: ReactNode; description?: ReactNode; onClose: () => void; defaultWidth?: number; headerActions?: ReactNode; children: ReactNode; }\nexport interface TableWindowPanelProps { id: string; title: string; onClose: () => void; width?: number; height?: number; minWidth?: number; minHeight?: number; actionsRight?: ReactNode; bodyClassName?: string; sidebarDefaultSize?: number; sidebarMinSize?: number; sidebar?: ReactNode; children: ReactNode; }\nexport interface TableEntityRefProps { token: string; id: string; href?: string; children: ReactNode; className?: string; }\nexport interface TablePeekProps { kind: string; id: string; href?: string; onClose: () => void; }\nexport interface TableDoors { href?: string; peekKind?: string; canPeek?: boolean; }\nexport interface MatrxDataTableHost { JsonViewer?: ComponentType<{ data: object | string }>; Link?: ComponentType<TableLinkProps>; CopyControls?: ComponentType<CopyControlProps>; ToolbarAction?: ComponentType<TableToolbarActionProps>; SidePanelSurface?: ComponentType<TableSidePanelProps>; WindowPanel?: ComponentType<TableWindowPanelProps>; EntityRef?: ComponentType<TableEntityRefProps>; resolveEntityDoors?: (token: string, id: string, href?: string | null) => TableDoors | null; ResourcePeek?: ComponentType<TablePeekProps>; SavedViews?: ComponentType<TableSavedViewsProps>; /** Host default; a table's explicit density takes precedence. */ defaultDensity?: MatrxDataTableDensity; notify?: { success(message: string): void; error(message: string): void }; }\n// Public entrypoints are independently bundled in ESM and CJS. The context\n// identity must survive those bundle boundaries; values stay provider-scoped.\nconst HOST_SLOT = Symbol.for(\"ai-matrx.design-system.table-host-context\");\nconst hostRegistry = globalThis as typeof globalThis & { [HOST_SLOT]?: Context<MatrxDataTableHost> };\nconst HostContext = hostRegistry[HOST_SLOT] ??= createContext<MatrxDataTableHost>({});\nexport function MatrxDataTableProvider({ value, children }: { value: MatrxDataTableHost; children: ReactNode }) { return <HostContext.Provider value={value}>{children}</HostContext.Provider>; }\nexport function useMatrxDataTableHost(): MatrxDataTableHost { return useContext(HostContext); }\n","\"use client\";\nimport { Button, type ButtonProps } from \"../button\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../tooltip\";\nimport {\n ChevronsLeft,\n ChevronLeft,\n ChevronsRight,\n ChevronRight,\n} from \"./icons\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../select\";\nimport { cn } from \"../cn\";\nimport { useMatrxDataTableHost, type TableToolbarActionProps } from \"./host\";\nimport type { ComponentType } from \"react\";\n\nexport interface GenericTablePaginationProps {\n totalItems: number;\n itemsPerPage: number;\n currentPage: number;\n onPageChange: (page: number) => void;\n onItemsPerPageChange: (items: number) => void;\n pageSizeOptions?: number[];\n className?: string;\n showItemsPerPageSelect?: boolean;\n showPageInfo?: boolean;\n showPageControls?: boolean;\n maxPagesToShow?: number;\n containerClassName?: string;\n selectContainerClassName?: string;\n infoContainerClassName?: string;\n controlsContainerClassName?: string;\n pageButtonClassName?: string;\n pageActiveButtonClassName?: string;\n navButtonClassName?: string;\n /** Value emitted for the optional All choice. Defaults to the current total. */\n allValue?: number;\n /** Honest label for the optional all-rows choice. */\n allOptionLabel?: string;\n showAllOption?: boolean;\n layoutType?: \"grid\" | \"flex\";\n labelFormat?: (start: number, end: number, total: number) => string;\n compact?: boolean;\n hideEntriesInfo?: boolean;\n /** Keeps progressive local pagination in one stable footer, including at\n * exhaustion. Counts describe rendered rows, not a numbered page. */\n progressive?: { loadedCount?: number; shownCount: number; hasMore: boolean; onShowMore: () => void };\n}\n\nfunction PageNavigationControl({\n label,\n disabledHint,\n visibilityClassName = \"inline-flex\",\n disabled,\n className,\n ...props\n}: ButtonProps & {\n label: string;\n disabledHint: string;\n visibilityClassName?: string;\n}) {\n const button = (\n <Button\n {...props}\n disabled={disabled}\n aria-label={label}\n className={cn(visibilityClassName, className, \"[&_svg]:size-5\")}\n />\n );\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n {disabled ? (\n <span\n className={cn(visibilityClassName, \"rounded-md outline-none focus-visible:ring-2 focus-visible:ring-ring\")}\n tabIndex={0}\n aria-label={`${label} — ${disabledHint.toLowerCase()}`}\n >\n {button}\n </span>\n ) : button}\n </TooltipTrigger>\n <TooltipContent>{disabled ? disabledHint : label}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction PaginationAction({\n HostAction,\n active = false,\n disabledHint,\n visibilityClassName = \"inline-flex\",\n fallbackClassName,\n ...props\n}: TableToolbarActionProps & {\n HostAction: ComponentType<TableToolbarActionProps> | undefined;\n active?: boolean;\n disabledHint: string;\n visibilityClassName?: string;\n fallbackClassName?: string;\n}) {\n if (HostAction) {\n return (\n <span data-matrx-table-icon-action className={visibilityClassName}>\n <HostAction\n {...props}\n active={active}\n tooltip={props.disabled ? disabledHint : (props.tooltip ?? props.ariaLabel)}\n />\n </span>\n );\n }\n return (\n <PageNavigationControl\n variant=\"outline\"\n size=\"icon\"\n visibilityClassName={visibilityClassName}\n label={props.ariaLabel}\n disabledHint={disabledHint}\n disabled={props.disabled}\n onClick={props.onClick}\n className={cn(\n PAGINATION_ACTION_CLASS,\n active && PAGINATION_ACTIVE_CLASS,\n fallbackClassName,\n )}\n aria-current={active ? \"page\" : undefined}\n data-matrx-table-icon-action\n >\n {props.children}\n </PageNavigationControl>\n );\n}\n\n// Table footers use an actual 44px control shape. A pseudo-element inset into a\n// smaller visual box let the select text and chevron escape its border.\nconst PAGINATION_ACTION_CLASS = \"h-11 w-11 min-h-11 min-w-11 rounded-md border border-border bg-card p-0 text-sm shadow-none hover:bg-accent disabled:opacity-40 [&_svg]:size-5\";\nconst PAGINATION_ACTIVE_CLASS = \"border-primary bg-primary text-primary-foreground hover:bg-primary/90\";\n\nexport default function GenericTablePagination({\n totalItems,\n itemsPerPage,\n currentPage,\n onPageChange,\n onItemsPerPageChange,\n pageSizeOptions = [5, 10, 25, 50, 100],\n className = \"\",\n showItemsPerPageSelect = true,\n showPageInfo = true,\n showPageControls = true,\n maxPagesToShow = 5,\n containerClassName = \"\",\n selectContainerClassName = \"\",\n infoContainerClassName = \"\",\n controlsContainerClassName = \"\",\n pageButtonClassName = \"\",\n pageActiveButtonClassName = \"\",\n navButtonClassName = \"\",\n allValue = totalItems,\n allOptionLabel = \"All\",\n showAllOption = true,\n layoutType = \"grid\",\n labelFormat,\n compact = false,\n hideEntriesInfo = false,\n progressive,\n}: GenericTablePaginationProps) {\n const host = useMatrxDataTableHost();\n const positivePageSizes = pageSizeOptions.filter((size) => size > 0);\n const availablePageSizes =\n itemsPerPage > 0 && !positivePageSizes.includes(itemsPerPage)\n ? [...positivePageSizes, itemsPerPage].sort((a, b) => a - b)\n : positivePageSizes;\n const effectiveItemsPerPage =\n itemsPerPage === 0 ? Math.max(totalItems, 1) : Math.max(itemsPerPage, 1);\n\n const totalPages = Math.max(1, Math.ceil(totalItems / effectiveItemsPerPage));\n\n const getPageNumbers = (limit = maxPagesToShow) => {\n let startPage = Math.max(1, currentPage - Math.floor(limit / 2));\n const endPage = Math.min(totalPages, startPage + limit - 1);\n startPage = Math.max(1, endPage - limit + 1);\n return Array.from(\n { length: endPage - startPage + 1 },\n (_, i) => startPage + i,\n );\n };\n\n const isFirstPageDisabled = currentPage <= 1;\n const isLastPageDisabled = currentPage >= totalPages;\n const startItem = totalItems === 0 ? 0 : progressive ? 1 : (currentPage - 1) * effectiveItemsPerPage + 1;\n const endItem = Math.min(progressive?.shownCount ?? currentPage * effectiveItemsPerPage, totalItems);\n\n const defaultLabelFormat = (start: number, end: number, total: number) => {\n if (progressive) return progressive.loadedCount !== undefined && progressive.loadedCount !== total\n ? `${end} shown / ${total} matching · ${progressive.loadedCount} loaded`\n : `${end} shown / ${total} loaded`;\n return compact\n ? `${start}-${end} of ${total}`\n : `Showing ${start} to ${end} of ${total} entries`;\n };\n\n const formatLabel = labelFormat || defaultLabelFormat;\n\n const containerClass = cn(\n \"w-full items-center\",\n !compact && \"border-t border-border\",\n layoutType === \"grid\"\n ? progressive\n ? \"grid grid-cols-[auto_minmax(0,1fr)_auto]\"\n : \"grid grid-cols-[auto_minmax(0,1fr)] sm:grid-cols-[auto_minmax(0,1fr)_auto]\"\n : \"flex flex-nowrap justify-between\",\n compact\n ? \"box-border min-h-8 gap-0 px-0 py-0\"\n : \"gap-1 px-2 py-1 sm:gap-4 sm:px-3\",\n className,\n containerClassName,\n );\n\n return (\n <TooltipProvider>\n <div data-matrx-table-footer className={containerClass}>\n {/* Items Per Page Select */}\n {showItemsPerPageSelect && (\n <div\n className={cn(\n \"flex min-w-0 justify-start\",\n !compact && \"sm:p-1\",\n selectContainerClassName,\n )}\n >\n <Select\n value={itemsPerPage.toString()}\n onValueChange={(value) => onItemsPerPageChange(parseInt(value))}\n >\n <SelectTrigger\n aria-label={progressive ? \"Visible row limit\" : \"Rows per page\"}\n className={cn(\n \"focus:ring-0\",\n compact\n ? \"h-8 min-h-8 min-w-20 rounded-md border border-border bg-card px-2 text-sm hover:bg-accent [&_svg]:size-4\"\n : \"h-8 w-[3.75rem] text-xs sm:w-36 sm:text-sm\",\n )}\n >\n <SelectValue placeholder={itemsPerPage.toString()} />\n </SelectTrigger>\n <SelectContent>\n {availablePageSizes.map((size) => (\n <SelectItem key={size} value={size.toString()}>\n {size}\n </SelectItem>\n ))}\n {showAllOption ? (\n <SelectItem value={allValue.toString()}>{allOptionLabel}</SelectItem>\n ) : null}\n </SelectContent>\n </Select>\n </div>\n )}\n\n <div\n className={cn(\"flex min-w-0 justify-center\", infoContainerClassName)}\n >\n {/* Page Info - only show if not hidden But always show the div. */}\n {showPageInfo && !hideEntriesInfo && (\n <>\n <span className=\"truncate text-xs tabular-nums text-muted-foreground sm:hidden\">\n {progressive ? `${endItem}/${totalItems} ${progressive.loadedCount !== undefined && progressive.loadedCount !== totalItems ? \"matching\" : \"loaded\"}` : `${startItem}-${endItem} / ${totalItems}`}\n </span>\n <span\n className={`hidden whitespace-nowrap ${\n compact ? \"text-sm\" : \"text-sm\"\n } min-w-0 truncate text-muted-foreground sm:inline`}\n >\n {formatLabel(startItem, endItem, totalItems)}\n </span>\n </>\n )}\n </div>\n\n {/* Page Controls */}\n {progressive ? (progressive.hasMore ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" aria-label=\"Show more rows\"\n className=\"h-8 min-h-8 shrink-0 justify-self-end px-2 text-xs\"\n onClick={progressive.onShowMore}>Show more</Button>\n </TooltipTrigger>\n <TooltipContent>Show more already-loaded rows</TooltipContent>\n </Tooltip>\n ) : null) : showPageControls && (\n <div\n className={cn(\n \"col-span-2 flex min-w-0 items-center justify-end sm:col-span-1\",\n compact ? \"gap-0\" : \"gap-0.5 sm:gap-1\",\n controlsContainerClassName,\n )}\n >\n <PaginationAction\n HostAction={host.ToolbarAction}\n ariaLabel=\"First page\"\n disabledHint=\"Already on the first page\"\n visibilityClassName=\"hidden sm:inline-flex\"\n fallbackClassName={navButtonClassName}\n onClick={() => onPageChange(1)}\n disabled={isFirstPageDisabled}\n >\n <ChevronsLeft className=\"h-5 w-5\" />\n </PaginationAction>\n\n <PaginationAction\n HostAction={host.ToolbarAction}\n ariaLabel=\"Previous page\"\n disabledHint=\"Already on the first page\"\n fallbackClassName={navButtonClassName}\n onClick={() => onPageChange(currentPage - 1)}\n disabled={isFirstPageDisabled}\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </PaginationAction>\n\n {getPageNumbers(3).map((page) => (\n <PaginationAction\n key={`mobile-${page}`}\n HostAction={host.ToolbarAction}\n ariaLabel={`Page ${page}`}\n active={currentPage === page}\n disabledHint={`Already on page ${page}`}\n visibilityClassName={cn(\n \"sm:hidden\",\n page === currentPage ? \"inline-flex\" : \"hidden min-[360px]:inline-flex\",\n )}\n fallbackClassName={page === currentPage ? pageActiveButtonClassName : pageButtonClassName}\n onClick={() => onPageChange(page)}\n >\n <span>{page}</span>\n </PaginationAction>\n ))}\n\n {getPageNumbers().map((page) => (\n <PaginationAction\n key={`desktop-${page}`}\n HostAction={host.ToolbarAction}\n ariaLabel={`Page ${page}`}\n active={currentPage === page}\n disabledHint={`Already on page ${page}`}\n visibilityClassName=\"hidden sm:inline-flex\"\n fallbackClassName={currentPage === page ? pageActiveButtonClassName : pageButtonClassName}\n onClick={() => onPageChange(page)}\n >\n <span>{page}</span>\n </PaginationAction>\n ))}\n\n <PaginationAction\n HostAction={host.ToolbarAction}\n ariaLabel=\"Next page\"\n disabledHint=\"Already on the last page\"\n fallbackClassName={navButtonClassName}\n onClick={() => onPageChange(currentPage + 1)}\n disabled={isLastPageDisabled}\n >\n <ChevronRight className=\"h-5 w-5\" />\n </PaginationAction>\n\n <PaginationAction\n HostAction={host.ToolbarAction}\n ariaLabel=\"Last page\"\n disabledHint=\"Already on the last page\"\n visibilityClassName=\"hidden sm:inline-flex\"\n fallbackClassName={navButtonClassName}\n onClick={() => onPageChange(totalPages)}\n disabled={isLastPageDisabled}\n >\n <ChevronsRight className=\"h-5 w-5\" />\n </PaginationAction>\n </div>\n )}\n </div>\n </TooltipProvider>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { Plus, X } from \"./icons\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport type { TableViewSnapshot } from \"./types\";\n\nexport interface TableViewTab { id: string; label: string; count?: number; }\nexport interface TableViewTabsProps {\n tabs: readonly TableViewTab[];\n activeId: string;\n onSelect: (id: string) => void;\n onAdd: () => void;\n onClose: (id: string) => void;\n onRename: (id: string, label: string) => void;\n /** Related-data doors use the same row, without creating another table. */\n related?: ReactNode;\n}\n\n/** One shared tab strip; hosts may own URL state without copying its UI. */\nexport function TableViewTabs({ tabs, activeId, onSelect, onAdd, onClose, onRename, related }: TableViewTabsProps) {\n const [renaming, setRenaming] = useState<string | null>(null);\n const [draft, setDraft] = useState(\"\");\n const commit = () => { if (renaming && draft.trim()) onRename(renaming, draft.trim()); setRenaming(null); };\n return <div className=\"flex min-w-0 shrink-0 items-center border-b\" data-matrx-table-tabs>\n <div role=\"tablist\" aria-label=\"Table views\" className=\"flex min-w-0 flex-1 items-center overflow-x-auto\">\n {tabs.map((tab, index) => <div key={tab.id} className=\"group flex shrink-0 items-center border-r\">\n {renaming === tab.id ? <input aria-label=\"Tab name\" autoFocus value={draft} onChange={e => setDraft(e.target.value)} onBlur={commit}\n onKeyDown={e => { if (e.key === \"Enter\") commit(); if (e.key === \"Escape\") setRenaming(null); }}\n className=\"h-8 w-32 bg-transparent px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\" /> :\n <button type=\"button\" role=\"tab\" aria-selected={tab.id === activeId} tabIndex={tab.id === activeId ? 0 : -1}\n onClick={() => onSelect(tab.id)} onDoubleClick={() => { setDraft(tab.label); setRenaming(tab.id); }}\n onKeyDown={e => { const next = e.key === \"ArrowRight\" ? (index + 1) % tabs.length : e.key === \"ArrowLeft\" ? (index + tabs.length - 1) % tabs.length : e.key === \"Home\" ? 0 : e.key === \"End\" ? tabs.length - 1 : -1; if (next >= 0) { e.preventDefault(); onSelect(tabs[next]!.id); const buttons = e.currentTarget.closest('[role=\"tablist\"]')?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]'); buttons?.[next]?.focus(); } }}\n className={`flex h-8 max-w-48 items-center gap-1.5 border-b-2 px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring ${tab.id === activeId ? \"border-primary text-foreground\" : \"border-transparent text-muted-foreground hover:bg-muted\"}`}>\n <span className=\"truncate\">{tab.label}</span>{tab.count !== undefined && <span className=\"text-muted-foreground tabular-nums\">{tab.count}</span>}\n </button>}\n {tabs.length > 1 && <Tooltip><TooltipTrigger asChild><button type=\"button\" aria-label={`Close ${tab.label}`} onClick={() => onClose(tab.id)} className=\"flex size-7 items-center justify-center rounded hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"><X className=\"size-4\" /></button></TooltipTrigger><TooltipContent>Close {tab.label}</TooltipContent></Tooltip>}\n </div>)}\n <Tooltip><TooltipTrigger asChild><button type=\"button\" aria-label=\"New table tab\" onClick={onAdd} className=\"flex size-8 shrink-0 items-center justify-center rounded hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"><Plus className=\"size-4\" /></button></TooltipTrigger><TooltipContent>New tab from current view · double-click a tab to rename</TooltipContent></Tooltip>\n </div>\n {related && <div className=\"flex shrink-0 items-center gap-1 border-l px-2\">{related}</div>}\n </div>;\n}\n\n/** Working tabs and saved views share the exact same snapshot/apply contract.\n * Only the active table is rendered; creating a tab never requests data. */\nexport function TableViewWorkspace({ snapshot, onApply, related }: { snapshot: TableViewSnapshot; onApply: (snapshot: TableViewSnapshot) => void; related?: ReactNode }) {\n const [tabs, setTabs] = useState<Array<TableViewTab & { snapshot: TableViewSnapshot }>>([{ id: \"default\", label: \"Default view\", snapshot }]);\n const [activeId, setActiveId] = useState(\"default\");\n const select = (id: string) => {\n if (id === activeId) return;\n const target = tabs.find(tab => tab.id === id);\n if (!target) return;\n // Identical views share the current source response, including page state.\n if (JSON.stringify(target.snapshot) !== JSON.stringify(snapshot)) onApply(target.snapshot);\n setTabs(current => current.map(tab => tab.id === activeId ? { ...tab, snapshot } : tab));\n setActiveId(id);\n };\n return <TableViewTabs tabs={tabs} activeId={activeId} onSelect={select} related={related}\n onAdd={() => { const id = crypto.randomUUID(); setTabs(current => [...current.map(tab => tab.id === activeId ? { ...tab, snapshot } : tab), { id, label: `View ${current.length + 1}`, snapshot }]); setActiveId(id); }}\n onClose={id => { if (tabs.length < 2) return; if (id === activeId) select(tabs.find(tab => tab.id !== id)!.id); setTabs(current => current.filter(tab => tab.id !== id)); }}\n onRename={(id, label) => setTabs(current => current.map(tab => tab.id === id ? { ...tab, label } : tab))} />;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n buildAgentPayload,\n createBrowserTransport,\n directSource,\n normalizeTransferJson,\n sealTransferArtifact,\n type AgentPayloadInput,\n type PageAction,\n type Payload,\n type Source,\n type TransferOutcome,\n} from \"@ai-matrx/kit/content-transfer\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\nimport {\n ContentTransferMenu,\n useContentTransferCapabilities,\n type ContentTransferController,\n type ContentTransferReference,\n type ContentTransferReferenceAction,\n type TransferMenuPresentation,\n} from \"./index\";\nimport type { AlchemyIcon } from \"./icon\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../dialog\";\nimport { Button } from \"../button\";\nimport { cn } from \"../cn\";\n\nexport type AlchemyOptionValues = Record<string, boolean | number>;\nexport type AlchemySourceOption =\n | {\n kind: \"toggle\";\n key: string;\n label: string;\n hint?: string;\n default: boolean;\n }\n | {\n kind: \"preset\";\n key: string;\n label: string;\n options: { label: string; value: number }[];\n default: number;\n }\n | {\n kind: \"slider\";\n key: string;\n label: string;\n hint?: string;\n stops: number[];\n default: number;\n formatValue: (value: number) => string;\n }\n | {\n kind: \"number\";\n key: string;\n label: string;\n hint?: string;\n min?: number;\n step?: number;\n presets?: { label: string; value: number }[];\n default: number;\n };\nexport interface AlchemyCustomSource {\n label?: string;\n hint?: string;\n options: AlchemySourceOption[];\n build(values: AlchemyOptionValues): {\n text: string;\n meta?: Record<string, string | number | boolean | undefined>;\n };\n wrap(\n text: string,\n values: AlchemyOptionValues,\n meta?: Record<string, string | number | boolean | undefined>,\n ): AgentPayloadInput;\n dialogTitle?: string;\n dialogDescription?: string;\n}\nexport type AlchemyDetail = \"full\" | \"compact\" | \"brief\";\nexport interface AlchemyGroomerSection {\n id: string;\n title: string;\n description?: string;\n cuttable?: boolean;\n levelLabels?: Partial<Record<AlchemyDetail, string>>;\n build(level: AlchemyDetail): unknown;\n defaultSelection?: AlchemyDetail | \"off\";\n}\nexport interface AlchemyGroomerConfig {\n label: string;\n kind: string;\n location: string;\n description: string;\n attributes?: AgentPayloadInput[\"attributes\"];\n context?: AgentPayloadInput[\"context\"];\n summary?: string;\n sections: AlchemyGroomerSection[];\n}\nexport interface AlchemyCopyVariant {\n id: string;\n label: string;\n hint?: string;\n icon?: React.ComponentType<{ className?: string }>;\n section?: \"copy\" | \"ai\";\n ariaLabel?: string;\n successMessage?: string;\n build?: () =>\n AgentPayloadInput | string | Promise<AgentPayloadInput | string>;\n onSelect?: () => void | Promise<void>;\n modal?: (props: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n }) => React.ReactNode;\n}\nexport interface AlchemyExportItem {\n id: string;\n label: string;\n build?: () => {\n content: BlobPart;\n extension: string;\n mime: string;\n /** Optional exact safe basename captured with bytes; omission derives a default, invalid values error. */\n filename?: string;\n };\n onSelect?: () => void | Promise<void>;\n}\ntype Resolvable<T> = T | (() => T);\nexport interface MatrxCopyMenuProps {\n label: string;\n /** Stable record identity when this mounted control can switch between records. */\n sourceId?: string;\n references?: readonly ContentTransferReference[];\n referenceActions?: readonly ContentTransferReferenceAction[];\n /** Prepare the tabular view while keeping raw JSON and human copy formats. */\n primarySource?: \"table\";\n human?: Resolvable<string>;\n json?: Resolvable<unknown>;\n agent?: Resolvable<AgentPayloadInput | string>;\n aiVariants?: AlchemyCopyVariant[];\n aiCustom?: AlchemyCustomSource;\n groomer?: () => AlchemyGroomerConfig;\n agentVariant?: {\n id?: string;\n label?: string;\n hint?: string;\n position?: \"first\" | \"last\";\n };\n export?: {\n items: AlchemyExportItem[];\n sheetRows?: () => Array<Record<string, unknown>>;\n sheetColumns?: () => Array<{ id: string; label: string }>;\n };\n /** Host-owned authenticated destination, not a second export serializer. */\n sendToSheet?: (\n rows: Array<Record<string, unknown>>,\n label: string,\n ) => Promise<TransferOutcome>;\n hide?: Array<\"copy\" | \"ai\" | \"export\">;\n disabled?: boolean;\n className?: string;\n stopPropagation?: boolean;\n size?: \"xs\" | \"icon\" | \"sm\" | \"toolbar\";\n appearance?: \"bare\" | \"segmented\";\n unified?: boolean;\n grouped?: boolean;\n icon?: AlchemyIcon;\n triggerVariant?: \"transparent\" | \"glass\" | \"outline\";\n}\nconst resolve = <T,>(value: Resolvable<T>): T =>\n typeof value === \"function\" ? (value as () => T)() : value;\nconst asPayload = (value: AgentPayloadInput | string): Payload => ({\n kind: \"markdown\",\n text: typeof value === \"string\" ? value : buildAgentPayload(value),\n});\nconst structuredPayload = (value: AgentPayloadInput | string): Payload => {\n if (typeof value === \"string\") return { kind: \"markdown\", text: value };\n const clean = (record?: AgentPayloadInput[\"context\"]) =>\n Object.fromEntries(\n Object.entries(record ?? {}).filter(([, entry]) => entry !== undefined),\n );\n return {\n kind: \"json\",\n value: normalizeTransferJson(\n {\n kind: value.kind,\n location: value.location,\n description: value.description,\n data: value.data,\n ...(value.summary !== undefined ? { summary: value.summary } : {}),\n attributes: clean(value.attributes),\n context: clean(value.context),\n },\n { omitUndefinedObjectProperties: true },\n ),\n };\n};\nconst actionDone = (message: string): TransferOutcome => ({\n status: \"success\",\n delivered: \"action\",\n mimeTypes: [],\n message,\n});\nconst isSafeFilename = (filename: string) =>\n filename === filename.trim() &&\n filename.length > 0 &&\n !/^\\.+$/.test(filename) &&\n !/[\\\\/\\x00-\\x1F\\x7F]/.test(filename);\nconst sourceFor = (\n id: string,\n label: string,\n build: () => Payload | Promise<Payload>,\n): Source => ({\n id,\n label,\n capture: async ({ signal }) => {\n signal.throwIfAborted();\n const payload = await build();\n signal.throwIfAborted();\n return directSource(payload, { sourceId: id, label });\n },\n});\n\n/** Opinionated bridge for Matrx's existing content builders, with one transfer UI. */\nexport function MatrxCopyMenu(props: MatrxCopyMenuProps) {\n const inherited = useContentTransferCapabilities();\n return (\n <MatrxCopyMenuSession\n key={JSON.stringify([\n inherited.identityKey ?? null,\n props.sourceId ?? props.label,\n ])}\n {...props}\n />\n );\n}\n\nfunction MatrxCopyMenuSession(props: MatrxCopyMenuProps) {\n const instance = React.useId();\n const controller = React.useRef<ContentTransferController>(null);\n const capabilities = useContentTransferCapabilities();\n const transport = capabilities.transport ?? createBrowserTransport();\n const [modal, setModal] = React.useState<AlchemyCopyVariant | null>(null);\n const [configuration, setConfiguration] = React.useState<{\n custom?: AlchemyCustomSource;\n groomer?: AlchemyGroomerConfig;\n } | null>(null);\n const copyVisible = !props.hide?.includes(\"copy\");\n const aiVisible = !props.hide?.includes(\"ai\");\n const exportVisible = !props.hide?.includes(\"export\");\n const make = (\n suffix: string,\n build: () => Payload | Promise<Payload>,\n label = props.label,\n ) =>\n sourceFor(\n `${props.sourceId ?? `${instance}:${props.label}`}:${suffix}`,\n label,\n build,\n );\n const human =\n copyVisible && props.human !== undefined\n ? make(\"human\", () => ({ kind: \"text\", text: resolve(props.human!) }))\n : undefined;\n const humanMarkdown =\n copyVisible && props.human !== undefined\n ? make(\"human-markdown\", () => ({\n kind: \"markdown\",\n text: resolve(props.human!),\n }))\n : undefined;\n const json =\n aiVisible && props.json !== undefined\n ? make(\"json\", () => ({\n kind: \"json\",\n value: normalizeTransferJson(resolve(props.json!), {\n omitUndefinedObjectProperties: true,\n }),\n }))\n : undefined;\n const agent =\n aiVisible && props.agent !== undefined\n ? make(\"agent\", () => asPayload(resolve(props.agent!)))\n : undefined;\n const structuredAgent =\n aiVisible && props.agent !== undefined\n ? make(\"structured-agent\", () => structuredPayload(resolve(props.agent!)))\n : undefined;\n const table =\n (exportVisible || props.primarySource === \"table\") &&\n props.export?.sheetRows\n ? make(\"rows\", () => {\n const value = normalizeTransferJson(props.export!.sheetRows!(), {\n omitUndefinedObjectProperties: true,\n });\n if (\n !Array.isArray(value) ||\n value.some(\n (row) =>\n row === null || typeof row !== \"object\" || Array.isArray(row),\n )\n )\n throw new Error(\"Sheet rows must be JSON objects.\");\n const rows = value as Array<\n Record<string, import(\"@ai-matrx/kit/content-transfer\").Json>\n >;\n const suppliedColumns = props.export!.sheetColumns?.();\n const columns = suppliedColumns ?? [...new Set(rows.flatMap((row) => Object.keys(row)))].map((id) => ({ id, label: id }));\n const ids = new Set<string>();\n for (const column of columns) {\n if (!column.id || !column.label || ids.has(column.id)) throw new Error(\"Sheet columns require unique nonempty ids and labels.\");\n ids.add(column.id);\n }\n for (const row of rows) for (const key of Object.keys(row)) if (!ids.has(key)) throw new Error(\"Table data contains a field outside its declared columns.\");\n return {\n kind: \"rows\",\n rows,\n columns: columns.map((column) => ({\n id: column.id,\n label: column.label,\n path: `/${column.id.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")}`,\n visible: true,\n })),\n };\n })\n : undefined;\n const builderVariants = aiVisible\n ? (props.aiVariants ?? [])\n .filter(\n (variant) => variant.build && !variant.onSelect && !variant.modal,\n )\n .map((variant) => ({\n ...variant,\n copyLabel: variant.label,\n source: make(\n `variant:${variant.id}`,\n async () => asPayload(await variant.build!()),\n variant.label,\n ),\n }))\n : [];\n const faithful = agent\n ? [\n {\n id: props.agentVariant?.id ?? \"faithful\",\n label: props.agentVariant?.label ?? \"Full AI context\",\n source: agent,\n copyLabel: props.agentVariant?.label ?? \"Copy for AI\",\n ...(props.agentVariant?.hint\n ? { hint: props.agentVariant.hint }\n : {}),\n },\n ]\n : [];\n const variants =\n props.agentVariant?.position === \"last\"\n ? [...builderVariants, ...faithful]\n : [...faithful, ...builderVariants];\n const actions: (PageAction & TransferMenuPresentation)[] = [];\n if (aiVisible)\n for (const variant of props.aiVariants ?? []) {\n if (!variant.onSelect && !variant.modal) continue;\n actions.push({\n ...variant,\n id: `variant-action:${variant.id}`,\n label: variant.label,\n supports: () => true,\n run: async () => {\n if (variant.onSelect) await variant.onSelect();\n else setModal(variant);\n return actionDone(`Opened ${variant.label}`);\n },\n });\n }\n if (aiVisible && props.aiCustom)\n actions.push({\n id: \"configure-source\",\n label: props.aiCustom.label ?? \"Customize source\",\n ...(props.aiCustom.hint ? { hint: props.aiCustom.hint } : {}),\n supports: () => true,\n run: async () => {\n setConfiguration({ custom: props.aiCustom! });\n return actionDone(\"Source options opened\");\n },\n });\n if (aiVisible && props.groomer)\n actions.push({\n id: \"groom-source\",\n label: \"Customize sections\",\n supports: () => true,\n run: async () => {\n setConfiguration({ groomer: props.groomer!() });\n return actionDone(\"Section options opened\");\n },\n });\n if (exportVisible)\n for (const item of props.export?.items ?? [])\n actions.push({\n id: `export:${item.id}`,\n label: item.label,\n supports: () => true,\n ...(item.build && !item.onSelect\n ? {\n placement: \"download\" as const,\n source: make(\n `export:${item.id}`,\n async () => {\n const file = item.build!();\n const bytes = new Uint8Array(\n await new Blob([file.content], {\n type: file.mime,\n }).arrayBuffer(),\n );\n return {\n kind: \"registered\",\n format: \"matrx-file\",\n value: {\n bytes: Array.from(bytes),\n mime: file.mime,\n extension: file.extension,\n ...(file.filename !== undefined\n ? { filename: file.filename }\n : {}),\n },\n };\n },\n item.label,\n ),\n }\n : {}),\n run: async ({ snapshot, draft, signal }) => {\n if (item.onSelect) {\n await item.onSelect();\n return actionDone(`Opened ${item.label}`);\n }\n const value =\n draft.payload.kind === \"registered\" ? draft.payload.value : null;\n if (\n !value ||\n Array.isArray(value) ||\n typeof value !== \"object\" ||\n !Array.isArray(value.bytes) ||\n typeof value.mime !== \"string\" ||\n typeof value.extension !== \"string\" ||\n value.bytes.some(\n (byte) =>\n typeof byte !== \"number\" ||\n !Number.isInteger(byte) ||\n byte < 0 ||\n byte > 255,\n )\n )\n throw new Error(`${item.label} did not capture a valid file.`);\n if (\n value.filename !== undefined &&\n (typeof value.filename !== \"string\" ||\n !isSafeFilename(value.filename))\n )\n throw new Error(\n `${item.label} has an unsafe filename. Use a nonempty basename without leading or trailing whitespace, dots only, path separators, or control characters.`,\n );\n if (\n draft.omissions.some((omission) => omission.reason !== \"duplicate\")\n )\n throw new Error(\n \"This custom file exceeds the configured export limits or contains excluded content. Use a standard format or revise the source options.\",\n );\n const bytes = new Uint8Array(value.bytes as number[]);\n const filename =\n typeof value.filename === \"string\"\n ? value.filename\n : `${\n props.label\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"export\"\n }.${value.extension.replace(/[^a-zA-Z0-9.-]/g, \"\") || \"bin\"}`;\n return transport.download(\n sealTransferArtifact({\n snapshotId: snapshot.id,\n draftRevision: draft.revision,\n format: `export:${item.id}`,\n plainText: \"\",\n file: { filename, mime: value.mime, bytes },\n omissions: [...draft.omissions],\n }),\n signal,\n );\n },\n });\n if (exportVisible && table && props.sendToSheet)\n actions.push({\n id: \"send-google-sheet\",\n label: \"Send to Google Sheet\",\n source: table,\n supports: () => true,\n run: async ({ draft }) => {\n if (draft.payload.kind !== \"rows\")\n throw new Error(\"Google Sheets requires captured rows.\");\n return props.sendToSheet!(draft.payload.rows, props.label);\n },\n });\n const source =\n (props.primarySource === \"table\" ? table : undefined) ??\n json ??\n table ??\n structuredAgent ??\n human ??\n builderVariants[0]?.source;\n if (!source && !actions.length) return null;\n // Action-only targets carry an explicit description, never invented record data.\n const target =\n source ?? make(\"actions\", () => ({ kind: \"text\", text: props.label }));\n return (\n <>\n <ContentTransferMenu\n triggerSize={props.size === \"xs\" || props.size === \"toolbar\" ? \"compact\" : \"default\"}\n source={target}\n {...(props.references ? { references: props.references } : {})}\n {...(props.referenceActions ? { referenceActions: props.referenceActions } : {})}\n {...(props.icon !== undefined ? { icon: props.icon } : {})}\n {...(props.triggerVariant !== undefined\n ? { triggerVariant: props.triggerVariant }\n : {})}\n controllerRef={controller}\n label={props.label}\n variants={variants}\n actions={actions}\n sourceFormats={Boolean(source)}\n hide={[\n ...(!copyVisible || !source ? [\"copy\" as const] : []),\n ...(!aiVisible || !source ? [\"prepare\" as const] : []),\n ...(!exportVisible ? [\"download\" as const] : []),\n ]}\n formatSources={{\n ...(human\n ? { plain: human, markdown: humanMarkdown!, html: humanMarkdown! }\n : {}),\n ...(json ? { json, \"compact-json\": json } : {}),\n ...(table && exportVisible ? { csv: table, tsv: table } : {}),\n }}\n {...(props.disabled !== undefined ? { disabled: props.disabled } : {})}\n className={cn(\n props.className,\n props.size === \"xs\" && \"matrx-alchemy-xs\",\n props.size === \"sm\" && \"matrx-alchemy-sm\",\n props.size === \"toolbar\" && \"matrx-alchemy-toolbar-target\",\n )}\n {...(props.stopPropagation !== undefined\n ? { stopPropagation: props.stopPropagation }\n : {})}\n />\n {modal?.modal?.({\n open: true,\n onOpenChange: (open) => {\n if (!open) setModal(null);\n },\n })}\n {configuration ? (\n <SourceConfiguration\n restoreFocus={() => controller.current?.focusTrigger()}\n key={`${instance}:configuration`}\n configuration={configuration}\n onClose={() => setConfiguration(null)}\n onPrepare={async (payload, label) => {\n if (!controller.current)\n throw new Error(\"Alchemy is no longer mounted.\");\n await controller.current.prepare(payload, {\n label,\n id: `${instance}:configured:${crypto.randomUUID()}`,\n });\n setConfiguration(null);\n }}\n />\n ) : null}\n </>\n );\n}\n\nfunction SourceConfiguration({\n restoreFocus,\n configuration,\n onClose,\n onPrepare,\n}: {\n configuration: {\n custom?: AlchemyCustomSource;\n groomer?: AlchemyGroomerConfig;\n };\n restoreFocus(): void;\n onClose(): void;\n onPrepare(payload: Payload, label: string): Promise<void>;\n}) {\n const custom = configuration.custom;\n const handingOff = React.useRef(false);\n const groomer = configuration.groomer;\n const [values, setValues] = React.useState<AlchemyOptionValues>(() =>\n Object.fromEntries(\n custom?.options.map((option) => [option.key, option.default]) ?? [],\n ),\n );\n const [sections, setSections] = React.useState<\n Record<string, AlchemyDetail | \"off\">\n >(() =>\n Object.fromEntries(\n groomer?.sections.map((section) => [\n section.id,\n section.defaultSelection ?? \"full\",\n ]) ?? [],\n ),\n );\n const [error, setError] = React.useState<string | null>(null);\n const [busy, setBusy] = React.useState(false);\n const title = custom?.dialogTitle ?? groomer?.label ?? \"Customize source\";\n let prepared: AgentPayloadInput | null = null;\n let buildError: string | null = null;\n let text = \"\";\n try {\n if (custom) {\n const result = custom.build(values);\n prepared = custom.wrap(result.text, values, result.meta);\n } else if (groomer) {\n const data: Record<string, unknown> = {};\n const omitted: string[] = [];\n for (const section of groomer.sections) {\n const level = sections[section.id] ?? \"full\";\n if (level === \"off\") omitted.push(section.id);\n else {\n const value = section.build(level);\n if (value !== undefined && value !== null) data[section.id] = value;\n }\n }\n prepared = {\n kind: groomer.kind,\n location: groomer.location,\n description: groomer.description,\n data,\n ...(groomer.summary ? { summary: groomer.summary } : {}),\n attributes: {\n ...groomer.attributes,\n dropped_sections: omitted.join(\",\"),\n },\n ...(groomer.context ? { context: groomer.context } : {}),\n };\n }\n text = prepared ? buildAgentPayload(prepared) : \"\";\n } catch (cause) {\n buildError =\n cause instanceof Error ? cause.message : \"Could not prepare this source.\";\n }\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !busy) onClose();\n }}\n >\n <DialogContent\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n if (!handingOff.current) restoreFocus();\n }}\n className=\"matrx-alchemy-workspace matrx-alchemy-configuration\"\n >\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>\n {custom?.dialogDescription ??\n \"Choose the source detail, then prepare, edit, summarize, copy or export it in Alchemy.\"}\n </DialogDescription>\n </DialogHeader>\n <div className=\"matrx-alchemy-workspace-body\">\n <div className=\"matrx-alchemy-main matrx-alchemy-toolbar\">\n {custom?.options.map((option) => (\n <label key={option.key}>\n {option.label}\n {\"hint\" in option && option.hint ? (\n <small>{option.hint}</small>\n ) : null}\n {option.kind === \"toggle\" ? (\n <input\n type=\"checkbox\"\n checked={Boolean(values[option.key])}\n onChange={(event) =>\n setValues({ ...values, [option.key]: event.target.checked })\n }\n />\n ) : option.kind === \"preset\" ? (\n <select\n value={Number(values[option.key])}\n onChange={(event) =>\n setValues({\n ...values,\n [option.key]: Number(event.target.value),\n })\n }\n >\n {option.options.map((choice) => (\n <option key={choice.value} value={choice.value}>\n {choice.label}\n </option>\n ))}\n </select>\n ) : option.kind === \"slider\" ? (\n <>\n <input\n type=\"range\"\n min={0}\n max={Math.max(0, option.stops.length - 1)}\n step={1}\n value={option.stops.indexOf(Number(values[option.key]))}\n onChange={(event) =>\n setValues({\n ...values,\n [option.key]: option.stops[Number(event.target.value)]!,\n })\n }\n />\n <span>{option.formatValue(Number(values[option.key]))}</span>\n </>\n ) : (\n <>\n <input\n type=\"number\"\n min={option.min}\n step={option.step}\n value={Number(values[option.key])}\n onChange={(event) =>\n setValues({\n ...values,\n [option.key]: Number(event.target.value),\n })\n }\n />\n {option.presets?.map((preset) => (\n <Button\n key={preset.value}\n type=\"button\"\n variant=\"ghost\"\n className=\"matrx-alchemy-workspace-secondary\"\n onClick={() =>\n setValues({ ...values, [option.key]: preset.value })\n }\n >\n {preset.label}\n </Button>\n ))}\n </>\n )}\n </label>\n ))}\n {groomer ? (\n <>\n <div>\n {([\"full\", \"compact\", \"brief\"] as const).map((level) => (\n <Button\n key={level}\n type=\"button\"\n variant=\"ghost\"\n className=\"matrx-alchemy-workspace-secondary\"\n onClick={() =>\n setSections(\n Object.fromEntries(\n groomer.sections.map((section) => [\n section.id,\n level === \"brief\" && section.cuttable\n ? \"off\"\n : level,\n ]),\n ),\n )\n }\n >\n {level}\n </Button>\n ))}\n </div>\n {groomer.sections.map((section) => (\n <label key={section.id}>\n {section.title}\n <select\n value={sections[section.id]}\n onChange={(event) =>\n setSections({\n ...sections,\n [section.id]: event.target.value as\n AlchemyDetail | \"off\",\n })\n }\n >\n {([\"full\", \"compact\", \"brief\"] as const).map((level) => (\n <option key={level} value={level}>\n {section.levelLabels?.[level] ?? level}\n </option>\n ))}\n {section.cuttable ? (\n <option value=\"off\">Exclude</option>\n ) : null}\n </select>\n {section.description ? (\n <span>{section.description}</span>\n ) : null}\n </label>\n ))}\n </>\n ) : null}\n </div>\n <p>\n {formatCount(text.length)} characters · approximately{\" \"}\n {formatCount(Math.ceil(text.length / 4))} tokens\n </p>\n {error || buildError ? <p role=\"alert\">{error ?? buildError}</p> : null}\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"matrx-alchemy-workspace-secondary\"\n disabled={busy}\n onClick={onClose}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n className=\"matrx-alchemy-workspace-primary\"\n disabled={busy || !prepared || Boolean(buildError)}\n onClick={async () => {\n if (!prepared) return;\n setBusy(true);\n setError(null);\n try {\n handingOff.current = true;\n await onPrepare(structuredPayload(prepared), title);\n } catch (cause) {\n handingOff.current = false;\n setError(\n cause instanceof Error\n ? cause.message\n : \"Could not open Alchemy.\",\n );\n } finally {\n setBusy(false);\n }\n }}\n >\n {busy ? \"Preparing…\" : \"Prepare in Alchemy\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport type AlchemyGroomerPreset = \"everything\" | \"balanced\" | \"minimal\";\nexport const GROOMER_LEVELS: AlchemyDetail[] = [\"full\", \"compact\", \"brief\"];\nexport function applyGroomerPreset(\n preset: AlchemyGroomerPreset,\n sections: AlchemyGroomerSection[],\n): Record<string, AlchemyDetail | \"off\"> {\n return Object.fromEntries(\n sections.map((section) => [\n section.id,\n preset === \"everything\"\n ? \"full\"\n : preset === \"balanced\"\n ? \"compact\"\n : section.cuttable\n ? \"off\"\n : \"brief\",\n ]),\n );\n}\nexport function defaultGroomerSelections(\n sections: AlchemyGroomerSection[],\n): Record<string, AlchemyDetail | \"off\"> {\n return Object.fromEntries(\n sections.map((section) => [section.id, section.defaultSelection ?? \"full\"]),\n );\n}\nexport function buildGroomerPresetPayload(\n config: AlchemyGroomerConfig,\n preset: AlchemyGroomerPreset,\n): AgentPayloadInput {\n const selections = applyGroomerPreset(preset, config.sections);\n const data: Record<string, unknown> = {};\n const dropped: string[] = [];\n for (const section of config.sections) {\n const selection = selections[section.id] ?? \"full\";\n if (selection === \"off\") {\n dropped.push(section.id);\n continue;\n }\n const value = section.build(selection);\n if (value !== undefined && value !== null) data[section.id] = value;\n }\n return {\n kind: config.kind,\n location: config.location,\n description:\n preset === \"everything\"\n ? config.description\n : `${config.description} (${preset} detail)`,\n data,\n ...(config.summary !== undefined ? { summary: config.summary } : {}),\n attributes: {\n ...config.attributes,\n detail: preset,\n ...(dropped.length ? { dropped_sections: dropped.join(\",\") } : {}),\n },\n ...(config.context ? { context: config.context } : {}),\n };\n}\nexport function groomerPresetVariants(\n getConfig: () => AlchemyGroomerConfig,\n): AlchemyCopyVariant[] {\n return [\n {\n id: \"balanced\",\n label: \"Balanced\",\n hint: \"Compact sections\",\n build: () => buildGroomerPresetPayload(getConfig(), \"balanced\"),\n },\n {\n id: \"minimal\",\n label: \"Minimal\",\n hint: \"Brief sections with optional detail excluded\",\n build: () => buildGroomerPresetPayload(getConfig(), \"minimal\"),\n },\n ];\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { Artifact, TransferOutcome } from \"@ai-matrx/kit/content-transfer\";\nimport { Button } from \"../button\";\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from \"../dialog\";\nimport type { ContentTransferEmailPort } from \"./extensions\";\n\ntype PendingEmail = {\n artifact: Artifact;\n context: { label: string; signal: AbortSignal };\n resolve(outcome: TransferOutcome): void;\n onAbort(): void;\n};\n\nconst cancelled = (): TransferOutcome => ({ status: \"cancelled\" });\nconst failed = (error: unknown): TransferOutcome => ({\n status: \"error\",\n code: \"email-failed\",\n message: error instanceof Error ? error.message : \"Could not send email.\",\n retryable: true,\n});\n\n/** Adds one explicit review step without changing the sealed artifact handed to the host. */\nexport function useReviewedTransferEmail(email?: ContentTransferEmailPort): {\n email: ContentTransferEmailPort | undefined;\n review: React.ReactNode;\n} {\n const [pending, setPending] = React.useState<PendingEmail | null>(null);\n const [sending, setSending] = React.useState(false);\n const pendingRef = React.useRef<PendingEmail | null>(null);\n const sendingRef = React.useRef(false);\n\n const settle = React.useCallback((request: PendingEmail, outcome: TransferOutcome, render = true) => {\n if (pendingRef.current !== request) return;\n pendingRef.current = null;\n request.context.signal.removeEventListener(\"abort\", request.onAbort);\n request.resolve(outcome);\n sendingRef.current = false;\n if (render) {\n setSending(false);\n setPending(null);\n }\n }, []);\n\n React.useEffect(\n () => () => {\n const request = pendingRef.current;\n if (!request) return;\n pendingRef.current = null;\n request.context.signal.removeEventListener(\"abort\", request.onAbort);\n request.resolve(cancelled());\n sendingRef.current = false;\n },\n [],\n );\n\n const reviewed = React.useMemo<ContentTransferEmailPort | undefined>(() => {\n if (!email) return undefined;\n return {\n send: (artifact, context) => {\n if (context.signal.aborted) return Promise.resolve(cancelled());\n if (pendingRef.current)\n return Promise.resolve({\n status: \"error\",\n code: \"email-review-active\",\n message: \"Finish reviewing the current email before starting another.\",\n retryable: true,\n });\n return new Promise<TransferOutcome>((resolve) => {\n const request: PendingEmail = {\n artifact,\n context,\n resolve,\n onAbort: () => settle(request, cancelled()),\n };\n pendingRef.current = request;\n context.signal.addEventListener(\"abort\", request.onAbort, { once: true });\n setSending(false);\n setPending(request);\n });\n },\n };\n }, [email, settle]);\n\n const cancel = React.useCallback(() => {\n const request = pendingRef.current;\n if (request && !sendingRef.current) settle(request, cancelled());\n }, [settle]);\n const confirm = React.useCallback(() => {\n const request = pendingRef.current;\n if (!request || sendingRef.current || request.context.signal.aborted) return;\n sendingRef.current = true;\n setSending(true);\n void email?.send(request.artifact, request.context).then(\n (outcome) => settle(request, outcome),\n (error) => settle(request, failed(error)),\n );\n }, [email, settle]);\n\n const review = pending ? <Dialog open onOpenChange={(open) => { if (!open) cancel(); }}>\n <DialogContent className=\"matrx-alchemy-workspace matrx-alchemy-email-review\" aria-busy={sending}>\n <DialogHeader>\n <DialogTitle>Review email attachment</DialogTitle>\n <DialogDescription>Email {pending.artifact.file?.filename ?? `${pending.artifact.format} output`} from {pending.context.label}. Review this exact attachment before sending.</DialogDescription>\n </DialogHeader>\n <textarea aria-label=\"Email attachment preview\" readOnly value={pending.artifact.plainText} className=\"matrx-alchemy-preview\" />\n {pending.artifact.omissions.length ? <details className=\"matrx-alchemy-email-adjustments\" open><summary>{pending.artifact.omissions.length} omission{pending.artifact.omissions.length === 1 ? \"\" : \"s\"} or adjustment{pending.artifact.omissions.length === 1 ? \"\" : \"s\"}</summary><ul >{pending.artifact.omissions.map((omission, index) => <li key={`${omission.path}-${omission.reason}-${index}`}>{omission.path || \"/\"}: {omission.reason}{omission.count == null ? \"\" : ` (${omission.count})`}</li>)}</ul></details> : <p className=\"matrx-alchemy-meta\">No omissions or adjustments.</p>}\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={sending} onClick={cancel}>Cancel</Button>\n <Button type=\"button\" className=\"matrx-alchemy-workspace-primary\" disabled={sending} onClick={confirm}>{sending ? \"Sending email…\" : \"Send email\"}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog> : null;\n\n return { email: reviewed, review };\n}\n","\"use client\";\n\nimport { useReviewedTransferEmail } from \"./email-review\";\n\nimport * as React from \"react\";\nimport { createPortal, flushSync } from \"react-dom\";\nimport {\n applySectionSelection,\n applyTransferLimits,\n capture,\n buildAgentPayload,\n collectAllMatching,\n createBrowserTransport,\n createDraft,\n directSource,\n editDraft,\n projectSnapshot,\n readTransferCell,\n reduceJson,\n resetDraft,\n resolveTransferPreferences,\n resolveTransferRegistry,\n sealTransferArtifact,\n serialize,\n serializeMarkdownRich,\n transformRows,\n undoDraft,\n type AiPreparation,\n type Artifact,\n type BoundAllMatching,\n type Draft,\n type ExportProjection,\n type FormatAdapter,\n type Json,\n type PageAction,\n type Payload,\n type Section,\n type Snapshot,\n type Source,\n type SurfaceHandle,\n type TransferCapabilities,\n type TransferOutcome,\n type TransferTarget,\n type TransferPreferenceOverrides,\n type TransferPreferences,\n type TransferScope,\n type Transport,\n} from \"@ai-matrx/kit/content-transfer\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\nimport { Button } from \"../button\";\nimport { cn } from \"../cn\";\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from \"../dialog\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { TapTargetButton, TapTargetButtonTransparent } from \"../tap-target/index\";\nimport { ALCHEMY_GLYPH_VIEWBOX, ALCHEMY_GLYPH_PATHS, type AlchemyIcon } from \"./icon\";\nexport { ALCHEMY_GLYPH_SVG, ALCHEMY_COPY_TRANSFORM_SVG, type AlchemyIcon } from \"./icon\";\n\nimport { createTransferEmailActions, type ContentTransferReference, type ContentTransferReferencePort, type ContentTransferEmailPort } from \"./extensions\";\nexport { tableSchemaFormat, tableDataFormat, createTransferEmailActions, type ContentTransferReference, type ContentTransferReferencePort, type ContentTransferEmailPort } from \"./extensions\";\nexport type ContentTransferReferenceAction = { id: string; label: string; run(): void | Promise<void> };\n\nexport function AlchemyGlyph({ icon = \"portal\", ...props }: React.SVGAttributes<SVGSVGElement> & { icon?: AlchemyIcon }) {\n return <svg width=\"18\" height=\"18\" viewBox={ALCHEMY_GLYPH_VIEWBOX[icon]} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" {...props}>{ALCHEMY_GLYPH_PATHS[icon].map((d) => <path key={d} d={d}/>)}</svg>;\n}\n\nexport type ContentTransferCapabilities = TransferCapabilities & {\n /** Opaque host session boundary. It is used only to reset local menu state. */\n identityKey?: string;\n transport?: Transport;\n reference?: ContentTransferReferencePort;\n email?: ContentTransferEmailPort;\n actions?: PageAction[];\n preferences?: TransferPreferenceOverrides;\n onOutcome?: (outcome: TransferOutcome) => void;\n};\nconst CapabilityContext = React.createContext<ContentTransferCapabilities>({});\nexport function ContentTransferCapabilitiesProvider({ value, children }: { value: ContentTransferCapabilities; children: React.ReactNode }) {\n return <CapabilityContext.Provider value={value}>{children}</CapabilityContext.Provider>;\n}\nexport const useContentTransferCapabilities = () => React.useContext(CapabilityContext);\nconst SurfaceContext = React.createContext<SurfaceHandle | null>(null);\nexport function ContentTransferSurfaceProvider({ handle, children }: { handle: SurfaceHandle; children: React.ReactNode }) {\n return <SurfaceContext.Provider value={handle}>{children}</SurfaceContext.Provider>;\n}\nexport const useContentTransferSurface = () => React.useContext(SurfaceContext);\n\nexport type SerializableFormat = \"plain\" | \"markdown\" | \"html\" | \"json\" | \"compact-json\" | \"csv\" | \"tsv\";\ntype BuiltInFormat = SerializableFormat | \"xlsx\";\nexport interface TransferMenuPresentation {\n group?: \"save\" | \"chat\" | \"email\";\n prepared?: boolean;\n hint?: string;\n icon?: React.ComponentType<{ className?: string }>;\n ariaLabel?: string;\n /** Download-only actions join the shared format palette instead of a second menu. */\n placement?: \"download\";\n}\nexport interface TransferMenuVariant extends TransferMenuPresentation {\n id: string; label: string; source: Source | Payload;\n copyLabel?: string;\n section?: \"copy\" | \"ai\";\n successMessage?: string;\n}\nfunction MenuPresentation({ label, hint, icon: Icon }: TransferMenuPresentation & { label: string }) {\n return <>{Icon ? <Icon className=\"matrx-alchemy-menu-icon\"/> : <PaletteGlyph file/>}<span>{label}{hint ? <small className=\"matrx-alchemy-menu-hint\">{hint}</small> : null}</span></>;\n}\nfunction DestinationPresentation({ action }: { action: PageAction & TransferMenuPresentation }) {\n const paths: Record<string, string> = {\n notes: \"M5 3h14v18H5zM8 8h8M8 12h8M8 16h5\",\n scratch: \"M5 3h14v18H5zM9 12h6M12 9v6\",\n document: \"M6 3h8l4 4v14H6zM14 3v5h4M9 12h6M9 16h6\",\n workbook: \"M3 4h18v16H3zM3 9h18M9 4v16M15 9v11M3 15h18\",\n task: \"M9 6h11M9 12h11M9 18h11M3 6l1 1 2-2M3 12l1 1 2-2M3 18l1 1 2-2\",\n attach: \"m9 12 5-5a3 3 0 0 1 4 4l-7 7a5 5 0 0 1-7-7l8-8M7 14l7-7\",\n code: \"m8 6-6 6 6 6m8-12 6 6-6 6m-3-14-2 16\",\n chat: \"M4 4h16v13H9l-5 4zM8 9h8M8 13h5\",\n assistant: \"M3 4h18v16H3zM15 4v16M6 9h6M6 13h4\",\n tools: \"m14 4 3 3 4-1a6 6 0 0 1-8 7l-7 7-3-3 7-7a6 6 0 0 1 4-6z\",\n };\n const path = paths[action.id.replace(/^matrx:/, \"\")];\n return <>{action.icon ? <action.icon className=\"matrx-alchemy-menu-icon\"/> : path ? <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d={path}/></svg> : <PaletteGlyph file/>}<span>{action.label}{action.hint ? <small className=\"matrx-alchemy-menu-hint\">{action.hint}</small> : null}</span></>;\n}\nfunction ReceiptLink({ target }: { target: TransferTarget | undefined }) {\n return target?.href && /^(\\/(?!\\/)|https?:\\/\\/)/.test(target.href) ? <a className=\"matrx-alchemy-receipt-link\" href={target.href}>Open {target.kind}</a> : null;\n}\nfunction PaletteGlyph({ format, ai = false, file = false, kind }: { format?: string; ai?: boolean; file?: boolean; kind?: \"ai-copy\" | \"sliders\" | \"link\" | \"surface\" }) {\n if (kind === \"link\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M10 13a5 5 0 0 0 7 0l3-3a5 5 0 0 0-7-7l-2 2M14 11a5 5 0 0 0-7 0l-3 3a5 5 0 0 0 7 7l2-2\"/></svg>;\n if (kind === \"surface\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M3 9h18M9 9v12\"/></svg>;\n if (kind === \"ai-copy\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><rect x=\"5\" y=\"5\" width=\"11\" height=\"14\" rx=\"2\"/><path d=\"M9 3h6a2 2 0 0 1 2 2v10\"/><path d=\"m18.5 3 .55 1.45L20.5 5l-1.45.55L18.5 7l-.55-1.45L16.5 5l1.45-.55z\"/></svg>;\n if (kind === \"sliders\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 6h16M4 12h16M4 18h16\"/><path d=\"M8 3v6M16 9v6M10 15v6\"/></svg>;\n if (ai) return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 5a3 3 0 1 0-5.997.125A4 4 0 0 0 3.5 10.9a4 4 0 0 0 .556 6.588A4 4 0 0 0 12 19\"/><path d=\"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.503 5.775 4 4 0 0 1-.556 6.588A4 4 0 0 1 12 19\"/><path d=\"M12 5v14M8 9h1M15 9h1M8 15h1M15 15h1\"/></svg>;\n if (file) return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 3h8l4 4v14H6z\"/><path d=\"M14 3v5h5M9 13h6M9 17h6\"/></svg>;\n const path = format === \"json\" || format === \"table-data\" ? <><path d=\"M9 4C7 4 7 7 5 7v3c2 0 2 1 2 2s0 2-2 2v3c2 0 2 3 4 3\"/><path d=\"M15 4c2 0 2 3 4 3v3c-2 0-2 1-2 2s0 2 2 2v3c-2 0-2 3-4 3\"/></>\n : format === \"table-schema\" ? <><rect x=\"8\" y=\"3\" width=\"8\" height=\"5\" rx=\"1\"/><rect x=\"2\" y=\"16\" width=\"8\" height=\"5\" rx=\"1\"/><rect x=\"14\" y=\"16\" width=\"8\" height=\"5\" rx=\"1\"/><path d=\"M12 8v4M6 16v-4h12v4\"/></>\n : format === \"compact-json\" ? <><path d=\"m14 10 7-7\"/><path d=\"M20 10h-6V4\"/><path d=\"m3 21 7-7\"/><path d=\"M4 14h6v6\"/></>\n : format === \"csv\" ? <><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\"/><path d=\"M4 10h16M10 4v16\"/></>\n : format === \"tsv\" ? <><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><path d=\"M14 2v6h6M8 13h2M14 13h2M8 17h2M14 17h2\"/></>\n : format === \"xlsx\" ? <><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><path d=\"M14 2v6h6M8 13h8M8 17h8M12 11v8\"/></>\n : format === \"markdown\" ? <><path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5z\"/><path d=\"M14 2v6h6M10 13l-2 2 2 2M14 17l2-2-2-2\"/></>\n : format === \"html\" ? <><path d=\"M15 6h6M3 6h7M3 12h18M3 18h12\"/></>\n : <><path d=\"M4 7V4h16v3M9 20h6M12 4v16\"/></>;\n return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">{path}</svg>;\n}\nfunction PaletteRows({ title, items, onRun, extra, ai = false, glyphKind, fallbackHint }: { title: string; items: readonly TransferMenuVariant[]; onRun?: (item: TransferMenuVariant) => void; extra?: React.ReactNode; ai?: boolean; glyphKind?: \"ai-copy\" | \"sliders\"; fallbackHint?: string }) {\n if (!items.length && !extra) return null;\n return <section className=\"matrx-alchemy-palette-section\"><h3>{title}</h3>{items.map((item) => { const label = item.copyLabel ?? item.label; const hint = item.hint ?? fallbackHint; return <button key={item.id} type=\"button\" className={cn(\"matrx-alchemy-palette-row\", ai && \"matrx-alchemy-palette-row-ai\")} aria-label={item.ariaLabel ?? `${label}${hint ? ` ${hint}` : \"\"}`} onClick={() => onRun?.(item)}>{item.icon ? <item.icon className=\"matrx-alchemy-menu-icon\"/> : <PaletteGlyph ai={ai} {...(glyphKind ? { kind: glyphKind } : {})}/>}<span>{label}{hint ? <small className=\"matrx-alchemy-menu-hint\">{hint}</small> : null}</span></button>; })}{extra}</section>;\n}\nexport interface ContentTransferMenuProps {\n source?: Payload | Source;\n projection?: ExportProjection;\n sections?: Section[];\n preferences?: TransferPreferenceOverrides;\n enabled?: boolean;\n surface?: SurfaceHandle;\n label?: string;\n table?: { availableScopes: TransferScope[]; initialScope: TransferScope; scopeLabels?: Partial<Record<TransferScope, string>> };\n references?: readonly ContentTransferReference[];\n referenceActions?: readonly ContentTransferReferenceAction[];\n /** A quick format may explicitly capture a different representation. */\n formatSources?: Partial<Record<SerializableFormat, Source | Payload>>;\n /** Set false for action-only hosts; source formats and adapters are then omitted. */\n sourceFormats?: boolean;\n /** Named alternate sources open this same preparation workspace. */\n variants?: readonly TransferMenuVariant[];\n actions?: (PageAction & TransferMenuPresentation)[];\n capabilities?: ContentTransferCapabilities;\n disabled?: boolean;\n /** Portal is the default Alchemy mark; copy-transform remains opt-in. */\n icon?: AlchemyIcon;\n /** Uses the canonical TapTargetButton presentation. */\n triggerVariant?: \"transparent\" | \"glass\" | \"outline\";\n triggerSize?: \"default\" | \"compact\";\n className?: string;\n stopPropagation?: boolean;\n hide?: readonly (\"copy\" | \"prepare\" | \"download\")[];\n controllerRef?: React.Ref<ContentTransferController>;\n}\nexport interface ContentTransferController {\n focusTrigger(): void;\n prepare(source: Source | Payload, options?: { id?: string; label?: string }): Promise<void>;\n}\n\nconst LABEL: Record<BuiltInFormat, string> = { plain: \"Plain text\", markdown: \"Markdown\", html: \"Formatted\", json: \"JSON\", \"compact-json\": \"Compact JSON\", csv: \"CSV\", tsv: \"Google Sheets\", xlsx: \"Excel workbook\" };\nconst BUILT_INS = Object.freeze((Object.keys(LABEL) as BuiltInFormat[]).map((id) => ({ id })));\nconst COPIES: SerializableFormat[] = [\"plain\", \"markdown\", \"html\", \"json\", \"compact-json\", \"csv\", \"tsv\"];\nconst DOWNLOADS: BuiltInFormat[] = [...COPIES, \"xlsx\"];\nconst EMPTY_VARIANTS: readonly { id: string; label: string; source: Source | Payload }[] = [];\nconst SCOPE_LABEL: Record<TransferScope, string> = { target: \"This content\", row: \"This row\", selected: \"Selected rows\", view: \"Current view\", loaded: \"Loaded rows\", \"all-matching\": \"All matching rows\" };\nconst filenameFor = (label: string) => label.toLocaleLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/(^-|-$)/g, \"\") || \"export\";\nconst estimateTokens = (text: string) => Math.ceil(text.length / 4);\nconst errorMessage = (error: unknown, fallback: string) => error instanceof Error ? error.message : fallback;\nconst isAbort = (error: unknown) => error instanceof DOMException && error.name === \"AbortError\";\nconst supportsBuiltIn = (format: BuiltInFormat, payload: Payload) => ![\"csv\", \"tsv\", \"xlsx\"].includes(format) || payload.kind === \"rows\";\nconst outcomeMessage = (result: TransferOutcome) => {\n if (result.status === \"success\") {\n const success = result as TransferOutcome & { delivered: string; message?: string };\n return success.delivered === \"action\" ? success.message ?? \"Action completed\" : success.delivered === \"download-started\" ? \"Download started\" : success.message ?? \"Copied\";\n }\n return result.status === \"degraded\" ? `Copied as plain text: ${result.reason}` : result.status === \"cancelled\" ? \"Cancelled\" : result.message;\n};\nconst materialIds = new WeakMap<object, number>();\nlet nextMaterialId = 0;\nfunction materialIdentity(material: Source | Payload | SurfaceHandle | null | undefined) {\n if (!material) return \"missing\";\n if (\"instanceId\" in material) return `surface:${material.instanceId}`;\n if (\"id\" in material) return `source:${material.id}`;\n let id = materialIds.get(material);\n if (id === undefined) { id = ++nextMaterialId; materialIds.set(material, id); }\n return `payload:${id}`;\n}\n\ntype CaptureResult = { snapshot: Snapshot; allMatching?: BoundAllMatching; collectionError?: string };\ntype WorkspaceState = CaptureResult & { sourceStale?: boolean | undefined; key: string; original: Draft; draft: Draft; scope: TransferScope; preferences: TransferPreferences; pending?: (CaptureResult & { scope: TransferScope }) | undefined; error?: string | undefined };\n\n/** Compare captured meaning at the user action boundary, never during render. */\nfunction snapshotContent(snapshot: Snapshot) {\n const { sourceId, label, payload, coverage, unsavedChanges, omissions, sections, limits } = snapshot;\n return JSON.stringify({ sourceId, label, payload, coverage, unsavedChanges, omissions, sections, limits });\n}\n\nfunction useFence() {\n const mounted = React.useRef(true);\n const nextId = React.useRef(0);\n const active = React.useRef(new Set<AbortController>());\n React.useEffect(() => {\n mounted.current = true;\n return () => { mounted.current = false; nextId.current += 1; active.current.forEach((c) => c.abort()); active.current.clear(); };\n }, []);\n const begin = React.useCallback(() => { const controller = new AbortController(); active.current.add(controller); return { controller, id: ++nextId.current }; }, []);\n const finish = React.useCallback((controller: AbortController) => active.current.delete(controller), []);\n const valid = React.useCallback((id: number, controller: AbortController) => mounted.current && !controller.signal.aborted && nextId.current === id, []);\n const abortAll = React.useCallback(() => { nextId.current += 1; active.current.forEach((c) => c.abort()); active.current.clear(); }, []);\n return { begin, finish, valid, abortAll };\n}\n\nasync function xlsxArtifact(draft: Draft, label: string): Promise<Artifact> {\n if (draft.payload.kind !== \"rows\") throw new Error(\"Excel workbook export requires tabular content.\");\n const XLSX = await import(\"xlsx\");\n const columns = draft.payload.columns.filter((c) => c.visible && c.exportable !== false && c.classification !== \"secret\" && c.classification !== \"credential\");\n const cells = draft.payload.rows.map((row) => columns.map((column) => {\n const value = readTransferCell(row, column);\n return value === null || [\"string\", \"number\", \"boolean\"].includes(typeof value) ? value : value === undefined ? \"\" : JSON.stringify(value);\n }));\n const sheet = XLSX.utils.aoa_to_sheet([columns.map((c) => c.label), ...cells]);\n const book = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(book, sheet, label.replace(/[\\\\/?*[\\]:]/g, \" \").trim().slice(0, 31) || \"Data\");\n const written = XLSX.write(book, { type: \"array\", bookType: \"xlsx\", compression: true });\n return sealTransferArtifact({ snapshotId: draft.snapshotId, draftRevision: draft.revision, format: \"xlsx\", plainText: serialize(draft, \"tsv\", { spreadsheetSafe: true }).plainText, file: { filename: `${filenameFor(label)}.xlsx`, mime: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", bytes: written instanceof Uint8Array ? written : new Uint8Array(written) }, omissions: [...draft.omissions] });\n}\nasync function buildArtifact(draft: Draft, format: BuiltInFormat, label: string): Promise<Artifact> {\n if (!supportsBuiltIn(format, draft.payload)) throw new Error(`${LABEL[format]} is available for tabular content only.`);\n if (format === \"xlsx\") return xlsxArtifact(draft, label);\n if (format === \"html\" && draft.payload.kind === \"markdown\") return serializeMarkdownRich(draft, `${filenameFor(label)}.html`);\n const extension = format === \"plain\" ? \"txt\" : format === \"compact-json\" ? \"json\" : format;\n return serialize(draft, format, { spreadsheetSafe: format === \"csv\" || format === \"tsv\", filename: `${filenameFor(label)}.${extension}` });\n}\n\nexport function ContentTransferMenu(props: ContentTransferMenuProps) {\n const inherited = React.useContext(CapabilityContext);\n const identityKey = props.capabilities?.identityKey ?? inherited.identityKey;\n return <ContentTransferMenuSession key={identityKey ?? \"anonymous\"} {...props} />;\n}\n\nfunction ContentTransferMenuSession({ references = [], referenceActions = [], source, surface, label, projection, sections, preferences, table, formatSources, sourceFormats = true, variants = EMPTY_VARIANTS, actions = [], capabilities: local, disabled, enabled = true, className, stopPropagation = true, hide = [], controllerRef, icon = \"portal\", triggerVariant = \"transparent\", triggerSize = \"default\" }: ContentTransferMenuProps) {\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const inherited = React.useContext(CapabilityContext);\n const nearestSurface = React.useContext(SurfaceContext);\n const fence = useFence();\n const [menuCapture, setMenuCapture] = React.useState<CaptureResult | null>(null);\n const [menuStatus, setMenuStatus] = React.useState<\"idle\" | \"loading\" | string>(\"idle\");\n const [workspaces, setWorkspaces] = React.useState<Record<string, WorkspaceState>>({});\n const [workspaceKey, setWorkspaceKey] = React.useState<string | null>(null);\n const [workspaceOpen, setWorkspaceOpen] = React.useState(false);\n const workspaceCaptures = React.useRef(new Map<string, (scope: TransferScope, signal: AbortSignal) => Promise<CaptureResult>>());\n const externalWorkspaceKeys = React.useRef(new Set<string>());\n const [notice, setNotice] = React.useState<string | null>(null);\n const [receiptTarget, setReceiptTarget] = React.useState<TransferTarget | undefined>();\n const [paletteOpen, setPaletteOpen] = React.useState(false);\n const [mode, setMode] = React.useState<\"copy\" | \"download\">(\"copy\");\n const scopes = React.useMemo(() => table?.availableScopes ?? ([\"target\"] as TransferScope[]), [table]);\n const [requestedScope, setRequestedScope] = React.useState<TransferScope>(table?.initialScope ?? \"target\");\n const initialScope = scopes.includes(requestedScope) ? requestedScope : table?.initialScope ?? \"target\";\n if (!scopes.includes(initialScope)) throw new Error(\"Alchemy initialScope must be included in availableScopes.\");\n const primary = surface ?? source ?? nearestSurface;\n const sourceLabel = label ?? (surface?.surfaceName ?? (source && \"label\" in source ? source.label : nearestSurface?.surfaceName) ?? \"content\");\n const primaryWorkspaceBase = `primary:${materialIdentity(primary)}`;\n const primaryWorkspaceKey = `${primaryWorkspaceBase}:${initialScope}`;\n const nearestWorkspaceKey = source && !surface && nearestSurface ? `surface:${materialIdentity(nearestSurface)}` : null;\n const variantWorkspaceKeys = React.useMemo(() => new Map(variants.map((variant) => [variant.id, `variant:${variant.id}:${materialIdentity(variant.source)}`])), [variants]);\n const transport = local?.transport ?? inherited.transport ?? createBrowserTransport();\n const ai = local?.ai ?? inherited.ai;\n const referencePort = local?.reference ?? inherited.reference;\n const { email: emailPort, review: emailReview } = useReviewedTransferEmail(local?.email ?? inherited.email);\n const providerPreferences = React.useMemo(() => resolveTransferPreferences(inherited.preferences, local?.preferences), [inherited.preferences, local?.preferences]);\n const adapters = React.useMemo(() => resolveTransferRegistry<{ id: string }>(BUILT_INS, inherited.formats ?? [], local?.formats ?? []).filter((x): x is FormatAdapter => \"build\" in x), [inherited.formats, local?.formats]);\n const emailJsonFormat = adapters.find((adapter) => adapter.id === \"table-data\");\n const emailActions = React.useMemo(() => emailPort ? createTransferEmailActions(emailPort, emailJsonFormat ? { jsonFormat: emailJsonFormat } : {}) : [], [emailPort, emailJsonFormat]);\n const registeredActions = React.useMemo(() => resolveTransferRegistry(emailActions, inherited.actions ?? [], local?.actions ?? [], actions), [actions, emailActions, inherited.actions, local?.actions]);\n React.useMemo(() => resolveTransferRegistry(variants), [variants]);\n const report = React.useCallback((result: TransferOutcome) => { inherited.onOutcome?.(result); local?.onOutcome?.(result); setNotice(outcomeMessage(result)); setReceiptTarget(\"target\" in result ? result.target : undefined); }, [inherited, local]);\n React.useEffect(() => {\n const valid = new Set([...scopes.map((scope) => `${primaryWorkspaceBase}:${scope}`), ...(nearestWorkspaceKey ? [nearestWorkspaceKey] : []), ...variantWorkspaceKeys.values(), ...externalWorkspaceKeys.current]);\n setWorkspaces((current) => Object.fromEntries(Object.entries(current).filter(([key]) => valid.has(key))));\n for (const key of workspaceCaptures.current.keys()) if (!valid.has(key)) workspaceCaptures.current.delete(key);\n if (workspaceKey && !valid.has(workspaceKey)) { setWorkspaceKey(null); setWorkspaceOpen(false); }\n }, [nearestWorkspaceKey, primaryWorkspaceBase, scopes, variantWorkspaceKeys, workspaceKey]);\n\n const captureOne = React.useCallback(async (material: Source | Payload | SurfaceHandle | null, scope: TransferScope, signal: AbortSignal, applyMenuProjection = false, collectPages = true): Promise<CaptureResult> => {\n if (!material) throw new Error(\"Alchemy needs a source or a mounted transfer surface.\");\n let sourceMaterial: Source;\n if (\"instanceId\" in material) {\n if (!material.isMounted()) throw new Error(\"The requested transfer surface is no longer mounted.\");\n const captured = await material.capture(signal);\n sourceMaterial = { id: captured.snapshot.sourceId, label: captured.snapshot.label, capture: async () => captured };\n } else if (\"kind\" in material) {\n sourceMaterial = { id: materialIdentity(material), label: sourceLabel, capture: async () => directSource(material, { sourceId: materialIdentity(material), label: sourceLabel, ...(applyMenuProjection && projection ? { projection } : {}), ...(applyMenuProjection && sections ? { sections } : {}) }) };\n } else if (applyMenuProjection && (projection || sections)) {\n sourceMaterial = {\n id: material.id,\n label: material.label,\n capture: async (request) => {\n const captured = await material.capture(request);\n return {\n ...captured,\n projection: { rules: [...captured.projection.rules, ...(projection?.rules ?? [])] },\n snapshot: { ...captured.snapshot, ...(sections ? { sections } : {}) },\n };\n },\n };\n } else {\n sourceMaterial = material;\n }\n const raw = await sourceMaterial.capture({ scope, signal });\n const constrained = resolveTransferPreferences(providerPreferences, preferences, raw.snapshot.limits);\n const result = await capture({ id: raw.snapshot.sourceId, label: raw.snapshot.label, capture: async () => ({ ...raw, snapshot: { ...raw.snapshot, limits: constrained.limits } }) }, signal, scope);\n if (scope !== \"all-matching\" || !collectPages) return result;\n if (!result.allMatching) throw new Error(\"This source cannot provide a stable all-matching export.\");\n const collected = await collectAllMatching(result.allMatching, signal);\n if (result.snapshot.payload.kind !== \"rows\") throw new Error(\"All-matching export requires tabular content.\");\n return { snapshot: projectSnapshot({ ...result.snapshot, payload: { kind: \"rows\", rows: collected.rows, columns: result.snapshot.payload.columns }, coverage: collected.coverage, omissions: [...collected.omissions] }, { rules: [] }), allMatching: result.allMatching, ...(collected.error ? { collectionError: collected.error.message } : {}) };\n }, [preferences, projection, providerPreferences, sections, sourceLabel]);\n const capturePrimary = React.useCallback((scope: TransferScope, signal: AbortSignal) => captureOne(primary, scope, signal, true), [captureOne, primary]);\n workspaceCaptures.current.set(primaryWorkspaceKey, capturePrimary);\n if (nearestWorkspaceKey && nearestSurface) workspaceCaptures.current.set(nearestWorkspaceKey, (scope, signal) => captureOne(nearestSurface, scope, signal, true));\n for (const variant of variants) {\n const key = variantWorkspaceKeys.get(variant.id)!;\n workspaceCaptures.current.set(key, (scope, signal) => captureOne(variant.source, scope, signal, true));\n }\n\n const preflight = React.useCallback(async (scope = initialScope) => {\n const { controller, id } = fence.begin(); setMenuCapture(null); setMenuStatus(\"loading\");\n try { const result = await captureOne(primary, scope, controller.signal, true, false); if (fence.valid(id, controller)) { setMenuCapture(result); setMenuStatus(\"idle\"); } }\n catch (error) { if (fence.valid(id, controller)) { setMenuCapture(null); setMenuStatus(errorMessage(error, \"Could not inspect content\")); } }\n finally { fence.finish(controller); }\n }, [captureOne, fence, initialScope, primary]);\n\n const transfer = React.useCallback(async (format: BuiltInFormat | FormatAdapter, download: boolean, alternate?: TransferMenuVariant) => {\n const { controller, id } = fence.begin();\n try {\n const explicit = alternate?.source ?? (typeof format === \"string\" && format !== \"xlsx\" ? formatSources?.[format] : undefined);\n const result = await (explicit ? captureOne(explicit, initialScope, controller.signal, true) : capturePrimary(initialScope, controller.signal));\n if (result.collectionError) throw new Error(`The complete source could not be collected: ${result.collectionError}`);\n if (result.snapshot.coverage.status !== \"complete\" || result.snapshot.omissions.length > 0) {\n const reason = result.snapshot.coverage.reason ?? `${result.snapshot.omissions.length} omission${result.snapshot.omissions.length === 1 ? \"\" : \"s\"}`;\n throw new Error(`Quick transfer is partial (${reason}). Open Prepare for AI to review it before delivery.`);\n }\n const resolved = resolveTransferPreferences(providerPreferences, preferences, result.snapshot.limits);\n const draft = applyTransferLimits(createDraft(result.snapshot), resolved.limits); const revision = draft.revision;\n if (draft.omissions.length > result.snapshot.omissions.length) throw new Error(\"Quick transfer requires content reductions. Open Prepare for AI to review them before delivery.\");\n const artifact = typeof format === \"string\" ? await buildArtifact(draft, format, result.snapshot.label) : await format.build(draft, controller.signal);\n if (artifact.omissions.length > draft.omissions.length) throw new Error(`Quick format requires ${artifact.omissions.length - draft.omissions.length} adjustment${artifact.omissions.length - draft.omissions.length === 1 ? \"\" : \"s\"}. Open Prepare for AI to review before delivery.`);\n if (!fence.valid(id, controller) || artifact.snapshotId !== result.snapshot.id || artifact.draftRevision !== revision) return;\n const outcome = await transport[download ? \"download\" : \"copy\"](artifact, controller.signal);\n if (fence.valid(id, controller)) report(outcome.status === \"success\" && alternate?.successMessage ? { ...outcome, message: alternate.successMessage } : outcome);\n } catch (error) { if (fence.valid(id, controller)) report({ status: \"error\", code: \"prepare-failed\", message: errorMessage(error, \"Preparation failed\"), retryable: true }); }\n finally { fence.finish(controller); }\n }, [captureOne, capturePrimary, fence, formatSources, initialScope, preferences, providerPreferences, report, transport]);\n\n const openWorkspace = React.useCallback(\n async (\n key = primaryWorkspaceKey,\n variant?: { source: Source | Payload | SurfaceHandle; label: string },\n ) => {\n const variantMaterial =\n variant && \"kind\" in variant.source\n ? ({\n id: `variant:${key}`,\n label: variant.label,\n capture: async () =>\n directSource(variant.source as Payload, {\n sourceId: `variant:${key}`,\n label: variant.label,\n }),\n } satisfies Source)\n : variant?.source;\n const captureWorkspace = (\n scope: TransferScope,\n signal: AbortSignal,\n collectPages = true,\n ) =>\n captureOne(variantMaterial ?? primary, scope, signal, true, collectPages);\n workspaceCaptures.current.set(key, captureWorkspace);\n const existing = workspaces[key];\n const { controller, id } = fence.begin();\n if (existing) {\n try {\n const scopeChanged = existing.scope !== initialScope;\n const allMatching = initialScope === \"all-matching\";\n const fresh = await captureWorkspace(\n initialScope,\n controller.signal,\n scopeChanged || !allMatching,\n );\n if (!fence.valid(id, controller) || !workspaceCaptures.current.has(key))\n return;\n if (allMatching && (!fresh.allMatching || (!scopeChanged && !existing.allMatching)))\n throw new Error(\n \"This source can no longer provide an all-matching snapshot.\",\n );\n const collectionIdentity = (value: BoundAllMatching | undefined) =>\n value && {\n query: value.source.query,\n projection: value.projection,\n columns: value.columns,\n limits: value.limits,\n };\n const changed = scopeChanged || (allMatching\n ? JSON.stringify(collectionIdentity(existing.allMatching)) !==\n JSON.stringify(collectionIdentity(fresh.allMatching))\n : snapshotContent(existing.snapshot) !==\n snapshotContent(fresh.snapshot));\n setWorkspaces((current) => {\n const retained = current[key];\n if (!retained) return current;\n return {\n ...current,\n [key]: {\n ...retained,\n error: fresh.collectionError,\n ...(allMatching && !scopeChanged\n ? { sourceStale: changed }\n : changed\n ? { pending: { ...fresh, scope: initialScope } }\n : { pending: undefined }),\n },\n };\n });\n setWorkspaceKey(key);\n setWorkspaceOpen(true);\n } catch (error) {\n if (fence.valid(id, controller) && workspaceCaptures.current.has(key)) {\n setWorkspaces((current) =>\n current[key]\n ? {\n ...current,\n [key]: {\n ...current[key]!,\n error: errorMessage(error, \"Could not refresh source\"),\n },\n }\n : current,\n );\n setWorkspaceKey(key);\n setWorkspaceOpen(true);\n }\n } finally {\n fence.finish(controller);\n }\n return;\n }\n try {\n const result = await captureWorkspace(initialScope, controller.signal);\n if (!fence.valid(id, controller)) return;\n const resolved = resolveTransferPreferences(\n providerPreferences,\n preferences,\n result.snapshot.limits,\n );\n const original = createDraft(result.snapshot);\n const base: WorkspaceState = {\n ...result,\n key,\n original,\n draft: original,\n scope: initialScope,\n preferences: resolved,\n ...(result.collectionError ? { error: result.collectionError } : {}),\n };\n setWorkspaces((current) => ({\n ...current,\n [key]: { ...base, draft: rebuild(base, initialControls(base)) },\n }));\n setWorkspaceKey(key);\n setWorkspaceOpen(true);\n } catch (error) {\n if (fence.valid(id, controller))\n setReceiptTarget(undefined); setNotice(errorMessage(error, \"Could not capture content\"));\n } finally {\n fence.finish(controller);\n }\n },\n [\n captureOne,\n capturePrimary,\n fence,\n initialScope,\n preferences,\n primaryWorkspaceKey,\n primary,\n providerPreferences,\n workspaces,\n ],\n );\n React.useImperativeHandle(controllerRef, () => ({\n focusTrigger: () => triggerRef.current?.focus(),\n prepare: async (requestedSource, options) => {\n const requestedLabel = options?.label ?? (\"label\" in requestedSource ? requestedSource.label : \"content\");\n const requestedKey = `controller:${options?.id ?? \"source\"}:${materialIdentity(requestedSource)}`;\n externalWorkspaceKeys.current.add(requestedKey);\n await openWorkspace(requestedKey, { source: requestedSource, label: requestedLabel });\n },\n }), [openWorkspace]);\n\n const runAction = React.useCallback(async (action: PageAction) => {\n const { controller, id } = fence.begin();\n try { const actionSource = (action as PageAction & { source?: Source }).source; const { snapshot } = actionSource ? await captureOne(actionSource, initialScope, controller.signal, true) : await capturePrimary(initialScope, controller.signal); const resolved = resolveTransferPreferences(providerPreferences, preferences, snapshot.limits); const draft = applyTransferLimits(createDraft(snapshot), resolved.limits); if (snapshot.coverage.status !== \"complete\" || draft.omissions.length) throw new Error(\"This content is partial or requires reductions. Open Prepare for AI to review it before sending it to a destination.\"); if (!action.supports(snapshot, draft)) throw new Error(`${action.label} is unavailable for this content.`); const result = await action.run({ snapshot, draft, signal: controller.signal }); if (fence.valid(id, controller) && draft.snapshotId === snapshot.id) report(result); }\n catch (error) { if (fence.valid(id, controller)) report({ status: \"error\", code: \"action-failed\", message: errorMessage(error, \"Action failed\"), retryable: true }); }\n finally { fence.finish(controller); }\n }, [captureOne, capturePrimary, fence, initialScope, preferences, providerPreferences, report]);\n\n const copyReference = async (reference: ContentTransferReference) => {\n const { controller, id } = fence.begin();\n closePalette();\n try {\n if (!referencePort?.supports(reference)) throw new Error(\"This reference is not registered or its identity is incomplete.\");\n const text = await referencePort.build(reference);\n if (!text.trim()) throw new Error(\"The reference serializer returned no content.\");\n const artifact = sealTransferArtifact({ snapshotId: `reference:${reference.id}`, draftRevision: 0, format: \"matrx-reference\", plainText: text, omissions: [] });\n if (!fence.valid(id, controller)) return;\n const outcome = await transport.copy(artifact, controller.signal);\n if (fence.valid(id, controller)) report(outcome);\n } catch (error) { if (fence.valid(id, controller)) report({status: \"error\", code: \"reference-failed\", message: errorMessage(error, \"Could not copy reference\"), retryable: true}); }\n finally { fence.finish(controller); }\n };\n const openReference = async (action: ContentTransferReferenceAction) => {\n closePalette();\n try { await action.run(); }\n catch (error) { report({status: \"error\", code: \"reference-failed\", message: errorMessage(error, \"Could not open reference picker\"), retryable: true}); }\n };\n if (!enabled) return null;\n const payload = menuCapture?.snapshot.payload ?? (source && \"kind\" in source ? source : undefined);\n const quickVariants = (section: \"copy\" | \"ai\") => variants.filter((v) => v.copyLabel && (v.section ?? \"ai\") === section);\n const visibleCopies = sourceFormats ? COPIES.filter((f) => Boolean(formatSources?.[f]) || ![\"csv\", \"tsv\"].includes(f) || payload?.kind === \"rows\") : [];\n const visibleDownloads = sourceFormats ? DOWNLOADS.filter((f) => (f !== \"xlsx\" && Boolean(formatSources?.[f])) || ![\"csv\", \"tsv\", \"xlsx\"].includes(f) || payload?.kind === \"rows\") : [];\n const visibleAdapters = sourceFormats && menuCapture ? adapters.filter((a) => a.supports(menuCapture.snapshot.payload)) : [];\n const visibleActions = menuCapture ? registeredActions.filter((a) => a.supports(menuCapture.snapshot, applyTransferLimits(createDraft(menuCapture.snapshot), resolveTransferPreferences(providerPreferences, preferences, menuCapture.snapshot.limits).limits))) : [];\n const downloadActions = visibleActions.filter((action) => (action as TransferMenuPresentation).placement === \"download\");\n const ordinaryActions = visibleActions.filter((action) => (action as TransferMenuPresentation).placement !== \"download\");\n const preparedActions = registeredActions.filter((action) => (action as TransferMenuPresentation).prepared && !action.source);\n const copyAvailable = !hide.includes(\"copy\") && (visibleCopies.length + visibleAdapters.length + quickVariants(\"copy\").length > 0);\n const downloadAvailable = !hide.includes(\"download\") && (visibleDownloads.length + visibleAdapters.length + downloadActions.length > 0);\n const prepareAvailable = !hide.includes(\"prepare\") && (quickVariants(\"ai\").length > 0 || Boolean(primary) || Boolean(nearestWorkspaceKey) || variants.length > 0);\n const resolvedMode = mode === \"copy\" && !copyAvailable ? \"download\" : mode === \"download\" && !downloadAvailable ? \"copy\" : mode;\n const nativeAiFormat: FormatAdapter = {\n id: \"ai-context\", label: \"AI context\", supports: () => true,\n build: async (draft) => {\n const json = serialize(draft, \"json\");\n return sealTransferArtifact({ snapshotId: draft.snapshotId, draftRevision: draft.revision, format: \"ai-context\", plainText: buildAgentPayload({ kind: \"matrx_content\", location: sourceLabel, description: \"Captured content for an assistant\", data: JSON.parse(json.plainText), attributes: { source: draft.sourceId } }), omissions: [...json.omissions] });\n },\n };\n const closePalette = () => setPaletteOpen(false);\n const tile = (id: string, label: string, onClick: () => void, options: { custom?: boolean; action?: PageAction; ai?: boolean; file?: boolean; ariaLabel?: string } = {}) => {\n const presentation = options.action as TransferMenuPresentation | undefined;\n const Icon = presentation?.icon;\n const fallbackLabel = options.file && !/^download\\b/i.test(label) ? `Download ${label}` : label;\n return <button key={id} type=\"button\" className=\"matrx-alchemy-palette-tile\" title={id === \"table-data\" ? \"JSON using column display names\" : id === \"table-schema\" ? \"Table schema and rows\" : label} aria-label={presentation?.ariaLabel ?? (presentation ? fallbackLabel : options.ariaLabel ?? `${resolvedMode === \"copy\" ? \"Copy\" : \"Download\"} ${label}`)} onClick={() => { closePalette(); onClick(); }}>{Icon ? <Icon className=\"matrx-alchemy-menu-icon\"/> : <PaletteGlyph format={id} ai={Boolean(options.ai)} file={options.file || Boolean(options.custom && id !== \"table-data\" && id !== \"table-schema\")}/>}<span>{label}{presentation?.hint ? <small className=\"matrx-alchemy-menu-hint\">{presentation.hint}</small> : null}</span></button>;\n };\n return <span className={cn(\"matrx-alchemy\", className)} onClick={stopPropagation ? (event) => event.stopPropagation() : undefined}>\n <Popover open={paletteOpen} onOpenChange={(open) => { setPaletteOpen(open); if (open) { setMode(\"copy\"); void preflight(); } }}><PopoverTrigger asChild>{triggerVariant === \"outline\" ? <Button ref={triggerRef} variant=\"outline\" size=\"icon-sm\" aria-label={`Copy, transform or export ${sourceLabel}`} data-alchemy-trigger=\"outline\" disabled={disabled}><AlchemyGlyph icon={icon}/></Button> : triggerVariant === \"glass\" ? <TapTargetButton ref={triggerRef} icon={<AlchemyGlyph icon={icon}/>} tooltip={false} ariaLabel={`Copy, transform or export ${sourceLabel}`} data-alchemy-trigger=\"glass\" data-alchemy-size={triggerSize} disabled={disabled} /> : <TapTargetButtonTransparent ref={triggerRef} icon={<AlchemyGlyph icon={icon}/>} tooltip={false} ariaLabel={`Copy, transform or export ${sourceLabel}`} data-alchemy-trigger=\"transparent\" data-alchemy-size={triggerSize} disabled={disabled} />}</PopoverTrigger><PopoverContent align=\"end\" className=\"matrx-alchemy-menu matrx-alchemy-palette\" aria-label=\"Alchemy output options\" onCloseAutoFocus={() => triggerRef.current?.focus()}>\n {menuStatus === \"loading\" ? <p className=\"matrx-alchemy-palette-status\">Inspecting content…</p> : menuStatus !== \"idle\" ? <p className=\"matrx-alchemy-error\">{menuStatus}</p> : null}\n {table && scopes.length > 1 ? <label className=\"matrx-alchemy-scope\">Content scope<select aria-label=\"Content scope\" value={initialScope} onChange={(event) => { const next = scopes.find((scope) => scope === event.target.value); if (next) { setRequestedScope(next); void preflight(next); } }}>{scopes.map((scope) => <option key={scope} value={scope}>{table.scopeLabels?.[scope] ?? SCOPE_LABEL[scope]}</option>)}</select></label> : null}\n {copyAvailable || downloadAvailable ? <section className=\"matrx-alchemy-output\"><h3>{resolvedMode === \"copy\" ? \"Copy as\" : \"Download as\"}</h3>{copyAvailable && downloadAvailable ? <div className=\"matrx-alchemy-mode\" aria-label=\"Output action\"><button type=\"button\" aria-label=\"Copy mode\" aria-pressed={resolvedMode === \"copy\"} onClick={() => setMode(\"copy\")}>Copy</button><button type=\"button\" aria-label=\"Download mode\" aria-pressed={resolvedMode === \"download\"} onClick={() => setMode(\"download\")}>Download</button></div> : null}\n {resolvedMode === \"copy\" && copyAvailable ? <><div className=\"matrx-alchemy-palette-grid\">{visibleCopies.map((format) => tile(format, ({ plain: \"Text\", markdown: \"Markdown\", html: \"Formatted\", json: \"JSON\", \"compact-json\": \"Compact\", csv: \"CSV\", tsv: \"Sheets\" } as Record<SerializableFormat, string>)[format]!, () => void transfer(format, false), { ariaLabel: `Copy ${LABEL[format]}` }))}{visibleAdapters.map((adapter) => tile(adapter.id, adapter.label, () => void transfer(adapter, false), { custom: true }))}</div>{quickVariants(\"copy\").length ? <PaletteRows title=\"Quick copy\" items={quickVariants(\"copy\")} onRun={(variant) => { closePalette(); void transfer(\"markdown\", false, variant); }}/>: null}</> : null}\n {resolvedMode === \"download\" && downloadAvailable ? <><div className=\"matrx-alchemy-palette-grid\">{visibleDownloads.map((format) => tile(format, ({ plain: \"Text\", markdown: \"Markdown\", html: \"Formatted\", json: \"JSON\", \"compact-json\": \"Compact\", csv: \"CSV\", tsv: \"Sheets\", xlsx: \"Excel\" } as Record<BuiltInFormat, string>)[format]!, () => void transfer(format, true), { ariaLabel: `Download ${LABEL[format]}` }))}{visibleAdapters.map((adapter) => tile(adapter.id, adapter.label, () => void transfer(adapter, true), { custom: true }))}{downloadActions.map((action) => tile(action.id, action.label, () => void runAction(action), { custom: true, action, file: true }))}</div></> : null}</section> : null}\n {prepareAvailable ? <><PaletteRows title=\"Copy for AI\" ai glyphKind=\"ai-copy\" fallbackHint=\"Copies immediately\" extra={sourceFormats ? <button type=\"button\" className=\"matrx-alchemy-palette-row\" onClick={() => { closePalette(); void transfer(nativeAiFormat, false); }}><PaletteGlyph kind=\"ai-copy\"/><span>Copy with AI context<small className=\"matrx-alchemy-menu-hint\">Include source context</small></span></button> : null} items={quickVariants(\"ai\")} onRun={(variant) => { closePalette(); void transfer(\"markdown\", false, variant); }}/><PaletteRows title=\"Edit and prepare\" items={[]} extra={<button type=\"button\" className=\"matrx-alchemy-palette-row\" aria-label=\"Prepare for AI\" onClick={() => { closePalette(); void openWorkspace(); }}><PaletteGlyph kind=\"sliders\"/><span>Prepare for AI<small className=\"matrx-alchemy-menu-hint\">Trim, edit or summarize</small></span></button>}/></>: null}\n {prepareAvailable && (nearestWorkspaceKey || variants.length) ? <PaletteRows title=\"Other sources\" items={[]} extra={<>{nearestWorkspaceKey && nearestSurface ? <button type=\"button\" className=\"matrx-alchemy-palette-row\" onClick={() => { closePalette(); void openWorkspace(nearestWorkspaceKey, { source: nearestSurface, label: nearestSurface.surfaceName }); }}><PaletteGlyph kind=\"surface\"/><span>Prepare this page</span></button> : null}{variants.map((variant) => <button key={variant.id} type=\"button\" className=\"matrx-alchemy-palette-row\" aria-label={variant.ariaLabel} onClick={() => { closePalette(); void openWorkspace(variantWorkspaceKeys.get(variant.id)!, variant); }}><MenuPresentation {...variant} label={`Prepare ${variant.label}`}/></button>)}</>}/>: null}\n {references.length || referenceActions.length ? <section className=\"matrx-alchemy-palette-section\"><h3>References</h3>{referenceActions.map((action) => <button key={action.id} type=\"button\" className=\"matrx-alchemy-palette-row\" onClick={() => void openReference(action)}><PaletteGlyph kind=\"link\"/><span>{action.label}</span><svg className=\"matrx-alchemy-disclosure\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" aria-hidden=\"true\"><path d=\"m6 4 4 4-4 4\"/></svg></button>)}{references.map((reference) => <button key={reference.id} type=\"button\" className=\"matrx-alchemy-palette-row\" title=\"Copies a reference to saved data\" onClick={() => void copyReference(reference)}><PaletteGlyph kind=\"link\"/><span>{reference.label}</span></button>)}</section> : null}\n {([\"save\", \"chat\", \"email\", \"other\"] as const).map((group) => { const entries = ordinaryActions.filter((action) => ((action as TransferMenuPresentation).group ?? \"other\") === group); return entries.length ? <details key={group} className=\"matrx-alchemy-palette-destinations\"><summary>{group === \"save\" ? \"Save to Matrx\" : group === \"chat\" ? \"Continue with AI\" : group === \"email\" ? \"Email to me\" : \"Actions\"}<span className=\"matrx-alchemy-disclosure-meta\"><span>{entries.length}</span><svg className=\"matrx-alchemy-disclosure\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" aria-hidden=\"true\"><path d=\"m6 4 4 4-4 4\"/></svg></span></summary><div>{entries.map((action) => <button key={action.id} type=\"button\" className=\"matrx-alchemy-palette-row\" aria-label={(action as TransferMenuPresentation).ariaLabel} onClick={() => { closePalette(); void runAction(action); }}><DestinationPresentation action={action}/></button>)}</div></details> : null; })}\n </PopoverContent></Popover>\n {notice && triggerRef.current ? createPortal(<div className=\"matrx-alchemy-feedback\"><span role=\"status\">{notice}</span><ReceiptLink target={receiptTarget}/><button type=\"button\" aria-label=\"Dismiss Alchemy feedback\" onClick={() => setNotice(null)}>×</button></div>, triggerRef.current.ownerDocument.body) : null}\n {Object.values(workspaces).map((saved) => <PreparationWorkspace restoreFocus={() => triggerRef.current?.focus()} key={saved.key} open={workspaceOpen && workspaceKey === saved.key} state={saved} scopes={scopes} scopeLabels={table?.scopeLabels} onClose={() => setWorkspaceOpen(false)} onChange={(next) => setWorkspaces((current) => ({ ...current, [saved.key]: next }))} transport={transport} adapters={adapters} actions={preparedActions} captureScope={workspaceCaptures.current.get(saved.key) ?? capturePrimary} {...(ai ? { ai } : {})} onOutcome={report}/>)}\n {emailReview}\n </span>;\n}\n\ntype Preset = \"full\" | \"compact\" | \"brief\" | \"custom\";\ntype Controls = {\n preset: Preset;\n sections: string[];\n search: string;\n filters: Record<string, string>;\n sort: string;\n direction: \"asc\" | \"desc\";\n top: number | null;\n visibleColumns: string[];\n selectedOnly: boolean;\n selectedIndices: number[];\n maxDepth: number | null;\n maxStringChars: number | null;\n maxArrayItems: number | null;\n};\n\nfunction initialControls(state: WorkspaceState): Controls {\n const rows = state.original.payload.kind === \"rows\" ? state.original.payload : null;\n return {\n preset: state.preferences.initialPreset,\n sections: state.snapshot.sections.filter((s) => s.includedByDefault).map((s) => s.id),\n search: \"\", filters: {}, sort: \"\", direction: \"asc\",\n top: state.preferences.limits.maxRows,\n visibleColumns: rows?.columns.filter((c) => c.visible).map((c) => c.id) ?? [],\n selectedOnly: false, selectedIndices: [],\n maxDepth: state.preferences.limits.maxDepth,\n maxStringChars: state.preferences.limits.maxStringChars,\n maxArrayItems: state.preferences.limits.maxArrayItems ?? null,\n };\n}\nfunction presetLimits(preset: Preset, controls: Controls, preferences: TransferPreferences) {\n const min = (choice: number | null, cap: number | null) => choice == null ? cap : cap == null ? choice : Math.min(choice, cap);\n if (preset === \"full\") return preferences.limits;\n const request = preset === \"brief\" ? { maxDepth: 4, maxStringChars: 800, maxArrayItems: 25 } : preset === \"compact\" ? { maxDepth: 8, maxStringChars: 4000, maxArrayItems: 100 } : { maxDepth: controls.maxDepth, maxStringChars: controls.maxStringChars, maxArrayItems: controls.maxArrayItems };\n return { ...preferences.limits, maxDepth: min(request.maxDepth, preferences.limits.maxDepth), maxStringChars: min(request.maxStringChars, preferences.limits.maxStringChars), maxArrayItems: min(request.maxArrayItems, preferences.limits.maxArrayItems ?? null) };\n}\nfunction rebuild(state: WorkspaceState, controls: Controls): Draft {\n let draft = resetDraft(state.snapshot);\n if (state.snapshot.sections.length) draft = applySectionSelection(draft, state.snapshot, controls.sections);\n if (draft.payload.kind === \"rows\") draft = transformRows(draft, {\n search: controls.search,\n filters: controls.filters,\n ...(controls.sort ? { sort: { column: controls.sort, direction: controls.direction } } : {}),\n ...(controls.selectedOnly ? { selectedIndices: controls.selectedIndices } : {}),\n visibleColumns: controls.visibleColumns,\n structuredProjection: \"visible\",\n top: controls.top,\n });\n const limits = presetLimits(controls.preset, controls, state.preferences);\n if (draft.payload.kind === \"json\" || draft.payload.kind === \"registered\") {\n draft = reduceJson(draft, { maxDepth: limits.maxDepth, maxStringChars: limits.maxStringChars, maxArrayItems: limits.maxArrayItems ?? null });\n }\n return applyTransferLimits(draft, limits);\n}\nfunction isBuiltInFormat(format: string): format is BuiltInFormat { return format in LABEL; }\nfunction preview(draft: Draft, format: string) {\n const resolved = isBuiltInFormat(format) ? format : \"plain\";\n return serialize(draft, resolved === \"xlsx\" ? \"tsv\" : resolved, { spreadsheetSafe: resolved === \"csv\" || resolved === \"tsv\" || resolved === \"xlsx\" }).plainText;\n}\n\nfunction PreparationWorkspace({ restoreFocus, open, state, scopes, scopeLabels, onClose, onChange, transport, ai, adapters, actions, onOutcome, captureScope }: {\n restoreFocus: () => void;\n open: boolean;\n state: WorkspaceState;\n scopes: TransferScope[];\n scopeLabels?: Partial<Record<TransferScope, string>> | undefined;\n onClose: () => void;\n onChange: (next: WorkspaceState) => void;\n transport: Transport;\n ai?: AiPreparation;\n adapters: FormatAdapter[];\n actions: PageAction[];\n onOutcome: (outcome: TransferOutcome) => void;\n captureScope: (scope: TransferScope, signal: AbortSignal) => Promise<CaptureResult>;\n}) {\n const fence = useFence();\n const latest = React.useRef(state); latest.current = state;\n const aiSession = React.useRef<AiPreparation | undefined>(undefined);\n if (!aiSession.current && ai) aiSession.current = ai.fork?.() ?? ai;\n const [controls, setControls] = React.useState(() => initialControls(state));\n const [controlsHistory, setControlsHistory] = React.useState<Controls[]>([]);\n const [pendingControls, setPendingControls] = React.useState<Controls | null>(null);\n const requestedFormat = state.preferences.initialFormat;\n const [format, setFormat] = React.useState<string>(() => isBuiltInFormat(requestedFormat) ? (supportsBuiltIn(requestedFormat, state.draft.payload) ? requestedFormat : \"plain\") : adapters.some((adapter) => adapter.id === requestedFormat && adapter.supports(state.draft.payload)) ? requestedFormat : \"plain\");\n const [buffer, setBuffer] = React.useState(() => isBuiltInFormat(format) ? preview(state.draft, format) : \"Preparing format preview…\");\n const [bufferError, setBufferError] = React.useState<string | null>(null);\n const [formatError, setFormatError] = React.useState<string | null>(null);\n const [preparedArtifact, setPreparedArtifact] = React.useState<Artifact | null>(null);\n const [instruction, setInstruction] = React.useState(\"\");\n const [busy, setBusy] = React.useState<\"ai\" | \"capture\" | \"copy\" | \"download\" | \"action\" | null>(null);\n const [aiFailed, setAiFailed] = React.useState(false);\n React.useEffect(() => { setAiFailed(false); }, [state.snapshot.id, state.draft.revision]);\n const handingOff = React.useRef(false);\n React.useEffect(() => { if (open) handingOff.current = false; }, [open]);\n const activeAi = React.useRef<AbortController | null>(null);\n const activeCapture = React.useRef<AbortController | null>(null);\n\n React.useEffect(() => {\n if (bufferError) return;\n const adapter = adapters.find((candidate) => candidate.id === format);\n const controller = new AbortController();\n const snapshotId = state.snapshot.id; const revision = state.draft.revision;\n setPreparedArtifact(null); setFormatError(null);\n if (adapter) setBuffer(\"Preparing format preview…\");\n const artifactPromise = adapter ? adapter.build(state.draft, controller.signal) : buildArtifact(state.draft, isBuiltInFormat(format) ? format : \"plain\", state.snapshot.label);\n void artifactPromise.then((artifact) => {\n if (!controller.signal.aborted && artifact.snapshotId === snapshotId && artifact.draftRevision === revision) { setPreparedArtifact(artifact); setBuffer(artifact.plainText); }\n }).catch((error) => { if (!controller.signal.aborted) setFormatError(errorMessage(error, \"Format preview failed\")); });\n return () => controller.abort();\n }, [adapters, bufferError, format, state.draft, state.snapshot.id]);\n const close = React.useCallback(() => { activeAi.current?.abort(); activeCapture.current?.abort(); activeAi.current = null; activeCapture.current = null; fence.abortAll(); setBusy(null); onClose(); }, [fence, onClose]);\n const changeControls = (next: Controls) => {\n if (state.draft.manuallyEdited) { setPendingControls(next); return; }\n setControlsHistory((history) => [...history, controls]); setControls(next); onChange({ ...state, draft: rebuild(state, next), error: undefined });\n };\n const applyPendingControls = () => {\n if (!pendingControls) return;\n setControlsHistory((history) => [...history, controls]); setControls(pendingControls); setBufferError(null);\n onChange({ ...state, draft: rebuild(state, pendingControls), error: undefined });\n setPendingControls(null);\n };\n const editBuffer = (text: string) => {\n setBuffer(text);\n setPreparedArtifact(null); setFormatError(null);\n const payload = state.draft.payload;\n if (payload.kind === \"json\" || payload.kind === \"registered\") {\n try {\n const value = JSON.parse(text) as Json;\n const next: Payload = payload.kind === \"json\" ? { kind: \"json\", value } : { kind: \"registered\", format: payload.format, value };\n setBufferError(null); onChange({ ...state, draft: editDraft(state.draft, next), error: undefined });\n } catch { setBufferError(\"JSON is incomplete or invalid. Fix it before copying or downloading.\"); }\n return;\n }\n setBufferError(null);\n const kind = payload.kind === \"markdown\" || format === \"markdown\" ? \"markdown\" : \"text\";\n if (payload.kind === \"rows\" || !isBuiltInFormat(format)) setFormat(\"plain\");\n onChange({ ...state, draft: editDraft(state.draft, { kind, text }), error: undefined });\n };\n\n const requestCapture = async (scope: TransferScope) => {\n activeCapture.current?.abort();\n const { controller, id } = fence.begin(); activeCapture.current = controller; const revision = state.draft.revision; setBusy(\"capture\");\n try {\n const result = await captureScope(scope, controller.signal);\n if (fence.valid(id, controller) && latest.current.draft.revision === revision) onChange({ ...latest.current, pending: { ...result, scope }, sourceStale: false, error: result.collectionError });\n } catch (error) { if (fence.valid(id, controller)) onChange({ ...latest.current, error: errorMessage(error, \"Refresh failed\") }); }\n finally { fence.finish(controller); if (activeCapture.current === controller) activeCapture.current = null; if (fence.valid(id, controller)) setBusy(null); }\n };\n const resolveCapture = (choice: \"keep\" | \"regenerate\") => {\n if (!state.pending) return;\n if (choice === \"keep\") { const { pending: _pending, ...kept } = state; onChange({ ...kept, error: undefined }); return; }\n const pending = state.pending;\n const preferences = resolveTransferPreferences({}, state.preferences, pending.snapshot.limits);\n const base: WorkspaceState = { ...pending, key: state.key, original: createDraft(pending.snapshot), draft: createDraft(pending.snapshot), scope: pending.scope, preferences, ...(pending.collectionError ? { error: pending.collectionError } : {}) };\n const nextControls = initialControls(base); setControls(nextControls); setControlsHistory([]); setPendingControls(null); setBufferError(null);\n onChange({ ...base, draft: rebuild(base, nextControls) });\n };\n\n const runAi = async (recover = false) => {\n const adapter = aiSession.current;\n if (!adapter || !adapter.supports(state.snapshot) || (!recover && !instruction.trim()) || (recover && !adapter.recover)) return;\n activeAi.current?.abort();\n const { controller, id } = fence.begin(); activeAi.current = controller;\n const snapshotId = state.snapshot.id; const revision = state.draft.revision; setBusy(\"ai\"); setAiFailed(false);\n try {\n const next = recover ? await adapter.recover!({ snapshot: state.snapshot, draft: state.draft, signal: controller.signal }) : await adapter.run({ snapshot: state.snapshot, draft: state.draft, instruction, signal: controller.signal });\n const current = latest.current;\n if (!fence.valid(id, controller) || current.snapshot.id !== snapshotId || current.draft.revision !== revision || next.snapshotId !== snapshotId || next.sourceId !== state.draft.sourceId || next.sourceRevision !== state.draft.sourceRevision || next.revision <= revision) return;\n try { serialize(next, \"plain\"); } catch { onChange({ ...current, error: \"AI returned an invalid transfer draft.\" }); setAiFailed(true); return; }\n onChange({ ...current, draft: next, error: undefined }); setBufferError(null);\n } catch (error) {\n if (!isAbort(error) && fence.valid(id, controller)) { setAiFailed(true); onChange({ ...latest.current, error: errorMessage(error, \"AI preparation failed\") }); }\n } finally { fence.finish(controller); if (activeAi.current === controller) activeAi.current = null; if (fence.valid(id, controller)) setBusy(null); }\n };\n const cancelAi = async () => {\n const aiController = activeAi.current;\n const { controller, id } = fence.begin();\n try { await aiSession.current?.cancel?.(); }\n catch (error) { if (fence.valid(id, controller)) onChange({ ...latest.current, error: errorMessage(error, \"AI cancellation failed\") }); }\n finally { aiController?.abort(); fence.finish(controller); if (activeAi.current === aiController) activeAi.current = null; if (fence.valid(id, controller)) setBusy(null); }\n };\n const [deliveryNotice, setDeliveryNotice] = React.useState<string | null>(null);\n React.useEffect(() => { setDeliveryNotice(null); }, [state.draft.revision]);\n const reportDelivery = (outcome: TransferOutcome) => { setDeliveryNotice(outcomeMessage(outcome)); onOutcome(outcome); };\n const deliver = async (download: boolean) => {\n if (bufferError) return;\n const { controller, id } = fence.begin(); const snapshotId = state.snapshot.id; const revision = state.draft.revision; setBusy(download ? \"download\" : \"copy\");\n try {\n if (!preparedArtifact) throw new Error(\"Wait for the selected format preview before delivery.\");\n const artifact = preparedArtifact;\n const current = latest.current;\n if (!fence.valid(id, controller) || current.snapshot.id !== snapshotId || current.draft.revision !== revision || artifact.snapshotId !== snapshotId || artifact.draftRevision !== revision) return;\n const result = await transport[download ? \"download\" : \"copy\"](artifact, controller.signal);\n if (fence.valid(id, controller)) reportDelivery(result);\n } catch (error) { if (fence.valid(id, controller)) reportDelivery({ status: \"error\", code: \"prepare-failed\", message: errorMessage(error, \"Preparation failed\"), retryable: true }); }\n finally { fence.finish(controller); if (fence.valid(id, controller)) setBusy(null); }\n };\n\n const deliverAction = async (action: PageAction) => {\n if (busy || bufferError || formatError || !preparedArtifact) return;\n const { controller, id } = fence.begin();\n const current = latest.current;\n setBusy(\"action\");\n try {\n if (!action.supports(current.snapshot, current.draft)) throw new Error(`${action.label} is unavailable for this prepared content.`);\n // Release the preparation focus trap before a host opens its destination.\n // This component remains mounted, retaining the exact edited revision.\n handingOff.current = true;\n flushSync(() => onClose());\n const result = await action.run({ snapshot: current.snapshot, draft: current.draft, signal: controller.signal });\n if (fence.valid(id, controller)) reportDelivery(result);\n } catch (error) {\n if (fence.valid(id, controller)) reportDelivery({ status: \"error\", code: \"destination-failed\", message: errorMessage(error, \"Could not deliver prepared content\"), retryable: false });\n } finally { fence.finish(controller); if (fence.valid(id, controller)) setBusy(null); }\n };\n const eligibleActions = actions.filter((action) => action.supports(state.snapshot, state.draft));\n\n const rows = state.original.payload.kind === \"rows\" ? state.original.payload : null;\n const formats = COPIES.filter((f) => supportsBuiltIn(f, state.draft.payload));\n const workspaceAdapters = adapters.filter((adapter) => adapter.supports(state.draft.payload));\n const displayedOmissions = preparedArtifact?.omissions ?? state.draft.omissions;\n const limitText = Object.entries(state.preferences.limits).filter(([, value]) => value != null).map(([key, value]) => `${key.replace(/^max/, \"max \")} ${formatCount(Number(value))}`).join(\" · \");\n return <Dialog open={open} onOpenChange={(next) => { if (!next) close(); }}><DialogContent onCloseAutoFocus={(event) => { event.preventDefault(); if (!handingOff.current) restoreFocus(); }} className=\"matrx-alchemy-workspace max-w-5xl\" aria-busy={busy !== null}>\n <DialogHeader><DialogTitle>Prepare {state.snapshot.label}</DialogTitle><DialogDescription>{state.snapshot.unsavedChanges ? \"Includes your unsaved changes. \" : \"\"}Review and edit this copy. Your original stays unchanged.</DialogDescription></DialogHeader>\n <div className=\"matrx-alchemy-workspace-body\"><div className=\"matrx-alchemy-workspace-grid\"><section className=\"matrx-alchemy-main\">\n <div className=\"matrx-alchemy-toolbar\">\n {scopes.length > 1 ? <label>Scope<select aria-label=\"Transfer scope\" value={state.scope} disabled={busy !== null} onChange={(e) => void requestCapture(e.target.value as TransferScope)}>{scopes.map((scope) => <option key={scope} value={scope}>{scopeLabels?.[scope] ?? SCOPE_LABEL[scope]}</option>)}</select></label> : null}\n <label>Detail<select aria-label=\"Detail preset\" value={controls.preset} onChange={(e) => changeControls({ ...controls, preset: e.target.value as Preset })}><option value=\"full\">Full</option><option value=\"compact\">Compact</option><option value=\"brief\">Brief</option><option value=\"custom\">Custom</option></select></label>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={(!state.draft.history?.length && !controlsHistory.length) || busy !== null} onClick={() => { setBufferError(null); if (controlsHistory.length) { const next = controlsHistory[controlsHistory.length - 1]!; setControls(next); setControlsHistory((history) => history.slice(0, -1)); onChange({ ...state, draft: rebuild(state, next), error: undefined }); } else onChange({ ...state, draft: undoDraft(state.draft), error: undefined }); }}>Undo</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={busy !== null} onClick={() => { const next = initialControls(state); setControls(next); setControlsHistory([]); setPendingControls(null); setBufferError(null); onChange({ ...state, draft: rebuild(state, next), error: undefined }); }}>Reset</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={busy !== null} onClick={() => void requestCapture(state.scope)}>Refresh source</Button>\n </div>\n {controls.preset === \"custom\" ? <fieldset className=\"matrx-alchemy-options\"><legend>{state.draft.payload.kind === \"json\" || state.draft.payload.kind === \"registered\" ? \"JSON limits\" : \"Content limits\"}</legend>{([ [\"maxDepth\", \"Maximum depth\"], [\"maxStringChars\", state.draft.payload.kind === \"rows\" ? \"Maximum characters per cell\" : \"Maximum string characters\"], [\"maxArrayItems\", \"Maximum array items\"] ] as const).filter(([key]) => key === \"maxStringChars\" || state.draft.payload.kind === \"json\" || state.draft.payload.kind === \"registered\").map(([key, text]) => <label key={key}>{text}<input type=\"number\" min=\"0\" value={controls[key] ?? \"\"} onChange={(e) => changeControls({ ...controls, [key]: Number.isNaN(e.target.valueAsNumber) ? null : e.target.valueAsNumber })}/></label>)}</fieldset> : null}\n {rows ? <details className=\"matrx-alchemy-options matrx-alchemy-data-controls\"><summary>Data selection · {controls.visibleColumns.length} columns{controls.search || controls.sort || controls.top != null || controls.selectedOnly || Object.values(controls.filters).some(Boolean) ? \" · customized\" : \" · all rows\"}</summary><div className=\"matrx-alchemy-data-controls-body\"><RowControls rows={rows} controls={controls} change={changeControls}/></div></details> : null}\n {state.snapshot.sections.length ? <details className=\"matrx-alchemy-options\"><summary>Sections · {controls.sections.length} included</summary><fieldset aria-label=\"Included sections\">{state.snapshot.sections.map((section) => <label key={section.id}><input type=\"checkbox\" checked={controls.sections.includes(section.id)} onChange={(e) => changeControls({ ...controls, sections: e.target.checked ? [...controls.sections, section.id] : controls.sections.filter((id) => id !== section.id) })}/> {section.label}</label>)}</fieldset></details> : null}\n <label className=\"matrx-alchemy-preview-label\">Output format<select aria-label=\"Output format\" value={format} onChange={(e) => setFormat(e.target.value)}>{formats.map((f) => <option key={f} value={f}>{LABEL[f]}</option>)}{state.draft.payload.kind === \"rows\" ? <option value=\"xlsx\">Excel workbook</option> : null}{workspaceAdapters.map((adapter) => <option key={adapter.id} value={adapter.id}>{adapter.label}</option>)}</select></label>\n <textarea className=\"matrx-alchemy-preview\" aria-label=\"Prepared output\" aria-invalid={bufferError ? true : undefined} aria-describedby={bufferError ? \"alchemy-buffer-error\" : undefined} value={buffer} onChange={(e) => editBuffer(e.target.value)}/>\n <div className=\"matrx-alchemy-coverage\"><span>{state.snapshot.coverage.included.toLocaleString()} included{state.snapshot.coverage.total == null ? \"\" : ` of ${state.snapshot.coverage.total.toLocaleString()}`} · {state.snapshot.coverage.status}</span>{state.snapshot.coverage.reason ? <span>{state.snapshot.coverage.reason}</span> : null}{limitText ? <span>Limits: {limitText}</span> : null}{displayedOmissions.length ? <details><summary>{displayedOmissions.length} omissions or adjustments</summary><ul>{displayedOmissions.map((o, i) => <li key={`${o.path}-${o.reason}-${i}`}>{o.path || \"/\"}: {o.reason}{o.count == null ? \"\" : ` (${o.count})`}</li>)}</ul></details> : null}</div>\n {bufferError ? <p id=\"alchemy-buffer-error\" role=\"alert\" className=\"matrx-alchemy-error\">{bufferError}</p> : null}\n {formatError ? <p role=\"alert\" className=\"matrx-alchemy-error\">{formatError}</p> : null}\n {bufferError ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" disabled={busy !== null} onClick={() => { const fallback = editDraft(state.draft, { kind: \"text\", text: buffer }); setBufferError(null); onChange({ ...state, draft: fallback, error: undefined }); setFormat(\"plain\"); }}>Use invalid JSON as plain text</Button> : null}\n </section>{ai || busy === \"capture\" || state.error ? <aside>\n {ai ? <>\n <label>Start with<select aria-label=\"AI preparation recipe\" defaultValue=\"\" onChange={(event) => { if (event.target.value) setInstruction(event.target.value); }}><option value=\"\">Choose an instruction</option><option value=\"Summarize this content concisely. Preserve important facts, names, decisions, and source references.\">Summarize</option><option value=\"Extract decisions, action items, owners, and due dates. Mark missing details as unspecified.\">Extract action items</option><option value=\"Prepare a complete handoff for another assistant. Include the objective, relevant facts, constraints, decisions, and unresolved questions.\">Assistant handoff</option><option value=\"Condense this content by removing repetition and formatting noise. Preserve every unique fact and all identifiers.\">Condense without losing facts</option><option value=\"Turn this content into a clear structured outline. Keep the original meaning and explicitly flag uncertainty.\">Create an outline</option><option value=\"Analyze this data. Identify patterns, anomalies, and useful comparisons. Distinguish observations from inferences.\">Analyze the data</option></select></label>\n <label>AI instruction<textarea value={instruction} onChange={(e) => setInstruction(e.target.value)} placeholder=\"Tell AI how to prepare this content\"/></label>\n <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" disabled={!aiSession.current || !instruction.trim() || busy !== null || !aiSession.current.supports(state.snapshot)} onClick={() => void runAi(false)}>Generate preview</Button>\n {busy === \"ai\" ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => void cancelAi()}>{aiSession.current?.cancel ? \"Cancel AI\" : \"Stop waiting\"}</Button> : null}\n </> : null}\n {busy === \"capture\" ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => { activeCapture.current?.abort(); activeCapture.current = null; setBusy(null); }}>Stop loading rows</Button> : null}\n {ai && aiFailed && aiSession.current?.recover && busy !== \"ai\" ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => void runAi(true)}>{aiFailed ? \"Retry or rejoin AI run\" : \"Rejoin AI run\"}</Button> : null}\n {ai ? <p className=\"matrx-alchemy-meta\">AI updates the preview; copy it when you are ready. Closing this window lets the AI run continue.</p> : null}{state.error ? <p role=\"alert\" className=\"matrx-alchemy-error\">{state.error}</p> : null}\n </aside> : null}</div>\n {pendingControls ? <div className=\"matrx-alchemy-decision\" role=\"alert\"><p>This control would replace your manual edit.</p><Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => setPendingControls(null)}>Keep edited draft</Button><Button className=\"matrx-alchemy-workspace-primary\" type=\"button\" onClick={applyPendingControls}>Rebuild from source</Button></div> : null}\n {state.sourceStale ? <p role=\"alert\" className=\"matrx-alchemy-decision\">The source changed since this draft. Use Refresh source to review the latest data.</p> : null}\n {state.pending ? <div className=\"matrx-alchemy-decision\" role=\"alert\"><p>A fresh source snapshot is ready.</p>{state.pending.scope !== state.scope ? <p>Switch from {scopeLabels?.[state.scope] ?? SCOPE_LABEL[state.scope]} to {scopeLabels?.[state.pending.scope] ?? SCOPE_LABEL[state.pending.scope]} by regenerating. Your current draft is retained until you choose.</p> : null}<Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => resolveCapture(\"keep\")}>Keep current snapshot and draft</Button><Button className=\"matrx-alchemy-workspace-primary\" type=\"button\" onClick={() => resolveCapture(\"regenerate\")}>Regenerate from fresh source</Button></div> : null}\n {eligibleActions.length ? <details className=\"matrx-alchemy-options matrx-alchemy-destinations\"><summary>Use prepared content · {eligibleActions.length} destinations</summary><div className=\"matrx-alchemy-destination-grid\">{eligibleActions.map((action) => <button key={action.id} type=\"button\" className=\"matrx-alchemy-palette-row\" disabled={busy !== null || Boolean(bufferError || formatError) || !preparedArtifact} onClick={() => void deliverAction(action)}><DestinationPresentation action={action}/></button>)}</div></details> : null}\n {deliveryNotice ? <p role=\"status\" className=\"matrx-alchemy-meta\">{deliveryNotice}</p> : null}</div>\n <DialogFooter><span className=\"matrx-alchemy-meta\">{buffer.length.toLocaleString()} characters · ~{estimateTokens(buffer).toLocaleString()} tokens</span><Button type=\"button\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" onClick={close}>Close</Button><Button type=\"button\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" aria-label=\"Download prepared output\" disabled={busy !== null || Boolean(bufferError || formatError) || !preparedArtifact} onClick={() => void deliver(true)}>Download</Button><Button type=\"button\" className=\"matrx-alchemy-workspace-primary\" aria-label=\"Copy prepared output\" disabled={busy !== null || Boolean(bufferError || formatError) || !preparedArtifact} onClick={() => void deliver(false)}>Copy</Button></DialogFooter>\n </DialogContent></Dialog>;\n}\n\nfunction RowControls({ rows, controls, change }: {\n rows: Extract<Payload, { kind: \"rows\" }>;\n controls: Controls;\n change: (next: Controls) => void;\n}) {\n const filterCount = Object.values(controls.filters).filter(Boolean).length;\n const selectionSummary = controls.selectedOnly ? `${controls.selectedIndices.length} selected row${controls.selectedIndices.length === 1 ? \"\" : \"s\"}` : \"All rows\";\n const dataSummary = [controls.search ? \"search active\" : \"\", controls.sort ? `sorted by ${rows.columns.find((column) => column.id === controls.sort)?.label ?? controls.sort}` : \"\", filterCount ? `${filterCount} filter${filterCount === 1 ? \"\" : \"s\"}` : \"\"].filter(Boolean).join(\" · \");\n return <>\n <div className=\"matrx-alchemy-toolbar\">\n <label>Search<input value={controls.search} onChange={(e) => change({ ...controls, search: e.target.value })}/></label>\n <label>Sort<select value={controls.sort} onChange={(e) => change({ ...controls, sort: e.target.value })}><option value=\"\">None</option>{rows.columns.map((column) => <option key={column.id} value={column.id}>{column.label}</option>)}</select></label>\n <label>Direction<select value={controls.direction} disabled={!controls.sort} onChange={(e) => change({ ...controls, direction: e.target.value as \"asc\" | \"desc\" })}><option value=\"asc\">Ascending</option><option value=\"desc\">Descending</option></select></label>\n <label>Top rows<input type=\"number\" min=\"0\" value={controls.top ?? \"\"} onChange={(e) => change({ ...controls, top: Number.isNaN(e.target.valueAsNumber) ? null : e.target.valueAsNumber })}/></label>\n </div>\n <details className=\"matrx-alchemy-options\"><summary>Columns and filters{dataSummary ? ` — ${dataSummary}` : \"\"}</summary><fieldset aria-label=\"Columns and filters\">{rows.columns.map((column) => <div className=\"matrx-alchemy-column\" key={column.id}><label><input type=\"checkbox\" checked={controls.visibleColumns.includes(column.id)} onChange={(e) => change({ ...controls, visibleColumns: e.target.checked ? [...controls.visibleColumns, column.id] : controls.visibleColumns.filter((id) => id !== column.id) })}/> {column.label}</label><input aria-label={`Filter ${column.label}`} placeholder=\"Filter\" value={controls.filters[column.id] ?? \"\"} onChange={(e) => change({ ...controls, filters: { ...controls.filters, [column.id]: e.target.value } })}/></div>)}</fieldset></details>\n <details className=\"matrx-alchemy-options\"><summary>Rows — {selectionSummary}</summary><fieldset aria-label=\"Row selection\"><label><input type=\"checkbox\" checked={controls.selectedOnly} onChange={(e) => change({ ...controls, selectedOnly: e.target.checked })}/> Only selected rows</label><div className=\"matrx-alchemy-row-list\">{rows.rows.map((row, index) => {\n const summary = rows.columns.filter((column) => column.visible).slice(0, 2).map((column) => String(readTransferCell(row, column) ?? \"\")).filter(Boolean).join(\" · \");\n return <label key={index}><input type=\"checkbox\" checked={controls.selectedIndices.includes(index)} onChange={(e) => change({ ...controls, selectedIndices: e.target.checked ? [...controls.selectedIndices, index] : controls.selectedIndices.filter((value) => value !== index) })}/> Row {index + 1}{summary ? ` — ${summary}` : \"\"}</label>;\n })}</div></fieldset></details>\n </>;\n}\n\nexport * from \"./matrx-copy\";\n","\"use client\";\n\n/**\n * Popover — ported verbatim from matrx-frontend `components/ui/popover.tsx`.\n *\n * Seam inversion: the host's `useNestedPortalContainer` (dialog/popout aware)\n * becomes the injected `PortalContainerProvider` seam (`portal-container.tsx`);\n * the explicit `container` prop keeps top priority, exactly as before.\n *\n * THE ROOT RENDERS UNCONDITIONALLY — no mount gate. This wrapper used to defer\n * rendering until after hydration (\"Radix generates dynamic aria-controls ids\n * that differ between SSR and client\"), and that justification was false:\n * Radix ids come from React's SSR-stable `useId` (verified against\n * @radix-ui/react-popover 1.1.17 / react-id 1.1.2). The gate was actively\n * harmful — the Trigger wraps ALWAYS-VISIBLE content, so `return null`\n * deleted it from SSR and the first client paint.\n */\n\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\n\nexport const Popover = PopoverPrimitive.Root;\n\nexport const PopoverTrigger = PopoverPrimitive.Trigger;\n\nexport const PopoverAnchor = PopoverPrimitive.Anchor;\n\nexport interface PopoverContentProps\n extends React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> {\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly — a picker re-anchoring while the user\n * types, a measurement pass. It is NOT the reduced-motion switch;\n * `styles.css` already honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nexport const PopoverContent = React.forwardRef<\n React.ComponentRef<typeof PopoverPrimitive.Content>,\n PopoverContentProps\n>(\n (\n {\n className,\n align = \"center\",\n sideOffset = 4,\n container,\n animated = true,\n ...props\n },\n ref,\n ) => {\n const portalContainer = usePortalContainer(container);\n return (\n <PopoverPrimitive.Portal container={portalContainer}>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n // Cap to the viewport space Radix measured and scroll — a popover taller\n // than the screen must never trap the user with unreachable content.\n // z must EQUAL the dialog layer (z-[10000]), never exceed it: with equal\n // z, DOM portal order decides, so a dialog opened FROM a popover stacks\n // above it, and a popover opened from a dialog still stacks above the\n // dialog. z-[10001] buried dialogs behind fullscreen popovers.\n \"z-[10000] w-72 max-h-[var(--radix-popover-content-available-height)] overflow-y-auto overscroll-contain rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none\",\n animated && MOTION_POPPER,\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n },\n);\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n","\"use client\";\n\nimport {\n cloneElement,\n forwardRef,\n isValidElement,\n type ButtonHTMLAttributes,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from \"react\";\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport { cn } from \"./cn\";\nimport {\n getTapTargetLinkComponent,\n type TapTargetLinkComponent,\n} from \"./link\";\n\nexport interface TapTargetButtonProps {\n icon?: React.ReactNode;\n children?: React.ReactNode;\n strokeWidth?: number | undefined;\n onClick?: (() => void) | undefined;\n className?: string | undefined;\n as?: \"button\" | \"label\" | undefined;\n htmlFor?: string | undefined;\n ariaLabel?: string | undefined;\n disabled?: boolean | undefined;\n /**\n * When set, the tap button renders as a link instead of a button.\n * - Internal hrefs (e.g. \"/tasks\") render via the injected link component\n * (`setTapTargetLinkComponent` / the `linkComponent` prop), falling back\n * to a plain `<a>` when none is registered.\n * - External hrefs (http://, https://, mailto:, tel:) render as `<a>`\n * with `target=\"_blank\"` and `rel=\"noopener noreferrer\"` by default.\n * - When combined with `disabled`, the trigger renders as a non-navigable\n * `<span aria-disabled=\"true\">` with the same visual styling.\n */\n href?: string | undefined;\n /** Override target. Works on both internal links and external anchors. */\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\" | undefined;\n /** Override rel. Works on both internal links and external anchors. */\n rel?: string | undefined;\n /** Forwarded to the injected link component. Pass `false` to disable prefetching. */\n prefetch?: boolean | null | undefined;\n /**\n * Per-instance link component for internal hrefs — overrides the\n * module-level `setTapTargetLinkComponent` registration.\n */\n linkComponent?: TapTargetLinkComponent | undefined;\n /**\n * Tooltip text. Defaults to `ariaLabel` when omitted.\n * Pass `false` to explicitly disable the tooltip.\n */\n tooltip?: string | false | undefined;\n /** Tooltip placement. Defaults to \"top\". */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\" | undefined;\n /** Tooltip alignment along its side. Defaults to \"center\". */\n tooltipAlign?: \"start\" | \"center\" | \"end\" | undefined;\n /**\n * Visible caption rendered inline after the icon (`[icon Label]`).\n * Widens the pill automatically. Tooltip defaults to off when set — the\n * label is self-describing. Visible text becomes the accessible name.\n */\n label?: string | undefined;\n /**\n * Collapse an icon + caption pill to its icon-only 44px tap target below\n * the `sm` breakpoint. The caption and inline geometry return at `sm+`;\n * `ariaLabel` (falling back to `label`) remains the accessible name.\n */\n mobileIconOnly?: boolean | undefined;\n}\n\nexport interface TapTargetButtonSolidProps extends TapTargetButtonProps {\n bgColor?: string | undefined;\n iconColor?: string | undefined;\n hoverBgColor?: string | undefined;\n /**\n * Press-state background. Defaults to `active:brightness-90` which works on\n * any color. Override when using a custom `bgColor` that should darken to a\n * specific shade on press (e.g. `active:bg-primary/60`).\n */\n activeBgColor?: string | undefined;\n}\n\nconst EXTERNAL_RE = /^(https?:|mailto:|tel:)/i;\n\n// Geometry + press feedback + tap hygiene are the SINGLE SOURCE OF TRUTH in\n// the shipped stylesheet (the `.matrx-tap-*` family in styles.css — import\n// \"@ai-matrx/tap-target/styles.css\" once at app root). This component only\n// picks the right class and layers each variant's decoration on top.\nconst TAP_OUTER_CLASS = \"matrx-tap-target group\";\nconst TAP_GROUP_OUTER_CLASS = \"matrx-tap-target matrx-tap-target-sm group\";\n\nfunction IconContent({\n icon,\n children,\n strokeWidth = 2,\n className,\n}: Pick<\n TapTargetButtonProps,\n \"icon\" | \"children\" | \"strokeWidth\" | \"className\"\n>) {\n if (icon) {\n if (isValidElement<{ className?: string }>(icon)) {\n return cloneElement(icon, {\n className: cn(className, icon.props.className),\n });\n }\n return <span className={className}>{icon}</span>;\n }\n return (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {children}\n </svg>\n );\n}\n\ntype TapTargetSize = \"default\" | \"sm\";\n\nfunction resolveTapGeometry(\n label: string | undefined,\n size: TapTargetSize,\n mobileIconOnly: boolean,\n) {\n const inline = Boolean(label);\n if (size === \"sm\") {\n return {\n outerClassName:\n inline && mobileIconOnly\n ? \"matrx-tap-target matrx-tap-target-sm matrx-tap-target-mobile-icon-only-sm group\"\n : inline\n ? \"matrx-tap-target matrx-tap-target-sm matrx-tap-target-inline-sm group\"\n : TAP_GROUP_OUTER_CLASS,\n inlineModifier: mobileIconOnly\n ? \"matrx-tap-pill-mobile-icon-only-sm\"\n : \"matrx-tap-pill-inline-sm\",\n };\n }\n return {\n outerClassName:\n inline && mobileIconOnly\n ? `${TAP_OUTER_CLASS} matrx-tap-target-mobile-icon-only`\n : inline\n ? `${TAP_OUTER_CLASS} matrx-tap-target-inline`\n : TAP_OUTER_CLASS,\n inlineModifier: mobileIconOnly\n ? \"matrx-tap-pill-mobile-icon-only\"\n : \"matrx-tap-pill-inline\",\n };\n}\n\nfunction buildTapInner({\n label,\n pillClassName,\n iconClassName,\n labelClassName,\n inlineModifier,\n icon,\n children,\n strokeWidth = 2,\n}: {\n label?: string | undefined;\n pillClassName: string;\n iconClassName: string;\n labelClassName?: string | undefined;\n inlineModifier: string;\n icon?: React.ReactNode;\n children?: React.ReactNode;\n strokeWidth?: number | undefined;\n}) {\n const iconEl = (\n <IconContent\n icon={icon}\n strokeWidth={strokeWidth}\n className={iconClassName}\n >\n {children}\n </IconContent>\n );\n const pillClasses = label\n ? `${pillClassName} ${inlineModifier}`.trim()\n : pillClassName;\n\n if (!label) {\n return <div className={pillClasses}>{iconEl}</div>;\n }\n\n return (\n <div className={pillClasses}>\n {iconEl}\n <span className={labelClassName ?? \"matrx-tap-label\"}>{label}</span>\n </div>\n );\n}\n\ninterface RenderTapTargetArgs extends Pick<\n TapTargetButtonProps,\n | \"icon\"\n | \"children\"\n | \"strokeWidth\"\n | \"label\"\n | \"mobileIconOnly\"\n | \"onClick\"\n | \"as\"\n | \"htmlFor\"\n | \"ariaLabel\"\n | \"disabled\"\n | \"href\"\n | \"target\"\n | \"rel\"\n | \"prefetch\"\n | \"linkComponent\"\n | \"tooltip\"\n | \"tooltipSide\"\n | \"tooltipAlign\"\n> {\n size?: TapTargetSize;\n pillClassName: string;\n iconClassName: string;\n labelClassName?: string | undefined;\n rest?: ButtonHTMLAttributes<HTMLButtonElement> | undefined;\n buttonRef?: Ref<HTMLButtonElement> | undefined;\n}\n\nfunction renderTapTarget({\n size = \"default\",\n pillClassName,\n iconClassName,\n labelClassName,\n icon,\n children,\n strokeWidth,\n label,\n mobileIconOnly = false,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n rest,\n buttonRef,\n}: RenderTapTargetArgs): ReactElement {\n const { outerClassName, inlineModifier } = resolveTapGeometry(\n label,\n size,\n mobileIconOnly,\n );\n const responsiveLabelClassName = mobileIconOnly\n ? `${labelClassName ?? \"matrx-tap-label\"} matrx-tap-label-mobile-icon-only`\n : labelClassName;\n const inner = buildTapInner({\n label,\n pillClassName,\n iconClassName,\n labelClassName: responsiveLabelClassName,\n inlineModifier: label ? inlineModifier : \"\",\n icon,\n children,\n strokeWidth,\n });\n const resolvedTooltip =\n tooltip !== undefined ? tooltip : label ? false : undefined;\n const triggerAriaLabel =\n label && !mobileIconOnly ? undefined : (ariaLabel ?? label);\n const trigger = renderTrigger({\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n as,\n htmlFor,\n onClick,\n ariaLabel: triggerAriaLabel,\n disabled,\n outerClassName,\n children: inner,\n rest,\n buttonRef,\n });\n return withTooltip(trigger, {\n tooltip: resolvedTooltip,\n ariaLabel: triggerAriaLabel,\n disabled,\n tooltipSide,\n tooltipAlign,\n });\n}\n\ninterface RenderTriggerArgs {\n href?: string | undefined;\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\" | undefined;\n rel?: string | undefined;\n prefetch?: boolean | null | undefined;\n linkComponent?: TapTargetLinkComponent | undefined;\n as?: \"button\" | \"label\" | undefined;\n htmlFor?: string | undefined;\n onClick?: (() => void) | undefined;\n ariaLabel?: string | undefined;\n disabled?: boolean | undefined;\n outerClassName: string;\n children: ReactNode;\n rest?: ButtonHTMLAttributes<HTMLButtonElement> | undefined;\n buttonRef?: Ref<HTMLButtonElement> | undefined;\n}\n\n/**\n * Resolves the correct trigger element based on the props passed.\n *\n * - `href` + `disabled` → unclickable `<span aria-disabled>`\n * - `href` matching `http(s):|mailto:|tel:` → `<a target=\"_blank\" rel=\"noopener noreferrer\">`\n * - `href` (internal) → the injected link component (per-instance\n * `linkComponent` prop, else `setTapTargetLinkComponent` registration),\n * falling back to a plain `<a>` when none is registered\n * - `as=\"label\"` → `<label htmlFor=...>`\n * - default → `<button>`\n */\nfunction renderTrigger({\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n as,\n htmlFor,\n onClick,\n ariaLabel,\n disabled,\n outerClassName,\n children,\n rest,\n buttonRef,\n}: RenderTriggerArgs): ReactElement {\n if (disabled && href) {\n return (\n <span\n aria-disabled=\"true\"\n aria-label={ariaLabel}\n className={`${outerClassName} opacity-40 pointer-events-none`}\n >\n {children}\n </span>\n );\n }\n if (href) {\n const isExternal = EXTERNAL_RE.test(href);\n if (isExternal) {\n return (\n <a\n href={href}\n target={target ?? \"_blank\"}\n rel={rel ?? \"noopener noreferrer\"}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </a>\n );\n }\n const Link = linkComponent ?? getTapTargetLinkComponent();\n if (Link) {\n return (\n <Link\n href={href}\n target={target}\n rel={rel}\n prefetch={prefetch}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </Link>\n );\n }\n // No link component registered — plain <a>. `prefetch` is a router hint,\n // not a DOM attribute, so it is deliberately dropped here.\n return (\n <a\n href={href}\n target={target}\n rel={rel}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </a>\n );\n }\n if (as === \"label\") {\n return (\n <label\n htmlFor={htmlFor}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </label>\n );\n }\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n disabled={disabled}\n {...rest}\n className={outerClassName}\n >\n {children}\n </button>\n );\n}\n\n/**\n * Wraps a trigger element in a Tooltip when a tooltip label is available.\n * Falls back to `ariaLabel` when `tooltip` is not explicitly set. If both\n * are absent (or `tooltip === false`), the trigger is returned unwrapped.\n */\nfunction withTooltip(\n trigger: ReactElement,\n {\n tooltip,\n ariaLabel,\n disabled,\n tooltipSide = \"top\",\n tooltipAlign = \"center\",\n }: {\n tooltip?: string | false | undefined;\n ariaLabel?: string | undefined;\n disabled?: boolean | undefined;\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\" | undefined;\n tooltipAlign?: \"start\" | \"center\" | \"end\" | undefined;\n },\n): ReactElement {\n if (tooltip === false) return trigger;\n const label =\n typeof tooltip === \"string\" && tooltip.length > 0 ? tooltip : ariaLabel;\n if (!label) return trigger;\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n {disabled ? (\n // Radix Tooltip triggers need a hoverable element; a disabled button\n // does not dispatch pointer events, so we wrap in a span for the\n // trigger target while keeping the disabled visual state.\n <span className=\"inline-flex\">{trigger}</span>\n ) : (\n trigger\n )}\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} align={tooltipAlign}>\n {label}\n </TooltipContent>\n </Tooltip>\n );\n}\n\n// To resize/retune every tap button, edit styles.css — not here.\n\nexport const TapTargetButton = forwardRef<\n HTMLButtonElement,\n TapTargetButtonProps & ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButton(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n className,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n const color = className ?? \"text-foreground\";\n return renderTapTarget({\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName: \"matrx-tap-pill matrx-glass-thin-border\",\n iconClassName: `matrx-tap-icon ${color}`,\n rest,\n buttonRef: ref,\n });\n});\n\nexport const TapTargetButtonTransparent = forwardRef<\n HTMLButtonElement,\n TapTargetButtonProps & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonTransparent(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n className,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n const color = className ?? \"text-foreground\";\n return renderTapTarget({\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName:\n \"matrx-tap-pill hover:bg-muted active:bg-muted-foreground/15\",\n iconClassName: `matrx-tap-icon ${color}`,\n rest,\n buttonRef: ref,\n });\n});\n\nexport const TapTargetButtonSolid = forwardRef<\n HTMLButtonElement,\n TapTargetButtonSolidProps & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonSolid(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n bgColor = \"bg-primary\",\n iconColor = \"text-primary-foreground\",\n hoverBgColor = \"hover:bg-primary/80\",\n activeBgColor = \"active:brightness-90\",\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n return renderTapTarget({\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName: `matrx-tap-pill ${bgColor} ${iconColor} ${hoverBgColor} ${activeBgColor}`,\n iconClassName: `matrx-tap-icon ${iconColor}`,\n labelClassName: `matrx-tap-label ${iconColor}`,\n rest,\n buttonRef: ref,\n });\n});\n\n/** Solid destructive pill — delete/remove actions. White-on-red like the\n * primary solid is white-on-blue. Use THIS, never hand-pass bg-destructive\n * with the default (dark) icon color. */\nexport const TapTargetButtonDestructive = forwardRef<\n HTMLButtonElement,\n TapTargetButtonSolidProps & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonDestructive(\n {\n bgColor = \"bg-destructive\",\n iconColor = \"text-destructive-foreground\",\n hoverBgColor = \"hover:bg-destructive/90\",\n ...rest\n },\n ref,\n) {\n return (\n <TapTargetButtonSolid\n ref={ref}\n bgColor={bgColor}\n iconColor={iconColor}\n hoverBgColor={hoverBgColor}\n {...rest}\n />\n );\n});\n\nexport const TapTargetButtonForGroup = forwardRef<\n HTMLButtonElement,\n TapTargetButtonProps & ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonForGroup(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n className,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n const color = className ?? \"text-foreground\";\n return renderTapTarget({\n size: \"sm\",\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName: \"matrx-tap-pill matrx-tap-pill-sm matrx-glass-interactive\",\n iconClassName: `matrx-tap-icon ${color}`,\n labelClassName: `matrx-tap-label ${color}`,\n rest,\n buttonRef: ref,\n });\n});\n\nexport function TapTargetButtonGroup({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string | undefined;\n}) {\n return (\n <div\n className={\n className\n ? `relative inline-flex h-9 items-center ${className}`\n : \"relative inline-flex h-9 items-center\"\n }\n >\n <div className=\"pointer-events-none absolute inset-x-0 top-1/2 -translate-y-1/2 h-7 rounded-full matrx-glass-thin-border\" />\n {/* min-w-0 lets flexible children (e.g. a truncating filename) shrink\n under container pressure; fixed-size tap buttons are unaffected. */}\n <div className=\"relative flex min-w-0 items-center\">{children}</div>\n </div>\n );\n}\n","/**\n * Minimal className join — the only piece of `cn` this package needs.\n * No tailwind-merge / clsx dependency by design: callers pass literal strings.\n */\nexport function cn(\n ...values: Array<string | null | undefined | false>\n): string {\n return values.filter(Boolean).join(\" \").trim();\n}\n","import type { ComponentType, ReactNode } from \"react\";\n\n/**\n * The injectable link seam — the package's replacement for the original\n * hard `next/link` import.\n *\n * Internal hrefs (anything NOT matching `http(s):`, `mailto:`, `tel:`) render\n * through the link component resolved here; external hrefs always render a\n * plain `<a target=\"_blank\" rel=\"noopener noreferrer\">`, exactly like the\n * original. When nothing is registered and no per-instance `linkComponent`\n * prop is given, internal hrefs fall back to a plain `<a>` (no prefetch, no\n * client-side routing — still a working link).\n */\nexport interface TapTargetLinkProps {\n href: string;\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\" | undefined;\n rel?: string | undefined;\n /** Router prefetch hint (next/link semantics). Plain `<a>` fallback ignores it. */\n prefetch?: boolean | null | undefined;\n \"aria-label\"?: string | undefined;\n className?: string | undefined;\n children?: ReactNode;\n}\n\nexport type TapTargetLinkComponent = ComponentType<TapTargetLinkProps>;\n\n/**\n * The registered component lives in a `Symbol.for` slot on `globalThis` — NOT\n * in module state — so it survives the module graph being instantiated more\n * than once: the `.` and `./buttons` dist bundles each inline the primitives\n * (tsup `splitting: false`), and a consumer may even mix `import` and\n * `require`. One registration must reach every copy.\n */\nconst LINK_SLOT = Symbol.for(\"@ai-matrx/tap-target:link-component\");\n\ntype GlobalWithLinkSlot = typeof globalThis & {\n [LINK_SLOT]?: TapTargetLinkComponent | null;\n};\n\n/**\n * Register the app's link component once at startup (e.g. `next/link`):\n *\n * ```tsx\n * import Link from \"next/link\";\n * import { setTapTargetLinkComponent } from \"@ai-matrx/tap-target\";\n * setTapTargetLinkComponent(Link);\n * ```\n *\n * Pass `null` to unregister (plain `<a>` fallback resumes).\n */\nexport function setTapTargetLinkComponent(\n component: TapTargetLinkComponent | null,\n): void {\n (globalThis as GlobalWithLinkSlot)[LINK_SLOT] = component;\n}\n\n/** The currently registered link component, or `null` when none is set. */\nexport function getTapTargetLinkComponent(): TapTargetLinkComponent | null {\n return (globalThis as GlobalWithLinkSlot)[LINK_SLOT] ?? null;\n}\n","/** Pure Alchemy icon assets. Safe to import without React or browser APIs. */\nexport type AlchemyIcon = \"portal\" | \"copy-transform\";\nexport const ALCHEMY_GLYPH_PATHS: Record<AlchemyIcon, readonly string[]> = {\n portal: [\"M10 4H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h4M14 4h4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-4M12 8v8m-3-3 3 3 3-3\"],\n \"copy-transform\": [\"M8 7V5a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v8M13 21H5a2 2 0 0 1-2-2V10a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v3m-5 4h11m-3-3 3 3-3 3\"],\n};\nexport const ALCHEMY_GLYPH_VIEWBOX: Record<AlchemyIcon, string> = { portal: \"0 0 24 24\", \"copy-transform\": \"0 0 24 24\" };\nconst svg = (paths: readonly string[], viewBox: string) => `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"${viewBox}\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${paths.map((d) => `<path d=\"${d}\"/>`).join(\"\")}</svg>`;\nexport const ALCHEMY_GLYPH_SVG = svg(ALCHEMY_GLYPH_PATHS.portal, ALCHEMY_GLYPH_VIEWBOX.portal);\nexport const ALCHEMY_COPY_TRANSFORM_SVG = svg(ALCHEMY_GLYPH_PATHS[\"copy-transform\"], ALCHEMY_GLYPH_VIEWBOX[\"copy-transform\"]);\n","import {\n ContentTransferError,\n readTransferCell,\n sealTransferArtifact,\n serialize,\n type Artifact,\n type Draft,\n type FormatAdapter,\n type Json,\n type PageAction,\n type Payload,\n type TransferOutcome,\n} from \"@ai-matrx/kit/content-transfer\";\n\nexport type ContentTransferReference = {\n id: string;\n label: string;\n noun: string;\n items: Record<string, Json>[];\n};\n\nexport type ContentTransferReferencePort = {\n supports(reference: ContentTransferReference): boolean;\n build(reference: ContentTransferReference): string | Promise<string>;\n};\n\nexport type ContentTransferEmailPort = {\n send(\n artifact: Artifact,\n context: { label: string; signal: AbortSignal },\n ): Promise<TransferOutcome>;\n};\n\nconst exportableColumns = (payload: Extract<Payload, { kind: \"rows\" }>) =>\n payload.columns.filter(\n (column) =>\n column.visible &&\n column.exportable !== false &&\n column.classification !== \"secret\" &&\n column.classification !== \"credential\",\n );\n\n/** A sealed, projection-safe representation of a tabular draft's declared schema and values. */\nexport const tableSchemaFormat: FormatAdapter = {\n id: \"table-schema\",\n label: \"Schema\",\n supports: (payload) => payload.kind === \"rows\",\n async build(draft, signal) {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n if (draft.payload.kind !== \"rows\")\n throw new ContentTransferError(\n \"unsupported-format\",\n \"Schema + rows requires tabular content; manually edited text cannot carry a table schema.\",\n );\n const rowColumns = exportableColumns(draft.payload);\n const columns = rowColumns.map((column) => ({\n id: column.id,\n label: column.label,\n path: column.path,\n ...(column.schema === undefined ? {} : { schema: column.schema }),\n }));\n const body = {\n sourceId: draft.sourceId,\n columns,\n rows: draft.payload.rows.map((row) =>\n Object.fromEntries(rowColumns.map((column) => [column.id, readTransferCell(row, column) ?? null])),\n ),\n } satisfies Json;\n const plainText = JSON.stringify(body, null, 2);\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format: \"table-schema\",\n plainText,\n file: {\n filename: \"table-schema.json\",\n mime: \"application/json\",\n bytes: new TextEncoder().encode(plainText),\n },\n omissions: [...draft.omissions],\n });\n },\n};\n\nfunction displayLabels(payload: Extract<Payload, { kind: \"rows\" }>): [string, typeof payload.columns[number]][] {\n const columns = exportableColumns(payload);\n const counts = new Map<string, number>();\n for (const column of columns) counts.set(column.label, (counts.get(column.label) ?? 0) + 1);\n const used = new Set<string>();\n return columns.map((column) => {\n const base = counts.get(column.label) === 1 ? column.label : `${column.label} [${column.id}]`;\n let label = base;\n for (let suffix = 2; used.has(label); suffix += 1) label = `${base} (${suffix})`;\n used.add(label);\n return [label, column];\n });\n}\n\n/** Flat row JSON keyed by user-facing display labels, never raw table records. */\nexport const tableDataFormat: FormatAdapter = {\n id: \"table-data\",\n label: \"Table JSON\",\n supports: (payload) => payload.kind === \"rows\",\n async build(draft, signal) {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n if (draft.payload.kind !== \"rows\")\n throw new ContentTransferError(\"unsupported-format\", \"Display-label JSON requires tabular content.\");\n const columns = displayLabels(draft.payload);\n const plainText = JSON.stringify(\n draft.payload.rows.map((row) =>\n Object.fromEntries(columns.map(([label, column]) => [label, readTransferCell(row, column) ?? null])),\n ),\n null,\n 2,\n );\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format: \"json\",\n plainText,\n file: {\n filename: \"data.json\",\n mime: \"application/json;charset=utf-8\",\n bytes: new TextEncoder().encode(plainText),\n },\n omissions: [...draft.omissions],\n });\n },\n};\n\ntype EmailFormat = \"csv\" | \"json\" | \"markdown\";\nexport type TransferEmailAction = PageAction & { prepared: true; group: \"email\" };\n\nconst emailArtifact = (draft: Draft, format: EmailFormat, signal: AbortSignal, jsonFormat?: FormatAdapter): Promise<Artifact> =>\n format === \"json\" && jsonFormat?.supports(draft.payload)\n ? jsonFormat.build(draft, signal)\n : Promise.resolve(serialize(draft, format, { spreadsheetSafe: format === \"csv\" }));\n\n/** Prepared-only delivery actions always serialize the current draft, never a host source. */\nexport function createTransferEmailActions(\n email: ContentTransferEmailPort,\n options: { jsonFormat?: FormatAdapter } = {},\n): TransferEmailAction[] {\n return ([\"csv\", \"json\", \"markdown\"] as const).map((format) => ({\n id: `email-${format}`,\n label: `Email ${format === \"csv\" ? \"CSV\" : format === \"json\" ? \"JSON\" : \"Markdown\"}`,\n prepared: true,\n group: \"email\",\n supports: (_snapshot, draft) => Boolean(draft) && (format !== \"csv\" || draft?.payload.kind === \"rows\"),\n async run({ draft, signal, snapshot }) {\n if (signal.aborted) return { status: \"cancelled\" };\n const artifact = await emailArtifact(draft, format, signal, options.jsonFormat);\n return email.send(artifact, { label: snapshot.label, signal });\n },\n }));\n}\n","import type { AgentPayloadInput } from \"./copy-types\";\n\n/** Portable Copy-for-AI envelope. The UI never hands an agent bare JSON. */\nexport function tableAgentText(value: AgentPayloadInput | string): string {\n if (typeof value === \"string\") return value;\n const attributes = Object.entries(value.attributes ?? {})\n .filter(([, entry]) => entry !== null && entry !== undefined && entry !== \"\")\n .map(([key, entry]) => ` ${key}=\"${String(entry)}\"`)\n .join(\"\");\n const context = Object.entries(value.context ?? {})\n .filter(([, entry]) => entry !== null && entry !== undefined && entry !== \"\")\n .map(([key, entry]) => `<${key}>${String(entry)}</${key}>`)\n .join(\"\\n\");\n const url = typeof window === \"undefined\" ? \"\" : window.location.href;\n const route = typeof window === \"undefined\" ? \"\" : window.location.pathname;\n return `<${value.kind}${attributes}>\n<context>\n<location>${value.location}</location>\n${url ? `<url>${url}</url>` : \"\"}\n${route ? `<route>${route}</route>` : \"\"}\n<copied>${value.description}</copied>\n<copied-at>${new Date().toISOString()}</copied-at>\n${context}\n</context>\n${value.summary ? `<summary>\\n${value.summary}\\n</summary>\\n` : \"\"}<data format=\"json\">\n\\`\\`\\`json\n${JSON.stringify(value.data, null, 2)}\n\\`\\`\\`\n</data>\n</${value.kind}>`;\n}\n","\"use client\";\nimport { MatrxCopyMenu } from \"../content-transfer/matrx-copy\";\nimport { useMatrxDataTableHost } from \"./host\";\nimport type { CopyControlProps, ExportItem } from \"./copy-types\";\nexport type { AgentPayloadInput, AiCustomSource, AiVariant, CopyControlProps, CopySubsetColumn } from \"./copy-types\";\nexport { tableAgentText } from \"./copy-payload\";\n\n/** All portable row, selection, toolbar and detail copy controls use Alchemy.\n * Host ports remain explicit so installed applications can activate their\n * authenticated destinations when they adopt the published package. */\nexport function CopyButtons(props: CopyControlProps) {\n const { CopyControls } = useMatrxDataTableHost();\n const copyProps = props.export?.sheetRows\n ? { ...props, primarySource: \"table\" as const }\n : props;\n if (CopyControls) return <CopyControls {...copyProps} />;\n return <MatrxCopyMenu {...copyProps} />;\n}\nexport function jsonExportItem(build: () => unknown, label: string): ExportItem { return { id: \"json\", label, build: () => ({ content: JSON.stringify(build(), null, 2), extension: \"json\", mime: \"application/json\" }) }; }\n","\"use client\";\nimport { useState } from \"react\";\nimport { useClipboard } from \"@ai-matrx/kit/clipboard\";\nimport { Button } from \"../button\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"../dialog\";\nimport { tableAgentText } from \"./copy-payload\";\n\nimport { MatrxDataTable } from \"./MatrxDataTable\";\nimport { filterAndSortRows, getCellValue } from \"./filter-engine\";\nimport { rowsToCsvFromColumns, rowsToMarkdownTable } from \"./tableCopy\";\nimport { useTableNotice } from \"./useTableNotice\";\nimport type { MatrxColumnDef, MatrxDataTableQueryState } from \"./types\";\nimport type { AiVariant, CopySubsetSource } from \"./copy-types\";\n\nfunction CopySubsetDialog<T>({ source, onClose }: { source: CopySubsetSource<T>; onClose: () => void }) {\n // Snapshot the array on opening; shaping never changes the originating view.\n const [rows] = useState(() => [...source.rows]);\n const [hidden, setHidden] = useState(() => new Set(source.columns.filter((c) => c.hidden).map((c) => c.id)));\n const [selectedIds, setSelectedIds] = useState<string[]>([]);\n const [format, setFormat] = useState(\"ai\");\n const [query, setQuery] = useState<MatrxDataTableQueryState>({ page: 1, pageSize: 50, search: \"\", anyOf: \"\", columnFilters: {}, sort: null });\n const { notify, notice } = useTableNotice();\n const clipboard = useClipboard({ notify: (message, kind) => notify[kind](message) });\n const columns: MatrxColumnDef<T>[] = source.columns.filter((c) => !hidden.has(c.id));\n const matched = filterAndSortRows(rows, columns, query.columnFilters, query.sort, query.search, undefined, query.layeredFilters, query.searchMatchMode ?? \"contains\");\n const selected = new Set(selectedIds);\n const shaped = selected.size ? matched.filter((row) => selected.has(source.getRowId(row))) : matched;\n const records = shaped.map((row) => Object.fromEntries(columns.map((col) => [String(col.header), getCellValue(row, col)])));\n let text = \"\";\n let buildError: string | null = null;\n try {\n text = format === \"csv\" ? rowsToCsvFromColumns(shaped, columns)\n : format === \"markdown\" ? rowsToMarkdownTable(shaped, columns)\n : format === \"json\" ? JSON.stringify(records, null, 2)\n : tableAgentText({ ...(source.serializer ? source.serializer(shaped) : { kind: source.kind, location: source.location, description: source.label }), data: records });\n } catch (raw) { buildError = raw instanceof Error ? raw.message : String(raw); }\n return <Dialog open onOpenChange={(open) => { if (!open) onClose(); }}><DialogContent className=\"matrx-alchemy-workspace matrx-alchemy-subset\"><DialogHeader><DialogTitle>Filter & sort before copying</DialogTitle></DialogHeader>\n <div className=\"matrx-alchemy-workspace-body matrx-alchemy-subset-body\"><fieldset className=\"matrx-alchemy-subset-columns\"><legend>Visible columns</legend>{source.columns.map((column) => <label key={column.id} className=\"mr-3 inline-flex items-center gap-1\"><input type=\"checkbox\" checked={!hidden.has(column.id)} onChange={() => setHidden((current) => { const next = new Set(current); next.has(column.id) ? next.delete(column.id) : next.add(column.id); return next; })} />{column.header}</label>)}</fieldset>\n {columns.length ? <div className=\"matrx-alchemy-subset-table\"><MatrxDataTable copy={false} data={rows} columns={columns} getRowId={source.getRowId} query={{ mode: \"controlled-local\", state: query, onStateChange: setQuery }} selection={{ selectedIds, onSelectedIdsChange: setSelectedIds }} detail={{ enabled: false }} window={{ enabled: false }} toolbar={{ searchMatch: {} }} /></div> : <p>Show at least one column to copy.</p>}\n {buildError ? <p role=\"alert\" className=\"text-destructive\">{buildError}</p> : null}{notice}</div>\n <DialogFooter><label className=\"matrx-alchemy-subset-format\">Format<select aria-label=\"Copy format\" value={format} onChange={(event) => setFormat(event.target.value)}><option value=\"ai\">For AI</option><option value=\"markdown\">Markdown</option><option value=\"csv\">CSV</option><option value=\"json\">JSON</option></select></label><span role=\"status\" className=\"text-xs\">{shaped.length} of {rows.length} rows · {columns.length} columns · {text.length.toLocaleString()} characters</span><Button type=\"button\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" onClick={onClose}>Close</Button><Button type=\"button\" className=\"matrx-alchemy-workspace-primary\" disabled={buildError !== null || !columns.length || !shaped.length} onClick={() => void clipboard.copyText(text, `${source.label} copied`)}>Copy subset</Button></DialogFooter>\n </DialogContent></Dialog>;\n}\nexport function useCopySubsetVariant<T>() {\n return (getSource: () => CopySubsetSource<T>): AiVariant => ({ id: \"copy-subset\", label: \"Filter & sort before copying\", section: \"ai\", modal: ({ open, onOpenChange }) => open ? <CopySubsetDialog source={getSource()} onClose={() => onOpenChange(false)} /> : null });\n}\n","/**\n * Shared vocabulary for ordered, AND-combined table filters. The same rule\n * shape is URL-safe, can be evaluated by local tables, and can be handed to a\n * controlled table's server query without a surface inventing another query\n * builder.\n */\n\nimport { z } from \"zod\";\nimport type { ColumnFiltersState } from \"./types\";\n\nexport const LAYERED_FILTER_OPERATORS = [\n \"contains\",\n \"not_contains\",\n \"equals\",\n \"not_equals\",\n \"starts_with\",\n \"ends_with\",\n \"word\",\n \"not_word\",\n \"is_empty\",\n \"is_not_empty\",\n \"greater_than\",\n \"greater_or_equal\",\n \"less_than\",\n \"less_or_equal\",\n \"between\",\n] as const;\n\nexport type LayeredFilterOperator = (typeof LAYERED_FILTER_OPERATORS)[number];\n\nexport interface LayeredFilterRule {\n id: string;\n field: string;\n operator: LayeredFilterOperator;\n value: string;\n valueTo?: string | undefined;\n}\n\nexport type LayeredFilterField =\n | {\n id: string;\n label: string;\n kind: \"text\";\n operators?: LayeredFilterOperator[];\n }\n | {\n id: string;\n label: string;\n kind: \"number\";\n operators?: LayeredFilterOperator[];\n placeholder?: string;\n }\n | {\n id: string;\n label: string;\n kind: \"select\";\n operators?: LayeredFilterOperator[];\n options: Array<{ value: string; label: string }>;\n };\n\nconst layeredFilterRuleSchema = z.object({\n id: z.string().min(1),\n field: z.string().min(1),\n operator: z.enum(LAYERED_FILTER_OPERATORS),\n value: z.string(),\n valueTo: z.string().optional(),\n});\n\nconst layeredFilterRulesSchema = z.array(layeredFilterRuleSchema).max(20);\n\nconst TEXT_OPERATORS: LayeredFilterOperator[] = [\n \"contains\",\n \"not_contains\",\n \"equals\",\n \"not_equals\",\n \"starts_with\",\n \"ends_with\",\n \"word\",\n \"not_word\",\n \"is_empty\",\n \"is_not_empty\",\n];\n\nconst NUMBER_OPERATORS: LayeredFilterOperator[] = [\n \"equals\",\n \"not_equals\",\n \"greater_than\",\n \"greater_or_equal\",\n \"less_than\",\n \"less_or_equal\",\n \"between\",\n \"is_empty\",\n \"is_not_empty\",\n];\n\nconst SELECT_OPERATORS: LayeredFilterOperator[] = [\n \"equals\",\n \"not_equals\",\n \"is_empty\",\n \"is_not_empty\",\n];\n\nexport const LAYERED_FILTER_OPERATOR_LABELS: Record<\n LayeredFilterOperator,\n string\n> = {\n contains: \"contains\",\n not_contains: \"doesn't contain\",\n equals: \"is\",\n not_equals: \"is not\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n word: \"has the word\",\n not_word: \"doesn't have the word\",\n is_empty: \"is empty\",\n is_not_empty: \"is not empty\",\n greater_than: \"is greater than\",\n greater_or_equal: \"is at least\",\n less_than: \"is less than\",\n less_or_equal: \"is at most\",\n between: \"is between\",\n};\n\nexport function operatorsForLayeredField(\n field: LayeredFilterField,\n): LayeredFilterOperator[] {\n if (field.operators) return field.operators;\n if (field.kind === \"number\") return NUMBER_OPERATORS;\n if (field.kind === \"select\") return SELECT_OPERATORS;\n return TEXT_OPERATORS;\n}\n\nexport function layeredFilterNeedsValue(\n operator: LayeredFilterOperator,\n): boolean {\n return operator !== \"is_empty\" && operator !== \"is_not_empty\";\n}\n\nexport function isCompleteLayeredFilterRule(rule: LayeredFilterRule): boolean {\n if (!layeredFilterNeedsValue(rule.operator)) return true;\n if (rule.value.trim() === \"\") return false;\n return rule.operator !== \"between\" || Boolean(rule.valueTo?.trim());\n}\n\nexport function completeLayeredFilterRules(\n rules: readonly LayeredFilterRule[] | undefined,\n): LayeredFilterRule[] {\n return (rules ?? []).filter(isCompleteLayeredFilterRule);\n}\n\nexport function isLayeredFilterOperator(\n value: string,\n): value is LayeredFilterOperator {\n return LAYERED_FILTER_OPERATORS.some((operator) => operator === value);\n}\n\n/** Decode URL-owned rules without trusting a hand-edited link. */\nexport function decodeLayeredFilterRules(\n raw: string | null,\n): LayeredFilterRule[] {\n if (!raw) return [];\n try {\n const parsed: unknown = JSON.parse(raw);\n const result = layeredFilterRulesSchema.safeParse(parsed);\n return result.success ? result.data : [];\n } catch {\n return [];\n }\n}\n\n/** Stable compact URL/wire form; rule order is preserved. */\nexport function encodeLayeredFilterRules(\n rules: readonly LayeredFilterRule[] | undefined,\n): string | null {\n return rules?.length ? JSON.stringify(rules) : null;\n}\n\n/**\n * Translate ordinary per-column controls into the same ordered rule language\n * used by the advanced builder. Controlled tables can send these rules to one\n * server evaluator instead of rebuilding numeric/text filter semantics.\n * Select filters are intentionally omitted because their multi-select control\n * is OR-combined and should stay in its native query parameter.\n */\nexport function columnFiltersToLayeredRules(\n filters: ColumnFiltersState,\n fieldIds: readonly string[],\n): LayeredFilterRule[] {\n const rules: LayeredFilterRule[] = [];\n for (const field of fieldIds) {\n const filter = filters[field];\n if (!filter) continue;\n\n if (filter.kind === \"text\") {\n rules.push({\n id: `column-${field}`,\n field,\n operator:\n filter.mode === \"empty\"\n ? \"is_empty\"\n : filter.mode === \"not_empty\"\n ? \"is_not_empty\"\n : \"contains\",\n value: filter.value,\n });\n continue;\n }\n\n if (filter.kind === \"number\") {\n if (filter.min !== undefined && filter.max !== undefined) {\n rules.push({\n id: `column-${field}`,\n field,\n operator: \"between\",\n value: String(filter.min),\n valueTo: String(filter.max),\n });\n } else if (filter.min !== undefined) {\n rules.push({\n id: `column-${field}`,\n field,\n operator: \"greater_or_equal\",\n value: String(filter.min),\n });\n } else if (filter.max !== undefined) {\n rules.push({\n id: `column-${field}`,\n field,\n operator: \"less_or_equal\",\n value: String(filter.max),\n });\n }\n continue;\n }\n\n if (filter.kind === \"boolean\") {\n rules.push({\n id: `column-${field}`,\n field,\n operator: \"equals\",\n value: String(filter.value),\n });\n }\n }\n return rules;\n}\n\nfunction normalizedText(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n return String(value).trim().toLocaleLowerCase();\n}\n\nfunction words(value: string): string[] {\n return value.split(/[^\\p{L}\\p{N}]+/u).filter(Boolean);\n}\n\n/** Local-table evaluator. Controlled tables send the same rule shape server-side. */\nexport function layeredFilterMatchesValue(\n value: unknown,\n rule: LayeredFilterRule,\n): boolean {\n const actual = normalizedText(value);\n const expected = rule.value.trim().toLocaleLowerCase();\n const expectedTo = rule.valueTo?.trim().toLocaleLowerCase() ?? \"\";\n\n switch (rule.operator) {\n case \"contains\":\n return actual.includes(expected);\n case \"not_contains\":\n return !actual.includes(expected);\n case \"equals\":\n return actual === expected;\n case \"not_equals\":\n return actual !== expected;\n case \"starts_with\":\n return actual.startsWith(expected);\n case \"ends_with\":\n return actual.endsWith(expected);\n case \"word\":\n return words(actual).includes(expected);\n case \"not_word\":\n return !words(actual).includes(expected);\n case \"is_empty\":\n return actual === \"\";\n case \"is_not_empty\":\n return actual !== \"\";\n case \"greater_than\":\n return Number(actual) > Number(expected);\n case \"greater_or_equal\":\n return Number(actual) >= Number(expected);\n case \"less_than\":\n return Number(actual) < Number(expected);\n case \"less_or_equal\":\n return Number(actual) <= Number(expected);\n case \"between\": {\n const numeric = Number(actual);\n return numeric >= Number(expected) && numeric <= Number(expectedTo);\n }\n }\n}\n\nexport function layeredFilterRuleSummary(\n rule: LayeredFilterRule,\n fields: readonly LayeredFilterField[],\n): string {\n const field = fields.find((candidate) => candidate.id === rule.field);\n const fieldLabel = field?.label ?? rule.field;\n const operator = LAYERED_FILTER_OPERATOR_LABELS[rule.operator];\n if (!layeredFilterNeedsValue(rule.operator))\n return `${fieldLabel} ${operator}`;\n const selectedLabel =\n field?.kind === \"select\"\n ? field.options.find((option) => option.value === rule.value)?.label\n : undefined;\n const value = selectedLabel ?? rule.value;\n return rule.operator === \"between\"\n ? `${fieldLabel} ${operator} ${value} and ${rule.valueTo ?? \"\"}`\n : `${fieldLabel} ${operator} ${value}`;\n}\n","import type {\n ColumnFilterValue,\n ColumnFiltersState,\n MatrxColumnDef,\n SortState,\n TableSearchMatchMode,\n} from \"./types\";\nimport {\n completeLayeredFilterRules,\n layeredFilterMatchesValue,\n type LayeredFilterRule,\n} from \"./layered-filters\";\n\n/**\n * Sentinel select-filter values for \"no value\" / \"any value\" — every select\n * filter offers them automatically when the column has empty cells, so any\n * table can isolate rows missing a value (or having one) without extra config.\n */\nexport const SELECT_EMPTY_VALUE = \"__empty__\";\nexport const SELECT_NOT_EMPTY_VALUE = \"__not_empty__\";\n\nexport function columnId<T>(col: MatrxColumnDef<T>): string {\n if (col.id) return col.id;\n if (col.accessorKey) return String(col.accessorKey);\n throw new Error(\"MatrxDataTable column requires `id` or `accessorKey`\");\n}\n\nexport function getCellValue<T>(row: T, col: MatrxColumnDef<T>): unknown {\n if (col.accessorFn) return col.accessorFn(row);\n if (col.accessorKey) {\n return (row as Record<string, unknown>)[col.accessorKey];\n }\n return undefined;\n}\n\nexport function getFilterValue<T>(row: T, col: MatrxColumnDef<T>): unknown {\n return col.filterValue ? col.filterValue(row) : getCellValue(row, col);\n}\n\nexport function getSortValue<T>(row: T, col: MatrxColumnDef<T>): unknown {\n return col.sortValue ? col.sortValue(row) : getCellValue(row, col);\n}\n\nexport function stringifyCellValue(value: unknown): string {\n if (value == null) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value instanceof Date) return value.toISOString();\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/** Unicode-aware tokenization shared by whole-word table search. */\nexport function tableSearchWords(value: string): string[] {\n return value\n .toLocaleLowerCase()\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter(Boolean);\n}\n\n/**\n * Match the primary table search against one row's searchable text. In\n * whole-word mode every entered word must exist as a complete token, so\n * `are` matches `we are ready` but never `hardware`.\n */\nexport function matchesTableSearch(\n searchableText: string,\n query: string,\n mode: TableSearchMatchMode = \"contains\",\n): boolean {\n const normalizedQuery = query.trim().toLocaleLowerCase();\n if (!normalizedQuery) return true;\n if (mode === \"contains\") {\n return searchableText.toLocaleLowerCase().includes(normalizedQuery);\n }\n const actualWords = new Set(tableSearchWords(searchableText));\n const expectedWords = tableSearchWords(normalizedQuery);\n return (\n expectedWords.length > 0 &&\n expectedWords.every((word) => actualWords.has(word))\n );\n}\n\nfunction compareValues(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"boolean\" && typeof b === \"boolean\") {\n return Number(a) - Number(b);\n }\n return stringifyCellValue(a).localeCompare(stringifyCellValue(b), undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n}\n\n/** Select filters treat array-valued cells as sets, never as serialized JSON choices. */\nexport function selectCellValues(value: unknown): string[] {\n return (Array.isArray(value) ? value : [value])\n .map(stringifyCellValue)\n .filter((item) => item !== \"\");\n}\n\nexport function passesColumnFilter(\n value: unknown,\n filter: ColumnFilterValue,\n): boolean {\n const matches = (() => {\n switch (filter.kind) {\n case \"text\": {\n const s = stringifyCellValue(value);\n if (filter.mode === \"null\") return value == null;\n if (filter.mode === \"not_null\") return value != null;\n if (filter.mode === \"empty\") return s.trim() === \"\";\n if (filter.mode === \"not_empty\") return s.trim() !== \"\";\n const q = filter.value.trim().toLowerCase();\n if (!q) return true;\n return s.toLowerCase().includes(q);\n }\n case \"select\": {\n const selected =\n filter.values ??\n (filter.value && filter.value !== \"__all__\" ? [filter.value] : []);\n if (selected.length === 0) return true;\n const values = selectCellValues(value);\n // OR semantics across the set; sentinels compose (\"A or (empty)\").\n return selected.some((v) =>\n v === SELECT_EMPTY_VALUE\n ? values.length === 0\n : v === SELECT_NOT_EMPTY_VALUE\n ? values.length > 0\n : values.includes(v),\n );\n }\n case \"boolean\": {\n return Boolean(value) === filter.value;\n }\n case \"number\": {\n const n =\n typeof value === \"number\"\n ? value\n : Number(stringifyCellValue(value).replace(/[^0-9.-]/g, \"\"));\n if (Number.isNaN(n)) return false;\n if (filter.min !== undefined && n < filter.min) return false;\n if (filter.max !== undefined && n > filter.max) return false;\n return true;\n }\n }\n })();\n return filter.negated ? !matches : matches;\n}\n\nexport function filterAndSortRows<T>(\n rows: T[],\n columns: MatrxColumnDef<T>[],\n columnFilters: ColumnFiltersState,\n sort: SortState | null,\n globalSearch: string,\n anyOf?: { columnIds: string[]; query: string },\n layeredFilters?: readonly LayeredFilterRule[],\n globalSearchMode: TableSearchMatchMode = \"contains\",\n searchText?: (row: T) => string,\n): T[] {\n const colById = new Map(columns.map((c) => [columnId(c), c]));\n const q = globalSearch.trim().toLowerCase();\n const anyQ = anyOf?.query.trim().toLowerCase() ?? \"\";\n const activeLayeredFilters = completeLayeredFilterRules(layeredFilters);\n\n let result = rows.filter((row) => {\n for (const [id, filter] of Object.entries(columnFilters)) {\n if (!filter) continue;\n const col = colById.get(id);\n if (!col || col.filter === false) continue;\n if (!passesColumnFilter(getFilterValue(row, col), filter)) return false;\n }\n\n for (const rule of activeLayeredFilters) {\n const col = colById.get(rule.field);\n if (!col || !layeredFilterMatchesValue(getFilterValue(row, col), rule)) {\n return false;\n }\n }\n\n if (anyQ && anyOf) {\n const hit = anyOf.columnIds.some((id) => {\n const col = colById.get(id);\n if (!col) return false;\n return stringifyCellValue(getFilterValue(row, col))\n .toLowerCase()\n .includes(anyQ);\n });\n if (!hit) return false;\n }\n\n if (!q) return true;\n const searchableValues = columns\n .filter(\n (col) =>\n col.filter !== false || Boolean(col.accessorKey || col.accessorFn),\n )\n .map((col) => stringifyCellValue(getFilterValue(row, col)));\n const additionalSearchText = searchText?.(row);\n if (additionalSearchText) searchableValues.push(additionalSearchText);\n if (globalSearchMode === \"contains\") {\n return searchableValues.some((value) =>\n matchesTableSearch(value, q, \"contains\"),\n );\n }\n return matchesTableSearch(searchableValues.join(\" \"), q, \"whole_words\");\n });\n\n if (sort) {\n const col = colById.get(sort.id);\n if (col && col.sortable !== false) {\n const dir = sort.direction === \"asc\" ? 1 : -1;\n result = [...result].sort((a, b) => {\n const va = getSortValue(a, col);\n const vb = getSortValue(b, col);\n // Empty cells (null / \"\") sort LAST in both directions — sorting a\n // column should surface its values, never a wall of blanks.\n const ea = va == null || stringifyCellValue(va) === \"\";\n const eb = vb == null || stringifyCellValue(vb) === \"\";\n if (ea !== eb) return ea ? 1 : -1;\n return compareValues(va, vb) * dir;\n });\n }\n }\n\n return result;\n}\n\nexport function countActiveColumnFilters(filters: ColumnFiltersState): number {\n let n = 0;\n for (const f of Object.values(filters)) {\n if (!f) continue;\n switch (f.kind) {\n case \"text\":\n if (f.value.trim() || (f.mode && f.mode !== \"contains\")) n += 1;\n break;\n case \"select\":\n if (f.values ? f.values.length > 0 : f.value && f.value !== \"__all__\")\n n += 1;\n break;\n case \"boolean\":\n n += 1;\n break;\n case \"number\":\n if (f.min !== undefined || f.max !== undefined) n += 1;\n break;\n }\n }\n return n;\n}\n\nexport function isColumnFilterActive(\n filter: ColumnFilterValue | undefined,\n): boolean {\n if (!filter) return false;\n switch (filter.kind) {\n case \"text\":\n return (\n filter.value.trim().length > 0 ||\n (filter.mode !== undefined && filter.mode !== \"contains\")\n );\n case \"select\":\n return filter.values\n ? filter.values.length > 0\n : Boolean(filter.value) && filter.value !== \"__all__\";\n case \"boolean\":\n return true;\n case \"number\":\n return filter.min !== undefined || filter.max !== undefined;\n }\n}\n\n/** Apply draft edits onto a row for display (shallow field merge). */\nexport function applyRowEdits<T>(\n row: T,\n edits: Record<string, unknown> | undefined,\n): T {\n if (!edits || Object.keys(edits).length === 0) return row;\n return { ...row, ...edits };\n}\n","import type { AgentPayloadInput } from \"./copy\";\nimport { normalizeTransferJson } from \"@ai-matrx/kit/content-transfer\";\nimport type { MatrxColumnDef, MatrxDataTableCopyConfig } from \"./types\";\nimport { columnId, getCellValue, stringifyCellValue } from \"./filter-engine\";\n\n/**\n * Typed, declared-column capture for MatrxDataTable's built-in Alchemy source.\n * It deliberately runs only at the transfer boundary: accessor functions can\n * throw useful capture errors, and rendering never evaluates them for copying.\n */\nexport function projectDefaultTableCopyRow<T>(\n row: T,\n columns: MatrxColumnDef<T>[],\n): Record<string, unknown> {\n const record: Record<string, unknown> = Object.create(null) as Record<string, unknown>;\n for (const column of columns) {\n const value = getCellValue(row, column);\n if (value !== undefined) record[columnId(column)] = value;\n }\n return normalizeTransferJson(record, { omitUndefinedObjectProperties: true }) as Record<string, unknown>;\n}\n\n/** Builds the default table's AI envelope from one already validated capture. */\nexport function buildDefaultTableViewAgentInput<T>(\n config: MatrxDataTableCopyConfig<T>,\n rows: T[],\n all: T[],\n columns: MatrxColumnDef<T>[],\n meta?: Parameters<typeof buildViewAgentInput<T>>[3],\n): AgentPayloadInput {\n const projected = rows.map((row) => projectDefaultTableCopyRow(row, columns));\n return {\n kind: config.listKind,\n location: config.location,\n description:\n meta?.scope === \"selected\"\n ? `${projected.length} selected ${projected.length === 1 ? config.label : (config.listLabel ?? `${config.label} rows`)}.`\n : (config.listDescription ?? `${config.listLabel ?? config.label} — current filtered/sorted view.`),\n data: projected,\n summary: projected.map((record) => formatDefaultTableCopyRecord(record, columns)).join(\"\\n---\\n\"),\n attributes: {\n visible_count: projected.length,\n total_count: all.length,\n search: meta?.search || undefined,\n search_match: meta?.search ? meta.searchMatchMode : undefined,\n any_of: meta?.anyOf || undefined,\n active_filters: meta?.filterCount ?? 0,\n sort: meta?.sort || undefined,\n scope: meta?.scope ?? \"view\",\n ...config.listAttributes?.(rows, all),\n },\n ...(config.listContext ? { context: config.listContext(rows, all) } : {}),\n };\n}\n\n/** Builds the default row AI envelope from one validated projection. */\nexport function buildDefaultTableRowAgentInput<T>(\n config: MatrxDataTableCopyConfig<T>,\n row: T,\n columns: MatrxColumnDef<T>[],\n): AgentPayloadInput {\n const projected = projectDefaultTableCopyRow(row, columns);\n return {\n kind: config.rowKind,\n location: config.location,\n description: config.rowDescription ?? `One ${config.label} row.`,\n data: projected,\n summary: formatDefaultTableCopyRecord(projected, columns),\n ...(config.rowAttributes ? { attributes: config.rowAttributes(row) } : {}),\n };\n}\n\nexport function formatDefaultTableCopyRecord<T>(\n record: Record<string, unknown>,\n columns: MatrxColumnDef<T>[],\n): string {\n return columns\n .map((column) => {\n const id = columnId(column);\n const label = column.label ?? (typeof column.header === \"string\" ? column.header : id);\n return `${label}: ${stringifyCellValue(record[id])}`;\n })\n .join(\"\\n\");\n}\n\n/** Human markdown table of the current view (visible columns × rows). */\nexport function rowsToMarkdownTable<T>(\n rows: T[],\n columns: MatrxColumnDef<T>[],\n): string {\n const cols = columns.filter((c) => c.filter !== false || c.accessorKey);\n if (cols.length === 0) return \"\";\n const headers = cols.map((c) => {\n if (typeof c.header === \"string\") return c.header;\n return columnId(c);\n });\n const lines = [\n `| ${headers.join(\" | \")} |`,\n `| ${headers.map(() => \"---\").join(\" | \")} |`,\n ];\n for (const row of rows) {\n const cells = cols.map((c) =>\n stringifyCellValue(getCellValue(row, c)).replace(/\\|/g, \"\\\\|\"),\n );\n lines.push(`| ${cells.join(\" | \")} |`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function buildRowAgentInput<T>(\n config: MatrxDataTableCopyConfig<T>,\n row: T,\n): AgentPayloadInput {\n return {\n kind: config.rowKind,\n location: config.location,\n description: config.rowDescription ?? `One ${config.label} row.`,\n data: config.agentRow ? config.agentRow(row) : row,\n summary: config.humanRow(row),\n ...(config.rowAttributes ? { attributes: config.rowAttributes(row) } : {}),\n };\n}\n\nexport function buildViewAgentInput<T>(\n config: MatrxDataTableCopyConfig<T>,\n visible: T[],\n all: T[],\n meta?: {\n search?: string;\n searchMatchMode?: string;\n anyOf?: string;\n filterCount?: number;\n sort?: string | null;\n /** `custom` = shaped in the copy-subset window (filter & sort before copying). */\n scope?: \"view\" | \"selected\" | \"custom\";\n },\n): AgentPayloadInput {\n return {\n kind: config.listKind,\n location: config.location,\n description:\n meta?.scope === \"selected\"\n ? `${visible.length} selected ${visible.length === 1 ? config.label : (config.listLabel ?? `${config.label} rows`)}.`\n : (config.listDescription ??\n `${config.listLabel ?? config.label} — current filtered/sorted view.`),\n data: visible.map((r) => (config.agentRow ? config.agentRow(r) : r)),\n summary: visible.map((r) => config.humanRow(r)).join(\"\\n---\\n\"),\n attributes: {\n visible_count: visible.length,\n total_count: all.length,\n search: meta?.search || undefined,\n search_match: meta?.search ? meta.searchMatchMode : undefined,\n any_of: meta?.anyOf || undefined,\n active_filters: meta?.filterCount ?? 0,\n sort: meta?.sort || undefined,\n scope: meta?.scope ?? \"view\",\n ...config.listAttributes?.(visible, all),\n },\n ...(config.listContext ? { context: config.listContext(visible, all) } : {}),\n };\n}\n\n/** CSV of the current view (visible columns × rows), for ExportMenu. */\nexport function rowsToCsvFromColumns<T>(\n rows: T[],\n columns: MatrxColumnDef<T>[],\n): string {\n const cols = columns.filter((c) => c.filter !== false || c.accessorKey);\n const escape = (value: string) =>\n /[\",\\n\\r]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n const lines = [\n cols\n .map((c) => escape(typeof c.header === \"string\" ? c.header : columnId(c)))\n .join(\",\"),\n ];\n for (const row of rows) {\n lines.push(\n cols\n .map((c) => escape(stringifyCellValue(getCellValue(row, c))))\n .join(\",\"),\n );\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * The same rows the CSV export produces, as records — the shape a Google Sheet\n * (or any other row destination) takes.\n *\n * It shares `rowsToCsvFromColumns`'s column selection and cell stringification\n * ON PURPOSE: a user who exports the view as CSV and a user who sends it to a\n * Sheet must get the SAME columns, in the same order, with the same values.\n * Two independent row builders is how those two answers start disagreeing.\n */\nexport function rowsToRecordsFromColumns<T>(\n rows: T[],\n columns: MatrxColumnDef<T>[],\n): Array<Record<string, unknown>> {\n const cols = columns.filter((c) => c.filter !== false || c.accessorKey);\n const headers = cols.map((c) =>\n typeof c.header === \"string\" ? c.header : columnId(c),\n );\n return rows.map((row) => {\n const record: Record<string, unknown> = {};\n cols.forEach((c, index) => {\n record[headers[index] ?? columnId(c)] = stringifyCellValue(getCellValue(row, c));\n });\n return record;\n });\n}\n\nexport function buildViewHuman<T>(\n config: MatrxDataTableCopyConfig<T>,\n visible: T[],\n columns: MatrxColumnDef<T>[],\n): string {\n const md = rowsToMarkdownTable(visible, columns);\n const summaries = visible.map((r) => config.humanRow(r)).join(\"\\n\\n\");\n return [\n `${config.listLabel ?? config.label} (${visible.length} rows)`,\n \"\",\n md,\n \"\",\n \"---\",\n \"\",\n summaries,\n ].join(\"\\n\");\n}\n","\"use client\";\nimport { useEffect } from \"react\";\nexport function useClippedContentGuard(ref: React.RefObject<HTMLElement | null>, options: { label: string; enabled?: boolean; onDiagnostic?: (message: string) => void }) {\n useEffect(() => { if (!options.enabled || !ref.current) return; const node = ref.current; const check = () => { if (node.scrollHeight > node.clientHeight && node.clientHeight === 0) options.onDiagnostic?.(`${options.label} has no visible height`); }; check(); const observer = new ResizeObserver(check); observer.observe(node); return () => observer.disconnect(); }, [ref, options]);\n}\n","\"use client\";\n\n/**\n * useTableUrlState — the ONE owner of controlled MatrxDataTable query state\n * that mirrors to the URL.\n *\n * `MatrxDataTableQueryState`'s own doc-comment says controlled callers \"may\n * mirror it to URL search params and use it as part of a direct\n * database-query cache key\" — this hook is that sentence made a primitive, so\n * no surface hand-rolls its own searchParams plumbing (or worse, loses\n * back/forward + shareable-link behavior by keeping the state in a bare\n * useState).\n *\n * Contract:\n * - `state` — the live query state; pass to `query={{ mode: \"controlled\", state, … }}`.\n * - `queryState` — same shape with SEARCH debounced (300ms); use as the input\n * to the data-fetching hook so keystrokes don't fan out into per-character\n * server queries. Page/sort/filter changes pass through immediately.\n * - `onStateChange` — hand to the table verbatim.\n *\n * URL params (all omitted at their defaults, so a pristine table has a clean\n * URL): `p` page, `ps` pageSize, `q` search, `match` search match mode,\n * `any` any-of search, `scope` intelligent-search scope, `sort` \"<id>.<asc|desc>\", `f` JSON-encoded column\n * filters, and `lf` JSON-encoded layered filters. User changes push native\n * history entries without a server round-trip, so Back/Forward restores the\n * exact table view instead of only restoring the route.\n *\n * This is deliberately VIEW-QUERY state (search, filters, page) — ephemeral,\n * shareable via link, never persisted. View STYLE (density, columns, view)\n * belongs to `useListViewPrefs` (lib/list-views), a different axis.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n ColumnFiltersState,\n MatrxDataTableQueryState,\n SortState,\n} from \"./types\";\nimport type { LayeredFilterRule } from \"./layered-filters\";\nimport {\n commitUrlParams,\n type UrlHistoryMode,\n useUrlSearchParams,\n} from \"@ai-matrx/kit/url-state\";\n\nexport interface UseTableUrlStateOptions {\n /** Stable table id used in `table.<id>.*` parameters. */\n tableId: string;\n /** Initial sort when the URL carries none. Default: none. */\n defaultSort?: SortState | null;\n /** Default page size (also the \"omit from URL\" value). Default 25. */\n defaultPageSize?: number;\n /** Debounce for `queryState.search`, ms. Default 300. */\n searchDebounceMs?: number;\n /** Browser history behavior for table transitions. Default: `push`. */\n history?: UrlHistoryMode;\n /** Rapid text edits push once, then replace by default. */\n textHistory?: \"session\" | UrlHistoryMode;\n}\n\nexport interface TableUrlState {\n /** Live state — pass to the table's controlled `query.state`. */\n state: MatrxDataTableQueryState;\n /** Search-debounced state — feed the data-fetching layer. */\n queryState: MatrxDataTableQueryState;\n /** Pass to the table's controlled `query.onStateChange`. */\n onStateChange: (next: MatrxDataTableQueryState) => void;\n /** Reset to defaults (clears the mirrored URL params too). */\n reset: () => void;\n}\n\nfunction parseSort(raw: string | null): SortState | null {\n if (!raw) return null;\n const at = raw.lastIndexOf(\".\");\n if (at <= 0) return null;\n const direction = raw.slice(at + 1);\n if (direction !== \"asc\" && direction !== \"desc\") return null;\n return { id: raw.slice(0, at), direction };\n}\n\nfunction parseObject<T extends object>(raw: string | null, fallback: T): T {\n if (!raw) return fallback;\n try {\n const parsed: unknown = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as T;\n }\n } catch {\n // A hand-mangled URL is not an error state — fall through to empty.\n }\n return fallback;\n}\n\nfunction parseLayeredFilters(raw: string | null): LayeredFilterRule[] {\n if (!raw) return [];\n try {\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as LayeredFilterRule[]) : [];\n } catch {\n return [];\n }\n}\n\nfunction positiveInt(raw: string | null, fallback: number): number {\n const n = raw ? Number.parseInt(raw, 10) : Number.NaN;\n return Number.isFinite(n) && n > 0 ? n : fallback;\n}\n\nexport function tableUrlParamPrefix(tableId: string): string {\n if (!/^[a-z][a-z0-9-]{0,63}$/.test(tableId)) {\n throw new Error(\n `MatrxDataTable urlState.id must match /^[a-z][a-z0-9-]{0,63}$/; received \"${tableId}\".`,\n );\n }\n return `table.${tableId}`;\n}\n\nexport function useTableUrlState(\n options: UseTableUrlStateOptions,\n): TableUrlState {\n const {\n tableId,\n defaultSort = null,\n defaultPageSize = 25,\n searchDebounceMs = 300,\n history = \"push\",\n textHistory = \"session\",\n } = options;\n const prefix = tableUrlParamPrefix(tableId);\n const key = useCallback((name: string) => `${prefix}.${name}`, [prefix]);\n const defaultSortId = defaultSort?.id;\n const defaultSortDirection = defaultSort?.direction;\n\n const searchParams = useUrlSearchParams();\n const readState = useCallback(\n (params: Pick<URLSearchParams, \"get\">): MatrxDataTableQueryState => {\n const initialSort =\n defaultSortId && defaultSortDirection\n ? { id: defaultSortId, direction: defaultSortDirection }\n : null;\n return {\n page: positiveInt(params.get(key(\"p\")), 1),\n pageSize: positiveInt(params.get(key(\"ps\")), defaultPageSize),\n search: params.get(key(\"q\")) ?? \"\",\n searchMatchMode:\n params.get(key(\"match\")) === \"whole_words\"\n ? \"whole_words\"\n : \"contains\",\n ...(params.get(key(\"scope\"))\n ? { searchScope: params.get(key(\"scope\"))! }\n : {}),\n anyOf: params.get(key(\"any\")) ?? \"\",\n layeredFilters: parseLayeredFilters(params.get(key(\"lf\"))),\n columnFilters: parseObject<ColumnFiltersState>(\n params.get(key(\"f\")),\n {},\n ),\n sort: parseSort(params.get(key(\"sort\"))) ?? initialSort,\n };\n },\n [defaultPageSize, defaultSortDirection, defaultSortId, key],\n );\n\n const state = readState(searchParams);\n const lastTextWriteAt = useRef(0);\n\n const [debouncedSearch, setDebouncedSearch] = useState(state.search);\n useEffect(() => {\n if (state.search === debouncedSearch) return;\n const timer = window.setTimeout(\n () => setDebouncedSearch(state.search),\n searchDebounceMs,\n );\n return () => window.clearTimeout(timer);\n }, [state.search, debouncedSearch, searchDebounceMs]);\n\n const writeState = useCallback(\n (nextState: MatrxDataTableQueryState, mode: UrlHistoryMode = history) => {\n const params = new URLSearchParams(window.location.search);\n const setOrDelete = (name: string, value: string | null) => {\n if (value === null || value === \"\") params.delete(name);\n else params.set(name, value);\n };\n setOrDelete(key(\"p\"), nextState.page > 1 ? String(nextState.page) : null);\n setOrDelete(\n key(\"ps\"),\n nextState.pageSize !== defaultPageSize\n ? String(nextState.pageSize)\n : null,\n );\n setOrDelete(key(\"q\"), nextState.search || null);\n setOrDelete(\n key(\"match\"),\n nextState.searchMatchMode === \"whole_words\" ? \"whole_words\" : null,\n );\n setOrDelete(\n key(\"scope\"),\n nextState.searchScope && nextState.searchScope !== \"all\"\n ? nextState.searchScope\n : null,\n );\n setOrDelete(key(\"any\"), nextState.anyOf || null);\n const sortToken = nextState.sort\n ? `${nextState.sort.id}.${nextState.sort.direction}`\n : null;\n const defaultToken =\n defaultSortId && defaultSortDirection\n ? `${defaultSortId}.${defaultSortDirection}`\n : null;\n setOrDelete(key(\"sort\"), sortToken !== defaultToken ? sortToken : null);\n const activeFilters = Object.fromEntries(\n Object.entries(nextState.columnFilters).filter(\n ([, v]) => v !== undefined,\n ),\n );\n setOrDelete(\n key(\"lf\"),\n nextState.layeredFilters && nextState.layeredFilters.length > 0\n ? JSON.stringify(nextState.layeredFilters)\n : null,\n );\n setOrDelete(\n key(\"f\"),\n Object.keys(activeFilters).length > 0\n ? JSON.stringify(activeFilters)\n : null,\n );\n const nextParams = new URLSearchParams(params);\n const currentParams = new URLSearchParams(window.location.search);\n const patch: Record<string, string | null> = {};\n for (const name of [\"p\", \"ps\", \"q\", \"match\", \"scope\", \"any\", \"sort\", \"lf\", \"f\"]) {\n const parameter = key(name);\n const nextValue = nextParams.get(parameter);\n if (currentParams.get(parameter) !== nextValue)\n patch[parameter] = nextValue;\n }\n commitUrlParams(patch, mode);\n },\n [defaultPageSize, defaultSortDirection, defaultSortId, history, key],\n );\n\n const onStateChange = useCallback(\n (next: MatrxDataTableQueryState) => {\n const changed = Object.keys(next).filter(\n (name) =>\n JSON.stringify(next[name as keyof MatrxDataTableQueryState]) !==\n JSON.stringify(state[name as keyof MatrxDataTableQueryState]),\n );\n const textOnly =\n changed.length > 0 &&\n changed.every((name) => name === \"search\" || name === \"anyOf\");\n let mode = history;\n if (textOnly && textHistory === \"replace\") mode = \"replace\";\n if (textOnly && textHistory === \"push\") mode = \"push\";\n if (textOnly && textHistory === \"session\") {\n const now = Date.now();\n mode = now - lastTextWriteAt.current < 750 ? \"replace\" : history;\n lastTextWriteAt.current = now;\n }\n writeState(next, mode);\n },\n [history, state, textHistory, writeState],\n );\n\n const reset = useCallback(() => {\n const dSort =\n defaultSortId && defaultSortDirection\n ? { id: defaultSortId, direction: defaultSortDirection }\n : null;\n const next: MatrxDataTableQueryState = {\n page: 1,\n pageSize: defaultPageSize,\n search: \"\",\n searchMatchMode: \"contains\",\n searchScope: \"all\",\n anyOf: \"\",\n layeredFilters: [],\n columnFilters: {},\n sort: dSort,\n };\n writeState(next);\n setDebouncedSearch(\"\");\n }, [defaultPageSize, defaultSortDirection, defaultSortId, writeState]);\n\n const queryState = useMemo<MatrxDataTableQueryState>(\n () =>\n state.search === debouncedSearch\n ? state\n : { ...state, search: debouncedSearch, page: 1 },\n [state, debouncedSearch],\n );\n\n return { state, queryState, onStateChange, reset };\n}\n","\"use client\";\n\nimport {\n forwardRef,\n useEffect,\n useMemo,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from \"react\";\nimport { useDraggable } from \"@dnd-kit/core\";\nimport {\n ArrowDown,\n ArrowUp,\n ArrowUpDown,\n Check as CheckIcon,\n ListFilter,\n ListX,\n X,\n} from \"./icons\";\nimport { Button } from \"../button\";\nimport { Input } from \"../input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from \"../command\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select\";\nimport { cn } from \"../cn\";\nimport type { ColumnFilterValue, SortDirection } from \"./types\";\nimport type { ResolvedFilterKind } from \"./infer-filter\";\nimport { isColumnFilterActive } from \"./filter-engine\";\n\ninterface ColumnHeaderCellProps {\n label: ReactNode;\n /** Plain-text column name for icon-only control aria-labels. */\n labelText?: string | undefined;\n sortable: boolean;\n isSorted: boolean;\n sortDirection: SortDirection;\n onSortAsc: () => void;\n onSortDesc: () => void;\n onClearSort: () => void;\n onHeaderSortClick: () => void;\n filterKind: ResolvedFilterKind | null;\n filterValue: ColumnFilterValue | undefined;\n onFilterChange: (next: ColumnFilterValue | undefined) => void;\n selectOptions?: Array<{ value: string; label: string }> | undefined;\n /** Single-choice select semantics (MatrxColumnDef.filterSingle). */\n selectSingle?: boolean | undefined;\n align?: \"left\" | \"center\" | \"right\" | undefined;\n className?: string | undefined;\n /**\n * ICON COLUMN header (MatrxColumnDef.compact): the label IS the glyph, so the\n * three controls collapse into ONE popover trigger carrying the same sort\n * actions and the same filter body. Nothing is lost — see the field's doc.\n */\n compact?: boolean | undefined;\n /** When supplied, filter edits remain a draft until Apply. */\n filterApplyLabel?: string | undefined;\n filterShowCancel?: boolean | undefined;\n filterFooterHint?: ReactNode | undefined;\n /** Opt-in because remote query sources may not understand negated filters. */\n allowNegation?: boolean | undefined;\n /** Opt-in because remote query sources may not understand null sentinels. */\n allowNullModes?: boolean | undefined;\n /** Internal column-reorder activator. The visible header label is the handle. */\n reorderColumn?: { id: string; label: string } | undefined;\n}\n\n/**\n * dnd-kit and Radix both describe the same trigger. Keep their ids together so\n * a draggable header retains drag guidance and its keyboard tooltip.\n */\nconst HeaderButton = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<\"button\"> & { dragDescription?: string }\n>(({ dragDescription, \"aria-describedby\": tooltipDescription, ...props }, ref) => {\n const descriptions = [tooltipDescription, dragDescription]\n .filter((value): value is string => Boolean(value))\n .join(\" \");\n return (\n <button\n ref={ref}\n {...props}\n {...(descriptions ? { \"aria-describedby\": descriptions } : {})}\n />\n );\n});\nHeaderButton.displayName = \"HeaderButton\";\n\nexport function ColumnHeaderCell({\n label,\n labelText,\n sortable,\n isSorted,\n sortDirection,\n onSortAsc,\n onSortDesc,\n onClearSort,\n onHeaderSortClick,\n filterKind,\n filterValue,\n onFilterChange,\n selectOptions = [],\n selectSingle = false,\n align = \"left\",\n className,\n compact = false,\n filterApplyLabel,\n filterShowCancel = false,\n filterFooterHint,\n allowNegation = false,\n allowNullModes = false,\n reorderColumn,\n}: ColumnHeaderCellProps) {\n const reorderEnabled = reorderColumn !== undefined;\n const { attributes: reorderAttributes, listeners: reorderListeners, setNodeRef } =\n useDraggable(\n reorderColumn\n ? {\n id: `matrx-column-header:${reorderColumn.id}`,\n data: { matrxDragKind: \"column-header\", columnId: reorderColumn.id },\n disabled: false,\n }\n : {\n id: `matrx-column-header:inactive:${labelText ?? \"column\"}`,\n disabled: true,\n },\n );\n const reorderLabel = reorderColumn?.label ?? labelText ?? \"column\";\n const { \"aria-describedby\": dragDescription, ...reorderAttributesWithoutDescription } =\n reorderAttributes;\n const reorderActivator = reorderEnabled\n ? {\n ...reorderAttributesWithoutDescription,\n ...reorderListeners,\n ref: setNodeRef,\n dragDescription,\n \"aria-description\": \"Drag this column label to reorder it.\",\n }\n : undefined;\n const reorderClass = reorderEnabled\n ? \"touch-none cursor-grab active:cursor-grabbing\"\n : undefined;\n const filterActive = isColumnFilterActive(filterValue);\n const deferredFilter =\n filterApplyLabel !== undefined || filterShowCancel || filterFooterHint !== undefined;\n const [filterOpen, setFilterOpen] = useState(false);\n const [draftFilter, setDraftFilter] = useState<ColumnFilterValue | undefined>(filterValue);\n useEffect(() => {\n if (!filterOpen) setDraftFilter(filterValue);\n }, [filterOpen, filterValue]);\n const applyFilter = () => {\n onFilterChange(draftFilter);\n setFilterOpen(false);\n };\n const cancelFilter = () => {\n setDraftFilter(filterValue);\n setFilterOpen(false);\n };\n const visibleFilter = deferredFilter ? draftFilter : filterValue;\n const setNegated = (negated: boolean) => {\n if (!visibleFilter) return;\n const next = { ...visibleFilter, ...(negated ? { negated: true } : {}) };\n if (!negated) delete next.negated;\n if (deferredFilter) setDraftFilter(next);\n else onFilterChange(next);\n };\n const menuLabel = labelText\n ? `Sort or filter ${labelText}`\n : \"Sort or filter column\";\n\n // ONE menu, rendered from ONE place, so the wide header and the icon header\n // can never end up offering different actions.\n const menuContent = (\n <PopoverContent\n align=\"start\"\n className=\"w-64 p-2\"\n onClick={(e) => e.stopPropagation()}\n onOpenAutoFocus={(event) => {\n const content = event.currentTarget;\n if (!(content instanceof HTMLElement)) return;\n\n const input = content.querySelector<HTMLInputElement>(\n \"[data-matrx-filter-autofocus]\",\n );\n if (!input) return;\n\n event.preventDefault();\n input.focus();\n }}\n >\n {sortable ? (\n <>\n <div className=\"flex flex-col gap-0.5 pb-2\">\n <Button\n variant={\n isSorted && sortDirection === \"asc\" ? \"secondary\" : \"ghost\"\n }\n size=\"sm\"\n className=\"h-8 justify-start gap-2 px-2 text-xs font-normal\"\n onClick={onSortAsc}\n >\n <ArrowUp className=\"h-3.5 w-3.5\" />\n Sort ascending\n </Button>\n <Button\n variant={\n isSorted && sortDirection === \"desc\" ? \"secondary\" : \"ghost\"\n }\n size=\"sm\"\n className=\"h-8 justify-start gap-2 px-2 text-xs font-normal\"\n onClick={onSortDesc}\n >\n <ArrowDown className=\"h-3.5 w-3.5\" />\n Sort descending\n </Button>\n {isSorted ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 justify-start gap-2 px-2 text-xs font-normal text-muted-foreground\"\n onClick={onClearSort}\n >\n <ListX className=\"h-3.5 w-3.5\" />\n Clear sort\n </Button>\n ) : null}\n </div>\n {filterKind ? <div className=\"mb-2 h-px bg-border\" /> : null}\n </>\n ) : null}\n {filterKind ? (\n <FilterBody\n kind={filterKind}\n value={visibleFilter}\n onChange={(next) => {\n const preservingNegation =\n next && visibleFilter?.negated\n ? { ...next, negated: true }\n : next;\n if (deferredFilter) setDraftFilter(preservingNegation);\n else onFilterChange(preservingNegation);\n }}\n selectOptions={selectOptions}\n selectSingle={selectSingle}\n allowNullModes={allowNullModes}\n />\n ) : null}\n {filterKind && visibleFilter && allowNegation ? (\n <div className=\"mt-2 border-t border-border pt-2\">\n <p className=\"mb-1 text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n Match mode\n </p>\n <div className=\"grid grid-cols-2 gap-1 rounded-md border p-0.5\">\n <button\n type=\"button\"\n aria-pressed={!visibleFilter.negated}\n onClick={() => setNegated(false)}\n className={cn(\n \"rounded px-2 py-1.5 text-xs transition-colors\",\n !visibleFilter.negated\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:bg-muted\",\n )}\n >\n Include\n </button>\n <button\n type=\"button\"\n aria-pressed={visibleFilter.negated === true}\n onClick={() => setNegated(true)}\n className={cn(\n \"rounded px-2 py-1.5 text-xs transition-colors\",\n visibleFilter.negated\n ? \"bg-destructive text-destructive-foreground\"\n : \"text-muted-foreground hover:bg-muted\",\n )}\n >\n Exclude\n </button>\n </div>\n </div>\n ) : null}\n {filterKind && deferredFilter ? (\n <div className=\"mt-2 border-t border-border pt-2\">\n {filterFooterHint ? (\n <div className=\"mb-2 text-xs text-muted-foreground\">{filterFooterHint}</div>\n ) : null}\n <div className=\"flex justify-end gap-2\">\n {filterShowCancel ? (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={cancelFilter}>\n Cancel\n </Button>\n ) : null}\n <Button type=\"button\" size=\"sm\" onClick={applyFilter}>\n {filterApplyLabel ?? \"Apply\"}\n </Button>\n </div>\n </div>\n ) : null}\n </PopoverContent>\n );\n\n // ICON COLUMN. A star/lock/dot column is 40px of glyph wrapped in ~30px of\n // header chrome, so the chrome collapses into the glyph itself: the label IS\n // the popover trigger, and the menu above still carries every sort action and\n // the whole filter body. Active state is a 2px marker, not a second control.\n if (compact) {\n if (!sortable && !filterKind) {\n if (!reorderEnabled) {\n return (\n <div className={cn(\"flex items-center justify-center\", className)}>\n {label}\n </div>\n );\n }\n return (\n <div className={cn(\"flex items-center justify-center\", className)}>\n <Tooltip>\n <TooltipTrigger asChild>\n <HeaderButton\n type=\"button\"\n {...reorderActivator}\n className={cn(\n \"inline-flex items-center justify-center rounded p-0.5 text-muted-foreground transition-colors hover:text-foreground\",\n reorderClass,\n )}\n >\n {label}\n </HeaderButton>\n </TooltipTrigger>\n <TooltipContent>Drag to reorder {reorderLabel}.</TooltipContent>\n </Tooltip>\n </div>\n );\n }\n return (\n <div\n className={cn(\n \"flex items-center\",\n align === \"right\" ? \"justify-end\" : \"justify-center\",\n className,\n )}\n >\n <Popover open={filterOpen} onOpenChange={setFilterOpen}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <HeaderButton\n type=\"button\"\n aria-label={menuLabel}\n data-matrx-canonical-signature=\"column-menu\"\n style={{ color: \"#60a5fa\" }}\n onClick={(event) => {\n event.stopPropagation();\n }}\n {...reorderActivator}\n className={cn(\n \"relative inline-flex items-center justify-center rounded p-0.5 transition-colors\",\n reorderClass,\n isSorted || filterActive\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {label}\n {isSorted ? (\n sortDirection === \"asc\" ? (\n <ArrowUp className=\"absolute -top-1 right-0 h-2 w-2 text-primary\" />\n ) : (\n <ArrowDown className=\"absolute -top-1 right-0 h-2 w-2 text-primary\" />\n )\n ) : null}\n {filterActive ? (\n <span\n aria-hidden\n className=\"absolute -bottom-0.5 right-0 h-1.5 w-1.5 rounded-full bg-primary\"\n />\n ) : null}\n </HeaderButton>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Canonical Matrx table · {menuLabel}</TooltipContent>\n </Tooltip>\n {menuContent}\n </Popover>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"flex items-center gap-0.5\",\n align === \"center\" && \"justify-center\",\n align === \"right\" && \"justify-end\",\n className,\n )}\n >\n {sortable ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <HeaderButton\n type=\"button\"\n onClick={onHeaderSortClick}\n {...reorderActivator}\n className={cn(\n \"inline-flex min-w-0 items-center gap-1 rounded px-0.5 py-0.5 text-left text-xs font-semibold uppercase tracking-wide transition-colors\",\n reorderClass,\n isSorted\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n <span className=\"truncate\">{label}</span>\n {isSorted ? (\n sortDirection === \"asc\" ? (\n <ArrowUp className=\"h-3 w-3 shrink-0 text-primary\" />\n ) : (\n <ArrowDown className=\"h-3 w-3 shrink-0 text-primary\" />\n )\n ) : (\n <ArrowUpDown className=\"h-3 w-3 shrink-0 opacity-40\" />\n )}\n </HeaderButton>\n </TooltipTrigger>\n <TooltipContent>\n {reorderEnabled\n ? `Drag to reorder ${reorderLabel}.`\n : (labelText ?? \"Sort column\")}\n </TooltipContent>\n </Tooltip>\n ) : reorderEnabled ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <HeaderButton\n type=\"button\"\n {...reorderActivator}\n className={cn(\n \"min-w-0 truncate rounded px-0.5 py-0.5 text-left text-xs font-semibold uppercase tracking-wide text-muted-foreground hover:text-foreground\",\n reorderClass,\n )}\n >\n {label}\n </HeaderButton>\n </TooltipTrigger>\n <TooltipContent>Drag to reorder {reorderLabel}.</TooltipContent>\n </Tooltip>\n ) : (\n <span className=\"truncate text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {label}\n </span>\n )}\n\n {filterKind || sortable ? (\n <div className=\"inline-flex items-center\">\n <Popover open={filterOpen} onOpenChange={setFilterOpen}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={menuLabel}\n data-matrx-canonical-signature=\"column-menu\"\n style={{ color: \"#60a5fa\" }}\n onClick={(e) => e.stopPropagation()}\n className={cn(\n \"rounded p-0.5 transition-colors\",\n filterActive\n ? \"text-primary hover:text-primary/80\"\n : \"text-muted-foreground/40 hover:text-muted-foreground\",\n )}\n >\n {filterKind ? (\n <ListFilter className={cn(\"h-3 w-3\", filterActive && \"fill-primary/20\")} />\n ) : (\n <ArrowUpDown className=\"h-3 w-3\" />\n )}\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>{menuLabel}</TooltipContent>\n </Tooltip>\n {menuContent}\n </Popover>\n {filterActive ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={\n labelText ? `Clear ${labelText} filter` : \"Clear this filter\"\n }\n onClick={(e) => {\n e.stopPropagation();\n onFilterChange(undefined);\n }}\n className=\"rounded p-0.5 text-primary hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {labelText ? `Clear ${labelText} filter` : \"Clear this filter\"}\n </TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction FilterBody({\n kind,\n value,\n onChange,\n selectOptions,\n selectSingle = false,\n allowNullModes = false,\n}: {\n kind: ResolvedFilterKind;\n value: ColumnFilterValue | undefined;\n onChange: (next: ColumnFilterValue | undefined) => void;\n selectOptions: Array<{ value: string; label: string }>;\n selectSingle?: boolean;\n allowNullModes?: boolean;\n}) {\n if (kind === \"text\") {\n const text = value?.kind === \"text\" ? value.value : \"\";\n const mode =\n (value?.kind === \"text\" ? value.mode : undefined) ?? \"contains\";\n const setMode = (next: \"contains\" | \"empty\" | \"not_empty\" | \"null\" | \"not_null\") => {\n if (next === \"contains\") {\n onChange(text ? { kind: \"text\", value: text } : undefined);\n } else {\n onChange({ kind: \"text\", value: \"\", mode: next });\n }\n };\n return (\n <div className=\"space-y-1.5 px-1\">\n <p className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n Filter\n </p>\n <div className=\"flex gap-1\">\n {([\n [\"contains\", \"Contains\"],\n [\"empty\", \"(empty)\"],\n [\"not_empty\", \"(not empty)\"],\n ...(allowNullModes\n ? [[\"null\", \"(null)\"], [\"not_null\", \"(not null)\"]] as const\n : []),\n ] as const).map(([m, label]) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setMode(m)}\n aria-pressed={mode === m}\n className={cn(\n \"rounded border px-1.5 py-0.5 text-[10px] transition-colors\",\n mode === m\n ? \"border-primary/50 bg-primary/10 text-foreground\"\n : \"border-border text-muted-foreground hover:text-foreground\",\n )}\n >\n {label}\n </button>\n ))}\n </div>\n {mode === \"contains\" && (\n <div className=\"relative\">\n <Input\n data-matrx-filter-autofocus\n value={text}\n onChange={(e) =>\n onChange(\n e.target.value\n ? { kind: \"text\", value: e.target.value }\n : undefined,\n )\n }\n placeholder=\"Contains…\"\n className=\"h-8 pr-7 text-sm\"\n style={{ fontSize: \"16px\" }}\n />\n {text ? (\n <button\n type=\"button\"\n aria-label=\"Clear filter text\"\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2 rounded p-0.5 text-muted-foreground hover:text-foreground\"\n onClick={() => onChange(undefined)}\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n ) : null}\n </div>\n )}\n </div>\n );\n }\n\n if (kind === \"select\") {\n const selected =\n value?.kind === \"select\"\n ? (value.values ??\n (value.value && value.value !== \"__all__\" ? [value.value] : []))\n : [];\n return (\n <SearchableSelectFilter\n selected={selected}\n options={selectOptions}\n onChange={onChange}\n single={selectSingle}\n />\n );\n }\n\n if (kind === \"boolean\") {\n const current =\n value?.kind === \"boolean\" ? value.value : (\"__all__\" as const);\n return (\n <div className=\"space-y-1.5 px-1\">\n <p className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n Filter\n </p>\n <Select\n value={current === \"__all__\" ? \"__all__\" : current ? \"true\" : \"false\"}\n onValueChange={(v) => {\n if (v === \"__all__\") onChange(undefined);\n else onChange({ kind: \"boolean\", value: v === \"true\" });\n }}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__all__\">All</SelectItem>\n <SelectItem value=\"true\">Yes</SelectItem>\n <SelectItem value=\"false\">No</SelectItem>\n </SelectContent>\n </Select>\n </div>\n );\n }\n\n return <NumberFilterBody value={value} onChange={onChange} />;\n}\n\nfunction SearchableSelectFilter({\n selected,\n options,\n onChange,\n single = false,\n}: {\n selected: string[];\n options: Array<{ value: string; label: string }>;\n onChange: (next: ColumnFilterValue | undefined) => void;\n single?: boolean;\n}) {\n const [query, setQuery] = useState(\"\");\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return options;\n return options.filter(\n (o) =>\n o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q),\n );\n }, [options, query]);\n\n // Multi-select with OR semantics: toggling builds the `values` set; an\n // empty set clears the filter entirely. Single mode (mutually exclusive\n // options — a scope, a date bucket): choosing REPLACES, re-choosing clears.\n const toggle = (v: string) => {\n if (single) {\n onChange(\n selected.length === 1 && selected[0] === v\n ? undefined\n : { kind: \"select\", value: v },\n );\n return;\n }\n const next = selected.includes(v)\n ? selected.filter((x) => x !== v)\n : [...selected, v];\n onChange(\n next.length === 0\n ? undefined\n : { kind: \"select\", value: next[0] ?? \"\", values: next },\n );\n };\n\n return (\n <div className=\"space-y-1 px-0\">\n <div className=\"flex items-center justify-between px-1 pb-1\">\n <p className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n Filter{selected.length > 1 ? ` (any of ${selected.length})` : \"\"}\n </p>\n {selected.length > 0 ? (\n <button\n type=\"button\"\n className=\"text-[11px] text-muted-foreground hover:text-foreground\"\n onClick={() => onChange(undefined)}\n >\n clear\n </button>\n ) : null}\n </div>\n <Command className=\"rounded-md border border-border\" shouldFilter={false}>\n <CommandInput\n data-matrx-filter-autofocus\n value={query}\n onValueChange={setQuery}\n placeholder=\"Search options…\"\n className=\"h-8 text-sm\"\n />\n <CommandList className=\"max-h-48\">\n <CommandEmpty className=\"py-3 text-xs text-muted-foreground\">\n No matches\n </CommandEmpty>\n <CommandGroup>\n <CommandItem\n value=\"__all__\"\n onSelect={() => onChange(undefined)}\n className=\"text-xs\"\n >\n All\n </CommandItem>\n {filtered.map((o) => {\n const active = selected.includes(o.value);\n return (\n <CommandItem\n key={o.value}\n value={o.value}\n onSelect={() => toggle(o.value)}\n className={cn(\n \"gap-1.5 text-xs\",\n active && \"bg-accent text-accent-foreground\",\n )}\n >\n <span\n className={cn(\n \"flex h-3.5 w-3.5 shrink-0 items-center justify-center border\",\n single ? \"rounded-full\" : \"rounded-sm\",\n active\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-muted-foreground/40\",\n )}\n >\n {active && <CheckIcon className=\"h-2.5 w-2.5\" />}\n </span>\n {o.label}\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </div>\n );\n}\n\nfunction NumberFilterBody({\n value,\n onChange,\n}: {\n value: ColumnFilterValue | undefined;\n onChange: (next: ColumnFilterValue | undefined) => void;\n}) {\n const min = value?.kind === \"number\" ? value.min : undefined;\n const max = value?.kind === \"number\" ? value.max : undefined;\n const [minText, setMinText] = useState(min !== undefined ? String(min) : \"\");\n const [maxText, setMaxText] = useState(max !== undefined ? String(max) : \"\");\n\n const commit = (raw: string, which: \"min\" | \"max\") => {\n const nextMin = which === \"min\" ? parseOptionalNumber(raw) : min;\n const nextMax = which === \"max\" ? parseOptionalNumber(raw) : max;\n if (nextMin === undefined && nextMax === undefined) {\n onChange(undefined);\n return;\n }\n onChange({ kind: \"number\", min: nextMin, max: nextMax });\n };\n\n return (\n <div className=\"space-y-1.5 px-1\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-[11px] font-medium uppercase tracking-wider text-muted-foreground\">\n Range\n </p>\n {(min !== undefined || max !== undefined) && (\n <button\n type=\"button\"\n className=\"text-[11px] text-muted-foreground hover:text-foreground\"\n onClick={() => {\n setMinText(\"\");\n setMaxText(\"\");\n onChange(undefined);\n }}\n >\n clear\n </button>\n )}\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Input\n data-matrx-filter-autofocus\n value={minText}\n onChange={(e) => setMinText(e.target.value)}\n onBlur={(e) => commit(e.target.value, \"min\")}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.currentTarget.blur();\n }}\n placeholder=\"min\"\n className=\"h-8 font-mono text-xs\"\n style={{ fontSize: \"16px\" }}\n />\n <span className=\"text-xs text-muted-foreground\">–</span>\n <Input\n value={maxText}\n onChange={(e) => setMaxText(e.target.value)}\n onBlur={(e) => commit(e.target.value, \"max\")}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.currentTarget.blur();\n }}\n placeholder=\"max\"\n className=\"h-8 font-mono text-xs\"\n style={{ fontSize: \"16px\" }}\n />\n </div>\n </div>\n );\n}\n\nfunction parseOptionalNumber(raw: string): number | undefined {\n if (raw.trim() === \"\") return undefined;\n const n = Number(raw.replace(/[^0-9.-]/g, \"\"));\n return Number.isFinite(n) ? n : undefined;\n}\n","\"use client\";\n\n/**\n * Command — ported verbatim from matrx-frontend `components/ui/command.tsx`.\n *\n * `cmdk` is a SANCTIONED REAL DEPENDENCY (the vaul ↔ BottomSheet precedent):\n * the filtering/scoring/keyboard engine IS the component's product — there is\n * no Command palette without it, and reimplementing type-ahead ranking plus\n * roving keyboard selection would twin a maintained library rather than our\n * own code. See FEATURE.md.\n *\n * Seam inversions:\n * - `MagnifyingGlassIcon` comes from the package's inlined SVGs (C19), not\n * @radix-ui/react-icons.\n * - `CommandDialog` composed the host dialog module (`Dialog`, `DialogContent`,\n * `DialogTitle`). Those pieces are inlined privately below with identical\n * behavior — modal context, overlay, desktop card / mobile bottom-sheet\n * geometry, close control, portal — except the host's popout-aware\n * `DialogPortal` becomes the package's `PortalContainerProvider` seam\n * (plus an explicit `container` prop, which keeps top priority).\n * - The host's `useIsMobile` (a plain matchMedia breakpoint hook, not\n * host-shaped) became the package's own `./use-is-mobile`, with the same\n * 768px breakpoint. It started life inlined here; `Dialog` needed the same\n * answer, so it moved to a module both read rather than being copied.\n */\n\nimport type { DialogProps } from \"@radix-ui/react-dialog\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport {\n CENTERED_DIALOG,\n MOTION_BOTTOM_SHEET,\n MOTION_DIALOG,\n MOTION_OVERLAY,\n} from \"./motion\";\nimport { MagnifyingGlassIcon, XIcon } from \"./icons\";\nimport { usePortalContainer } from \"./portal-container\";\nimport {\n RadixDialogModalProvider,\n useRadixDialogModal,\n} from \"./radix-dialog-modal-context\";\nimport { useIsMobile } from \"./use-is-mobile\";\n\nexport const Command = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\n className,\n )}\n {...props}\n />\n));\nCommand.displayName = CommandPrimitive.displayName;\n\n/* ------------------------------------------------------------------ */\n/* Private dialog internals for CommandDialog (host dialog module, */\n/* behavior-identical, portal seam inverted). */\n/* ------------------------------------------------------------------ */\n\nconst DIALOG_DESKTOP_CLASSES =\n `fixed left-[50%] top-[50%] z-[10000] grid min-w-0 w-full max-w-lg ${CENTERED_DIALOG} gap-4 overflow-x-clip border bg-background p-6 shadow-lg [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full sm:rounded-lg`;\n\nconst DIALOG_MOBILE_SHEET_CLASSES =\n \"fixed inset-x-0 bottom-0 left-0 right-0 top-auto z-[10000] flex min-w-0 flex-col w-full max-w-full max-h-[90dvh] translate-x-0 translate-y-0 gap-4 overflow-x-clip border-t bg-background p-4 pb-safe shadow-lg [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full rounded-t-2xl rounded-b-none overflow-y-auto overscroll-contain\";\n\n// Re-asserted LAST so the sheet geometry always wins over any caller className.\nconst DIALOG_MOBILE_SHEET_OVERRIDE =\n \"inset-x-0 bottom-0 left-0 right-0 top-auto translate-x-0 translate-y-0 w-full max-w-full max-h-[90dvh] rounded-b-none rounded-t-2xl overflow-y-auto\";\n\nconst CommandDialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n container?: HTMLElement | null;\n }\n>(({ className, children, container, ...props }, ref) => {\n const isMobile = useIsMobile();\n const isModal = useRadixDialogModal();\n const portalContainer = usePortalContainer(container);\n return (\n <DialogPrimitive.Portal container={portalContainer}>\n {isModal ? (\n <DialogPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-[10000] bg-[var(--matrx-overlay-scrim-soft)]\",\n MOTION_OVERLAY,\n )}\n />\n ) : null}\n <DialogPrimitive.Content\n ref={ref}\n aria-modal={isModal || undefined}\n aria-describedby={undefined}\n className={cn(\n isMobile ? DIALOG_MOBILE_SHEET_CLASSES : DIALOG_DESKTOP_CLASSES,\n isMobile ? MOTION_BOTTOM_SHEET : MOTION_DIALOG,\n className,\n isMobile && DIALOG_MOBILE_SHEET_OVERRIDE,\n !isModal && \"z-[900]\",\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-2 top-4 flex h-10 w-10 items-center justify-center rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground sm:right-4\">\n <XIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n );\n});\nCommandDialogContent.displayName = \"CommandDialogContent\";\n\nexport interface CommandDialogProps extends DialogProps {\n /** Explicit portal target for the dialog; beats the injected seam. */\n container?: HTMLElement | null;\n}\n\nexport const CommandDialog = ({\n children,\n container,\n ...props\n}: CommandDialogProps) => {\n const modal = props.modal ?? true;\n return (\n <RadixDialogModalProvider modal={modal}>\n <DialogPrimitive.Root {...props} modal={modal}>\n <CommandDialogContent\n className=\"overflow-hidden p-0\"\n {...(container !== undefined ? { container } : {})}\n >\n <DialogPrimitive.Title className=\"sr-only\"></DialogPrimitive.Title>\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </CommandDialogContent>\n </DialogPrimitive.Root>\n </RadixDialogModalProvider>\n );\n};\n\nexport const CommandInput = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b px-3\" cmdk-input-wrapper=\"\">\n <MagnifyingGlassIcon className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n \"flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n </div>\n));\nCommandInput.displayName = CommandPrimitive.Input.displayName;\n\nexport const CommandList = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\n {...props}\n />\n));\nCommandList.displayName = CommandPrimitive.List.displayName;\n\nexport const CommandEmpty = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n));\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName;\n\nexport const CommandGroup = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\n className,\n )}\n {...props}\n />\n));\nCommandGroup.displayName = CommandPrimitive.Group.displayName;\n\nexport const CommandSeparator = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n));\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName;\n\nexport const CommandItem = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n));\nCommandItem.displayName = CommandPrimitive.Item.displayName;\n\nexport const CommandShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n};\nCommandShortcut.displayName = \"CommandShortcut\";\n","\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n} from \"react\";\nimport {\n clampColumnWidth,\n columnResizeCssVar,\n resolveColumnResizeBounds,\n} from \"./column-resize\";\n\nexport interface ColumnResizeHandleProps {\n columnId: string;\n label: string;\n tableRef: RefObject<HTMLTableElement | null>;\n minWidth?: number | undefined;\n maxWidth?: number | undefined;\n disabled?: boolean | undefined;\n /** Captures the table's rendered geometry before a pointer preview can affect auto layout. */\n onResizeStart?: (() => void) | undefined;\n /** Clears a parent-owned pointer snapshot when a resize is abandoned. */\n onResizeCancel?: (() => void) | undefined;\n /** Called once when a pointer resize is released, and once per keyboard adjustment. */\n onResizeCommit: (columnId: string, width: number) => void;\n}\n\ninterface ActiveResize {\n pointerId: number;\n startX: number;\n startWidth: number;\n priorPreview: string;\n}\n\nconst KEYBOARD_STEP = 8;\nconst KEYBOARD_LARGE_STEP = 24;\n\n/**\n * A standalone header-edge separator. Pointer moves write only a CSS variable\n * on the table in rAF; React state and the parent column state change only on\n * release, preventing a full table render for every physical pointer event.\n */\nexport function ColumnResizeHandle({\n columnId,\n label,\n tableRef,\n minWidth,\n maxWidth,\n disabled = false,\n onResizeStart,\n onResizeCancel,\n onResizeCommit,\n}: ColumnResizeHandleProps) {\n const handleRef = useRef<HTMLButtonElement | null>(null);\n const activeResizeRef = useRef<ActiveResize | null>(null);\n const previewRafRef = useRef<number | null>(null);\n const queuedWidthRef = useRef<number | null>(null);\n const keyboardWidthRef = useRef<number | null>(null);\n const [announcedWidth, setAnnouncedWidth] = useState<number | null>(null);\n const bounds = resolveColumnResizeBounds(minWidth, maxWidth);\n const cssVar = columnResizeCssVar(columnId);\n\n const readWidth = useCallback(() => {\n const header = handleRef.current?.closest(\"th\");\n const measured = header?.getBoundingClientRect().width ?? 0;\n const computed = header ? Number.parseFloat(getComputedStyle(header).width) : 0;\n return clampColumnWidth(measured || computed || keyboardWidthRef.current || bounds.minWidth, bounds);\n }, [bounds]);\n\n const writePreview = useCallback((width: number) => {\n tableRef.current?.style.setProperty(cssVar, `${width}px`);\n }, [cssVar, tableRef]);\n\n const queuePreview = useCallback((width: number) => {\n queuedWidthRef.current = width;\n if (previewRafRef.current !== null) return;\n previewRafRef.current = requestAnimationFrame(() => {\n previewRafRef.current = null;\n const nextWidth = queuedWidthRef.current;\n queuedWidthRef.current = null;\n if (nextWidth !== null) writePreview(nextWidth);\n });\n }, [writePreview]);\n\n const clearQueuedPreview = useCallback(() => {\n if (previewRafRef.current !== null) cancelAnimationFrame(previewRafRef.current);\n previewRafRef.current = null;\n queuedWidthRef.current = null;\n }, []);\n\n const finishPointerResize = useCallback((commit: boolean) => {\n const active = activeResizeRef.current;\n if (!active) return;\n activeResizeRef.current = null;\n clearQueuedPreview();\n const table = tableRef.current;\n const width = keyboardWidthRef.current ?? active.startWidth;\n if (!commit) {\n if (active.priorPreview) table?.style.setProperty(cssVar, active.priorPreview);\n else table?.style.removeProperty(cssVar);\n onResizeCancel?.();\n } else {\n writePreview(width);\n setAnnouncedWidth(width);\n onResizeCommit(columnId, width);\n }\n if (handleRef.current?.hasPointerCapture(active.pointerId)) {\n handleRef.current.releasePointerCapture(active.pointerId);\n }\n }, [clearQueuedPreview, columnId, cssVar, onResizeCancel, onResizeCommit, tableRef, writePreview]);\n\n useEffect(() => () => clearQueuedPreview(), [clearQueuedPreview]);\n\n const onPointerDown = (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (disabled || event.button !== 0 || !event.isPrimary) return;\n event.preventDefault();\n event.stopPropagation();\n const startWidth = readWidth();\n keyboardWidthRef.current = startWidth;\n // Native auto layout can redistribute sibling columns as soon as the\n // preview variable is written. Let the table capture all current widths\n // before that first write so switching to fixed layout preserves them.\n onResizeStart?.();\n activeResizeRef.current = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startWidth,\n priorPreview: tableRef.current?.style.getPropertyValue(cssVar) ?? \"\",\n };\n event.currentTarget.setPointerCapture(event.pointerId);\n };\n\n const onPointerMove = (event: ReactPointerEvent<HTMLButtonElement>) => {\n const active = activeResizeRef.current;\n if (!active || active.pointerId !== event.pointerId) return;\n event.preventDefault();\n event.stopPropagation();\n const width = clampColumnWidth(active.startWidth + event.clientX - active.startX, bounds);\n keyboardWidthRef.current = width;\n queuePreview(width);\n };\n\n const onPointerUp = (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (activeResizeRef.current?.pointerId !== event.pointerId) return;\n event.preventDefault();\n event.stopPropagation();\n finishPointerResize(true);\n };\n\n const onPointerCancel = (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (activeResizeRef.current?.pointerId !== event.pointerId) return;\n event.preventDefault();\n event.stopPropagation();\n finishPointerResize(false);\n };\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return;\n // Saved views and controlled owners can replace the width between keys.\n // Start from the rendered column rather than a previous gesture's cache.\n const current = readWidth();\n const step = event.shiftKey ? KEYBOARD_LARGE_STEP : KEYBOARD_STEP;\n const width = event.key === \"ArrowLeft\"\n ? current - step\n : event.key === \"ArrowRight\"\n ? current + step\n : event.key === \"Home\"\n ? bounds.minWidth\n : event.key === \"End\"\n ? bounds.maxWidth\n : null;\n if (width === null) return;\n event.preventDefault();\n event.stopPropagation();\n const nextWidth = clampColumnWidth(width, bounds);\n keyboardWidthRef.current = nextWidth;\n // Match pointer resizing: native auto layout must be measured before this\n // preview can redistribute sibling columns.\n onResizeStart?.();\n writePreview(nextWidth);\n setAnnouncedWidth(nextWidth);\n onResizeCommit(columnId, nextWidth);\n };\n\n const currentWidth = announcedWidth ?? keyboardWidthRef.current ?? bounds.minWidth;\n return (\n <button\n ref={handleRef}\n type=\"button\"\n role=\"separator\"\n aria-label={`Resize ${label}`}\n aria-orientation=\"vertical\"\n aria-valuemin={bounds.minWidth}\n aria-valuemax={bounds.maxWidth}\n aria-valuenow={currentWidth}\n aria-valuetext={`${currentWidth} pixels`}\n disabled={disabled}\n onFocus={() => {\n const width = readWidth();\n keyboardWidthRef.current = width;\n setAnnouncedWidth(width);\n }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerCancel}\n onLostPointerCapture={() => finishPointerResize(false)}\n onKeyDown={onKeyDown}\n className=\"absolute inset-y-0 right-0 z-20 hidden w-3 translate-x-1/2 cursor-col-resize touch-none select-none border-0 bg-transparent p-0 outline-none after:absolute after:inset-y-1 after:left-1/2 after:w-px after:-translate-x-1/2 after:bg-transparent hover:after:bg-primary focus-visible:after:bg-primary focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none sm:block\"\n />\n );\n}\n","export const DEFAULT_COLUMN_MIN_WIDTH = 80;\nexport const DEFAULT_COLUMN_MAX_WIDTH = 1200;\n\nexport interface ColumnResizeBounds {\n minWidth: number;\n maxWidth: number;\n}\n\n/** A CSS custom-property name that is stable for every valid table column id. */\nexport function columnResizeCssVar(columnId: string): string {\n const encoded = Array.from(columnId, (character) => character.codePointAt(0)!.toString(36)).join(\"-\");\n return `--matrx-col-resize-${encoded || \"column\"}`;\n}\n\nexport function resolveColumnResizeBounds(\n minWidth: number | undefined,\n maxWidth: number | undefined,\n): ColumnResizeBounds {\n const min = Number.isFinite(minWidth) ? Math.max(0, minWidth!) : DEFAULT_COLUMN_MIN_WIDTH;\n const requestedMax = Number.isFinite(maxWidth) ? maxWidth! : DEFAULT_COLUMN_MAX_WIDTH;\n return { minWidth: min, maxWidth: Math.max(min, requestedMax) };\n}\n\nexport function clampColumnWidth(width: number, bounds: ColumnResizeBounds): number {\n return Math.round(Math.min(bounds.maxWidth, Math.max(bounds.minWidth, width)));\n}\n\n/**\n * Saved widths are intentionally sparse: omitted values retain a column's\n * declared width/content-size behavior, which keeps old saved views valid.\n */\nexport function normalizeColumnWidthMap(\n widths: Record<string, unknown> | undefined,\n knownColumnIds: ReadonlySet<string>,\n): Record<string, number> {\n if (!widths) return {};\n const normalized: Record<string, number> = {};\n for (const [columnId, width] of Object.entries(widths)) {\n if (!knownColumnIds.has(columnId) || typeof width !== \"number\" || !Number.isFinite(width) || width <= 0) continue;\n normalized[columnId] = Math.round(width);\n }\n return normalized;\n}\n","export interface ColumnDragPreview {\n draggedId: string;\n targetId: string | null;\n after: boolean;\n}\n\n/**\n * Project a header drag without committing the caller-owned column order.\n * Rendering this order makes the drop destination a full column shadow and\n * shifts every sibling into the same position the eventual drop will commit.\n */\nexport function projectColumnDragOrder(\n orderedIds: readonly string[],\n preview: ColumnDragPreview | null,\n): string[] {\n const order = [...orderedIds];\n if (!preview?.targetId || preview.draggedId === preview.targetId) return order;\n\n const draggedIndex = order.indexOf(preview.draggedId);\n const targetIndex = order.indexOf(preview.targetId);\n if (draggedIndex < 0 || targetIndex < 0) return order;\n\n order.splice(draggedIndex, 1);\n const insertion = order.indexOf(preview.targetId) + (preview.after ? 1 : 0);\n order.splice(insertion, 0, preview.draggedId);\n return order;\n}\n","import { columnId, getFilterValue, matchesTableSearch, stringifyCellValue } from \"./filter-engine\";\nimport type { MatrxColumnDef, TableSearchMatchMode } from \"./types\";\n\nexport type TableSearchRole = \"id\" | \"name\" | \"description\" | \"other\";\nexport interface TableSearchScope { id: string; label: string; fields?: readonly string[]; }\nexport interface TableRankedSearchOptions {\n scope?: string;\n roles?: Readonly<Record<string, TableSearchRole>>;\n scopes?: readonly TableSearchScope[];\n matchMode?: TableSearchMatchMode;\n}\n\n/** Column metadata overrides inference; identity substrings always outrank prose. */\nexport function inferTableSearchRole(field: string): TableSearchRole {\n const key = field.replace(/([a-z])([A-Z])/g, \"$1_$2\").toLowerCase().replace(/[\\s-]+/g, \"_\");\n if (key === \"id\" || key === \"uuid\" || key.endsWith(\"_id\")) return \"id\";\n if (/^(name|alias|label|title|key|slug|display_name|common_name|model_name)$/.test(key) || /_(name|label|title)$/.test(key)) return \"name\";\n if (/^(description|summary|details|notes|blurb)$/.test(key) || key.endsWith(\"_description\")) return \"description\";\n return \"other\";\n}\n\nfunction searchableFields<T>(row: T, columns: readonly MatrxColumnDef<T>[]): Map<string, string> {\n const values = new Map<string, string>();\n // A hidden column remains searchable. Loaded fields without a visible column\n // also participate; this does not fetch or imply access to additional records.\n if (row !== null && typeof row === \"object\") {\n for (const [key, value] of Object.entries(row)) values.set(key, stringifyCellValue(value));\n }\n for (const column of columns) {\n if (column.accessorKey || column.accessorFn || column.filterValue) {\n values.set(columnId(column), stringifyCellValue(getFilterValue(row, column)));\n }\n }\n return values;\n}\n\nexport function resolveTableSearchScopes<T>(rows: readonly T[], columns: readonly MatrxColumnDef<T>[], options: TableRankedSearchOptions = {}): TableSearchScope[] {\n const fields = new Set(columns.filter(c => c.accessorKey || c.accessorFn || c.filterValue).map(columnId));\n for (const row of rows) if (row !== null && typeof row === \"object\") Object.keys(row).forEach(key => fields.add(key));\n const roles = new Set([...fields].map(key => options.roles?.[key] ?? inferTableSearchRole(key)));\n const scopes: TableSearchScope[] = [{ id: \"all\", label: \"All\" }];\n for (const [id, label] of [[\"id\", \"ID\"], [\"name\", \"Name\"], [\"description\", \"Description\"]] as const) {\n if (roles.has(id)) scopes.push({ id, label });\n }\n for (const scope of options.scopes ?? []) if (!scopes.some(s => s.id === scope.id) && scope.fields?.length) scopes.push(scope);\n return scopes;\n}\n\n/** Apply to the complete authorized result BEFORE slicing pages. Remote owners\n * must implement the same contract at their source, never on a partial page. */\nexport function rankTableSearchRows<T>(rows: readonly T[], columns: readonly MatrxColumnDef<T>[], query: string, options: TableRankedSearchOptions = {}, extraText?: (row: T) => string): T[] {\n const q = query.trim().toLocaleLowerCase();\n if (!q) return [...rows];\n const scope = options.scope ?? \"all\";\n const customScope = options.scopes?.find(s => s.id === scope);\n const mode = options.matchMode ?? \"contains\";\n return rows.flatMap((row, index) => {\n const fields = [...searchableFields(row, columns)].filter(([key]) => {\n if (scope === \"all\") return true;\n if (customScope) return customScope.fields?.includes(key) ?? false;\n return (options.roles?.[key] ?? inferTableSearchRole(key)) === scope;\n });\n const extra = scope === \"all\" ? extraText?.(row) : undefined;\n const texts = fields.map(([, value]) => value);\n if (extra) texts.push(extra);\n const matched = mode === \"whole_words\"\n ? matchesTableSearch(texts.join(\" \"), q, mode)\n : texts.some(value => matchesTableSearch(value, q, mode));\n if (!matched) return [];\n let rank = 3;\n for (const [key, value] of fields) {\n if (!matchesTableSearch(value, q, mode)) continue;\n const role = options.roles?.[key] ?? inferTableSearchRole(key);\n if (role === \"id\" || role === \"name\") rank = Math.min(rank, value.trim().toLocaleLowerCase() === q ? 0 : 1);\n else if (role === \"description\") rank = Math.min(rank, 2);\n }\n return [{ row, rank, index }];\n }).sort((a, b) => a.rank - b.rank || a.index - b.index).map(item => item.row);\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { useDndMonitor, useDraggable, useDroppable } from \"@dnd-kit/core\";\nimport { Button } from \"../button\";\nimport { Checkbox } from \"../checkbox\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../dialog\";\nimport { cn } from \"../cn\";\nimport { ArrowDown, ArrowUp, GripVertical } from \"./icons\";\nimport { columnId } from \"./filter-engine\";\nimport type { MatrxColumnDef } from \"./types\";\n\ninterface ColumnManagerProps<T> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n columns: MatrxColumnDef<T>[];\n order: string[];\n hidden: Set<string>;\n onApply: (order: string[], hidden: Set<string>) => void;\n}\n\n/** Package-owned column visibility and order editor shared by every table. */\nexport function ColumnManager<T>({\n open,\n onOpenChange,\n columns,\n order,\n hidden,\n onApply,\n}: ColumnManagerProps<T>) {\n const byId = useMemo(\n () => new Map(columns.map((column) => [columnId(column), column])),\n [columns],\n );\n const [draftOrder, setDraftOrder] = useState(order);\n const [draftHidden, setDraftHidden] = useState(() => new Set(hidden));\n const [draggedColumnId, setDraggedColumnId] = useState<string | null>(null);\n const [dropTarget, setDropTarget] = useState<string | null>(null);\n\n useEffect(() => {\n if (!open) return;\n setDraftOrder(order);\n setDraftHidden(new Set(hidden));\n }, [open, order, hidden]);\n\n const move = (id: string, direction: -1 | 1) => {\n setDraftOrder((current) => {\n const index = current.indexOf(id);\n const target = index + direction;\n if (index < 0 || target < 0 || target >= current.length) return current;\n const next = [...current];\n const displaced = next[target];\n if (displaced === undefined) return current;\n next[target] = id;\n next[index] = displaced;\n return next;\n });\n };\n\n const moveTo = (id: string, targetId: string) => {\n if (id === targetId) return;\n setDraftOrder((current) => {\n const from = current.indexOf(id);\n const target = current.indexOf(targetId);\n if (from < 0 || target < 0) return current;\n const next = [...current];\n next.splice(from, 1);\n const targetAfterRemoval = next.indexOf(targetId);\n next.splice(targetAfterRemoval, 0, id);\n return next;\n });\n };\n\n // This dialog is rendered inside the table's DndContext. Keeping the draft\n // order here means Cancel still discards a drag, while the shared pointer\n // sensor gives mouse, touch, and pen identical behavior.\n useDndMonitor({\n onDragStart(event) {\n if (event.active.data.current?.matrxDragKind !== \"column-manager\") return;\n setDraggedColumnId(String(event.active.data.current.columnId));\n },\n onDragOver(event) {\n if (event.active.data.current?.matrxDragKind !== \"column-manager\") return;\n const overData = event.over?.data.current;\n const target = overData?.matrxDragKind === \"column-manager\" ? overData.columnId : null;\n setDropTarget(target ? String(target) : null);\n },\n onDragCancel(event) {\n if (event.active.data.current?.matrxDragKind !== \"column-manager\") return;\n setDraggedColumnId(null);\n setDropTarget(null);\n },\n onDragEnd(event) {\n if (event.active.data.current?.matrxDragKind !== \"column-manager\") return;\n const dragged = String(event.active.data.current.columnId);\n const overData = event.over?.data.current;\n const target = overData?.matrxDragKind === \"column-manager\" ? overData.columnId : null;\n setDraggedColumnId(null);\n setDropTarget(null);\n if (target) moveTo(dragged, String(target));\n },\n });\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Columns</DialogTitle>\n <DialogDescription>\n Choose the columns to show and set their order.\n </DialogDescription>\n </DialogHeader>\n <div className=\"max-h-[55dvh] divide-y overflow-y-auto rounded-md border\">\n {draftOrder.map((id, index) => {\n const column = byId.get(id);\n if (!column) return null;\n const label = typeof column.header === \"string\" ? column.header : id;\n const hideable = column.hideable !== false;\n const visible = !draftHidden.has(id);\n return (\n <ColumnManagerDropTarget\n key={id}\n id={id}\n className={cn(\n \"flex items-center gap-2 px-2 py-2\",\n !visible && \"bg-muted/30 text-muted-foreground\",\n dropTarget === id && draggedColumnId !== id && \"border-t-2 border-primary\",\n )}\n >\n <ColumnManagerDragHandle id={id} label={label} />\n <Checkbox\n checked={visible}\n disabled={!hideable}\n aria-label={`${visible ? \"Hide\" : \"Show\"} ${label}`}\n onCheckedChange={(checked) => {\n if (!hideable) return;\n setDraftHidden((current) => {\n const next = new Set(current);\n if (checked) next.delete(id);\n else next.add(id);\n return next;\n });\n }}\n />\n <span className=\"min-w-0 flex-1 truncate text-sm\">{label}</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label={`Move ${label} earlier`}\n disabled={index === 0}\n onClick={() => move(id, -1)}\n >\n <ArrowUp className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label={`Move ${label} later`}\n disabled={index === draftOrder.length - 1}\n onClick={() => move(id, 1)}\n >\n <ArrowDown className=\"h-4 w-4\" />\n </Button>\n </ColumnManagerDropTarget>\n );\n })}\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n onApply(draftOrder, draftHidden);\n onOpenChange(false);\n }}\n >\n Apply columns\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ColumnManagerDropTarget({\n id,\n className,\n children,\n}: {\n id: string;\n className: string;\n children: ReactNode;\n}) {\n const { setNodeRef } = useDroppable({\n id: `matrx-column-manager:${id}`,\n data: { matrxDragKind: \"column-manager\", columnId: id },\n });\n return (\n <div ref={setNodeRef} data-matrx-column-manager-drop-target={id} className={className}>\n {children}\n </div>\n );\n}\n\nfunction ColumnManagerDragHandle({ id, label }: { id: string; label: string }) {\n const { attributes, listeners, setNodeRef } = useDraggable({\n id: `matrx-column-manager:${id}`,\n data: { matrxDragKind: \"column-manager\", columnId: id },\n });\n return (\n <button\n ref={setNodeRef}\n type=\"button\"\n className=\"flex h-10 w-10 shrink-0 touch-none cursor-grab items-center justify-center text-muted-foreground hover:text-foreground active:cursor-grabbing\"\n aria-label={`Reorder ${label}`}\n title={`Drag to reorder ${label}`}\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n );\n}\n","import { z } from \"zod\";\nimport { LAYERED_FILTER_OPERATORS } from \"./layered-filters\";\nimport type { ColumnFiltersState, TableViewSnapshot } from \"./types\";\n\nconst filterSchema = z.union([\n z.object({ kind: z.literal(\"text\"), value: z.string(), mode: z.enum([\"contains\", \"empty\", \"not_empty\", \"null\", \"not_null\"]).optional(), negated: z.boolean().optional() }),\n z.object({ kind: z.literal(\"select\"), value: z.string(), values: z.array(z.string()).optional(), negated: z.boolean().optional() }),\n z.object({ kind: z.literal(\"boolean\"), value: z.boolean(), negated: z.boolean().optional() }),\n z.object({ kind: z.literal(\"number\"), min: z.number().optional(), max: z.number().optional(), negated: z.boolean().optional() }),\n]);\nconst layeredRuleSchema = z.object({ id: z.string().min(1), field: z.string().min(1), operator: z.enum(LAYERED_FILTER_OPERATORS), value: z.string(), valueTo: z.string().optional() });\nconst snapshotSchema = z.object({\n __kind: z.literal(\"matrx-table-view\"), version: z.literal(1),\n query: z.object({ pageSize: z.number().int().positive(), search: z.string(), searchMatchMode: z.enum([\"contains\", \"whole_words\"]).optional(), searchScope: z.string().min(1).optional(), anyOf: z.string(), layeredFilters: z.array(layeredRuleSchema).optional(), columnFilters: z.record(z.string(), filterSchema.optional()), sort: z.object({ id: z.string().min(1), direction: z.enum([\"asc\", \"desc\"]) }).nullable() }),\n columns: z.object({\n order: z.array(z.string().min(1)).refine((order) => new Set(order).size === order.length, {\n message: \"Column order must not contain duplicate IDs\",\n }),\n hidden: z.array(z.string().min(1)),\n widths: z.record(z.string(), z.number().finite().positive()).optional(),\n }),\n});\n\nfunction normalizeFilters(raw: z.infer<typeof snapshotSchema>[\"query\"][\"columnFilters\"]): ColumnFiltersState {\n const filters: ColumnFiltersState = {};\n for (const [id, value] of Object.entries(raw)) {\n if (value === undefined) continue;\n if (value.kind === \"text\") filters[id] = { kind: \"text\", value: value.value, ...(value.mode === undefined ? {} : { mode: value.mode }), ...(value.negated === undefined ? {} : { negated: value.negated }) };\n else if (value.kind === \"select\") filters[id] = { kind: \"select\", value: value.value, ...(value.values === undefined ? {} : { values: value.values }), ...(value.negated === undefined ? {} : { negated: value.negated }) };\n else if (value.kind === \"boolean\") filters[id] = { kind: \"boolean\", value: value.value, ...(value.negated === undefined ? {} : { negated: value.negated }) };\n else filters[id] = { kind: \"number\", ...(value.min === undefined ? {} : { min: value.min }), ...(value.max === undefined ? {} : { max: value.max }), ...(value.negated === undefined ? {} : { negated: value.negated }) };\n }\n return filters;\n}\n\n/** Defensive decoder for persisted JSON. Invalid snapshots are ignored by adapters. */\nexport function parseTableViewSnapshot(raw: unknown): TableViewSnapshot | null {\n const parsed = snapshotSchema.safeParse(raw);\n if (!parsed.success) return null;\n const { query, columns } = parsed.data;\n return {\n __kind: \"matrx-table-view\",\n version: 1,\n query: {\n pageSize: query.pageSize,\n search: query.search,\n ...(query.searchMatchMode === undefined ? {} : { searchMatchMode: query.searchMatchMode }),\n ...(query.searchScope === undefined ? {} : { searchScope: query.searchScope }),\n anyOf: query.anyOf,\n ...(query.layeredFilters === undefined ? {} : { layeredFilters: query.layeredFilters }),\n columnFilters: normalizeFilters(query.columnFilters),\n sort: query.sort,\n },\n columns: {\n order: columns.order,\n hidden: columns.hidden,\n ...(columns.widths === undefined ? {} : { widths: columns.widths }),\n },\n };\n}\n","\"use client\";\n\n/**\n * MatrxUuidCell — canonical UUID / FK display for dense tables.\n *\n * Port of aidream `UuidDisplay` + AI Models `UuidCell` + tool-call `ShortId`:\n * short prefix (8 chars), full value on hover, always-visible copy of the full\n * id. Optional FK open: in-app WindowPanel (`onOpen`) and/or route (`href`).\n * Forbidden targets stay copyable but are not navigable.\n *\n * THE DOOR LAW: \"never render an id you can't open\". Pass `token` (the canonical\n * entity token this id points at) and the cell resolves its own doors from the\n * registries — route, new tab, and peek — with no per-callsite wiring. Prefer\n * `EntityRef` whenever the record's NAME is available; this is the fallback for\n * a raw FK column where it genuinely isn't.\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n type MouseEvent,\n type ReactNode,\n} from \"react\";\nimport {\n Check,\n Copy,\n ExternalLink,\n Lightbulb,\n PanelRight,\n ShieldOff,\n} from \"./icons\";\nimport { useTableNotice } from \"./useTableNotice\";\nimport { useMatrxDataTableHost } from \"./host\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../tooltip\";\nimport { cn } from \"../cn\";\n\nconst SHORT_LEN = 8;\n\nexport function shortUuid(id: string, len = SHORT_LEN): string {\n return id.slice(0, len);\n}\n\nasync function copyText(text: string): Promise<boolean> {\n try {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // fall through\n }\n try {\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.style.position = \"fixed\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n const ok = document.execCommand(\"copy\");\n document.body.removeChild(ta);\n return ok;\n } catch {\n return false;\n }\n}\n\nexport type MatrxUuidOpenResult = void | \"forbidden\";\n\nexport interface MatrxUuidCellProps {\n value: string | null | undefined;\n /** Tooltip / copy label prefix (e.g. column name). */\n label?: string | undefined;\n /**\n * Open the referenced record in-app (prefer WindowPanel).\n * Return `\"forbidden\"` to block navigation and show a muted state.\n */\n onOpen?: (id: string) => MatrxUuidOpenResult | Promise<MatrxUuidOpenResult>;\n /** Optional real href (new tab / cmd-click). Used when navigation is allowed. */\n href?: string | null | undefined;\n /**\n * Canonical entity token this id points at (`agent`, `note`, `task`, …).\n * Supplies the route and the peek automatically — THE DOOR LAW, resolved\n * from the registries instead of wired per callsite. An explicit `href` /\n * `onOpen` still wins.\n */\n token?: string | null | undefined;\n /** Force non-navigable (still copyable). */\n forbidden?: boolean;\n className?: string;\n trailing?: ReactNode;\n}\n\nexport function MatrxUuidCell({\n value,\n label,\n onOpen,\n href,\n token,\n forbidden = false,\n className,\n trailing,\n}: MatrxUuidCellProps) {\n const { resolveEntityDoors, ResourcePeek } = useMatrxDataTableHost();\n const { notify, notice } = useTableNotice();\n const [copied, setCopied] = useState(false);\n const [opening, setOpening] = useState(false);\n const [peekOpen, setPeekOpen] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (timer.current) clearTimeout(timer.current);\n },\n [],\n );\n\n if (!value) {\n return <span className=\"text-muted-foreground/40\">—</span>;\n }\n\n const doors = token ? resolveEntityDoors?.(token, value, href) ?? null : null;\n const resolvedHref = doors?.href ?? href ?? null;\n const canPeek = Boolean(doors?.canPeek) && !forbidden;\n const display = shortUuid(value);\n const tip = label ? `${label}: ${value}` : value;\n\n const stop = (e: MouseEvent) => {\n e.stopPropagation();\n };\n\n const onCopy = (e: MouseEvent) => {\n stop(e);\n e.preventDefault();\n void copyText(value).then((ok) => {\n if (!ok) {\n notify?.error(\"Couldn't copy ID\");\n return;\n }\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), 1500);\n });\n };\n\n const handleOpen = async (e: MouseEvent) => {\n stop(e);\n e.preventDefault();\n if (!onOpen || forbidden || opening) return;\n setOpening(true);\n try {\n const result = await onOpen(value);\n if (result === \"forbidden\") {\n // access-errors: ok — relays the onOpen contract's explicit verdict: the caller's opener returns \"forbidden\" only after ITS OWN access check; the cell performs no read and never guesses\n notify?.error(\"You don't have access to open this record\");\n }\n } catch (err) {\n notify?.error(\n `Couldn't open: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n setOpening(false);\n }\n };\n\n const idNode = (() => {\n if (forbidden) {\n return (\n <span className=\"inline-flex min-w-0 items-center gap-1 font-mono text-xs text-muted-foreground/70 tabular-nums\">\n <span className=\"min-w-0 truncate\">{display}</span>\n <ShieldOff className=\"h-3 w-3 shrink-0 opacity-60\" aria-hidden />\n </span>\n );\n }\n\n if (onOpen) {\n return (\n <button\n type=\"button\"\n aria-label={`Open ${label ?? \"record\"} ${display}`}\n onClick={(e) => void handleOpen(e)}\n disabled={opening}\n className=\"inline-flex min-w-0 items-center gap-1 font-mono text-xs text-sky-600 hover:underline dark:text-sky-400 disabled:opacity-60\"\n >\n <span className=\"min-w-0 truncate tabular-nums\">{display}</span>\n <PanelRight className=\"h-3 w-3 shrink-0 opacity-50\" />\n </button>\n );\n }\n\n if (resolvedHref) {\n return (\n <a\n href={resolvedHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`Open ${label ?? \"record\"} ${display} in a new tab`}\n onClick={stop}\n className=\"inline-flex min-w-0 items-center gap-1 font-mono text-xs text-sky-600 hover:underline dark:text-sky-400\"\n >\n <span className=\"min-w-0 truncate tabular-nums\">{display}</span>\n <ExternalLink className=\"h-3 w-3 shrink-0 opacity-50\" />\n </a>\n );\n }\n\n return (\n <span className=\"min-w-0 truncate font-mono text-xs text-muted-foreground tabular-nums select-all\">\n {display}\n </span>\n );\n })();\n\n return (\n <TooltipProvider delayDuration={200}>\n <span\n data-matrx-cell-control\n className={cn(\n \"inline-flex min-w-0 max-w-full items-center gap-0.5 whitespace-nowrap\",\n className,\n )}\n onClick={stop}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex min-w-0 max-w-full items-center\">\n {idNode}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-sm break-all font-mono\">\n {forbidden ? `No access · ${tip}` : tip}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onCopy}\n aria-label={copied ? \"Copied\" : `Copy ${label ?? \"id\"}`}\n className={cn(\n \"inline-flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:text-foreground focus:outline-none\",\n copied && \"text-primary\",\n )}\n >\n {copied ? <Check className=\"h-3 w-3\" /> : <Copy className=\"h-3 w-3\" />}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{copied ? \"Copied\" : `Copy ${label ?? \"id\"}: ${value}`}</TooltipContent>\n </Tooltip>\n {canPeek ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => {\n stop(e);\n setPeekOpen(true);\n }}\n aria-label={`Quick look at ${label ?? \"record\"}`}\n className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:text-foreground focus:outline-none\"\n >\n <Lightbulb className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Quick look at {label ?? \"record\"}</TooltipContent>\n </Tooltip>\n ) : null}\n {onOpen && resolvedHref && !forbidden ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <a\n href={resolvedHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={stop}\n aria-label={`Open ${label ?? \"record\"} in a new tab`}\n className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:text-foreground focus:outline-none\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Open {label ?? \"record\"} in a new tab</TooltipContent>\n </Tooltip>\n ) : null}\n {trailing}\n {notice}\n {canPeek && peekOpen && ResourcePeek ? (\n <ResourcePeek\n kind={doors?.peekKind ?? token ?? \"record\"}\n id={value}\n onClose={() => setPeekOpen(false)}\n // Same contract as `EntityDoorControls`: forward the CALLER's raw\n // `href` so the peek's \"Open\" cannot send the user somewhere this\n // cell's own link does not go. `doors.ts` names EntityRef and this\n // cell as the two presentations that must not drift — the peek\n // override shipped on one of them first, which is exactly the drift\n // that file warns about.\n {...(href == null ? {} : { href })}\n />\n ) : null}\n </span>\n </TooltipProvider>\n );\n}\n","export function isUuidValue(value: unknown): value is string {\n return typeof value === \"string\" && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);\n}\nexport function tokenFromColumnName(name: string): string | null {\n return name.endsWith(\"_id\") ? name.slice(0, -3) : null;\n}\n","import { stringifyCellValue } from \"./filter-engine\";\n\n/** Display formatting only; copy/export and persistence retain the original value. */\nexport function formatTableDisplayValue(value: unknown): string {\n if (typeof value === \"number\") return value.toLocaleString(undefined, { maximumFractionDigits: 12 });\n if (value instanceof Date) return value.toLocaleString();\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/.test(value) && !Number.isNaN(Date.parse(value))) {\n return new Date(value).toLocaleString();\n }\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n return stringifyCellValue(value) || \"—\";\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../cn\";\nimport { CopyButtons } from \"./copy\";\nimport { MatrxUuidCell } from \"./MatrxUuidCell\";\nimport { isUuidValue } from \"./entity\";\nimport { formatTableDisplayValue } from \"./display-value\";\n\n/** No field is a door unless the caller says which token it points at. */\nconst noFieldToken = (): string | null => null;\n\nfunction formatValue(value: unknown): string {\n if (value == null) return \"—\";\n if (typeof value === \"string\") return value || \"—\";\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value instanceof Date) return value.toISOString();\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date)\n );\n}\n\n/**\n * Default detail / window View body for any row. Renders a scannable key/value\n * inspector. UUID-shaped values use MatrxUuidCell (short + copy). Every field\n * row gets hover-revealed Copy + Copy-for-AI buttons (set `fieldCopy={false}`\n * to opt out). Pass a custom `renderView` / `renderDetail` to replace it.\n */\nexport function DataRowInspector<T = unknown>({\n row,\n title,\n className,\n fieldCopy = true,\n recordKind = \"record\",\n recordLabel,\n location,\n tokenForField = noFieldToken,\n}: {\n row: T;\n title?: ReactNode;\n className?: string;\n /** Hover Copy + Copy-for-AI on every field row. Default true. */\n fieldCopy?: boolean;\n /** Stable slug for the record type, used in field agent payloads. */\n recordKind?: string;\n /** Human label for the record, used in toasts (\"Backlink · anchor_text\"). */\n recordLabel?: string;\n /** Where the user is, in words, for field agent payloads. */\n location?: string;\n /**\n * Maps one of this record's field names to the entity token its id points at,\n * turning that field into a door (route + peek).\n *\n * Defaults to NO doors, because this inspector renders arbitrary tables and a\n * wrong door opens a different record. A caller that has checked its FKs can\n * pass `tokenFromColumnName` (from `components/official/entity-ref/doors`) to\n * open every `<token>_id` field, or its own stricter map.\n */\n tokenForField?: (key: string, row: T) => string | null;\n}) {\n const entries = isPlainObject(row)\n ? Object.entries(row)\n : [[\"value\", row] as const];\n\n const fieldButtons = (key: string, value: unknown) =>\n fieldCopy ? (\n <div className=\"absolute right-1 top-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover/field:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label={recordLabel ? `${recordLabel} · ${key}` : key}\n human={() => formatValue(value)}\n agent={() => ({\n kind: `${recordKind}-field`,\n location: location ?? \"Data row inspector\",\n description: `The \"${key}\" field of one ${recordLabel ?? recordKind}.`,\n data: { field: key, value, record: row },\n attributes: { field: key },\n })}\n />\n </div>\n ) : null;\n\n return (\n <div\n className={cn(\"flex h-full min-h-0 flex-col overflow-hidden\", className)}\n >\n {title ? (\n <div className=\"shrink-0 border-b border-border px-3 py-2 text-sm font-medium\">\n {title}\n </div>\n ) : null}\n <div className=\"min-h-0 flex-1 overflow-auto p-3\">\n <dl className=\"space-y-2\">\n {entries.map(([key, value]) => {\n if (isUuidValue(value)) {\n return (\n <div\n key={key}\n className=\"group/field relative grid grid-cols-[minmax(7rem,9rem)_1fr] gap-2 rounded-md border border-border/60 bg-muted/20 px-2.5 py-2\"\n >\n <dt className=\"truncate text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {key}\n </dt>\n <dd className=\"min-w-0\">\n <MatrxUuidCell\n value={value}\n label={key}\n token={tokenForField(key, row)}\n />\n </dd>\n </div>\n );\n }\n\n const formatted = value !== null && typeof value === \"object\" && !(value instanceof Date)\n ? formatValue(value)\n : formatTableDisplayValue(value);\n const multiline = formatted.includes(\"\\n\") || formatted.length > 80;\n return (\n <div\n key={key}\n className=\"group/field relative grid grid-cols-[minmax(7rem,9rem)_1fr] gap-2 rounded-md border border-border/60 bg-muted/20 py-2 pl-2.5 pr-12\"\n >\n <dt className=\"truncate text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {key}\n </dt>\n <dd\n className={cn(\n \"min-w-0 text-sm text-foreground break-words\",\n multiline &&\n \"whitespace-pre-wrap font-mono text-xs leading-relaxed\",\n )}\n >\n {formatted}\n </dd>\n {fieldButtons(key, value)}\n </div>\n );\n })}\n </dl>\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * DataRowWindow — generic WindowPanel for any table row.\n *\n * Uses WindowPanel's built-in sidebar for View / Edit tabs when an edit body\n * is provided. Page-local close via `onClose` (no overlay required) so custom\n * JSX never has to travel through Redux.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { DefaultTableWindow } from \"./default-host\";\nimport { Eye, Pencil } from \"./icons\";\nimport { useMatrxDataTableHost } from \"./host\";\nimport { cn } from \"../cn\";\nimport { DataRowInspector } from \"./DataRowInspector\";\n\nexport type DataRowWindowTab = \"view\" | \"edit\";\n\nexport interface DataRowWindowProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string | undefined;\n /** Serializable row for the default inspector. Ignored when viewContent set. */\n row?: unknown | undefined;\n /**\n * Full-body override (no tabs). Escape hatch — prefer viewContent +\n * editContent so the window stays editable.\n */\n children?: React.ReactNode | undefined;\n /** View tab body. Defaults to DataRowInspector. */\n viewContent?: React.ReactNode | undefined;\n /** Edit tab body. When set, View/Edit sidebar tabs are shown. */\n editContent?: React.ReactNode | undefined;\n /** Which tab to open. Default: \"edit\" when editContent exists, else \"view\". */\n defaultTab?: DataRowWindowTab | undefined;\n /** Right-side header actions (e.g. CopyButtons for the whole record). */\n headerActions?: React.ReactNode | undefined;\n width?: number | undefined;\n height?: number | undefined;\n windowId?: string | undefined;\n}\n\nexport function DataRowWindow({\n isOpen,\n onClose,\n title = \"Row details\",\n row,\n children,\n viewContent,\n editContent,\n defaultTab,\n headerActions,\n width = 720,\n height = 560,\n windowId = \"matrx-data-row-window\",\n}: DataRowWindowProps) {\n const host = useMatrxDataTableHost();\n const WindowPanel = host.WindowPanel ?? DefaultTableWindow;\n const hasEdit = editContent != null;\n const hasTabs = hasEdit && children == null;\n const initialTab: DataRowWindowTab =\n defaultTab ?? (hasEdit ? \"edit\" : \"view\");\n const [tab, setTab] = useState<DataRowWindowTab>(initialTab);\n\n // Reset tab when the window opens on a different row / edit availability.\n useEffect(() => {\n if (!isOpen) return;\n setTab(defaultTab ?? (hasEdit ? \"edit\" : \"view\"));\n }, [isOpen, windowId, hasEdit, defaultTab]);\n\n if (!isOpen) return null;\n\n const viewBody = viewContent ?? <DataRowInspector row={row} />;\n\n // Same contract as the side panel: `viewContent` / `editContent` are custom\n // bodies (usually the table's `detail.render`) that mostly do NOT own their\n // own scrolling, so `overflow-hidden` here cut them off at the fold. The\n // container owns the scroll; a body that already scrolls resolves to this\n // container's height and still shows a single scrollbar.\n const body = children ?? (\n <div className=\"flex h-full min-h-0 flex-1 flex-col overflow-hidden\">\n {hasTabs ? (\n tab === \"edit\" ? (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{editContent}</div>\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{viewBody}</div>\n )\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{viewBody}</div>\n )}\n </div>\n );\n\n return (\n <WindowPanel\n id={windowId}\n title={title}\n onClose={onClose}\n width={width}\n height={height}\n minWidth={420}\n minHeight={320}\n actionsRight={headerActions}\n bodyClassName=\"flex min-h-0 flex-1 flex-col overflow-hidden p-0\"\n sidebarDefaultSize={140}\n sidebarMinSize={110}\n sidebar={\n hasTabs ? (\n <nav\n aria-label=\"Row window tabs\"\n className=\"flex h-full flex-col gap-0.5 overflow-y-auto p-1.5\"\n >\n <TabButton\n active={tab === \"view\"}\n icon={<Eye className=\"h-4 w-4 shrink-0\" />}\n label=\"View\"\n onClick={() => setTab(\"view\")}\n />\n <TabButton\n active={tab === \"edit\"}\n icon={<Pencil className=\"h-4 w-4 shrink-0\" />}\n label=\"Edit\"\n onClick={() => setTab(\"edit\")}\n />\n </nav>\n ) : undefined\n }\n >\n {body}\n </WindowPanel>\n );\n}\n\nfunction TabButton({\n active,\n icon,\n label,\n onClick,\n}: {\n active: boolean;\n icon: React.ReactNode;\n label: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={onClick}\n className={cn(\n \"flex items-center gap-2 rounded-md px-2.5 py-2 text-left text-sm transition-colors\",\n active\n ? \"bg-accent font-medium text-foreground\"\n : \"text-muted-foreground hover:bg-muted/60 hover:text-foreground\",\n )}\n >\n {icon}\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n </button>\n );\n}\n","import { isUuidValue } from \"./entity\";\nimport { columnId, getCellValue } from \"./filter-engine\";\nimport { inferTableSearchRole } from \"./ranked-search\";\nimport type { MatrxColumnDef } from \"./types\";\n\n/** Use the same name-field inference as search; visual column order is not identity. */\nexport function defaultRowTitle<T>(row: T, columns: readonly MatrxColumnDef<T>[]): string {\n const values = columns.map((column) => ({\n id: columnId(column),\n value: getCellValue(row, column),\n })).filter((entry): entry is { id: string; value: string } =>\n typeof entry.value === \"string\" && entry.value.trim().length > 0,\n );\n const named = values.find(({ id, value }) =>\n inferTableSearchRole(id) === \"name\" && !isUuidValue(value),\n );\n const identity = values.find(({ id }) => id === \"id\" || id === \"uuid\") ??\n values.find(({ id }) => inferTableSearchRole(id) === \"id\");\n const value = (named ?? identity ?? values[0])?.value.trim();\n return value ? isUuidValue(value) ? value.slice(0, 8) : value : \"Details\";\n}\n","\"use client\";\n\nimport { Loader2, Save, X } from \"./icons\";\nimport { Button } from \"../button\";\nimport { cn } from \"../cn\";\n\n/**\n * Floating dirty-session pill — Save / Cancel after inline edits.\n * Fixed bottom-center so it stays visible while scrolling the table.\n */\nexport function DirtySavePill({\n changeCount,\n saving,\n onSave,\n onCancel,\n className,\n}: {\n changeCount: number;\n saving?: boolean;\n onSave: () => void;\n onCancel: () => void;\n className?: string;\n}) {\n if (changeCount <= 0) return null;\n\n return (\n <div\n className={cn(\n \"pointer-events-none fixed inset-x-0 bottom-6 z-50 flex justify-center pb-safe\",\n className,\n )}\n >\n <div className=\"pointer-events-auto flex items-center gap-2 rounded-full border border-border bg-card px-3 py-1.5 shadow-lg elevation-2\">\n <span className=\"px-1 text-xs font-medium text-muted-foreground\">\n {changeCount} unsaved change{changeCount === 1 ? \"\" : \"s\"}\n </span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 gap-1.5 rounded-full border-dashed border-destructive/60 text-xs text-destructive hover:text-destructive\"\n disabled={saving}\n onClick={onCancel}\n >\n <X className=\"h-3.5 w-3.5\" />\n Cancel\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-7 gap-1.5 rounded-full text-xs\"\n disabled={saving}\n onClick={onSave}\n >\n {saving ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Save className=\"h-3.5 w-3.5\" />\n )}\n Save\n </Button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Typed inline cell editor. Strings edit in-place; non-strings open a small\n * popover (Supabase-style). Commits into the parent draft map — never persists\n * until the floating Save pill fires.\n */\n\nimport { useState } from \"react\";\nimport { Check, ChevronDown, Pencil, X } from \"./icons\";\nimport { Button } from \"../button\";\nimport { Checkbox } from \"../checkbox\";\nimport { Input } from \"../input\";\nimport { useMatrxDataTableHost } from \"./host\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport { cn } from \"../cn\";\nimport type { CellEditType } from \"./types\";\nimport { stringifyCellValue } from \"./filter-engine\";\n\ninterface EditableTableCellProps {\n value: unknown;\n editType: Exclude<CellEditType, false>;\n editOptions?: Array<{ value: string; label: string }>;\n display: React.ReactNode;\n dirty?: boolean;\n onCommit: (next: unknown) => void;\n className?: string;\n /**\n * D112: when the cell doubles as the row's title link, the display renders\n * as a real anchor (keyboard focus, SR semantics, middle-click) and editing\n * moves to a hover/focus-revealed pencil instead of click-text-to-edit.\n */\n href?: string;\n /**\n * `\"pencil\"` (or any `href`) → hover pencil only. `\"click\"` (default) →\n * click the cell body to edit. Whole-row click owners use `\"pencil\"` so the\n * body doesn't steal the gesture into edit mode.\n */\n editTrigger?: \"click\" | \"pencil\";\n}\n\n/** Display + hover-pencil shell; optional real link when `href` is set. */\nfunction CellEditShell({\n href,\n display,\n dirty,\n className,\n editButton,\n}: {\n href?: string;\n display: React.ReactNode;\n dirty?: boolean;\n className?: string;\n editButton: React.ReactNode;\n}) {\n const { Link: HostLink } = useMatrxDataTableHost();\n const Link = HostLink ?? ((props: { href: string; children: React.ReactNode; className?: string; onClick?: React.MouseEventHandler<HTMLAnchorElement> }) => <a {...props} />);\n return (\n <span\n className={cn(\n // overflow-hidden + min-w-0: table cells grow to min-content by default,\n // so a 10-page description must be clipped here — never via truncate on\n // this flex row (nowrap would stretch the whole table horizontally).\n \"group/cell-link flex w-full min-w-0 max-w-full items-center gap-1 overflow-hidden rounded px-0.5\",\n dirty && \"ring-1 ring-primary/40 bg-primary/5\",\n className,\n )}\n >\n {href ? (\n <Link\n href={href}\n onClick={(e) => e.stopPropagation()}\n className=\"min-w-0 flex-1 overflow-hidden truncate rounded outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {display}\n </Link>\n ) : (\n <span className=\"block min-w-0 flex-1 overflow-hidden\">{display}</span>\n )}\n {editButton}\n </span>\n );\n}\n\nconst CELL_PENCIL_CLASS =\n \"shrink-0 rounded p-0.5 text-muted-foreground opacity-100 transition-opacity hover:bg-muted/60 focus-visible:opacity-100 lg:opacity-0 group-hover/cell-link:opacity-100\";\n\nexport function EditableTableCell({\n value,\n editType,\n editOptions = [],\n display,\n dirty,\n onCommit,\n className,\n href,\n editTrigger = \"click\",\n}: EditableTableCellProps) {\n const [open, setOpen] = useState(false);\n // A linked cell always edits via pencil — the body is a real navigable link.\n const usePencil = Boolean(href) || editTrigger === \"pencil\";\n\n if (editType === \"string\") {\n return (\n <InlineStringEditor\n value={stringifyCellValue(value)}\n display={display}\n {...(dirty === undefined ? {} : { dirty })}\n onCommit={onCommit}\n {...(className === undefined ? {} : { className })}\n {...(href === undefined ? {} : { href })}\n usePencil={usePencil}\n />\n );\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n {usePencil ? (\n <CellEditShell\n {...(href === undefined ? {} : { href })}\n display={display}\n {...(dirty === undefined ? {} : { dirty })}\n {...(className === undefined ? {} : { className })}\n editButton={\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Edit\"\n onClick={(e) => e.stopPropagation()}\n className={CELL_PENCIL_CLASS}\n >\n <Pencil className=\"h-3 w-3\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Edit</TooltipContent>\n </Tooltip>\n }\n />\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => e.stopPropagation()}\n className={cn(\n \"group/cell-select flex w-full items-center gap-1 rounded px-0.5 text-left hover:bg-muted/60\",\n dirty && \"ring-1 ring-primary/40 bg-primary/5\",\n className,\n )}\n >\n <span className=\"min-w-0 flex-1 overflow-hidden\">{display}</span>\n {/*\n * MSR-08: a typed cell that opens a picker must LOOK pickable —\n * a bare chip with no chevron reads as inert text, not an\n * editable field (Arman: \"a dropdown and pick the option\"). The\n * chevron stays dim until hover/focus so it doesn't compete with\n * the value, but it is always PRESENT, never opacity-0.\n */}\n {editType === \"select\" ? (\n <ChevronDown className=\"h-3 w-3 shrink-0 text-muted-foreground/70 transition-colors group-hover/cell-select:text-foreground\" />\n ) : null}\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Edit value</TooltipContent>\n </Tooltip>\n )}\n <PopoverContent\n align=\"start\"\n className=\"w-56 p-2\"\n onClick={(e) => e.stopPropagation()}\n >\n <TypedEditor\n editType={editType}\n value={value}\n editOptions={editOptions}\n onCommit={(next) => {\n onCommit(next);\n setOpen(false);\n }}\n onCancel={() => setOpen(false)}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction InlineStringEditor({\n value,\n display,\n dirty,\n onCommit,\n className,\n href,\n usePencil,\n}: {\n value: string;\n display: React.ReactNode;\n dirty?: boolean;\n onCommit: (next: unknown) => void;\n className?: string;\n href?: string;\n usePencil: boolean;\n}) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(value);\n\n if (!editing) {\n if (usePencil) {\n return (\n <CellEditShell\n {...(href === undefined ? {} : { href })}\n display={display}\n {...(dirty === undefined ? {} : { dirty })}\n {...(className === undefined ? {} : { className })}\n editButton={\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Edit\"\n onClick={(e) => {\n e.stopPropagation();\n setDraft(value);\n setEditing(true);\n }}\n className={CELL_PENCIL_CLASS}\n >\n <Pencil className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Edit</TooltipContent>\n </Tooltip>\n }\n />\n );\n }\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setDraft(value);\n setEditing(true);\n }}\n className={cn(\n \"w-full rounded px-0.5 text-left hover:bg-muted/60\",\n dirty && \"ring-1 ring-primary/40 bg-primary/5\",\n className,\n )}\n >\n {display}\n </button>\n </TooltipTrigger>\n <TooltipContent>Click to edit</TooltipContent>\n </Tooltip>\n );\n }\n\n return (\n <Input\n autoFocus\n value={draft}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => {\n onCommit(draft);\n setEditing(false);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n onCommit(draft);\n setEditing(false);\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setEditing(false);\n }\n }}\n className=\"h-7 text-sm\"\n style={{ fontSize: \"16px\" }}\n />\n );\n}\n\nfunction TypedEditor({\n editType,\n value,\n editOptions,\n onCommit,\n onCancel,\n}: {\n editType: Exclude<CellEditType, false | \"string\">;\n value: unknown;\n editOptions: Array<{ value: string; label: string }>;\n onCommit: (next: unknown) => void;\n onCancel: () => void;\n}) {\n if (editType === \"boolean\") {\n const checked = Boolean(value);\n return (\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-xs font-medium\">Value</span>\n <Checkbox\n checked={checked}\n onCheckedChange={(v) => onCommit(v === true)}\n />\n </div>\n );\n }\n\n if (editType === \"number\") {\n return (\n <NumberEditor\n value={typeof value === \"number\" ? value : Number(value) || 0}\n onCommit={onCommit}\n onCancel={onCancel}\n />\n );\n }\n\n if (editType === \"tags\") {\n return (\n <TagsEditor\n value={Array.isArray(value) ? value.map(String) : []}\n suggestions={editOptions}\n onCommit={onCommit}\n onCancel={onCancel}\n />\n );\n }\n\n if (editType === \"select\") {\n return (\n <Select\n value={stringifyCellValue(value)}\n onValueChange={(v) => onCommit(v)}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {editOptions.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n }\n\n // date\n return (\n <Input\n type=\"date\"\n defaultValue={stringifyCellValue(value).slice(0, 10)}\n className=\"h-8 text-xs\"\n style={{ fontSize: \"16px\" }}\n onChange={(e) => {\n if (e.target.value) onCommit(e.target.value);\n }}\n />\n );\n}\n\n/**\n * Chips + free text. Existing values are offered as suggestions but never\n * enforced — a tag vocabulary that cannot grow from the row it describes stops\n * being used.\n */\nfunction TagsEditor({\n value,\n suggestions,\n onCommit,\n onCancel,\n}: {\n value: string[];\n suggestions: Array<{ value: string; label: string }>;\n onCommit: (next: unknown) => void;\n onCancel: () => void;\n}) {\n const [tags, setTags] = useState<string[]>(value);\n const [draft, setDraft] = useState(\"\");\n\n const add = (raw: string) => {\n const next = raw.trim();\n if (!next || tags.includes(next)) return;\n setTags([...tags, next]);\n setDraft(\"\");\n };\n\n const matches = suggestions\n .filter(\n (s) =>\n !tags.includes(s.value) &&\n s.value !== \"__none__\" &&\n (!draft || s.label.toLowerCase().includes(draft.trim().toLowerCase())),\n )\n .slice(0, 6);\n\n return (\n <div className=\"space-y-2\" onClick={(e) => e.stopPropagation()}>\n <div className=\"flex flex-wrap gap-1\">\n {tags.length === 0 && (\n <span className=\"text-xs text-muted-foreground\">No tags</span>\n )}\n {tags.map((tag) => (\n <Tooltip key={tag}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setTags(tags.filter((t) => t !== tag))}\n aria-label={`Remove ${tag}`}\n className=\"inline-flex items-center gap-1 rounded-full border border-border px-2 py-0.5 text-[11px] hover:border-destructive hover:text-destructive\"\n >\n {tag}\n <X className=\"h-2.5 w-2.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Remove {tag}</TooltipContent>\n </Tooltip>\n ))}\n </div>\n\n <Input\n autoFocus\n value={draft}\n placeholder=\"Add tag, press Enter\"\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n add(draft);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel();\n } else if (e.key === \"Backspace\" && !draft && tags.length > 0) {\n setTags(tags.slice(0, -1));\n }\n }}\n className=\"h-8 text-xs\"\n />\n\n {matches.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {matches.map((s) => (\n <button\n key={s.value}\n type=\"button\"\n onClick={() => add(s.value)}\n className=\"rounded-full border border-dashed border-border px-2 py-0.5 text-[11px] text-muted-foreground hover:border-primary hover:text-primary\"\n >\n + {s.label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"flex justify-end gap-1 pt-1\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 px-2\"\n aria-label=\"Cancel edit\"\n onClick={onCancel}\n >\n <X className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n size=\"sm\"\n className=\"h-7 px-2\"\n aria-label=\"Apply tags\"\n onClick={() => onCommit(tags)}\n >\n <Check className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n );\n}\n\nfunction NumberEditor({\n value,\n onCommit,\n onCancel,\n}: {\n value: number;\n onCommit: (next: unknown) => void;\n onCancel: () => void;\n}) {\n const [draft, setDraft] = useState(String(value));\n return (\n <div className=\"flex flex-col gap-2\">\n <Input\n autoFocus\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n className=\"h-8 font-mono text-xs\"\n style={{ fontSize: \"16px\" }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n const n = Number(draft);\n if (Number.isFinite(n)) onCommit(n);\n }\n if (e.key === \"Escape\") onCancel();\n }}\n />\n <div className=\"flex justify-end gap-1\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7\"\n aria-label=\"Cancel edit\"\n onClick={onCancel}\n >\n <X className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-7\"\n aria-label=\"Apply value\"\n onClick={() => {\n const n = Number(draft);\n if (Number.isFinite(n)) onCommit(n);\n }}\n >\n <Check className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { X } from \"./icons\";\nimport { Button } from \"../button\";\nimport { cn } from \"../cn\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../tooltip\";\nimport type { ToolbarFacet } from \"./types\";\n\n/**\n * Extensible toolbar facet strip. Today: button-group + custom.\n * Active non-default options get a clear (X) so you don't hunt for \"All\".\n */\nexport function ToolbarFacets({ facets }: { facets: ToolbarFacet[] }) {\n if (facets.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n {facets.map((facet) => {\n if (facet.type === \"custom\") {\n return <div key={facet.id}>{facet.render()}</div>;\n }\n\n const defaultValue =\n facet.defaultValue ?? facet.options[0]?.value ?? \"\";\n const isNonDefault = facet.value !== defaultValue;\n\n return (\n <div\n key={facet.id}\n className=\"flex flex-wrap items-center gap-1.5 max-sm:grid max-sm:w-full max-sm:grid-cols-3\"\n >\n {facet.label ? (\n <span className=\"mr-0.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {facet.label}\n </span>\n ) : null}\n {facet.options.map((opt) => {\n const active = facet.value === opt.value;\n return (\n <Button\n key={opt.value}\n type=\"button\"\n size=\"sm\"\n variant={active ? \"default\" : \"outline\"}\n className={cn(\n \"h-7 gap-1 px-2.5 text-xs max-sm:w-full\",\n active && isNonDefault && \"pr-1.5\",\n )}\n onClick={() => facet.onChange(opt.value)}\n >\n {opt.icon}\n {opt.label}\n {active && isNonDefault ? (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n role=\"button\"\n tabIndex={0}\n aria-label={`Clear ${facet.label ?? opt.label} filter`}\n className=\"ml-0.5 inline-flex rounded-sm p-0.5 hover:bg-primary-foreground/20\"\n onClick={(e) => {\n e.stopPropagation();\n facet.onChange(defaultValue);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.stopPropagation();\n facet.onChange(defaultValue);\n }\n }}\n >\n <X className=\"h-3 w-3\" />\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Clear this filter</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : null}\n </Button>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n}\n\n/** Reset every button-group facet to its default. */\nexport function resetToolbarFacets(facets: ToolbarFacet[] | undefined): void {\n if (!facets) return;\n for (const facet of facets) {\n if (facet.type !== \"button-group\") continue;\n const def = facet.defaultValue ?? facet.options[0]?.value;\n if (def !== undefined && facet.value !== def) facet.onChange(def);\n }\n}\n","\"use client\";\n\nimport { useState, type DragEvent, type KeyboardEvent } from \"react\";\nimport { GripVertical, Plus, SlidersHorizontal, Trash2, X } from \"./icons\";\nimport { Button } from \"../button\";\nimport { Input } from \"../input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select\";\nimport { cn } from \"../cn\";\nimport {\n LAYERED_FILTER_OPERATOR_LABELS,\n isCompleteLayeredFilterRule,\n isLayeredFilterOperator,\n layeredFilterNeedsValue,\n layeredFilterRuleSummary,\n operatorsForLayeredField,\n type LayeredFilterField,\n type LayeredFilterRule,\n} from \"./layered-filters\";\n\nexport interface LayeredFilterBuilderProps {\n fields: readonly LayeredFilterField[];\n rules: readonly LayeredFilterRule[];\n onChange: (rules: LayeredFilterRule[]) => void;\n maxRules?: number | undefined;\n label?: string | undefined;\n}\n\nfunction moveRule(\n rules: readonly LayeredFilterRule[],\n from: number,\n to: number,\n): LayeredFilterRule[] {\n if (from === to || to < 0 || to >= rules.length) return [...rules];\n const next = [...rules];\n const [moved] = next.splice(from, 1);\n if (!moved) return next;\n next.splice(to, 0, moved);\n return next;\n}\n\nexport function LayeredFilterBuilder({\n fields,\n rules,\n onChange,\n maxRules = 20,\n label = \"Advanced filters\",\n}: LayeredFilterBuilderProps) {\n const [open, setOpen] = useState(false);\n const [draggedIndex, setDraggedIndex] = useState<number | null>(null);\n\n if (fields.length === 0) return null;\n\n const updateRule = (index: number, patch: Partial<LayeredFilterRule>) => {\n onChange(\n rules.map((rule, candidate) =>\n candidate === index ? { ...rule, ...patch } : rule,\n ),\n );\n };\n\n const addRule = () => {\n const field = fields[0];\n if (!field || rules.length >= maxRules) return;\n const operator = operatorsForLayeredField(field)[0] ?? \"contains\";\n onChange([\n ...rules,\n {\n id: `layer-${Date.now()}-${rules.length}`,\n field: field.id,\n operator,\n value: field.kind === \"select\" ? (field.options[0]?.value ?? \"\") : \"\",\n },\n ]);\n };\n\n const removeRule = (index: number) => {\n onChange(rules.filter((_, candidate) => candidate !== index));\n };\n\n const reorder = (from: number, to: number) => {\n onChange(moveRule(rules, from, to));\n };\n\n return (\n <div className=\"flex min-w-0 flex-wrap items-center gap-1\">\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) {\n const completeRules = rules.filter(isCompleteLayeredFilterRule);\n if (completeRules.length !== rules.length) onChange(completeRules);\n }\n }}\n >\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant={rules.length > 0 ? \"secondary\" : \"outline\"}\n size=\"sm\"\n className=\"h-8 gap-1.5 px-2 text-xs\"\n aria-label={label}\n >\n <SlidersHorizontal className=\"h-3.5 w-3.5\" />\n <span className=\"hidden sm:inline\">\n {rules.length > 0 ? `${rules.length} layers` : \"Advanced\"}\n </span>\n {rules.length > 0 ? (\n <span className=\"sm:hidden\">{rules.length}</span>\n ) : null}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n sideOffset={6}\n className=\"w-[min(46rem,calc(100vw-1rem))] p-0\"\n >\n <div className=\"flex items-start justify-between gap-3 border-b border-border px-3 py-2.5\">\n <div>\n <p className=\"text-sm font-semibold text-foreground\">\n Narrow these results\n </p>\n <p className=\"text-xs text-muted-foreground\">\n Every layer must match. Drag layers to put them in the order\n that makes sense to you.\n </p>\n </div>\n {rules.length > 0 ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 shrink-0 px-2 text-xs text-muted-foreground\"\n onClick={() => onChange([])}\n >\n Clear layers\n </Button>\n ) : null}\n </div>\n\n <div className=\"max-h-[min(28rem,65dvh)] space-y-1.5 overflow-y-auto p-2.5 scrollbar-thin\">\n {rules.length === 0 ? (\n <div className=\"rounded-md border border-dashed border-border px-3 py-5 text-center\">\n <p className=\"text-sm font-medium text-foreground\">\n Start with one simple layer\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n For example: Keyword contains ITAD, then Keyword doesn't\n have the word “what”.\n </p>\n </div>\n ) : (\n rules.map((rule, index) => (\n <LayeredRuleRow\n key={rule.id}\n index={index}\n rule={rule}\n fields={fields}\n dragging={draggedIndex === index}\n onChange={(patch) => updateRule(index, patch)}\n onRemove={() => removeRule(index)}\n onDragStart={() => setDraggedIndex(index)}\n onDragEnd={() => setDraggedIndex(null)}\n onDrop={(targetIndex) => {\n if (draggedIndex !== null)\n reorder(draggedIndex, targetIndex);\n setDraggedIndex(null);\n }}\n onKeyboardMove={(direction) =>\n reorder(index, index + direction)\n }\n />\n ))\n )}\n </div>\n\n <div className=\"flex items-center justify-between gap-2 border-t border-border px-3 py-2\">\n <p className=\"text-[11px] text-muted-foreground\">\n The regular search still works and is applied before these layers.\n </p>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 shrink-0 gap-1 px-2 text-xs\"\n disabled={rules.length >= maxRules}\n onClick={addRule}\n >\n <Plus className=\"h-3.5 w-3.5\" /> Add layer\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n\n {rules.map((rule, index) => (\n <span\n key={`summary-${rule.id}`}\n className={cn(\n \"inline-flex max-w-60 items-center gap-1 rounded-full border px-2 py-0.5 text-[11px]\",\n isCompleteLayeredFilterRule(rule)\n ? \"border-border bg-muted/50 text-foreground\"\n : \"border-dashed border-warning/50 bg-warning/10 text-warning\",\n )}\n >\n <button\n type=\"button\"\n className=\"min-w-0 truncate text-left\"\n onClick={() => setOpen(true)}\n title={\n isCompleteLayeredFilterRule(rule)\n ? layeredFilterRuleSummary(rule, fields)\n : `Layer ${index + 1} needs a value`\n }\n >\n <span className=\"mr-1 text-muted-foreground\">{index + 1}</span>\n {isCompleteLayeredFilterRule(rule)\n ? layeredFilterRuleSummary(rule, fields)\n : \"Choose a value\"}\n </button>\n <button\n type=\"button\"\n className=\"shrink-0 rounded-full p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground\"\n aria-label={`Remove filter layer ${index + 1}`}\n onClick={() => removeRule(index)}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))}\n </div>\n );\n}\n\nfunction LayeredRuleRow({\n index,\n rule,\n fields,\n dragging,\n onChange,\n onRemove,\n onDragStart,\n onDragEnd,\n onDrop,\n onKeyboardMove,\n}: {\n index: number;\n rule: LayeredFilterRule;\n fields: readonly LayeredFilterField[];\n dragging: boolean;\n onChange: (patch: Partial<LayeredFilterRule>) => void;\n onRemove: () => void;\n onDragStart: () => void;\n onDragEnd: () => void;\n onDrop: (targetIndex: number) => void;\n onKeyboardMove: (direction: -1 | 1) => void;\n}) {\n const field =\n fields.find((candidate) => candidate.id === rule.field) ?? fields[0];\n if (!field) return null;\n const operators = operatorsForLayeredField(field);\n const needsValue = layeredFilterNeedsValue(rule.operator);\n\n const handleMoveKey = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (event.key !== \"ArrowUp\" && event.key !== \"ArrowDown\") return;\n event.preventDefault();\n onKeyboardMove(event.key === \"ArrowUp\" ? -1 : 1);\n };\n\n return (\n <div\n className={cn(\n \"grid grid-cols-[1.75rem_minmax(7.5rem,1fr)_minmax(8.5rem,1fr)_minmax(9rem,1.4fr)_1.75rem] items-center gap-1 rounded-md border border-border bg-card p-1.5 max-sm:grid-cols-[1.75rem_1fr_1.75rem]\",\n dragging && \"opacity-50\",\n )}\n onDragOver={(event: DragEvent<HTMLDivElement>) => event.preventDefault()}\n onDrop={(event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n onDrop(index);\n }}\n >\n <button\n type=\"button\"\n draggable\n className=\"flex h-7 w-7 cursor-grab items-center justify-center rounded text-muted-foreground hover:bg-muted hover:text-foreground active:cursor-grabbing\"\n aria-label={`Move filter layer ${index + 1}. Use arrow keys or drag.`}\n title=\"Drag to reorder; arrow keys also work\"\n onDragStart={(event) => {\n event.dataTransfer.effectAllowed = \"move\";\n onDragStart();\n }}\n onDragEnd={onDragEnd}\n onKeyDown={handleMoveKey}\n >\n <GripVertical className=\"h-3.5 w-3.5\" />\n </button>\n\n <Select\n value={field.id}\n onValueChange={(nextFieldId) => {\n const nextField = fields.find(\n (candidate) => candidate.id === nextFieldId,\n );\n if (!nextField) return;\n const operator = operatorsForLayeredField(nextField)[0] ?? \"contains\";\n onChange({\n field: nextField.id,\n operator,\n value:\n nextField.kind === \"select\"\n ? (nextField.options[0]?.value ?? \"\")\n : \"\",\n valueTo: undefined,\n });\n }}\n >\n <SelectTrigger\n size=\"sm\"\n className=\"h-7 w-full text-xs max-sm:col-span-1\"\n aria-label={`Filter layer ${index + 1} field`}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {fields.map((candidate) => (\n <SelectItem\n key={candidate.id}\n value={candidate.id}\n className=\"text-xs\"\n >\n {candidate.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n <Select\n value={rule.operator}\n onValueChange={(operator) => {\n if (!isLayeredFilterOperator(operator)) return;\n onChange({\n operator,\n valueTo: operator === \"between\" ? rule.valueTo : undefined,\n });\n }}\n >\n <SelectTrigger\n size=\"sm\"\n className=\"h-7 w-full text-xs max-sm:col-start-2\"\n aria-label={`Filter layer ${index + 1} operator`}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {operators.map((operator) => (\n <SelectItem key={operator} value={operator} className=\"text-xs\">\n {LAYERED_FILTER_OPERATOR_LABELS[operator]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n <div className=\"min-w-0 max-sm:col-span-3 max-sm:col-start-1\">\n {!needsValue ? (\n <span className=\"flex h-7 items-center px-2 text-xs text-muted-foreground\">\n No value needed\n </span>\n ) : field.kind === \"select\" ? (\n <Select\n value={rule.value}\n onValueChange={(value) => onChange({ value })}\n >\n <SelectTrigger\n size=\"sm\"\n className=\"h-7 w-full text-xs\"\n aria-label={`Filter layer ${index + 1} value`}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {field.options.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n className=\"text-xs\"\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <div className=\"flex items-center gap-1\">\n <Input\n value={rule.value}\n onChange={(event) => onChange({ value: event.target.value })}\n inputMode={field.kind === \"number\" ? \"decimal\" : \"text\"}\n placeholder={\n field.kind === \"number\"\n ? (field.placeholder ?? \"Value\")\n : \"Value…\"\n }\n className=\"h-7 min-w-0 text-base sm:text-xs\"\n aria-label={`Filter layer ${index + 1} value`}\n />\n {rule.operator === \"between\" ? (\n <>\n <span className=\"text-[11px] text-muted-foreground\">and</span>\n <Input\n value={rule.valueTo ?? \"\"}\n onChange={(event) =>\n onChange({ valueTo: event.target.value })\n }\n inputMode=\"decimal\"\n placeholder=\"Value\"\n className=\"h-7 min-w-0 text-base sm:text-xs\"\n aria-label={`Filter layer ${index + 1} upper value`}\n />\n </>\n ) : null}\n </div>\n )}\n </div>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0 text-muted-foreground hover:text-destructive max-sm:col-start-3 max-sm:row-start-1\"\n aria-label={`Remove filter layer ${index + 1}`}\n onClick={onRemove}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n );\n}\n","import type { ColumnFilterKind, MatrxColumnDef } from \"./types\";\nimport {\n SELECT_EMPTY_VALUE,\n SELECT_NOT_EMPTY_VALUE,\n getCellValue,\n selectCellValues,\n} from \"./filter-engine\";\n\n/** Auto-inference switches to text above this many distinct values… */\nconst SELECT_CARDINALITY_CAP = 24;\n\nexport type ResolvedFilterKind = \"text\" | \"select\" | \"boolean\" | \"number\";\n\n/**\n * Infer a filter UI from sample row values. Prefer select for low-cardinality\n * string/enum columns, boolean for booleans, number for numeric, else text.\n */\nexport function resolveFilterKind<T>(\n col: MatrxColumnDef<T>,\n sampleRows: T[],\n): ResolvedFilterKind | null {\n if (col.filter === false) return null;\n if (col.filter && col.filter !== \"auto\") return col.filter;\n\n const values = sampleRows\n .slice(0, 200)\n .map((row) => getCellValue(row, col))\n .filter((v) => v != null);\n\n if (values.length === 0) return \"text\";\n\n if (values.every((v) => typeof v === \"boolean\")) return \"boolean\";\n if (values.every((v) => typeof v === \"number\" && Number.isFinite(v))) {\n return \"number\";\n }\n\n const strings = values.flatMap(selectCellValues);\n const unique = new Set(strings);\n if (\n unique.size >= 1 &&\n unique.size <= SELECT_CARDINALITY_CAP &&\n unique.size < strings.length * 0.6\n ) {\n return \"select\";\n }\n\n return \"text\";\n}\n\nexport function collectSelectOptions<T>(\n col: MatrxColumnDef<T>,\n rows: T[],\n): Array<{ value: string; label: string }> {\n const seen = new Set<string>();\n const options: Array<{ value: string; label: string }> = [];\n let hasEmpty = false;\n for (const row of rows) {\n const values = selectCellValues(getCellValue(row, col));\n if (values.length === 0) {\n hasEmpty = true;\n continue;\n }\n for (const value of values) {\n if (col.filterOptions?.length || seen.has(value)) continue;\n seen.add(value);\n options.push({ value, label: value });\n }\n }\n const base = col.filterOptions?.length\n ? [...col.filterOptions]\n : options.sort((a, b) => a.label.localeCompare(b.label));\n // Emptiness sentinels: whenever the column has blank cells, every select\n // filter can isolate them — or exclude them — with zero per-table config.\n if (hasEmpty) {\n base.unshift(\n { value: SELECT_EMPTY_VALUE, label: \"(empty)\" },\n { value: SELECT_NOT_EMPTY_VALUE, label: \"(not empty)\" },\n );\n }\n return base;\n}\n\nexport function filterKindLabel(\n kind: ColumnFilterKind | ResolvedFilterKind,\n): string {\n switch (kind) {\n case \"text\":\n return \"Text\";\n case \"select\":\n return \"Select\";\n case \"boolean\":\n return \"Boolean\";\n case \"number\":\n return \"Number\";\n case \"auto\":\n return \"Auto\";\n case false:\n return \"Off\";\n }\n}\n","import {\n collectSelectOptions,\n resolveFilterKind,\n type ResolvedFilterKind,\n} from \"./infer-filter\";\nimport type { MatrxColumnDef, MatrxDataTableQueryState } from \"./types\";\n\nexport interface QueryFilterMeta {\n kind: ResolvedFilterKind | null;\n options: Array<{ value: string; label: string }>;\n}\n\n/**\n * Resolve header-filter metadata without inferring remote cardinality from the\n * current page. Controlled callers must declare select options explicitly;\n * local tables preserve the original inference behavior.\n */\nexport function resolveQueryFilterMeta<T>(\n column: MatrxColumnDef<T>,\n rows: T[],\n controlled: boolean,\n): QueryFilterMeta {\n if (!controlled) {\n const kind = resolveFilterKind(column, rows);\n return {\n kind,\n options: kind === \"select\" ? collectSelectOptions(column, rows) : [],\n };\n }\n if (column.filter === false) return { kind: null, options: [] };\n const declared = column.filter;\n const kind: ResolvedFilterKind =\n declared && declared !== \"auto\"\n ? declared\n : column.filterOptions?.length\n ? \"select\"\n : \"text\";\n return {\n kind,\n options: kind === \"select\" ? (column.filterOptions ?? []) : [],\n };\n}\n\nexport interface QueryStateChangeOptions {\n /** Reset to the first page after a query-shape change. */\n resetPage?: boolean;\n}\n\n/**\n * Build the next controlled query state without mutating the caller's object.\n * Search, filters, sort, facets, and page-size changes pass `resetPage: true`;\n * direct pagination passes a page patch without resetting it.\n */\nexport function nextQueryState(\n current: MatrxDataTableQueryState,\n patch: Partial<MatrxDataTableQueryState>,\n options: QueryStateChangeOptions = {},\n): MatrxDataTableQueryState {\n return {\n ...current,\n ...patch,\n page: options.resetPage ? 1 : (patch.page ?? current.page),\n };\n}\n\n/** Resolve a safe one-based page for the latest remote total. */\nexport function safeQueryPage(\n requestedPage: number,\n totalItems: number,\n pageSize: number,\n): number {\n const safeTotal = Math.max(0, totalItems);\n const safeSize = Math.max(1, pageSize);\n const pageCount = Math.max(1, Math.ceil(safeTotal / safeSize));\n return Math.min(Math.max(1, requestedPage), pageCount);\n}\n\n","\"use client\";\n\nimport { useId, useState } from \"react\";\nimport { Button } from \"../button\";\nimport { Input } from \"../input\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../dropdown-menu\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"../dialog\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport { ChevronDown } from \"./icons\";\nimport type { TableViewSnapshot } from \"./types\";\n\nexport interface SavedViewsControlProps {\n views: ReadonlyArray<{ id: string; name: string; snapshot: TableViewSnapshot }>;\n activeId?: string | null;\n loading?: boolean;\n error?: string | null;\n dirty?: boolean;\n onSelect: (id: string | null) => void;\n onSaveNew: (name: string) => void | Promise<void>;\n onUpdate?: () => void | Promise<void>;\n onReload?: () => void | Promise<void>;\n}\n\n/** Shared named-view chooser. Persistence, authorization and validation stay host-side. */\nexport function SavedViewsControl({\n views,\n activeId = null,\n loading = false,\n error,\n dirty = false,\n onSelect,\n onSaveNew,\n onUpdate,\n onReload,\n}: SavedViewsControlProps) {\n const unsavedChangesId = useId();\n const [saveOpen, setSaveOpen] = useState(false);\n const [name, setName] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n const visibleError = actionError ?? error;\n const save = async () => {\n const next = name.trim();\n if (!next) return;\n setSaving(true);\n setActionError(null);\n try {\n await onSaveNew(next);\n setName(\"\");\n setSaveOpen(false);\n } catch (cause) {\n setActionError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setSaving(false);\n }\n };\n const update = async () => {\n if (!onUpdate) return;\n setSaving(true);\n setActionError(null);\n try {\n await onUpdate();\n } catch (cause) {\n setActionError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setSaving(false);\n }\n };\n const reload = async () => {\n if (!onReload) return;\n setSaving(true);\n setActionError(null);\n try {\n await onReload();\n } catch (cause) {\n setActionError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setSaving(false);\n }\n };\n const activeName = activeId ? views.find((view) => view.id === activeId)?.name : undefined;\n return (\n <div className=\"flex min-w-0 flex-wrap items-center gap-1\" data-matrx-table-saved-views>\n <DropdownMenu>\n <Tooltip><TooltipTrigger asChild><DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 min-w-0 max-w-52 gap-1 px-2 text-xs font-medium\"\n aria-label={`Table view: ${loading ? \"Loading views\" : (activeName ?? \"Default view\")}${dirty ? \", unsaved changes\" : \"\"}`}\n aria-describedby={dirty ? unsavedChangesId : undefined}\n disabled={saving}\n >\n <span className=\"min-w-0 flex-1 truncate\">{loading ? \"Loading views…\" : (activeName ?? \"Default view\")}</span>\n {dirty ? <span aria-hidden=\"true\" className=\"size-1.5 shrink-0 rounded-full bg-amber-500\" /> : null}\n <ChevronDown className=\"size-3.5 shrink-0\" />\n </Button>\n </DropdownMenuTrigger></TooltipTrigger><TooltipContent>Choose or save a table view</TooltipContent></Tooltip>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Views</DropdownMenuLabel>\n <DropdownMenuRadioGroup value={activeId ?? \"__default__\"} onValueChange={(value) => onSelect(value === \"__default__\" ? null : value)}>\n <DropdownMenuRadioItem value=\"__default__\">Default view</DropdownMenuRadioItem>\n {views.map((view) => <DropdownMenuRadioItem key={view.id} value={view.id}>{view.name}</DropdownMenuRadioItem>)}\n </DropdownMenuRadioGroup>\n <DropdownMenuSeparator />\n <DropdownMenuItem disabled={saving} onSelect={() => { setActionError(null); setSaveOpen(true); }}>Save current view…</DropdownMenuItem>\n {activeId && onUpdate ? <DropdownMenuItem disabled={saving} onSelect={() => void update()}>Update current view</DropdownMenuItem> : null}\n {onReload ? <DropdownMenuItem disabled={saving || loading} onSelect={() => void reload()}>Reload views</DropdownMenuItem> : null}\n </DropdownMenuContent>\n </DropdownMenu>\n {dirty ? <span id={unsavedChangesId} className=\"sr-only\">This table view has unsaved changes. Open the view menu to save or update it.</span> : null}\n {visibleError ? <p role=\"alert\" className=\"basis-full break-words text-xs text-destructive\">{visibleError}</p> : null}\n <Dialog open={saveOpen} onOpenChange={setSaveOpen}>\n <DialogContent>\n <DialogHeader><DialogTitle>Save current view</DialogTitle></DialogHeader>\n {visibleError ? <p role=\"alert\" className=\"text-sm text-destructive\">{visibleError}</p> : null}\n <Input aria-label=\"View name\" value={name} onChange={(event) => setName(event.target.value)} placeholder=\"View name\" autoFocus />\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setSaveOpen(false)}>Cancel</Button>\n <Button type=\"button\" disabled={!name.trim() || saving} onClick={() => void save()}>{saving ? \"Saving…\" : \"Save view\"}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * DropdownMenu — Radix dropdown with two behaviours the stock body lacks.\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. A wrapper in\n * matrx-frontend once deferred rendering until after hydration on a false\n * premise (Radix ids come from React's SSR-stable `useId`), which deleted\n * the always-visible trigger — buttons, `…` menus — from SSR and the first\n * client paint.\n *\n * 2. A LONG MENU SCROLLS INSTEAD OF GROWING OFF-SCREEN. Content and SubContent\n * cap at `--radix-dropdown-menu-content-available-height` — the space Radix\n * actually measured between the trigger and the viewport edge — and scroll\n * past it. Without the cap a menu longer than the viewport puts its last\n * items where no pointer can reach them, and on a short window that can be\n * the only exit from the surface.\n *\n * Portalling goes through the package's `usePortalContainer` seam, so a menu\n * opened inside a Dialog mounts INSIDE the dialog (staying in the scroll\n * shard, where its wheel events work) instead of at `document.body`. An\n * explicit `container` prop still wins.\n *\n * Icons are the package's inlined SVGs (C19) — no icon-library dependency.\n */\n\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { CheckIcon, DotFilledIcon, RadixChevronRightIcon } from \"./icons\";\nimport { usePortalContainer } from \"./portal-container\";\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nconst MENU_SURFACE_CLASS =\n \"z-[10001] min-w-[8rem] max-h-[var(--radix-dropdown-menu-content-available-height)] overflow-y-auto overflow-x-hidden overscroll-contain rounded-md border bg-popover p-1 text-popover-foreground\";\n\n\nconst MENU_ITEM_CLASS =\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\";\n\nconst MENU_INDICATOR_ITEM_CLASS =\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\";\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n data-slot=\"dropdown-menu-sub-trigger\"\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n >\n {children}\n <RadixChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName;\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(MENU_SURFACE_CLASS, \"shadow-lg\", MOTION_POPPER, className)}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName;\n\nexport interface DropdownMenuContentProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> {\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n}\n\nconst DropdownMenuContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n DropdownMenuContentProps\n>(({ className, sideOffset = 4, container, ...props }, ref) => {\n const portalContainer = usePortalContainer(container);\n return (\n <DropdownMenuPrimitive.Portal container={portalContainer}>\n <DropdownMenuPrimitive.Content\n ref={ref}\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n MENU_SURFACE_CLASS,\n \"shadow-md\",\n MOTION_POPPER,\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n});\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\nconst DropdownMenuItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n data-slot=\"dropdown-menu-item\"\n className={cn(MENU_ITEM_CLASS, inset && \"pl-8\", className)}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(MENU_INDICATOR_ITEM_CLASS, className)}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(MENU_INDICATOR_ITEM_CLASS, className)}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <DotFilledIcon className=\"h-4 w-4 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n data-slot=\"dropdown-menu-label\"\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", inset && \"pl-8\", className)}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n);\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\n\nexport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n};\n","import * as XLSX from \"xlsx\";\n\nimport { columnId, getCellValue, stringifyCellValue } from \"./filter-engine\";\nimport type { MatrxColumnDef } from \"./types\";\n\n/**\n * Download the same visible columns and rendered cell values used by the\n * canonical table's CSV export as a real Excel workbook. This module is loaded\n * only after the user chooses Excel from the unified action menu.\n */\nexport function downloadTableAsXlsx<T>({\n rows,\n columns,\n label,\n}: {\n rows: T[];\n columns: MatrxColumnDef<T>[];\n label: string;\n}) {\n const visibleColumns = columns.filter(\n (column) => column.filter !== false || column.accessorKey,\n );\n const headers = visibleColumns.map((column) =>\n typeof column.header === \"string\" ? column.header : columnId(column),\n );\n const values = rows.map((row) =>\n visibleColumns.map((column) =>\n stringifyCellValue(getCellValue(row, column)),\n ),\n );\n const worksheet = XLSX.utils.aoa_to_sheet([headers, ...values]);\n const workbook = XLSX.utils.book_new();\n const sheetName = label.replace(/[\\\\/?*[\\]:]/g, \" \").trim().slice(0, 31) || \"Data\";\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);\n const bytes = XLSX.write(workbook, {\n type: \"array\",\n bookType: \"xlsx\",\n compression: true,\n });\n const blob = new Blob([bytes], { type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\" });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = `${label.toLowerCase().replace(/[^a-z0-9]+/g, \"-\") || \"table\"}.xlsx`;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n"],"mappings":"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","names":["import_react","import_core","import_jsx_runtime","import_format","React","import_jsx_runtime","import_jsx_runtime","React","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","import_class_variance_authority","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","React","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_react_tree","React","React","import_jsx_runtime","CONTEXT_SLOT","contextRegistry","React","import_jsx_runtime","CONTEXT_SLOT","contextRegistry","import_react_tree","import_class_variance_authority","React","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","React","import_content_transfer","import_format","React","import_jsx_runtime","resolve","React","import_content_transfer","React","import_jsx_runtime","import_react","cn","import_jsx_runtime","cn","TapTargetButton","TapTargetButtonTransparent","TapTargetButtonSolid","TapTargetButtonDestructive","TapTargetButtonForGroup","import_jsx_runtime","Icon","path","XLSX","label","import_jsx_runtime","import_jsx_runtime","import_react","import_content_transfer","import_jsx_runtime","import_react","import_react","import_url_state","import_react","DialogPrimitive","React","import_jsx_runtime","CommandPrimitive","DIALOG_DESKTOP_CLASSES","DIALOG_MOBILE_SHEET_CLASSES","DIALOG_MOBILE_SHEET_OVERRIDE","CommandPrimitive","import_jsx_runtime","import_react","columnId","import_jsx_runtime","columnId","preview","import_react","import_core","import_jsx_runtime","import_zod","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","value","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","kind","import_jsx_runtime","columns","columnId","preview","resolve","import_react","React","import_jsx_runtime","import_jsx_runtime"]}
|