# Dashboard 01 - Operational overview (`dashboard-01`) - SignalOS page block

> The canonical SignalOS page: collapsible sidebar, page header with actions, KPI metric strip, filter bar, and a paginated data table - pure composition of the shared widgets.

- **Version:** 0.1.2
- **Kind:** block (group: dashboard) · **Category:** pages
- **Install:** `npx shadcn@latest add @signalos/dashboard-01`
- **Registry dependencies (pulled automatically):** @signalos/tokens, @signalos/utils, @signalos/app-shell, @signalos/data-table, @signalos/filter-bar, @signalos/metric-tile
- **npm dependencies:** @tanstack/react-table@^8.21.3, lucide-react@^1.7.0
- **Files installed:** `src/components/blocks/dashboard-01/Dashboard01.tsx`, `src/components/blocks/dashboard-01/Dashboard01.types.ts`

## Access

This is a private registry: pulling source requires a `SIGNALOS_REGISTRY_TOKEN`
(GitHub fine-grained PAT with read access to the signal-widgets repo) and an
`@signalos` entry in components.json `"registries"`. Previews and this document are public.

## Usage

```tsx
// after: npx shadcn@latest add @signalos/dashboard-01
// mount the pulled page in a route, e.g. src/app/dashboard/page.tsx
import { Dashboard01 } from "@/components/blocks/dashboard-01/Dashboard01"

export default function Page() {
  return <Dashboard01 />
}
```

## Props

### `Dashboard01Props`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `navigationItems` | `NavigationItem[]` | yes | - |  |
| `activePath` | `string` | yes | - | Current pathname for the sidebar active state. |
| `LinkComponent` | `ComponentType<AppShellLinkProps> \| undefined` | no | - | Router link renderer for the sidebar; plain <a> by default. |
| `brand` | `ReactNode` | no | - | Sidebar brand block. |
| `pageTitle` | `string \| undefined` | no | `"Overview"` |  |
| `pageSubtitle` | `string \| undefined` | no | - |  |
| `actions` | `ReactNode` | no | - | Right-aligned header actions (buttons, menus). |
| `metrics` | `MetricTileProps[]` | yes | - | KPI strip, one tile per entry (max 4 recommended). |
| `search` | `FilterBarSearchConfig \| undefined` | no | - | Search box wiring for the filter bar; omit to hide. |
| `filters` | `FilterConfig[] \| undefined` | no | - | Dropdown filters for the filter bar. |
| `onClearFilters` | `(() => void) \| undefined` | no | - |  |
| `columns` | `ColumnDef<TData, TValue>[]` | yes | - |  |
| `rows` | `TData[]` | yes | - |  |
| `pagination` | `PaginationConfig \| undefined` | no | - |  |
| `onRowClick` | `((row: TData) => void) \| undefined` | no | - |  |
| `emptyMessage` | `string \| undefined` | no | `"No records match the current filters."` |  |
| `isLoading` | `boolean \| undefined` | no | - | Skeletons the metrics strip and table. |
| `error` | `DataTableErrorConfig \| null \| undefined` | no | - | Table error state (widget-owned rendering). |
| `className` | `string \| undefined` | no | - |  |

## Changelog

# dashboard-01

## 0.1.2

- Content sync fix to bring source in line with published registry payload.


## 0.1.1

- Standardize inline comment formatting (em dash → hyphen); no runtime or API change.

## 0.1.0

- Initial release: operational-overview page composed from app-shell, metric-tile,
  filter-bar, and data-table. Generic over the table row type; one `isLoading` flag
  drives skeletons across the whole page.
