FORGE DASHBOARD — Data-Dense SaaS Design Skill
Dashboards fail in two ways: too much clutter, or too little clarity.
This skill enforces the third path: information architecture that makes data readable at a glance.
DIAL CONFIGURATION
DATA_DENSITY: 8 (1=Airy metrics / 10=Cockpit-level data saturation)
VISUAL_CLARITY: 8 (1=Decorative charts / 10=Precision data tables)
INTERACTION_DEPTH:6 (1=Static view / 10=Drill-down, filter, real-time)
SECTION 1 — DASHBOARD IDENTITY RULES
Typography for Data UIs
- Display font:
Satoshi or Geist. NEVER serif on dashboards.
- Numeric data: ALWAYS
font-mono (Geist Mono or JetBrains Mono).
- Label text:
0.6875rem uppercase, letter-spacing: 0.1em, muted color.
- Table data:
0.875rem, regular weight, tabular-nums (font-variant-numeric: tabular-nums).
Color for Data
- Background:
hsl(220 14% 97%) (not pure white — reduces eye strain)
- Card surface:
hsl(0 0% 100%) with 1px solid hsl(220 13% 91%)
- Positive delta:
hsl(158 60% 40%) — no neon green
- Negative delta:
hsl(0 72% 50%) — no neon red
- Neutral:
hsl(220 8% 58%)
- Chart palette: accent + 4 harmonious HSL rotations (±40° hue steps)
SECTION 2 — LAYOUT ARCHITECTURE
Grid System
- Dashboard uses
CSS Grid sidebar + main layout:
.dashboard {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: 56px 1fr;
min-height: 100dvh;
}
- Sidebar: fixed width 240px (collapsed: 64px icon-only mode)
- Header: 56px height, sticky,
backdrop-blur-md
- Content:
p-6 padding, max-w-[1600px]
Metric Cards (KPI Row)
- Use
divide-x divide-border or inline border-right — NOT boxed cards
- Each metric: label + large number + delta badge + sparkline
- Numbers:
clamp(1.5rem, 2.5vw, 2.25rem), font-mono, font-bold
- Delta badge:
±X% with directional arrow icon — colored accordingly
Card Usage Rules
- Cards ONLY when elevation communicates hierarchy (modals, overlays, floating panels)
- At
DATA_DENSITY > 6: separate sections with border-t or divide-y, NOT cards
- When cards are used:
rounded-xl, p-6, diffusion shadow (0 4px 24px -4px hsl(220 20% 8% / 0.06))
SECTION 3 — DATA VISUALIZATION STANDARDS
Chart Library
Check package.json for recharts, nivo, or @tremor/react. Use whichever is installed.
If none: install recharts as default (npm install recharts).
Chart Anti-Patterns (BANNED)
- 3D charts of any kind
- Pie charts with > 5 segments (use a bar chart instead)
- Charts without axis labels or tooltips
- Charts with default library colors (always remap to project palette)
- Missing loading/empty states for charts
Chart Skeleton
Every chart must have a shimmer skeleton matching its bounding box:
// Shimmer skeleton for charts
<div className="h-[200px] rounded-lg bg-surface-2 animate-pulse" />
Table Standards
- Sticky header row
- Row hover:
bg-surface-2 transition
- Sortable columns: arrow icon that rotates on sort direction change
- Pagination:
< 1 2 3 ... 14 > compact style
- Empty table: centered illustration + "No results match your filters" + Clear filters CTA
- Loading: skeleton rows matching column count
SECTION 4 — SIDEBAR NAVIGATION
Structure
[Logo / Brand]
─────────────
[Primary Nav Group]
Home
Analytics
Projects
Customers
─────────────
[Secondary Nav Group]
Settings
Help
─────────────
[User Avatar + Name]
[Logout]
Behavior
- Active state: accent color left border + accent-dim background fill
- Hover:
bg-surface-2 transition 150ms
- Collapsed mode (icon-only): tooltip on hover showing label
- Mobile: off-canvas drawer,
AnimatePresence slide-in from left
- Keyboard navigation: full arrow-key + Enter support
SECTION 5 — INTERACTION PATTERNS
Filters & Search
- Global search:
⌘K command palette (not inline search bar)
- Table filters: popover with checkbox groups, date ranges
- Active filters: badge row below search with × to remove each
- Filter state: persist in URL params (
?status=active&sort=asc)
Real-Time Updates (when INTERACTION_DEPTH >= 7)
- Websocket data: use optimistic updates — update UI before server confirms
- New row animation: slide-in from top with
AnimatePresence
- Metric updates: number transition animation (
useMotionValue counter)
- Status indicators: CSS keyframe pulse (
@keyframes ping)
Drill-Down Flow
- Table row click → slide-in detail panel (not new page) with
framer-motion layout
- Back navigation: breadcrumb trail always visible
- URL updates on drill-down (deep-linkable)
SECTION 6 — QUALITY GATE (DASHBOARD SPECIFIC)
1---2name: bexa-dashboard3description: Data-dense dashboard and admin panel design skill for AI agents. Enforces information hierarchy, data visualization clarity, high-density layouts, and professional SaaS-grade UI patterns.4---56# FORGE DASHBOARD — Data-Dense SaaS Design Skill78> Dashboards fail in two ways: too much clutter, or too little clarity.9> This skill enforces the third path: information architecture that makes data readable at a glance.1011---1213## DIAL CONFIGURATION1415```16DATA_DENSITY: 8 (1=Airy metrics / 10=Cockpit-level data saturation)17VISUAL_CLARITY: 8 (1=Decorative charts / 10=Precision data tables)18INTERACTION_DEPTH:6 (1=Static view / 10=Drill-down, filter, real-time)19```2021---2223## SECTION 1 — DASHBOARD IDENTITY RULES2425### Typography for Data UIs26- Display font: `Satoshi` or `Geist`. **NEVER** serif on dashboards.27- Numeric data: ALWAYS `font-mono` (`Geist Mono` or `JetBrains Mono`).28- Label text: `0.6875rem` uppercase, `letter-spacing: 0.1em`, muted color.29- Table data: `0.875rem`, regular weight, tabular-nums (`font-variant-numeric: tabular-nums`).3031### Color for Data32- Background: `hsl(220 14% 97%)` (not pure white — reduces eye strain)33- Card surface: `hsl(0 0% 100%)` with `1px solid hsl(220 13% 91%)`34- Positive delta: `hsl(158 60% 40%)` — no neon green35- Negative delta: `hsl(0 72% 50%)` — no neon red36- Neutral: `hsl(220 8% 58%)`37- Chart palette: accent + 4 harmonious HSL rotations (±40° hue steps)3839---4041## SECTION 2 — LAYOUT ARCHITECTURE4243### Grid System44- Dashboard uses `CSS Grid` sidebar + main layout:45```css46.dashboard {47 display: grid;48 grid-template-columns: 240px 1fr;49 grid-template-rows: 56px 1fr;50 min-height: 100dvh;51}52```53- Sidebar: fixed width 240px (collapsed: 64px icon-only mode)54- Header: 56px height, sticky, `backdrop-blur-md`55- Content: `p-6` padding, `max-w-[1600px]`5657### Metric Cards (KPI Row)58- Use `divide-x divide-border` or inline border-right — NOT boxed cards59- Each metric: label + large number + delta badge + sparkline60- Numbers: `clamp(1.5rem, 2.5vw, 2.25rem)`, `font-mono`, `font-bold`61- Delta badge: `±X%` with directional arrow icon — colored accordingly6263### Card Usage Rules64- Cards ONLY when elevation communicates hierarchy (modals, overlays, floating panels)65- At `DATA_DENSITY > 6`: separate sections with `border-t` or `divide-y`, NOT cards66- When cards are used: `rounded-xl`, `p-6`, diffusion shadow (`0 4px 24px -4px hsl(220 20% 8% / 0.06)`)6768---6970## SECTION 3 — DATA VISUALIZATION STANDARDS7172### Chart Library73Check `package.json` for `recharts`, `nivo`, or `@tremor/react`. Use whichever is installed.74If none: install `recharts` as default (`npm install recharts`).7576### Chart Anti-Patterns (BANNED)77- 3D charts of any kind78- Pie charts with > 5 segments (use a bar chart instead)79- Charts without axis labels or tooltips80- Charts with default library colors (always remap to project palette)81- Missing loading/empty states for charts8283### Chart Skeleton84Every chart must have a shimmer skeleton matching its bounding box:85```jsx86// Shimmer skeleton for charts87<div className="h-[200px] rounded-lg bg-surface-2 animate-pulse" />88```8990### Table Standards91- Sticky header row92- Row hover: `bg-surface-2` transition93- Sortable columns: arrow icon that rotates on sort direction change94- Pagination: `< 1 2 3 ... 14 >` compact style95- Empty table: centered illustration + "No results match your filters" + Clear filters CTA96- Loading: skeleton rows matching column count9798---99100## SECTION 4 — SIDEBAR NAVIGATION101102### Structure103```104[Logo / Brand]105─────────────106[Primary Nav Group]107 Home108 Analytics109 Projects110 Customers111─────────────112[Secondary Nav Group]113 Settings114 Help115─────────────116[User Avatar + Name]117[Logout]118```119120### Behavior121- Active state: accent color left border + accent-dim background fill122- Hover: `bg-surface-2` transition 150ms123- Collapsed mode (icon-only): tooltip on hover showing label124- Mobile: off-canvas drawer, `AnimatePresence` slide-in from left125- Keyboard navigation: full arrow-key + Enter support126127---128129## SECTION 5 — INTERACTION PATTERNS130131### Filters & Search132- Global search: `⌘K` command palette (not inline search bar)133- Table filters: popover with checkbox groups, date ranges134- Active filters: badge row below search with × to remove each135- Filter state: persist in URL params (`?status=active&sort=asc`)136137### Real-Time Updates (when `INTERACTION_DEPTH >= 7`)138- Websocket data: use optimistic updates — update UI before server confirms139- New row animation: slide-in from top with `AnimatePresence`140- Metric updates: number transition animation (`useMotionValue` counter)141- Status indicators: CSS keyframe pulse (`@keyframes ping`)142143### Drill-Down Flow144- Table row click → slide-in detail panel (not new page) with `framer-motion` layout145- Back navigation: breadcrumb trail always visible146- URL updates on drill-down (deep-linkable)147148---149150## SECTION 6 — QUALITY GATE (DASHBOARD SPECIFIC)151152- [ ] Is `font-mono` used for ALL numeric data?153- [ ] Are charts remapped to the project color palette?154- [ ] Are all charts/tables showing loading, empty, AND error states?155- [ ] Is the sidebar keyboard-navigable?156- [ ] Does the layout use `CSS Grid` for sidebar+main (not flexbox hacks)?157- [ ] Are KPI metrics separated by borders (not individual cards at density > 6)?158- [ ] Is global search available via keyboard shortcut?159- [ ] Are positive/negative deltas using calibrated (non-neon) colors?