Solve the blank canvas problem. Prompt → 3 fully-formed distinct designs → vary → export.
Inspired by the Variant design community — a space where designers share divergent takes on the same brief. This skill brings that practice into Claude Code: every prompt yields three designs that feel like they came from different studios, then lets you iterate with one-word actions.
Built on the Impeccable design system — a comprehensive set of design references covering typography, color theory, spatial design, motion, interaction patterns, responsive design, and UX writing. Every design decision is grounded in these principles.
Supports: HTML (default) · React · 7 domain reference libraries · 27 palettes · design system references · variation actions
On first use in a project, gather design context to ground all future generations. Ask the user:
If the user can't answer, infer from their codebase: scan for existing color variables, font imports, component patterns, and README/brand docs. Confirm inferences before proceeding.
Persist context as a comment block at the top of generated files or in the conversation — reference it in every subsequent generation to ensure consistency across variations.
Identify the scenario and load the corresponding reference file before designing:
User asks about...Also matchesLoadDashboard, analytics, metrics, monitoring, data viz后台, admin panel, management system, backoffice, CRM, internal toolreferences/dashboard.mdEditorial, magazine, journalism, news, articleblog post, report, white paper, newsletterreferences/editorial.mdLanding page, SaaS, product page, startup, B2Bwebsite, 官网, corporate site, personal site, portfolio, agencyreferences/saas.mdE-commerce, shopping, product, fintech card, consumerstore, shop, marketplace, cart, checkoutreferences/ecommerce.mdEducation, learning app, quiz, language, sciencelesson, flashcard, tutorial, training, coursereferences/education.mdGenerative art, music tool, 3D, creative tool, synthesizertool, studio, editor, canvas, sequencer, DAWreferences/creative.mdMobile app, iOS, Android, onboarding, home screenapp, 应用, 界面, UI screenreferences/mobile.mdUnsure / generalUse aesthetic directions table below + references/palettes.md
Always also load the relevant design system references from references/design-system/ based on what matters most for the design:
Design challengeLoadFont selection, type scale, hierarchyreferences/design-system/typography.mdColor palette, dark mode, contrastreferences/design-system/color-and-contrast.mdLayout, spacing, grids, visual hierarchyreferences/design-system/spatial-design.mdAnimations, transitions, loading statesreferences/design-system/motion-design.mdForms, states, focus, keyboard navreferences/design-system/interaction-design.mdMobile-first, breakpoints, fluid designreferences/design-system/responsive-design.mdLabels, errors, empty states, microcopyreferences/design-system/ux-writing.md
For initial generation, load at minimum: typography, color-and-contrast, and spatial-design. Load others as the design demands.
Identify scenario, load domain reference file + relevant design system references, pick 3 starter prompts and palettes. Study the Real Community Examples for composition patterns and what makes each design work — extract the principle, not the surface style.
Each variation = a different studio's interpretation. Never two in the same direction.
Universal aesthetic directions:
DirectionFeelSignatureMinimal / EditorialType-driven, generous spaceOne strong font, minimal colorBold / ExpressiveHigh contrast, graphicDominant color blockDark / PremiumMoody, atmosphericDeep bg, elevated surfaces (not shadows)Warm / HumanRounded, approachableSoft palette, organic formsData / TechnicalDense, systematicGrid, monospace, tightNeo-brutalistRaw, unconventionalBold outlines, broken gridLuxury / SilenceMaximum negative spaceOne image, sparse text
For each variation, define before coding:
palettes.md) — use OKLCH for perceptually uniform colors where possiblespatial-design.md for grid and hierarchy principlesmotion-design.md for timing and easingWorking code — HTML (default) or React. Real content, no lorem ipsum. Visually complete.
Label: Variation A — [Name] / B — [Name] / C — [Name]
Before presenting, run this check on each variation:
If you showed this interface to someone and said "AI made this," would they believe you immediately? If yes, redesign.
A distinctive interface should make someone ask "how was this made?" not "which AI made this?" Review the Anti-Patterns table below — they are the fingerprints of AI-generated work.
After presenting, always offer:
Which direction resonates? Options:
- Vary strong — push aesthetic to its extreme
- Vary subtle — polish, same direction
- Distill — strip to essence, remove everything non-essential
- Change style — keep layout, swap visual language
- Remix colors — 3 alternative palettes using OKLCH
- Shuffle layout — same content/style, different composition
- Polish — refine spacing, typography, and micro-details
- Critique — audit against design system principles
- Extract tokens — export design tokens as CSS/JSON/Tailwind config
- See other views — mobile / dark mode / empty state / onboarding / hover states
Amplify current direction to maximum. More contrast, stronger type, bolder color, more dramatic composition. Consult references/design-system/typography.md for scale ratios and references/design-system/color-and-contrast.md for high-contrast palette construction.
Before → After example:
Tighten spacing, refine hierarchy, soften where needed. Same direction, higher craft. Focus on vertical rhythm, optical alignment, and micro-interactions per references/design-system/spatial-design.md and references/design-system/motion-design.md.
Before → After example:
tabular-nums on data, font-kerning: normal on headlinesStrip the design to its absolute essence. Inspired by the Impeccable distill philosophy — ruthless simplification reveals what truly matters.
Process:
<details>, hover reveals)Before → After example:
Extract structure/layout DNA, replace entire visual language with a different direction from the table above.
Keep all shapes, type, layout. Generate 3 palettes using OKLCH color space (per references/design-system/color-and-contrast.md):
Always tint neutrals toward the brand hue. Never use pure gray, pure black (#000), or pure white (#fff).
Before → After example (palette 3, unexpected):
Same content + style. Rearrange structure: try full-bleed → asymmetric grid → editorial columns → card masonry. Consult references/design-system/spatial-design.md for grid systems and visual hierarchy principles.
Before → After example:
Apply Impeccable design system refinements systematically:
references/design-system/typography.md): vertical rhythm, modular scale, OpenType features (tabular-nums for data, proper fractions), font-display: swap, size-adjust fallback metricsreferences/design-system/spatial-design.md): squint test, hierarchy through multiple dimensions, optical alignment (text negative margin -0.05em, icon center offsets)references/design-system/interaction-design.md): all 8 interactive states (default/hover/focus/active/disabled/loading/error/success), focus-visible rings, proper form design (visible labels, blur validation, aria-describedby errors)references/design-system/motion-design.md): 100/300/500 rule, ease-out-expo for enters, exit at 75% of enter duration, staggered animations with CSS custom propertiesreferences/design-system/ux-writing.md): specific button labels (verb + object), error formula (what → why → fix), empty states that teach the interface, link text with standalone meaningSystematic audit against design system principles. Score each dimension and provide specific fixes:
pointer/ hover)? Safe areas?Export the design's token system in the requested format:
CSS Custom Properties (default):
css
:root {
/* Primitives */
--blue-500: oklch(55% 0.2 260);
--stone-100: oklch(95% 0.01 60);
/* Semantic */
--color-primary: var(--blue-500);
--color-surface: var(--stone-100);
/* Typography */
--font-display: 'Fraunces', serif;
--font-body: 'Instrument Sans', sans-serif;
--text-xs: clamp(0.7rem, 0.65rem + 0.25vw, 0.75rem);
--text-base: clamp(0.95rem, 0.9rem + 0.25vw, 1.0625rem);
--text-xl: clamp(1.5rem, 1rem + 2.5vw, 3rem);
/* Spacing */
--space-xs: 4px; --space-sm: 8px; --space-md: 16px;
--space-lg: 24px; --space-xl: 48px; --space-2xl: 96px;
/* Motion */
--ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
--duration-instant: 100ms;
--duration-fast: 200ms;
--duration-normal: 350ms;
}
JSON (for design tools / Figma): Same structure as flat key-value JSON.
Tailwind config: Extend theme with colors, fontFamily, spacing, transitionTimingFunction.
Render additional views with full design system compliance:
Empty state — not just "No items." Design as an onboarding moment:
Data-filled state — realistic volume: 3–7 items for lists, 6–12 months of data for charts, edge cases included (one very long name, one empty optional field)
Mobile viewport — not a shrunk desktop. Per references/design-system/responsive-design.md:
data-label attributes@media (pointer: coarse) for larger tap areasDark ↔ Light toggle — per references/design-system/color-and-contrast.md:
Onboarding flow — per Impeccable onboard principles:
Hover / active / focus states — all interactive elements with visible state changes
After any variation action, always:
Grounded in the Impeccable design system. Consult individual references for deep implementation guidance.
references/design-system/typography.md)#@import, always specify weights.clamp(min, preferred, max) for responsive sizing. Not for buttons/labels.tabular-nums for data tables, diagonal-fractions for recipes, all-small-caps for abbreviations.references/design-system/color-and-contrast.md)#--blue-500) + semantic ( --color-primary: var(--blue-500)). Dark mode redefines semantic only.references/design-system/spatial-design.md)#gap instead of margins for sibling spacing.references/design-system/motion-design.md)#cubic-bezier(0.16, 1, 0.3, 1)) for elements entering. Exit at 75% of enter duration.transform and opacity. For height: use grid-template-rows: 0fr → 1fr.animation-delay: calc(var(--i) * 50ms). Cap total stagger time.@media (prefers-reduced-motion: reduce).references/design-system/interaction-design.md)#outline: none without replacement. Use :focus-visible.aria-describedby.<dialog> when needed. Consider Popover API for non-modal overlays.references/design-system/ux-writing.md)#--accent: oklch(65% 0.2 250); /* fallback: #6366F1 */--color-primary, --color-surface, --color-text mapping to primitives@import in <style> — always specify weights used, include font-display: swap640px and 1024px. Use clamp() for fluid values@media (prefers-reduced-motion: reduce) block for all animationsconst theme = { ... } with OKLCH values and hex fallbacks<link> in the returned JSX or instruct user to add to index.htmlstyles object@apply for repeated patterns; if CSS modules: one .module.css per componentuseEffect for layout — CSS-only animations and transitions preferredundefined, no "Lorem ipsum")When a user asks for a flow (onboarding, checkout, wizard, multi-step form):
390px frame with label abovecurrentStep state variable to show/hide screens if making it interactiveEvery output must meet these minimums:
loading="lazy" on below-fold images, width/ height attributes to prevent CLS, srcset for responsive images, WebP/AVIF format preferencefont-display: swap, subset to used character ranges when possible, preconnect to Google Fonts origin: <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>@import for CSS files (blocks render) — only for Google Fonts in <style>. Use content-visibility: auto for off-screen sectionstransform and opacity (GPU-composited). No will-change unless animation is imminent. Use Intersection Observer for scroll-triggered animations — never scroll event listenersApply when the design will be used in real products:
Text resilience:
overflow: hidden; text-overflow: ellipsis for single-line, -webkit-line-clamp for multi-lineoverflow-wrap: break-word to prevent horizontal scroll on mobilei18n readiness:
margin-inline-start not margin-left (RTL support)Intl.NumberFormat for locale-aware formattingIntl.DateTimeFormat — never hardcode date formatsError & edge states:
Input robustness:
Avoid these in every output — they are the telltale signs of AI-generated design:
Anti-patternInsteadTwo variations in the same aesthetic directionEnsure A/B/C feel like different studios — re-check the direction tableInter, Roboto, Arial, system-ui as display fontsDistinctive fonts: Instrument Sans, Fraunces, Outfit, NewsreaderHardcoded hex values in CSS rulesCSS custom properties with OKLCH: color: var(--text)Lorem ipsum or placeholder textReal, domain-plausible contentGeneric "Feature 1 / Feature 2 / Feature 3" copySpecific feature names that match the domainFive or more colors used at similar weight60-30-10: one dominant color used with convictionCards with identical sizes and equal visual weightVary card sizes to create rhythm and hierarchyHover states missing on interactive elementsEvery button, link, and card needs hover + focus-visibleMobile layouts that are just desktop shrunk downRethink for thumb zones, touch targets, and vertical flowGradient abuse (5+ color gradient backgrounds)One solid color or a two-stop gradient maximumPurple-to-blue gradients, cyan-on-dark, neon accentsIntentional palette from OKLCH, tinted neutralsGlassmorphism everywhere (blur, glow borders)Purposeful decorative elements that reinforce brandBig rounded icons above every headingThey rarely add value — use typography for hierarchyCards nested inside cardsFlatten hierarchy — use spacing and dividersEverything centeredLeft-aligned with asymmetric layouts feels more designedSame spacing everywhereVaried spacing creates rhythm — tight groups, generous separationsGradient text on headings/metricsDecorative, not meaningful — use solid color with weightDark mode as default with glowing accentsEarn dark mode: different surface depths, desaturated accents, no shadowsBounce/elastic easingExponential ease-out — real objects decelerate smoothlyoutline: none without replacement:focus-visible with 2-3px offset ringModals for everythingConsider alternatives: inline expansion, drawers, popoversPure black (#000) or pure white (#fff)Always tint — pure extremes don't exist in natureGray text on colored backgroundsUse darker shade of the background colorEmpty state = "No data" text onlyDesign as onboarding moment: acknowledge, explain value, CTAText that overflows its containeroverflow-wrap: break-word, text-overflow: ellipsis, line-clamp
Apply to every output — non-negotiable:
outline: none without a custom visible :focus-visible replacement#F0EDE8 on #111) reduces eye strain@media (prefers-reduced-motion: reduce) — preserve functional animations (progress, loading), remove spatial movementrem/ em for font sizes, never px for body text — respect browser settingsmain, nav, aside), live regions for dynamic content, aria-describedby for form errors