Answers which of these rather than is this right. Builds several genuinely different versions of one piece of UI behind a picker in the real page, so you can flip between them and promote the one that wins.
Real-world examples not captured yet
This skill shows a gallery of live HTML demos (CDN libraries welcome — GSAP, Three.js, etc.) rendered inline via srcdoc.
Skill markdown
# Variants This skill takes one described piece of UI and builds three versions that differ on purpose. They go behind a picker in the real page, so you can flip between them and choose. It produces candidates and never ranks them. Reviewing existing UI is `interface-review` and `better-interface`, stress testing one component is `break` and working through a component's states is `state-machine`. ## Different answers, not different tints Each variant is a different answer to the same brief, on an axis this collection owns: | Axis | Owner | What varies | | --- | --- | --- | | Structure | `better-layout` | Grouping, order, column count, what collapses | | Density | `better-layout` | Spacing scale, how much fits | | Emphasis | `better-colors` | Where filled color goes, what recedes | | Type | `better-typography` | Scale steps, weight contrast, measure | | Voice | `better-writing` | Labels, tone, how much copy | Pick **one primary axis** and give each variant a different position on it. The axis names the picker's group heading. Secondary choices follow from it rather than varying on their own. A dense variant may need a smaller type step, and that is coherence, not a second axis. ## The floor every variant clears Before a variant enters the picker it clears `better-interface`'s escalation triggers, which are: - Every control has an accessible name and a visible focus indicator. - Keyboard reaches everything a pointer does. - Motion and auto-playing content respect `prefers-reduced-motion`. - Nothing clips, overlaps or becomes unreachable at 320px width or 200% zoom. - Body and control text pass their required contrast ratio. - No state or meaning rides on color alone, and no state change on motion alone. - A destructive action has a confirmation, an undo or a distinct treatment. - Truncated content has a way to reach the full value. - Nothing hides past a scroll edge or behind a disclosure with no visible cue. - Every error names a way to recover. - No semantic color is used against its meaning, such as the danger hue on a non-destructive action. That floor is identical across variants. It is not an axis and never trades against one. Where a direction can only work by breaking it, say so and drop the direction. ## 1. Scope one piece One piece of UI per run. "The dashboard" is not a piece; the metric card is. Where the request spans several, list the candidates and ask which one to explore. Restate the brief in one sentence: what the thing is, where it renders, what it has to do. ## 2. Learn the ground Variants have to look like they could ship tomorrow, so read what they stand on: - The styling system, the component library and any motion library. - The tokens: color, spacing, radius, type scale, easing. - The product's density and voice. A dense professional tool bounds how far the boldest variant may go. - Where the piece renders: against what background, beside which neighbours, at which widths. With no project to read, use neutral grays, one accent and the system font stack, and say that is what you did. ## 3. Name the axis before writing code Default to three variants. Go to five only when asked. Write the set down first, a name and an axis position each. Names say what the direction is, so `Quiet`, `Editorial`, `Dense`, never `Option A`. This step is done when no two variants share a position and you can state each one's axis in a phrase. ## 4. Build it into the real page Host the variants on the page that will actually contain the piece, with the real chrome, the real neighbours and realistic data. Select with a URL search param such as `?__variant=quiet`, so every variant is a link you can send someone. A grouped list beside the piece sets it. Where there is no room beside the piece, it moves above it as a select with the same groups. [picker.md](picker.md) holds the spec. Render one variant at a time, full size. Thumbnails distort spacing and scale, and spacing is usually the thing you are choosing between. Variant files may import production components. Only the hosting page imports a variant, and nothing else imports from the harness. Where no page can host it, build one self-contained HTML file and keep the same picker. Give every variant real content: product-shaped copy, plausible names and the number of items the page will really carry. Lorem ipsum and three rows make every structure look good. ## 5. Present the tradeoffs and stop Load the page once in a browser already at hand and flip through every variant. Each one renders, each interaction responds and the console is clean. With no browser at hand, say so and hand the URL over for the user to check. Then hand the decision over: | Variant | Axis position | Right when | Costs | | --- | --- | --- | --- | | Quiet | Lowest visual weight | The page is used daily | Least memorable | | Editorial | Largest type, most space | The moment deserves weight | Eats vertical space | Say where the picker is running, which key …
More from jakubkrehel
- Better AccessibilityReview and improve focus states, keyboard support, ARIA, forms, screen readers, hit areas, and motion accessibility.
- Better ColorsOKLCH color space for web projects. Convert hex/rgb/hsl to oklch, generate palettes, check contrast, handle gamut boundaries, and theme with Tailwind v4. Triggers on oklch, color conversion, palette generation, contrast ratio, gamut, display p3, design tokens, hue drift, chroma, dark mode colors.
- Better InterfaceRun a holistic interface review across accessibility, layout, writing, typography, color, and visual polish.
- Better LayoutImprove interface structure through grouping, alignment, reading order, progressive disclosure, and adaptive responsive layouts.
- Better TypographyWeb typography from choosing fonts to spacing, wrapping and accessibility. Use when picking or pairing typefaces, configuring variable fonts or OpenType features, setting up a type scale, styling text in components, truncating text, styling underlines, selection, placeholders or carets, or reviewing frontend code for typography. Triggers on typography, fonts, font formats, woff2, variable fonts, font-weight, opentype, font-feature-settings, letter-spacing, line-height, type scale, tabular numbers, text-wrap, truncation, line clamp, underlines, text-decoration, text selection, iOS input zoom, font smoothing, text contrast, measure, line length, text-box, smart punctuation, drop cap.
- Better UIDesign engineering principles for making interfaces feel polished. Use when building UI components, reviewing frontend code, implementing animations, hover states, shadows, borders, micro-interactions, enter/exit animations, or any visual detail work. Triggers on UI polish, design details, "make it feel better", "feels off", stagger animations, border radius, optical alignment, image outlines, box shadows.