From shipit-ui-design
Apply senior dashboard design patterns (app shells, KPI tiles, data tables, drawers, command palette, role-based UI, density-by-user-type) when working on files in `/admin`, `/dashboard`, `/console` paths or files importing chart libraries (recharts, visx, tremor, echarts, chart.js).
How this skill is triggered — by the user, by Claude, or both
Slash command
/shipit-ui-design:dashboard-designThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Senior-level reference for admin and data-heavy surfaces. Assumes the reader has shipped a dashboard before; the goal is to surface non-obvious tradeoffs and the rules juniors get wrong.
Senior-level reference for admin and data-heavy surfaces. Assumes the reader has shipped a dashboard before; the goal is to surface non-obvious tradeoffs and the rules juniors get wrong.
- Max 300 lines per file. If a generated component would exceed, split before writing.
- No hardcoded design values. Colors, spacing, radii, shadows, durations, easings — all from tokens.
- Every interactive element has hover, active, focus-visible, and disabled states.
- All motion respects
prefers-reduced-motion.- Every image / illustration has alt text or
aria-hiddenif decorative.- Dark mode is never an afterthought — emitted alongside light from the start.
- Stack-respect: never introduce a new framework or styling system; adapt to what's there.
The shell is the most expensive decision. Switching mid-project costs days. Decide before the first screen.
| Shell | Pick when | Avoid when |
|---|---|---|
| Sidebar + topbar + content | App has > 6 top-level sections, multi-tenant, role-based menus, deep IA | Marketing-adjacent surface; mobile-first product |
| Topbar-only | ≤ 5 top-level sections, content-led admin, public-facing console | Heavy IA; lots of secondary navigation |
| Split-pane (list + detail) | Inbox-shape work — tickets, leads, alerts, messages | Browsing-shape work where lists are short-lived |
Blueprints: references/dashboard-blueprints/app-shell-sidebar.md, app-shell-topbar.md.
The sidebar collapses to icon-only at ≥ 1024 px (user toggle, persisted), and to a sheet behind a hamburger below 1024 px. Never hide it permanently on desktop without a setting.
--color-brand-600) on the leading edge plus a tinted background (--color-surface-2). Never color-only.<aside> panel, not a second sidebar. Two sidebars is a smell.Cmd/Ctrl+K). Do not build a separate sidebar search.The single biggest junior mistake is shipping one density. Match density to the work.
| User | Density | Row height | Card padding | Chart height |
|---|---|---|---|---|
| Operator (support agent, ops, fulfillment) | Compact | 32–36 px | --space-4 | 160–200 px |
| Analyst (data, finance, growth) | Toggleable (compact default, comfortable on demand) | 36–48 px | --space-5 | 240–320 px |
| Executive (one-glance KPIs, board view) | Comfortable | 56+ px | --space-8 | 280–360 px |
A density toggle is not optional for analyst surfaces. See references/responsive-grids/density.md. Persist the choice per user.
Operator surfaces: tabular-numerals, monospace for IDs, no hover lifts on rows (thrash on mouse-heavy use), keyboard shortcuts visible inline.
A KPI tile is five things, in this order. Drop any of them and you have decoration, not a KPI.
var(--text-2xl). Format with locale-aware thousands separators.+12.4% or −$3.2k. The delta is the load-bearing element, not the value. A KPI without a delta is a number on a wall.vs prior 7 days or vs goal $500k. A delta with no period is a lie. Always show the comparison window.Color on the delta: --color-success-600 for favorable direction, --color-danger-600 for unfavorable. Not always green-up: for "errors per minute", down is success.
Never make the whole tile a hover-lift link unless drill-down is real. Static KPI tiles must not animate on hover.
Blueprint: references/dashboard-blueprints/kpi-tile.md. Row pattern: references/dashboard-blueprints/kpi-row.md.
Tables are 60% of dashboard surface area. Get them right.
Defaults that hold up:
position: sticky; top: 0), with a 1 px bottom border so it survives over content.--color-surface-2 (no transform; tables don't lift).Pagination vs infinite scroll vs virtualization:
10,000 or live: virtualize (TanStack Virtual / react-window — verify project deps first).
Blueprint: references/dashboard-blueprints/data-table.md. Deep dives: references/data-tables/.
The single most common junior gap. Each is a different design.
Empty is three different states, not one:
Loading:
--color-surface-2 block with a slow shimmer; suppress shimmer under prefers-reduced-motion.Error:
Partial / stale (often missing):
Pick one, not all three, for a given task.
| Pattern | Use when |
|---|---|
| Inline edit | Single field; immediately reversible (cell, name, status pill) |
| Drawer (right-side, 480–640 px) | Multi-field detail, keeps list context visible |
| Modal | Destructive confirm, blocking choice, multi-step wizard |
| Side-by-side / route | Editing > 8 fields, or anything benefitting from URL share |
Drawers are not modals: they don't block the page, they let users keep scanning the underlying list. Modal is for "you must answer this now"; drawer is for "look at this without losing your place".
Inline edit rules: visible affordance on hover (pencil icon or border on focus), Esc cancels, Enter saves, error inline below the cell, keyboard focus moves to next cell on save.
When ≥ 1 row is selected, the filter bar is replaced in place by a bulk-action bar (no layout shift):
3 selected) + clear-selection link.Destructive actions (Delete, Archive bulk) always confirm in a modal with the count quoted. No "are you sure" toasts — the modal is the friction.
Required on any dashboard with > 5 top-level routes. It is the second navigation, sized for keyboard users.
Sections, in this order:
Fuzzy match on label + keywords. Up/down to navigate, Enter to run, Esc to close, Cmd/Ctrl+K toggles. Section headers visible, not collapsed.
Blueprint: references/dashboard-blueprints/command-palette.md.
Two surfaces, different jobs:
Toast is for confirmation ("Saved"); inbox is for events ("New report available", "User X requested access"). Don't mirror everything to both — pick one per event.
Toast colors: success --color-success-500, info --color-info-500, warning --color-warning-500, danger --color-danger-500. Always include an icon — color alone fails for colorblind users (rule 5 in spirit; channels other than color).
Blueprint: references/dashboard-blueprints/notification-center.md.
Filter bar lives directly above the table or chart it filters. Components, in order:
Active filters appear as removable chips below the bar. The URL must reflect the filter state — every dashboard view should be linkable.
Saved views are per-user by default; "shared" views require explicit permission and a separate icon (people icon).
Blueprint: references/dashboard-blueprints/filter-bar.md.
Same surface, different shapes, by role. Three principles:
"view" density: no hover lifts, no inline edit handles, badge "View only" near the title.Three common roles to design for: Admin (sees everything), Member (acts on own work), Viewer (read-only). A surface that doesn't differ across these is suspicious; usually you missed an action.
A dashboard that only works at 1440 is a desk dashboard, not a product. See references/responsive-grids/dashboard-grid.md.
Headlines:
references/data-tables/responsive.md).Use container queries (@container) for KPI tiles so a 4-up grid that becomes 2-up doesn't need bespoke per-tile breakpoints — tiles respond to their parent column width.
npx claudepluginhub shipiit/shipit-ui-design --plugin shipit-ui-designSearches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Implements vector databases with Pinecone, Weaviate, Qdrant, Milvus, pgvector for semantic search, RAG, recommendations, and similarity systems. Optimizes embeddings, indexing, and hybrid search.