Use when reviewing UI for accessibility — WCAG 2.2 AA, keyboard nav, focus, ARIA, contrast, screen-reader semantics — even on 'is this a11y-OK?' or 'mach das barrierefrei'.
The English summary is being prepared. Showing the original description.
Writing or reviewing Tailwind CSS — utility-first, design tokens, no inline-style drift, responsive variants, dark mode — 'style this' or 'mach das hübsch'. Pairs with react-shadcn-ui.
The English summary is being prepared. Showing the original description.
See how to installReview the instructions the agent will receive before you install.
Apply utility-first discipline. Reach for design tokens before arbitrary values, compose with
@applyonly where it earns its keep, and reject inlinestyle=drift. The skill is the how for any Tailwind-stack screen; pair withexisting-ui-auditfor the what already exists andfe-designfor the why.
style= for dynamic values, hex codes
not in tailwind.config, or !important.Do NOT use when:
ui-component-architect.accessibility-auditor.Inspect tailwind.config.{js,ts} (or the equivalent @theme block)
and identify the configured tokens. Map every requested colour,
radius, spacing, shadow, font-size to a configured token. If the design hands you #3B82F6, use
bg-blue-500 (or the project's named token). Arbitrary values
(bg-[#3B82F6], mt-[17px]) are a smell — accept only with a
one-line comment naming the design source.
That paragraph is written for greenfield, and artifact-bound work inverts
it. When a provided finished design is the spec
(design-fidelity), #3B82F6 is a decision
somebody already made and bg-blue-500 is a guess about it. Three obligations
follow, and the third is the one this skill used to get wrong:
Reconciled: line below, and
let the human decide. Writing a different project value because the
difference looks small is exactly the unconfirmed swap (1) rules out — the
mode table at design-fidelity.md:117-121 grants no visibility exemption,
and structural grants only the filling of a spec that is genuinely
silent, which an artifact stating #3B82F6 is not.Why not "just approximate within tolerance", which is the eventual intent:
that needs a tolerance to exist. There is none — no reconcile, tolerance,
approximat or nearest in the rule or its guideline — and both the threshold
and whether approximation is autonomous by default are owner decisions, tracked
as blocker: approximation-tolerance and blocker: fidelity-default-flip on
road-to-design-intent-conformance. Until they land, a skill granting that
autonomy would be re-writing the rule from underneath it.
Structure, controls, grid and breakpoints are never this skill's to adjust;
those stay 1:1 with the artifact and belong to the rule, not to a
utility-class decision. Icons are out of scope here as well, and this skill
asserts no obligation about them — the icon system belongs to
icon-consistency. An earlier revision of
this paragraph claimed icons "stay 1:1 with the artifact" with no citation of
any kind, while putting them outside its own scope in the same sentence; the
claim is withdrawn rather than defended, because a clause that reached the tree
first does not thereby earn an evidentiary bar for its own reversal.
Token authoring (DTCG 3-layer model, CSS-var/Tailwind generation) lives
in design-tokens; its
tokens.ts validate --dir <path> is the single token-discipline
linter — the mechanical check behind this rule (no hardcoded hex / px /
rem outside the token files). That skill ships with the frontend-design
pack: without it the rule above still binds and is checked by reading,
not by a linter. Greenfield Tailwind config: bundled
scripts/tailwind_config_gen.ts (Apache-2.0-derived, pure templating)
scaffolds tailwind.config.{js,ts} per framework.
Inline style="..." is allowed only for runtime-computed values
the build cannot know (server-pushed colour, animated transform
target). Static values inline are a regression — replace with a
utility, an arbitrary value, or a token extension.
Group by axis: layout → box-model → typography → colour → state
→ responsive. Most projects pin this with prettier-plugin-tailwindcss;
if the plugin is configured, run it; if not, follow the order
manually. Reviewer should read intent in one pass.
The first two repetitions of a utility-class string are noise; the third
is a pattern (the utility-class row of the per-class canon,
abstraction-thresholds).
Extract via:
| Mechanism | When |
|---|---|
| Component (Blade/Livewire/React) | Different content, same shell |
| Class string constant | Same shell, different consumers in same file |
@apply in CSS | Cross-file shared visual primitive (button, badge) |
| Tailwind plugin | Tokens or variants, not classes |
@apply for a one-off is a regression — keep utilities inline
until the third use earns extraction.
Class order within an axis: base → sm: → md: → lg: → xl: →
dark: → state (hover:, focus:, disabled:, aria-*:).
Mixing the order makes diffs noisy. State on top of dark on top
of responsive matches Tailwind's cascade and reads top-down.
When reviewing or proposing styles, return:
<artifact value> → <kept, or the token that carries it exactly> (<distance to the nearest project token>). This is
the destination "report the distance" means; without it the obligation
has nowhere to land and is unobservable in the deliverable.@apply / none
with reason; risks named (arbitrary values, !important, dark-mode
gaps, non-token references).Concrete shape:
Element: <selector or component name>
Token map: <colour/spacing/etc → config token>
Reconciled: <artifact value → kept or exact-carrying token, + distance>
Class list: <ordered classes>
Inline style: <only if runtime-computed; else "none">
Extraction: <component | constant | @apply | none — reason>
Risks: <arbitrary values, !important, dark-mode gaps>
space-x-* / space-y-* collide with flex-wrap and RTL — use
gap-* on the flex/grid parent unless the design demands otherwise.dark: variants need a token map in both modes; one-sided dark
styling is half a feature.mt-[17px]) survive Tailwind upgrades but
break the design system; they accumulate silently. Artifact-bound is the
exception, not a loophole: a value the provided design specifies is not
accumulation, and step 1's three obligations decide it. An arbitrary value
nobody can trace to a source is still the smell this bullet is about.style= is for what only
the runtime knows (a computed width, a live transform, a measured offset).
Porting an artifact's inline style= into classes is therefore expected and
is not a deviation, as long as the resolved value comes out identical.
Changing the carrier is free; changing the number is not.@apply inside component CSS interacts with PurgeCSS — keep it
in files Tailwind scans, not in vendor CSS.docs/guidelines/design-antipatterns.md
(C1 gradients, T7 fonts, L1/L2 layout, V1 side-stripe). Pull the catalog
for the full list; the objective subset (contrast, font-size floor,
reduced-motion) is validated via accessibility-auditor's checklist —
cite its verdict rather than eyeballing.font-sans (Arial / Helvetica). If tailwind.config
pins a font family, use it; if not, treat the missing token as a
gap to flag, not a license to ship the OS default.aesthetic:
line if fe-design's aesthetic-direction section produced one.When DESIGN.md declares ## Taste Dials, honour them: Variance → layout-family spread + asymmetry tolerance; Motion → animation budget + reduced-motion posture; Density → spacing scale + information-per-viewport. Absent → follow the design brief's inferred dials.
scripts/tailwind_config_gen.ts is the only shipped script, started as:
node <skills-root>/tailwind-engineer/scripts/tailwind_config_gen.mjs \
[--framework react|vue|svelte|nextjs] [--output PATH] [--validate-only]
--output PATH, or
tailwind.config.ts / .js in the current working directory when no
--output is given. It reads nothing from the project.tailwind.config.ts into cwd, overwriting an existing config without
prompting. --validate-only is the read-only path — it prints the
generated config to stdout and writes nothing. Run --validate-only
first, and pass --output when the target is not the cwd default.
This default contradicts skill-writing's "never mutate on a bare
invocation" line; it is recorded rather than silently tolerated, and
changing the script's default is a caller-visible behaviour change that
belongs in its own change, not here.tailwind_config_gen bare in a project that already has a
tailwind.config.* — it overwrites without asking. Use
--validate-only first, then --output at the intended path.!important to win a specificity fight; restructure
the cascade or extract the conflicting style.tailwind.config without
also adding the token; one-off hex codes drift the system.@apply to avoid utility verbosity inside a single
component — extract the component instead.style= for static values; that is a CSS regression
the linter will not catch.No reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
Use when reviewing UI for accessibility — WCAG 2.2 AA, keyboard nav, focus, ARIA, contrast, screen-reader semantics — even on 'is this a11y-OK?' or 'mach das barrierefrei'.
The English summary is being prepared. Showing the original description.
Use when defining or auditing the activation event — aha-moment selection, retention correlation, falsifiable definition. Triggers on 'what is our aha moment', 'redefine activation'.
The English summary is being prepared. Showing the original description.
Use when capturing an architectural decision — file naming, next ADR number, Status / Context / Decision / Consequences, index regen; fires even without saying 'ADR'.
The English summary is being prepared. Showing the original description.
Adversarial critique — devil's advocate, stress-test, honest teardown ('poke holes', 'be brutal', 'was hältst du davon'); explicit request only. Routine code or design review → code-review.
The English summary is being prepared. Showing the original description.
Use when reading, creating, or updating agent documentation, module docs, roadmaps, or AGENTS.md. Understands the full .augment/, agents/, and copilot-instructions structure.
The English summary is being prepared. Showing the original description.
Use for an adversarial red-team / blue-team / auditor review of an AI agent's CONFIG + behaviour (rules, skills, MCP, hooks, permissions) — attack-chain → defensive-gap list, not a code audit.
The English summary is being prepared. Showing the original description.