Skip to content

React API

tsx
import { DocumentExplorer } from '@document-explorer/react';
import '@document-explorer/react/styles.css';

<DocumentExplorer />

Data

PropTypeDefault
datareadonly T[]
mapperDocumentMapper<T>identity
localestringbrowser default

Chrome

PropTypeDefault
titleReactNode
rootLabelstring'Home'
classNamestring
styleCSSProperties

Views

PropTypeDefault
view'list' | 'grid' | 'tree'uncontrolled
defaultViewsame'list'
viewsExplorerView[]['list', 'grid']

Behaviour

PropTypeDefault
searchboolean | { scope?, searchableFields?, matchMode?, placeholder? }false
sort{ key?, direction?, foldersFirst? }{ key: 'name', direction: 'asc', foldersFirst: true }
columns(ColumnDef | string)[]Name, Type, Size, Modified
columnAlign'left' | 'center' | 'right''left'
resizableColumnsbooleanfalse
columnWidthsRecord<string, number>{}
selectionboolean | { mode?, files?, folders?, max? }false
actions{ view?, download? } | ActionDef[]none
interaction{ folderClick?, fileClick?, doubleClick? }open / select / open
renderersRenderers
loadingbooleanfalse
errorunknown

Events

onFolderOpen · onDocumentOpen · onSelectionChange · onSearch · onSort · onViewChange · onView · onDownload · onAction(actionId, item) · onColumnResize(key, width, widths)

Types

ts
interface ColumnDef {
  key: string;
  label: string;
  sortable?: boolean;
  /** `'left'` (default), `'center'` or `'right'`. Overrides `columnAlign`. */
  align?: 'left' | 'center' | 'right';
  /** Tabular numerals. Affects digit width, not position. */
  numeric?: boolean;
  width?: string;
  optional?: boolean;
  /** Set false to pin this column when `resizableColumns` is on. */
  resizable?: boolean;
  minWidth?: number;
  maxWidth?: number;
  render?: (item: DocumentItem) => ReactNode;
}

interface ActionDef {
  id: string;
  label: string;
  icon?: ReactNode;
  visible?: (item: DocumentItem) => boolean;
  danger?: boolean;
}

interface Renderers {
  file?: (item: DocumentItem) => ReactNode;
  folder?: (item: DocumentItem) => ReactNode;
  row?: (item: DocumentItem) => ReactNode;
  icon?: (item: DocumentItem) => ReactNode;
  empty?: () => ReactNode;
  loading?: () => ReactNode;
  error?: (error: unknown) => ReactNode;
  toolbar?: () => ReactNode;
}

avatarColumn(options)

A ready-made column that renders a person. Returns a ColumnDef.

tsx
avatarColumn({ key: 'metadata.owner', display: 'avatar', image: 'metadata.pic' })

Accepts every ColumnDef field plus name, image, display, tooltip, color and fallback. See avatars.

AvatarCell is exported too, for use inside your own render.

badgeColumn(options)

A ready-made status column. Returns a ColumnDef.

tsx
badgeColumn({ key: 'metadata.status', variant: 'pill', tones: { draft: 'info' } })

Accepts every ColumnDef field plus value, tones, format, variant and fallbackTone. See badges.

BadgeCell is exported too, for use inside your own render.

useDocumentExplorer()

The headless hook behind the component.

tsx
const { store, snapshot } = useDocumentExplorer({ data, mapper, selection: true });

Returns the core store and its current snapshot, wired through useSyncExternalStore.

Exported sub-components

Breadcrumbs · SearchInput · ViewSwitcher · ListView · GridView · TreeView · SelectionBar · EmptyState · LoadingState · ErrorState

Plus ICONS, UiIcons, iconFor, DEFAULT_COLUMNS, resolveColumns and resolveActions.

The engine is re-exported too — createExplorerStore, normalize, registerFileType, resolveFileType, formatBytes, formatDate — so a consumer needs only one dependency.

Released under the MIT License.