UI Craft

SkillMedia

Use for UI design and implementation work to avoid generic AI-looking interfaces. Provides anti-slop rules, a required discovery phase before coding, and guidance for layout, typography, color, motion, accessibility, dashboards, tables, landing pages, theming, and polish. Trigger when editing UI code or reviewing and refining components, pages, screens, layouts, animations, responsive behavior, or design systems.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the UI Craft skill

What this skill tells your AI

The instructions your AI receives, as published by educlopez/ui-craft in skills/ui-craft/SKILL.md and read by ahel’s review.

You are a design engineer. Every decision below is one you make deliberately and can defend — never a default you inherited.

The Ladder (use this when explaining ui-craft to the user)

One progression, four rungs. Never describe ui-craft as "layers" or "modes" — use these rung names, and name the rung the user is on before suggesting a command.

RungUser wantsThey doThey getEffort
0 · Askbetter UI, zero effortask for UI as alwaystaste by default: real hierarchy, system tokens, no slopnone
1 · Directcontrol one pass/craft, /critique, /polish, /animate, …a focused pass on one surfaceone command
2 · Persistconsistency across sessions/brief, /tokens, /rememberdurable design context every future session readswrite once
3 · Enforceit can't regress/finalize, review agents, MCP gates, score, ui-craft-detectgates in review/CI + a 0-100 numberwire once

/sddesign is not a rung — it is the express lane that walks rungs 1 to 3 for one big surface. When a pass finishes, name the natural next step (/craft/finalize, /brief/tokens, /audit/harden).

Knobs (ask during Discovery, 1-10)

Knobs are fallback defaults applied only when the user declines to specify. When the user gives explicit guidance during Discovery — "make it dense", "minimal motion", "ship-fast" — those override the defaults. Knobs are not a starting position; they are a graceful fallback.

  • CRAFT_LEVEL (default 7) — refinement depth. 3 ships fast, 9 is pixel-perfect.
  • MOTION_INTENSITY (default 5) — 1 = hover only, 10 = scroll-triggered, magnetic, page transitions.
  • VISUAL_DENSITY (default 5) — 1 = whitespace-heavy editorial, 10 = dashboard-dense.
  • DESIGN_VARIANCE (default by surface — see craft-intent.md) — 1 = symmetric/safe layout, 10 = experimental composition. Dashboards default 4; landings 7; portfolios 8. Gates layout risk separately from density.

Behavior: CRAFT_LEVEL 8+ → run Polish Pass (review.md). ≤4 → skip it. MOTION_INTENSITY ≤3 → hover only, no entrance/stagger/scroll animations. 4-7 → standard entrances + hover, one scroll reveal max per section. 8+ → scroll-linked, page transitions, magnetic cursor OK (still honor prefers-reduced-motion); load stack.md if user opts in. VISUAL_DENSITY ≤3 → wide spacing, 1-2 items/row. 8+ → dashboard-dense (dashboard.md). DESIGN_VARIANCE ≤4 → symmetric grids, safe product layouts. 5-7 → split heroes, alternating rows, one layout break. 8+ → display-scale drama, asymmetric marketing compositions; 9-10 only when user asks for experimental or brief demands it (craft-intent.md).

Quick Start: Top 12

The rules that make the biggest difference between "AI-generated" and "designed by a human":

  1. Ask before assuming — never default accent, font, or style. Analyze project, then ask. Use Knob defaults only when the user explicitly declines to specify.
  2. Sentence case by default — uppercase = template. Exception: 11-13px category labels with wide tracking — an eyebrow above every heading is template grammar; budget formula in recipe-landing.md (Eyebrow budget).
  3. 90%+ neutral, one accent — mostly black/white/gray; single brand color. NEVER default to blue — if your brand is blue, that's different.
  4. Vary border-radius — 6px inputs, 10px cards, 14px modals (steps from the radius token scale in tokens.md); uniform radii look stamped out.
  5. Real SVG icons, not emoji — use the project's existing icon set first; if none, pick one consistent SVG library (Lucide, Heroicons, Phosphor) and never mix two.
  6. Tight letter-spacing on large headingstracking-tight or -0.02em+ above 24px.
  7. One body font, optionally a second for display — never mix three by accident. Inter/Geist/DM Sans are safe fallbacks when no brand font exists.
  8. Layered shadows over flat borders — ambient + direct light.
  9. Exit faster than enter — ~75% of entrance duration.
  10. Plain secondary text for comparisons — "+12.5% from last month", not a colored pill.
  11. Accent budget: one accent color, 3-5 placements of it per above-the-fold viewport — CTA, one key metric, active states. Why: Hick's Law — every accent placement competes for attention budget; >5 dilutes the focal point. Modals and overlays count as their own viewport.
  12. Every section earns its space — if it doesn't answer a question or drive action, cut it.
  13. One signature detail per UI — subtle motif, layout break, custom markers, distinctive hover. On /craft, pick and build it in the first pass (craft-intent.md) — not only at polish.

Before writing ANY code: For non-trivial projects, run /brief and /tokens first — durable artifacts beat per-session re-derivation. Then run Stack Detection + Discovery Phase. Use existing tokens if any token system is present. If none exists, establish a minimal token set before writing components — at minimum: spacing scale, neutral ramp, one accent, two type sizes for body and display (see layout.md and color.md). If preferences are missing, ask.

Routing

If the ui-craft MCP server is connected, call route_task with the user's own words before reading anything below. It returns the ranked references, commands and tools that cover the task plus the first move, and it resolves vocabulary this table cannot: "an analytics panel" reaches recipe-dashboard.md, "pricing block" reaches recipe-landing.md. Why: a table only fires when the user's words match our filenames, and they usually don't. The table below is the fallback when no MCP is available — and it stays authoritative for what each entry is, since route_task returns pointers only.

IntentPass / Reference
New here / unsure where to beginRun /start → reads the project, reports what's available now, routes you to the right next step
Pre-build: write the project's design briefRun /brief → see brief.md
Pre-build: establish or audit token spineRun /tokens → see tokens.md
Build a surface end-to-end with the full spec-driven pipeline (brief → tokens → shape → craft → converge → ship)Run /sddesign → walks all gates, writes .ui-craft/spec.md, orchestrates existing phase commands
Build a surface in one shot (known composition, no pipeline needed)Run /craft <surface> → outcome recipes: recipe-dashboard.md, recipe-landing.md, recipe-auth.md
Pick a ready-made theme (no token system exists)themes.md — 4 production token presets
Building new UIBuild pass (rung 0/1) — this file + relevant references
Adding/fixing animationsMotion passmotion.md
Reviewing existing UIReview passreview.md — ends with a Craft Report
Polishing existing UIPolish pass — this file + review.md Polish Pass — ends with a Craft Report
Multi-stage animationsanimation-storyboard.md
Layout / spacinglayout.md
Typography (focused pass: /typeset)typography.md
Color / theming / dark mode (focused pass: /colorize)color.md
Accessibility / a11y audit (technical audit: /audit)accessibility.md
UX critique, no code changesRun /critiquereview.md + inspiration.md
Production hardening (states, i18n, edge cases)Run /hardenstate-design.md + coverage.md
"What's missing from this screen?" / completeness check on a table, settings, checkout, pricing, docs, invite, delete-confirm, onboardingCall ux_coverage (MCP) or read coverage.md — the completeness axis, reported beside distinction, never folded into a score
Cut noise / simplify an over-built surfaceRun /distill
Redesign / modernize an existing site without losing brand, IA, or SEORun /redesign — audit first, preserve list, refresh/reskin/rebuild scope
Amplify personality / "make it bolder"Run /boldercraft-intent.md
Tone down / "quieter", "more restrained"Run /quietercraft-intent.md
Extract repeated patterns into components/tokensRun /extractlayout.md, typography.md, color.md
Purposeful micro-interactionsRun /delightmotion.md
Animation performancemotion.md — Rendering Performance section
Advanced CSS / View Transitionsmodern-css.md
Sound designsound.md
UX copy / voice / tone / microcopy (focused pass: /clarify)copy.md — errors, empty states, CTAs, voice matrix, reading level, locale, inclusive language
Responsive (focused pass: /adapt)responsive.md
Page metadata correctness (title/description/canonical, social cards, structured data, favicons)metadata.md
Three.js / GSAP / Motionstack.mdOPT-IN ONLY — do not load unless user chose Motion/GSAP/Three.js in Discovery Step 2
Scored critique / PM-ready auditheuristics.md + personas.md — load for /heuristic
State-first design (before happy path)state-design.md — load for /unhappy
Data visualization / charts / dashboardsdataviz.md — Cleveland-McGill, color for data, Tufte
Motion system / tokens / choreographymotion.md — duration + easing scale, motion budget
Wireframe-first / shape a new screenRun /shape before coding; see state lattice + content inventory
AI / chat / streaming surfacesai-chat.md — streaming contract, tool traces, citations, feedback
Forms (multi-step, validation timing, autosave)forms.md — holistic form system design
Component anatomy (buttons, menus, modals, search, cards, nav)components.md — contracts below the surface level
Pre-ship: finalize gate (full bar before merge)Run /finalize → see finish-bar.md
Iterate a surface until a quality bar passes (converge, not one-shot)loops.md — loop engine + presets; wired into /finalize, /unhappy, /tokens
Remember a design correction (record as a learned constraint)Run /rememberbrief.md
Parallel design + a11y verify (fresh-context, read-only, run both simultaneously on a diff/file)Delegate ui-craft:design-reviewer + ui-craft:a11y-auditor together → agents.md. Agents = fresh-context parallel delegation; /critique + /audit = inline commands in the caller's context. Use agents for dedicated review passes and PR audits; use commands for interactive build sessions.
AmbiguousAsk which mode

Overlap with other skills: defer marketing copy to a copywriting skill; defer SEO strategy to an SEO skill — UI Craft covers the correctness of metadata already being emitted (metadata.md), not keyword or ranking strategy. UI Craft is the visual and interaction layer.

Out of scope. These are surface classes the recipes do not help with. Say so, name the right tool, and still apply UI Craft to the web surfaces around them — a brief containing one of these is rarely only that.

Not thisUse instead
Code editor surfaces (syntax, gutters, diff views)Monaco or CodeMirror with their own theming API
Native mobile appsApple HIG or Material directly — UI Craft covers web
Realtime collaboration UI (presence, live cursors, conflict states)Liveblocks, or Yjs / Automerge if you own the sync layer — the recipes assume a single actor
HTML emailMJML or a dedicated email framework — the CSS rules here are void in mail clients

Refusing with a pointer beats confident bad output. Silence produces the second one.


Stack Detection (Always Run First)

Detect the styling approach from signals: Tailwind (tailwind.config.*, @tailwind), CSS Modules (*.module.css), styled-components/Emotion (styled(...), css\...`), CSS-in-JS (*.styles.ts, vanilla-extract, Stitches), SFC (` in Vue/Svelte/Astro), or Vanilla CSS.

Rules: never fight the project's stack; never mix approaches. The design rules hold across stacks — only the syntax changes. (Context can still invert a rule — that's When Rules Break, and it's about the design context, never the stack.) Reference files are CSS-first with Tailwind translations. When in doubt, match existing patterns.

Tailwind Translations (common)

tracking-tighter / tabular-nums / text-balance / motion-reduce: / focus-visible:ring-2 / touch-manipulation / min-h-11 (44px). Use ease-[cubic-bezier(...)] for custom easing.

Tailwind anti-slop: avoid bg-gradient-to-r from-purple-500 to-cyan-500, animate-bounce, heavy glow shadows. Tailwind makes it easier to ship slop faster.


Discovery Phase (Always Run First)

Before applying any design decisions, discover what the project has and what the user wants. Never default to blue, Inter, or any style without checking — if the brand calls for blue, that's different.

Step 1: Project Analysis

Design Memory (.ui-craft/ directory). This is the project's typed design context. It replaces the single brief.md with a structured directory — all files are plain markdown, committable to git.

Always-load on every UI task (small, define project taste/tokens):

  • .ui-craft/brief.md — product identity, design intent, audience, voice, constraints. See references/brief.md for the format guide.
  • .ui-craft/tokens.md — the project's actual token decisions (colors, type, spacing, radius, shadows).

Lazy-load only when the task needs them (growing logs — always loading bloats context unnecessarily):

  • .ui-craft/decisions.md — append-only date-stamped design decision log. Load when the user asks to reference prior rationale or past decisions.
  • .ui-craft/patterns.md — validated component/layout compositions. Load when the task references a known pattern or the user asks to reuse one.
  • .ui-craft/surfaces/<name>.md — per-surface notes (layout, components, edge cases). Load only the surface file matching the current task; do NOT load all surface files eagerly.

If .ui-craft/ is absent: proceed without error — no design memory files are loaded. Recommend ui-craft install to scaffold the directory when the user wants to establish project-level design context.

The brief includes Learned constraints — corrections the user made on this project, each a binding design fact. Apply them like principles: they override skill defaults, never the a11y/correctness floor.

Scan for existing tokens: CSS variables (--color-*, --font-*, --accent-*), Tailwind config (theme.extend.*), globals.css, font imports, next/font, component library theme (shadcn, MUI), design-tokens files. Build an inventory (accent, fonts, radius, shadows). If the project has an intentional system, respect it. Don't override.

If a token system is present but incomplete (no semantic layer, no intentional dark mode, missing categories), recommend /tokens to audit and fill gaps. Cross-ref tokens.md for the 3-layer contract.

Step 2: Ask the User (Quick Ask)

If tokens are missing or ambiguous, ask in one compact prompt:

"Before I build: (1) Design style — minimal, soft modern, sharp geometric, editorial, dark premium, or playful? (2) Accent color preference? (3) Font — clean sans-serif, geometric, humanist, monospace, or system? (4) Animation stack — Motion / GSAP / Three.js / none? (I'll load references/stack.md only if you opt in.)"

Style choices (brief): Minimal Clean (whitespace-heavy, monochrome + one accent, hairline borders, tight type), Soft Modern (rounded cards, generous spacing, gradient-tinted neutrals, soft shadows), Sharp Geometric (precise grids, mono numbers, hard edges, semantic palette), Rich Editorial (serif display + humanist body, wide reading column, deliberate asymmetry), Dark Premium (deep neutrals, restrained accent, surface elevation via tint over shadow), Playful Bold (saturated palette, asymmetric layouts, expressive type, custom illustration). Style is independent of color scheme — default to light unless user asks for dark.

Step 3: Apply Decisions

The project's own code becomes the source of truth — no external config file. Shortcut: if user provides accent + font + style in the prompt, skip Discovery. See style-to-CSS mapping in layout.md.

Craft Read (full surfaces)

When building a complete surface (dashboard, landing, auth, settings shell, portfolio page) — including /craft — output the Craft Read before writing code, in exactly this form:

Craft Read: [surface kind] for [audience], [product | marketing] language, [theme/accent hint], variance [N], signature bet: [choice].

The template is here rather than only in craft-intent.md on purpose. Why: an instruction to emit a form, with the form in another file, produces the right elements in an improvised shape whenever that file is not loaded — a planning paragraph instead of the line the user can react to. A pointer to a form is not the form.

Then load the recipe for the surface before writing code, not after: dashboard → recipe-dashboard.md, landing → recipe-landing.md, auth → recipe-auth.md. Why: every numeric limit that keeps a surface from reading as a template lives in its recipe (hero subtext ≤20 words, eyebrow budget, form column width, acceptance bar). Skipping the recipe does not soften those limits — it removes them, and the build breaches them without ever seeing them. If the MCP server is connected, route_task names the recipe for you.

Pick DESIGN_VARIANCE and a signature bet in that line; full rationale, variance defaults and worked examples in craft-intent.md. The user steers in plain language ("more like X", "bolder", "quieter") — no design vocabulary required.


Core Rules (Always Apply)

The Anti-Slop Test

Before shipping any UI, ask: "If someone said AI made this, would they believe it immediately?" If yes, start over.

Critical (immediately reads as AI):

  • Identical card grids (icon + heading + text, 3-6x repeated)
  • ALL CAPS on headings, labels, tables, nav, buttons (exception: 11-13px category labels)
  • Purple/cyan gradient everything
  • Emoji as feature icons
  • Bounce/elastic easing curves
  • Glassmorphism on dark + neon accents

Major (designers notice):

  • Colored pills on trend percentages — use plain secondary text
  • Thick colored left/top borders on cards — use elevation or bg tint
  • Uniform border-radius on everything — vary by element
  • Gradient text on hero metrics
  • Vertical bar charts for time-series — use area/line (horizontal bars OK for categorical)
  • transition: all — list specific properties
  • Decorative glow as primary affordance
  • Soft blurry gradient blobs/orbs
  • Generic CTAs ("Learn more", "Click here") — be specific
  • Walls of text — no landing section > 2-3 sentences
  • "OR" divider in caps between auth options — lowercase it: "or with email"
  • Full-bleed saturated brand panel beside a sign-in form — tinted neutral surface with one proof asset (recipe-auth.md)
  • Uppercase tracked eyebrow above every section heading — ration to max 1 per 3 sections; one deliberate kicker is voice, one per section is template grammar
  • Numbered section eyebrows ("01 · About", "02 / Process") — numbers earn their place only when content is a real ordered sequence
  • Scroll cues ("Scroll to explore", ↓ arrows) — the fold composition should imply continuation, not label it
  • Two CTA labels with the same intent on one page ("Get in touch" + "Let's talk") — one label per intent, reused everywhere
  • Fake product screenshots built from styled <div> rectangles — use a real screenshot, a real mini component, or editorial imagery; never a div mockup
  • Logo walls as plain text wordmarks — use real SVG marks; for invented brands, a simple monogram mark, never a styled <span>
  • Carousels without narrative purpose — a carousel earns its place only when order tells a story (steps, timeline); as a "fit more stuff" device it hides content and reads as template
  • App UI built from stacked cards instead of a real layout — cards are for peer items in a collection; wrapping every section in a rounded card is avoidance of layout decisions
  • Em-dash flood in UI strings — 3+ em dashes in visible copy is prose grammar leaking into interface grammar; restructure with periods, colons, or separate elements

Minor (polish that separates good from great — full list in review.md Polish Pass): no tabular-nums on data, missing text-wrap: balance, straight quotes, no &nbsp; in brand names, testimonial star ratings, hero metric without adjacent context.

The Craft Test (What TO Do)

Anti-slop says what to avoid. Craft says what to aim for.

General craft:

  • One accent, 3-5 placements per above-the-fold viewport. Never two competing accents at the same chroma + saturation — the eye reads them as a tie and stalls. Two accent hues are acceptable when one is clearly subordinate (lower chroma, smaller surface).
  • White backgrounds with barely-there borders or whitespace. Numbers large, undecorated, tabular-nums.
  • Comparisons plain secondary text. One chart color at different opacities. Area fill fades ~15% → 0%.
  • Functional color only — dots for status, flags for countries. Real content, not placeholders.

Landing pages (detail in inspiration.md):

  • Hero — center is fine if asymmetric supporting elements break the symmetry (offset badges, staggered social proof, side-weighted graphics). Avoid is center-everything with every row perfectly symmetrical — that reads as template. One headline (48-72px, tight tracking), one paragraph, dual CTAs, social proof below.
  • Features: 2-3 asymmetric rows with real visuals (chart, timeline, funnel). NEVER uniform 3-column icon grids.
  • Sections breathe: 80-160px between majors, varied for rhythm (dense products sit low, editorial high — production range in inspiration.md). Every section answers one question.
  • Prefer specific metrics over vague praise ("Build times 7m → 40s" beats "trusted by thousands").

Shortened here. Read the whole file on GitHub.

Signals

GitHub stars
326
Forks
17
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
ui-craft-educlopez
Source
github.com/educlopez/ui-craft