/** * The explorer's directory body: the empty-state ladder, the card grid and the * scrolling table (folders sorted above items in both), and the page footer. The * pagination MATH lives in `ExplorerView`; this renders the result. */ import type { ReactNode } from 'react'; import { EntityCardGrid } from './entity-card-grid'; import { PAGE_SIZES } from './explorer-page-size'; import type { ExplorerColumn, ExplorerEmptyStates } from './explorer-view'; import { type Folder, FolderRow } from './folder-nav'; import { type OpenTargetProps } from './open-target'; import { Button, Card, EmptyState } from './primitives'; import { ScrollRegion } from './scroll-region'; import { Select } from './select'; import { Table, TBody, TD, TH, THead, TR } from './table'; import type { ViewMode } from './view-toggle'; /** One page entry: a subfolder (sorted first) or a filtered item, in one array. */ export type ExplorerEntry = | { readonly kind: 'folder'; readonly folder: Folder } | { readonly kind: 'item'; readonly item: T }; /** A first-class folder entry — a `FolderRow` (icon + name, navigates inward) * beside its optional actions, in the layout shared by the row cell and the card. */ function FolderEntry({ folder, onNavigate, renderFolderActions, }: { readonly folder: Folder; readonly onNavigate: (folderId: string | null) => void; readonly renderFolderActions: ((folder: Folder) => ReactNode) | undefined; }): ReactNode { return (
{renderFolderActions ? renderFolderActions(folder) : null}
); } interface ExplorerPagerProps { readonly label: string; readonly pageStart: number; readonly pageSize: number; readonly total: number; readonly effectivePage: number; readonly pageCount: number; readonly onPageChange: (page: number) => void; readonly onPageSizeChange: (size: number) => void; } function ExplorerPager({ label, pageStart, pageSize, total, effectivePage, pageCount, onPageChange, onPageSizeChange, }: ExplorerPagerProps): ReactNode { return (