Install
openclaw skills install variant-design-skillGenerates 3 distinct, high-quality UI design variations from a prompt using a comprehensive design system with options to vary, remix, polish, critique, and...
openclaw skills install variant-design-skillSolve 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 matches | Load |
|---|---|---|
| Dashboard, analytics, metrics, monitoring, data viz | 后台, admin panel, management system, backoffice, CRM, internal tool | references/dashboard.md |
| Editorial, magazine, journalism, news, article | blog post, report, white paper, newsletter | references/editorial.md |
| Landing page, SaaS, product page, startup, B2B | website, 官网, corporate site, personal site, portfolio, agency | references/saas.md |
| E-commerce, shopping, product, fintech card, consumer | store, shop, marketplace, cart, checkout | references/ecommerce.md |
| Education, learning app, quiz, language, science | lesson, flashcard, tutorial, training, course | references/education.md |
| Generative art, music tool, 3D, creative tool, synthesizer | tool, studio, editor, canvas, sequencer, DAW | references/creative.md |
| Mobile app, iOS, Android, onboarding, home screen | app, 应用, 界面, UI screen | references/mobile.md |
| Unsure / general | Use 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 challenge | Load |
|---|---|
| Font selection, type scale, hierarchy | references/design-system/typography.md |
| Color palette, dark mode, contrast | references/design-system/color-and-contrast.md |
| Layout, spacing, grids, visual hierarchy | references/design-system/spatial-design.md |
| Animations, transitions, loading states | references/design-system/motion-design.md |
| Forms, states, focus, keyboard nav | references/design-system/interaction-design.md |
| Mobile-first, breakpoints, fluid design | references/design-system/responsive-design.md |
| Labels, errors, empty states, microcopy | references/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:
| Direction | Feel | Signature |
|---|---|---|
| Minimal / Editorial | Type-driven, generous space | One strong font, minimal color |
| Bold / Expressive | High contrast, graphic | Dominant color block |
| Dark / Premium | Moody, atmospheric | Deep bg, elevated surfaces (not shadows) |
| Warm / Human | Rounded, approachable | Soft palette, organic forms |
| Data / Technical | Dense, systematic | Grid, monospace, tight |
| Neo-brutalist | Raw, unconventional | Bold outlines, broken grid |
| Luxury / Silence | Maximum negative space | One 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):
: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-pattern | Instead |
|---|---|
| Two variations in the same aesthetic direction | Ensure A/B/C feel like different studios — re-check the direction table |
Inter, Roboto, Arial, system-ui as display fonts | Distinctive fonts: Instrument Sans, Fraunces, Outfit, Newsreader |
| Hardcoded hex values in CSS rules | CSS custom properties with OKLCH: color: var(--text) |
| Lorem ipsum or placeholder text | Real, domain-plausible content |
| Generic "Feature 1 / Feature 2 / Feature 3" copy | Specific feature names that match the domain |
| Five or more colors used at similar weight | 60-30-10: one dominant color used with conviction |
| Cards with identical sizes and equal visual weight | Vary card sizes to create rhythm and hierarchy |
| Hover states missing on interactive elements | Every button, link, and card needs hover + focus-visible |
| Mobile layouts that are just desktop shrunk down | Rethink for thumb zones, touch targets, and vertical flow |
| Gradient abuse (5+ color gradient backgrounds) | One solid color or a two-stop gradient maximum |
| Purple-to-blue gradients, cyan-on-dark, neon accents | Intentional palette from OKLCH, tinted neutrals |
| Glassmorphism everywhere (blur, glow borders) | Purposeful decorative elements that reinforce brand |
| Big rounded icons above every heading | They rarely add value — use typography for hierarchy |
| Cards nested inside cards | Flatten hierarchy — use spacing and dividers |
| Everything centered | Left-aligned with asymmetric layouts feels more designed |
| Same spacing everywhere | Varied spacing creates rhythm — tight groups, generous separations |
| Gradient text on headings/metrics | Decorative, not meaningful — use solid color with weight |
| Dark mode as default with glowing accents | Earn dark mode: different surface depths, desaturated accents, no shadows |
| Bounce/elastic easing | Exponential ease-out — real objects decelerate smoothly |
outline: none without replacement | :focus-visible with 2-3px offset ring |
| Modals for everything | Consider alternatives: inline expansion, drawers, popovers |
| Pure black (#000) or pure white (#fff) | Always tint — pure extremes don't exist in nature |
| Gray text on colored backgrounds | Use darker shade of the background color |
| Empty state = "No data" text only | Design as onboarding moment: acknowledge, explain value, CTA |
| Text that overflows its container | overflow-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