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'.
日本語の概要は準備中です。原文の説明を表示しています。
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.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
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 fallback to Arial / Helvetica / Inter
via system defaults) as the visible body face. 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.
--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.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
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'.
日本語の概要は準備中です。原文の説明を表示しています。
Use when defining or auditing the activation event — aha-moment selection, retention correlation, falsifiable definition. Triggers on 'what is our aha moment', 'redefine activation'.
日本語の概要は準備中です。原文の説明を表示しています。
Use when capturing an architectural decision — file naming, next ADR number, Status / Context / Decision / Consequences, index regen; fires even without saying 'ADR'.
日本語の概要は準備中です。原文の説明を表示しています。
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.
日本語の概要は準備中です。原文の説明を表示しています。
Use when reading, creating, or updating agent documentation, module docs, roadmaps, or AGENTS.md. Understands the full .augment/, agents/, and copilot-instructions structure.
日本語の概要は準備中です。原文の説明を表示しています。
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.
日本語の概要は準備中です。原文の説明を表示しています。