better-accessibility
Reviews and fixes keyboard and focus behavior, ARIA, accessible names, forms, screen-reader…
Builds multiple variants of a component you're working on and helps you iterate and pick one.
$ npx -y skills add jakubkrehel/skills --skill variant --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/variantContext preview
The summary Claude sees to decide when to auto-load this skill.
Builds multiple variants of a component you're working on and helps you iterate and pick one.
name: variant description: Builds multiple variants of a component you're working on and helps you iterate and pick one. disable-model-invocation: true
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`.
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. 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.
Before a variant enters the picker it clears `better-interface`'s escalation triggers, which are:
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.
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.
Variants have to look like they could ship tomorrow, so read what they stand on:
With no project to read, use neutral grays, one accent and the system font stack, and say that is what you did.
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.
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 floating control sets it; [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.
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.
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 guarded import. 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.
| 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 | | Judg
A collection of agent skills that help you build great interfaces.
Reviews and fixes keyboard and focus behavior, ARIA, accessible names, forms, screen-reader…
Helps you build and check a color system for your project. It generates palettes, names…
Combines all of the `better-*` skills into a single review across accessibility, layout,…
Helps with grouping, alignment, reading order, responsive structure and room for translated…
Sets and reviews how text renders in your product, from the type scale and spacing to font…
Polishes the surfaces, icons and motion in your project with exact values for border radius,…