external/interface-design/SKILL.md
Craft-first interface design for dashboards, admin panels, SaaS apps, tools, settings pages, data interfaces, and interactive products. Use when designing, building, reviewing, auditing, or refining product UI where visual craft, layout hierarchy, tokens, states, visual direction, or design-system consistency matter. Not for marketing pages, landing pages, campaigns, or brand-only work.
npx skillsauth add seikaikyo/dash-skills interface-designInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.
development
拋棄式 HTML mockup 比稿:產出 2 到 3 個設計立場不同的變體(密度 / 版式 / 強調軸,不是換色),各附取捨說明,最後給有立場的對比結論。適用:「畫個草圖」「比較 A 版 B 版」「先看方向再做」「給我看幾種做法」。要 production 元件或設計已定案時不適用。
tools
需求不明時的意圖萃取訪談:一次一題、每題附上自己的猜測、聽出「真正想要 vs 覺得應該要」,直到能預測使用者反應(約 95% 信心)才動工。適用:需求缺少對象 / 動機 / 成功標準 / 約束,或使用者點名「訪談我」「先確認一下」「我們確定嗎」。明確自足的指示、純資訊查詢、機械性操作不適用。
development
對非平凡決策啟動新鮮 context 對抗審查(找碴不背書),在修正還便宜的時候抓出錯誤方向。適用:高風險改動(production、資安敏感邏輯、不可逆操作)、不熟的程式碼、要宣稱「這樣是安全的 / 可行的」之前。機械性操作與一行修改不適用。
testing
Reference for writing and editing agent skills well — the vocabulary and principles that make a skill predictable. Consult when authoring, reviewing, or pruning a SKILL.md.