variant — Codex skill: UI variations and installation
This skill builds distinct versions of one UI component and puts them on the page where it will live. Use it to compare design directions before choosing one.
npx skills add jakubkrehel/skills --skill variant -a claude-codeWhat variant does
Each run focuses on one piece of UI and creates three variants. They differ along one chosen axis, such as structure, density, or typography. The skill lays out the tradeoffs but leaves the decision to you.
Variants appear in a picker on the project page, with each one selectable through a URL parameter such as ?__variant=quiet. The skill reads the styling system and surrounding components, then checks accessibility basics including keyboard access, focus, contrast, and narrow-screen behavior. Review them in context; a blank route can make a design look better than it is.
To install with Codex, run the command below and check for .agents/skills/variant/SKILL.md in the project. The skill can create five variants when asked. Once you choose one, it directs the agent to move that version into the project and remove the picker and unused variants.
What it helps with
- compare design directions for one component
- preview UI variants within the page they will ship on
- weigh visual emphasis against content density
- check accessibility before settling on a design
Example prompts for the agent
- Create three density variations of the metric card on the dashboard page.
- Build five search-form variants and show them in a picker on the page.
- Compare sidebar directions and explain the tradeoff for each one.
How to install variant
1Skills CLI (Vercel)
npx skills add jakubkrehel/skills --skill variant -a claude-code2Manually: put the files in place
~/.claude/skills/variant/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/variant/
1Skills CLI (Vercel)
npx skills add jakubkrehel/skills --skill variant -a codex2Manually: put the files in place
.agents/skills/variant/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add jakubkrehel/skills --skill variant -a cursor2Manually: put the files in place
.cursor/skills/variant/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install jakubkrehel/skills variant2Manually: put the files in place
.github/skills/variant/SKILL.md1Skills CLI (Vercel)
npx skills add jakubkrehel/skills --skill variant -a gemini-cli2Platform CLI
gemini skills install https://github.com/jakubkrehel/skills --path skills/variantManually: put the files in place
.devin/skills/variant/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add jakubkrehel/skills --skill variant -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set13
The whole set →Similar
Questions about variant
How do I install variant in Codex?
Run npx skills add jakubkrehel/skills --skill variant -a codex. The skill file is at .agents/skills/variant/SKILL.md.
What does variant do?
It builds distinct versions of one UI component, displays them on the page where they belong, and describes the tradeoffs. You make the final choice.
How many variants does the skill create?
It creates three by default. It makes five only when asked.
Source text
SKILL.md · MIT
--- name: variant description: Builds multiple variants of a component you're working on and helps you iterate and pick one. disable-model-invocation: true --- # 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 flips it and which width you judged at. The answer can change between 375px and 1440px. Never mark a favourite in the table. Asked directly, answer from how often the piece is seen and from the product's personality, not from which one you enjoyed building. ## 6. Promote one, delete the rest On a choice, build that variant properly where it belongs, following the project's own conventions. Then delete the other variants, the picker and the hosting page's import of the variants. Search for the variant names and the `__variant` param, and check the diff leaves nothing of the harness behind. Asked for another round instead, keep the harness and run **Name the axis before writing code** again, taking new positions around the direction you leaned toward. ## Before you finish | Mistake | Fix | | --- | --- | | Variants differ only in accent color or copy | Move one to a different position on the primary axis, or cut it | | Every axis varies at once | Vary one; let the rest follow from it | | Judged on a blank route | Host them on the page that will contain the piece | | Lorem ipsum, three rows, "Jane Doe" | Real copy and the item count the page will really carry | | The boldest variant skips keyboard or focus | Clear the floor or drop the direction | | A favourite marked in the table | State each variant's cost and let the user choose | | Picker restyled with the project's tokens | Keep it visibly outside the design system | | One long row of tabs, one per variant | A grouped list beside the piece that scrolls on its own; a select above it where the list does not fit | | Harness left behind after promotion | Delete it and search for the names and the param |
© jakubkrehel · MIT · jakubkrehel/skills