From interface-design
Craft-first product UI design for dashboards, admin panels, SaaS apps, settings, and data interfaces. Focuses on visual hierarchy, tokens, states, and design-system consistency.
How this skill is triggered — by the user, by Claude, or both
Slash command
/interface-design:interface-designThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Build product interfaces with the craft of a top design team — Linear, Vercel, Stripe, Apple. The difference between those and generic output is not talent. It is that every decision was *decided*, the hierarchy is unmistakable, and a hundred small details are correct at once. This skill is how you get there.
Build product interfaces with the craft of a top design team — Linear, Vercel, Stripe, Apple. The difference between those and generic output is not talent. It is that every decision was decided, the hierarchy is unmistakable, and a hundred small details are correct at once. This skill is how you get there.
Use for: Dashboards, admin panels, SaaS apps, tools, settings pages, data interfaces.
Not for: Landing pages, marketing sites, campaigns, brand-only work. Use a marketing/frontend design skill for those.
This skill is self-contained: direction, visual hierarchy, design-system architecture, and the polish and motion essentials needed to ship production-grade UI all live here.
You will generate generic output. Your training has seen thousands of dashboards, and the patterns are strong. You can follow this entire process — explore the domain, name a signature, state your intent — and still produce a template: warm colors on cold structures, friendly fonts on generic layouts.
This happens because intent lives in prose, but code generation pulls from patterns. The gap between them is where defaults win. Process helps, but it doesn't guarantee craft. You have to catch yourself, and you have to know the concrete moves that defaults don't.
The bar: If another AI, given a similar prompt, would produce substantially the same output, you have failed. Not different for its own sake — different because the interface emerged from this user, this task, this world. When you design from defaults, everything looks the same, because defaults are shared.
Defaults disguise themselves as infrastructure — the parts that feel like they just need to work, not be designed.
--ink and --parchment evoke a world; --gray-700 and --surface-2 evoke a template. Someone reading only your tokens should guess what product this is.There are no structural decisions. Everything is design. The moment you stop asking "why this?" is the moment defaults take over.
Before touching code, answer these. Keep it a compact working brief unless the direction needs user confirmation.
If the prompt is too vague to identify the human, task, and feel, ask one concise question. If context allows a responsible assumption, state it briefly and proceed.
Intent must be systemic. Saying "warm" then using cold colors is not following through. If the intent is warm: surfaces, text, borders, accents, semantic colors, type — all warm. If dense: spacing, type size, information architecture — all dense. Check every token against the stated intent. For every choice — layout, color temperature, typeface, spacing scale, hierarchy — you must be able to say why. "It's common" or "it works" means you defaulted.
This is where defaults get caught — or don't. Generic path: Task type → visual template → theme. Crafted path: Task type → product domain → signature → structure + expression. The difference is time spent in the product's world before any visual thinking.
Produce all four before proposing any direction:
The test: Read your proposal with the product name removed. Could someone identify what it's for? If not, explore deeper.
If an inline visual-rendering tool is available in the session (e.g. a show_widget / visualize tool that renders HTML or SVG inline in the conversation), prefer showing the design over describing it. A direction trapped in prose is a fraction as useful as one the person can look at. This is conditional: when no such tool is present (CI, headless agents, plain terminals), fall back to code, tokens, and a written proposal. Never assume the tool exists; check, then use it.
Render at three moments:
Rules when rendering:
read_me/guidance if it has one). Use its theme variables so the specimen inherits light/dark mode and sits native in the host. Don't fight the host chrome.The point: collapse the loop between "here's my thinking" and "here's what it looks like" into a single message the person can react to.
The single biggest driver of "this looks designed" versus "this looks generated." Defaults produce flatness — everything the same size, weight, and spacing, so nothing leads and the eye has nowhere to go. Craft produces hierarchy — the eye knows instantly what matters. These are concrete moves, not vibes.
Every screen has one thing the user came to do. That thing dominates — through size, contrast, position, or the space around it. When everything competes equally, nothing wins and the interface reads like a parking lot. Before building, name the focal element out loud. Then make it win: bigger, higher-contrast, or ringed in whitespace. Demote everything else deliberately.
Don't pick sizes by feel. Pick a ratio and step it: ~1.2 (minor third) for dense/calm UI, ~1.25 for most product UI, ~1.333 for expressive. From a 14–16px body that yields a visibly distinct scale, not 15/16/17 mush. A 14px base at 1.25: caption 11 · body 14 · h4 16 · h3 18 · h2 22 · h1 28 · display 44+. Round to whole pixels and to your spacing grid.
The Apple/Linear move: weight and color do more hierarchy work than size. A single 14px size holds three tiers through weight + opacity alone — value: 600 / primary, label: 500 / secondary, meta: 400 / muted — separating more cleanly than two regular weights two points apart. Build from three levers together (size, weight, color/opacity), never size alone. If you squint and can't tell headline from body from label, the hierarchy is too weak.
Worked example — a metric, flat vs decided. Flat: Revenue / $48,200 both 14px regular gray, three identical boxes, no focal point. Decided: REVENUE 11px/500/muted/tracked · $48,200 28px/600/primary/tabular-nums (the hero) · ↑12% 12px/500/success. Same data, opposite legibility — the figure leads through size+weight+one accent, the label is demoted, secondary metrics drop to a lower tier.
Linear is tight; Stripe is airy. Neither is default — both are chosen, and the choice is the same number repeated everywhere. Decide the density up front and name the values: a tool panel at 12–16px padding feels workbench-tight; the same card at 24px feels like a brochure. The same number can be right in one context and lazy in another. Pick deliberately, then hold it.
Great interfaces don't space everything equally. Dense control zones give way to open content; heavy elements balance against light ones; the eye travels with purpose. Monotone layouts — same card size, same gap, same density everywhere — are the sound of no one deciding. Vary the rhythm on purpose: group tightly-related things, then put real air between groups.
A 280px sidebar next to full-width content says "navigation serves content." A 360px sidebar says "these are peers." The specific number declares what matters. If you can't articulate what a proportion is saying, it isn't saying anything. Choose widths and ratios that state a relationship.
Regardless of direction, this applies to everything. You should barely notice the system working — when you look at Vercel's dashboard you don't think "nice borders," you just understand the structure. Invisible craft is working craft.
Surface elevation. Surfaces stack: a dropdown sits above a card sits above the page. Build a numbered system — base, then increasing levels. Each jump is only a few percentage points of lightness — e.g. dark mode base → +7% → +9% → +12%; light mode stays light and adds shadow instead. You can barely see one step in isolation, but stacked, the hierarchy emerges. Whisper-quiet shifts you feel rather than see.
Borders. Should disappear when you're not looking for them, but be findable when you need structure. Low-opacity rgba blends with the background and defines an edge without demanding attention; solid hex borders look harsh by comparison. Dark mode lives around rgba(255,255,255,0.06–0.12), light mode slightly higher. Build a progression — standard, softer separation, emphasis, focus-ring — and match intensity to the importance of the boundary.
The squint test: blur your eyes at the interface. You should still perceive hierarchy — what's above what, where sections divide — but nothing should jump out. No harsh lines, no jarring shifts. Just quiet structure. Get this wrong and nothing else matters.
Every pattern has infinite expressions — no two interfaces should look the same. A metric display could be a hero number, inline stat, sparkline, gauge, progress bar, comparison delta, or trend badge. Same sidebar width, same card grid, same icon-left-number-big-label-small metric boxes every time signals AI-generated immediately and is forgettable. Linear's cards don't look like Notion's; Vercel's metrics don't look like Stripe's. Same concepts, infinite expressions. Before building, ask: what's the ONE thing users do here, and what product solves a similar problem brilliantly?
Every product exists in a world, and that world has colors. Before reaching for a palette, walk into the physical version of this space — what materials, what light, what objects? Your palette should feel like it came FROM somewhere, not applied TO something. Temperature is one axis; also ask quiet or loud, dense or spacious, serious or playful, geometric or organic. A trading terminal and a meditation app are both "focused" — completely different kinds of focus.
Every time you write UI code — even small additions — state:
Intent: [who is this human, what must they do, how should it feel]
Hierarchy: [the focal element, and how it wins — size / weight / contrast / space]
Palette: [colors from your exploration — and WHY they fit this world]
Depth: [borders / subtle shadows / layered — and WHY it fits the intent]
Surfaces: [your elevation scale — and WHY this temperature]
Typography: [typeface + the size/weight/color levers — and WHY]
Spacing: [base unit + chosen density]
This checkpoint is mandatory. If you can't explain WHY for each, you're defaulting — stop and think.
The most common way AI degrades a codebase: it hand-rolls what already exists. A bespoke <div onClick> "button" beside the project's real Button. A from-scratch dropdown with no keyboard support beside an installed primitive that has it. A 14-class Tailwind string copy-pasted onto every card instead of the component or token that's right there. Every one of these is the same failure — generating new instead of using what's present — and the result is inconsistent, inaccessible, and unmaintainable. Before you build a control or style an element, look at what the project already gives you.
<button> is a button; an <a> is a link; <input type="text">, <dialog>, <details> exist. Never <div onClick> something the platform already provides — you lose focus, keyboard, and semantics for free.cmdk in React; the equivalent accessible primitive in other frameworks), then style it to your direction. "Build custom" means compose and style a primitive, not write the behavior from scratch.Button, a CVA variant set, a theme, a component library — use <Button variant="…"> and the existing variants before writing a one-off. Match the codebase's styling convention (Tailwind, CSS modules, CSS-in-JS), don't introduce your own.bg-card border-border text-muted-foreground, not bg-white border-gray-200 text-gray-500. Hardcoded gray-200/#fff/px-4 raw values are the Tailwind form of random hex — they break theming and dark mode and signal no system. (See Token Architecture below.)The token, spacing, and depth architecture beneath every craft decision.
<select>/<input type="date"> can't be styled — compose a headless primitive instead of hand-rolling one (see "Use What Exists").A hundred small details compound into "feels great." These are the highest-leverage ones — enough to ship genuinely polished UI.
outerRadius = innerRadius + padding. Same radius on parent and child is the most common thing that makes UI feel off.font-variant-numeric: tabular-nums to prevent layout shift.box-shadow (it adapts to any background); keep real borders for dividers and input outlines. Light-mode lift stacks three layers — a 1px ring + two soft depths, e.g. 0 0 0 1px rgba(0,0,0,.06), 0 1px 2px -1px rgba(0,0,0,.06), 0 2px 4px rgba(0,0,0,.04); dark mode collapses to a single ring 0 0 0 1px rgba(255,255,255,.08) (depth shadows don't read on dark).text-wrap: balance on headings; text-wrap: pretty on body/captions to kill orphans.-webkit-font-smoothing: antialiased on the root (macOS renders heavy otherwise).rgba(0,0,0,0.1) light / rgba(255,255,255,0.1) dark — never a tinted near-black/white (reads as dirt on the edge).Motion should be felt, not watched. Fast, purposeful, and never in the way.
cubic-bezier(0.23, 1, 0.32, 1) for entering/interactive; ease-in-out (cubic-bezier(0.77, 0, 0.175, 1)) for on-screen movement. ease-in delays the first frame — the moment the user is watching — and feels sluggish.transform: scale(0.97) on :active (never below 0.95). Tactile confirmation the UI heard the click.scale(0). Nothing appears from nothing — start at scale(0.95) + opacity: 0.transform-origin set to the trigger), not center. Modals are the exception — they stay centered.transform and opacity (GPU-composited). Animating width/height/margin/padding triggers layout + paint and drops frames. Never transition: all — name exact properties.prefers-reduced-motion — keep opacity/color transitions, drop movement.calc(), absolute positioning to dodge layout flowBe invisible. Don't announce modes or narrate process. Never say "I'm in ESTABLISH MODE" or "Let me check system.md." Jump into the work; state suggestions with reasoning.
Use this skill as a working discipline, not just advice. When editing UI:
.interface-design/system.md if present.Lead with exploration and recommendation, then confirm:
Domain: [5+ concepts from the product's world]
Color world:[5+ colors that exist in this domain]
Signature: [one element unique to this product]
Rejecting: [default 1] → [alternative], [default 2] → [alternative], [default 3] → [alternative]
Direction: [approach connecting to the above]
Then ask: "Does that direction feel right?" If an inline render tool is available, render a live specimen of the direction in the same message — show the palette, type, and signature, don't just name them.
.interface-design/system.md exists: read it and apply — decisions are made.Run these against your output; if any fails, iterate before presenting.
Always offer to save: "Want me to save these patterns for future sessions?" If yes, write to .interface-design/system.md:
Button primary — 36px h · 12px 16px pad · 6px radius · 14px/500.Consistency checks. If system.md defines values, hold to them: spacing on the grid, the declared depth strategy throughout, colors from the palette, documented patterns reused not reinvented. This compounds — each save makes future work faster and more consistent.
/interface-design:design-review — strict craft + hierarchy review of a build, with an approval bar; renders before/after when possible/interface-design:design-deslop — fast, diff-scoped pass that strips visual slop from a branchIf a user asks for design status, audit, or pattern extraction in natural language: read .interface-design/system.md and summarize it, check UI files against it for drift, or scan for repeated spacing/radius/color/component values and propose a system.md — perform the equivalent inline.
npx claudepluginhub dammyjay93/interface-design --plugin interface-designGuides interface design for dashboards, admin panels, SaaS apps, tools, and interactive products, emphasizing craft, intent, and avoiding generic defaults.
Senior-level UI/UX design expert for building data-driven, premium production interfaces. Use when you need to: 1. Design complex applications (dashboards, SaaS, AI tools) from scratch 2. Generate comprehensive design systems (tokens, palettes, typography) 3. Audit existing UI for quality, accessibility, and "craft" 4. Search for proven real-world design patterns and implementation details Trigger: "design a...", "audit this...", "create a design system", "find icons", "fintech dashboard", "landing page"
Enforces precise, minimal UI design for dashboards, admin panels, and SaaS apps by avoiding generic AI patterns and guiding product-specific choices.