17 ui consistency review
Skill FluxonLab/Skillry/plugins/frontend-web-design/skills/17-ui-consistency-review
Use when you need to audit UI consistency, spacing, color, typography, states, accessibility basics, and responsive behavior.From its SKILL.md
npx -y skills add FluxonLab/Skillry --skill 17-ui-consistency-reviewAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
11.3 KB, ~2.7k tokens by cl100k_base, as published. Nobody here has run it
UI Consistency Review
Purpose
Audit UI consistency across spacing, color, typography, interactive states, accessibility basics, and responsive behavior — with every finding anchored to the project's own design tokens and component system rather than personal taste. The output is a minimal-diff punch list: each issue names the offending file and line, the bad value, and the exact token or utility class that should replace it, so a developer can fix it without a second round of clarification. The review is static and visual only; it never refactors component APIs or invents a new design language.
When to use
- New components or screens were added and need a consistency pass against the established spacing scale, color tokens, and type system before review or release.
- Hardcoded hex values, magic pixel values, or missing interactive states (hover, focus, disabled, error, empty) have been spotted in the codebase.
- An accessibility concern was raised — missing focus rings, low-contrast text, or non-semantic clickable elements need a systematic sweep.
- The UI has grown across multiple contributors and visual drift (inconsistent font sizes, spacing rhythm, or button styles) has accumulated.
- A design system or Tailwind config exists and you need to confirm production code actually consumes it instead of bypassing it with arbitrary values.
When not to use
- The task is unrelated to frontend and web design work.
- The work would require production deploys, destructive data actions, or secret disclosure.
- The page has structural layout breakage (wrong hierarchy, broken mobile). Fix structure with
web-design-revieworresponsive-layout-reviewfirst, then run consistency. - A narrower skill already covers the exact need:
design-system-reviewfor token architecture and duplicate primitives,accessibility-auditfor a full WCAG pass,visual-polish-passfor final pixel finish.
Procedure
- Establish the intended system first. Locate the spacing scale, color tokens, type scale, radius/shadow scale, and component primitives before judging anything. Look in
tailwind.config.{js,ts}, CSS custom properties in:root, atokens.json, or a theme provider. Record the scale base (4px or 8px), the named color roles, and the bounded type steps. Review against this source of truth, not personal taste. - Audit spacing and layout. Confirm padding, margin, and gap values land on the scale. Flag inline
style={{ }}overrides and arbitrary Tailwind values such asp-[13px]orgap-[7px]. Check that related elements (a label and its field) sit tighter than unrelated sections, and that gutters in a grid are uniform. - Audit color. Compare every hardcoded hex/rgb against the token palette — a literal
#3b82f6that equalscolors.primaryis a violation. Verify text contrast meets WCAG 2.1 AA: 4.5:1 for body text and 3:1 for large text (>=24px regular or >=18.66px bold), plus 3:1 for UI component boundaries and focus indicators. - Audit typography. Confirm a bounded type scale (roughly five to seven steps). Flag one-off
font-sizevalues off the scale, mixedfont-weightat the same hierarchy level, and inconsistentline-heightbetween similar text blocks. - Audit interactive states. Every actionable element needs
:hover,:focus-visible,:active, and:disabled. Data-bound surfaces additionally need loading, empty, and error states. A button with hover but no disabled or focus-visible state is incomplete. - Audit responsive behavior. Check breakpoints, horizontal overflow, text truncation versus wrapping, and touch targets >=44x44px (Apple HIG) or 48x48dp (Material) at mobile widths. Confirm body text stays >=16px so mobile browsers do not auto-zoom inputs on focus.
- Audit accessibility basics. Images need
alt; form inputs need an associated<label>oraria-label; clickable behavior belongs on<button>/<a>, not<div onClick>. Decorative icons needaria-hidden="true". - Report per-component findings with severity and the token/value to use instead, leading with systemic issues (a missing token, a repeated bad pattern, a global
outline: none) over isolated nits.
Concrete checks
Spacing and layout:
- Padding, margin, and gap values land on the 4/8px scale — no arbitrary
p-[13px]ormt-[22px]. - No inline
style={{ }}overrides that hardcode spacing outside the scale. - Related elements (label and field, icon and caption) are grouped tighter than unrelated sections.
- Grid and flex gutters are uniform within the same layout.
Color and contrast:
- Every color is a token reference, not a literal hex that duplicates a token value.
- Body text meets WCAG 2.1 AA contrast of 4.5:1; large text and UI boundaries meet 3:1.
- Disabled and muted states remain legible, not washed-out gray on white.
- A single muted-text token and a single border-color token are used everywhere.
Typography:
- The type scale is bounded to roughly five to seven steps, all referenced by name.
- No mismatched
font-weightat the same hierarchy level without a documented reason. line-heightis consistent within body text and within headings.
States and accessibility:
- Every actionable element has
:hover,:focus-visible,:active, and:disabled. - Data-bound surfaces have loading, empty, and error states.
<img>hasalt; inputs have a<label>oraria-label; clickable behavior is on<button>/<a>.- Touch targets are >=44x44px / 48x48dp at mobile widths; body text stays >=16px.
Commands
# --- color tokens ---
# hardcoded hex/rgb in components (should be tokens)
rg -n '#[0-9a-fA-F]{3,8}\b|rgba?\(' src/components src/app 2>/dev/null
# raw Tailwind color utilities used in place of semantic tokens
rg -n 'bg-(red|blue|green|gray|slate|zinc)-[0-9]{3}|text-(gray|slate)-[0-9]{3}' src
# rank the most-used literal colors (near-duplicate detection)
rg -oN '#[0-9a-fA-F]{6}' src | sort | uniq -c | sort -rn | head -20
# --- spacing ---
# arbitrary Tailwind spacing values off the scale
rg -n '\b[pm][trblxy]?-\[[0-9]+px\]|gap-\[[0-9]+px\]' src
# inline style overrides that bypass the system
rg -n 'style=\{\{' src
# --- typography ---
# count distinct font sizes (drift signal — expect <= ~6)
rg -oN 'text-(xs|sm|base|lg|xl|2xl|3xl|4xl|5xl)|font-size:\s*[0-9.]+(px|rem)' src | sort -u | wc -l
# distinct font-weights in use (expect a small, intentional set)
rg -oN 'font-(thin|light|normal|medium|semibold|bold|extrabold)|font-weight:\s*[0-9]+' src | sort | uniq -c
# --- states ---
# interactive elements vs how many declare hover/focus-visible
rg -c 'hover:|focus-visible:' src
rg -n '<button|<a |role="button"' src | wc -l
# focus removed without a focus-visible replacement (keyboard blocker)
rg -n 'outline:\s*none|outline-none' src | rg -v 'focus-visible'
# --- accessibility ---
# clickable divs that should be buttons
rg -n '<div[^>]*onClick' src
# images missing alt (quick a11y sweep)
rg -n '<img(?![^>]*\balt=)' src
# --- radius / shadow drift ---
# distinct border-radius values in use (expect <= 3)
rg -oN 'rounded-(sm|md|lg|xl|2xl|full|none)|border-radius:\s*[0-9.]+(px|rem)' src | sort | uniq -c
# distinct shadow utilities (elevation should be a small, ordered set)
rg -oN 'shadow-(sm|md|lg|xl|2xl|none|inner)' src | sort | uniq -c
# --- responsive / theme ---
# fixed pixel widths that may overflow on small screens
rg -n 'w-\[[0-9]{3,}px\]|width:\s*[0-9]{3,}px' src
# inputs with sub-16px font that trigger mobile auto-zoom
rg -n 'text-(xs|sm)\b' src/components | rg -i 'input|select|textarea'
# theme coverage: is dark mode a token swap or duplicated CSS?
rg -n 'dark:|prefers-color-scheme|data-theme' src | head
Common issues & anti-patterns
- Token defined, never used:
colors.primaryexists in the config but components writebg-blue-600directly, so a palette change silently misses them. - Orphan hover state: an element has
cursor: pointerand anonClickbut no visible hover or focus change — the affordance signal is absent. - Focus killed for looks:
outline: noneapplied globally with no:focus-visiblereplacement, leaving keyboard users with no visible focus position. - Placeholder-as-label: an input whose only label is its placeholder — the label vanishes on input and is invisible to screen readers.
- Weight drift: some
<h3>arefont-semibold(600), othersfont-medium(500), with no rule, so the hierarchy reads inconsistently. - Disabled that looks enabled: a disabled button at full opacity with no
cursor: not-allowed, so users click it repeatedly. - The 2px rounding error:
padding: 22pxinstead of the scale's 24px, repeated with small variations across components until the grid feels chaotic. - Mixed icon sizes: nav icons at 20px next to action icons at 16px and 24px, with no contextual rule, so the toolbar looks uneven.
- Near-duplicate grays:
#6b7280in one component and#64748bin another for the same muted text — visually similar, technically inconsistent, and impossible to theme. - Color-only meaning: status conveyed solely by a red or green dot with no icon or label, which fails for color-blind users and screen readers.
- Inconsistent radius logic: inputs at
rounded-sm, cards atrounded-md, modals atrounded-xl, and pills atrounded-fullwith no documented hierarchy, so the product reads as assembled from unrelated kits.
Required output
Return a structured report with:
- System summary: where the tokens live (config or CSS variables), the scale base, and whether production code actually consumes them.
- Findings by area: spacing, color, type, states, responsive, and a11y, each row as
severity | component/file:line | issue | recommended token/value. - Accessibility blockers: contrast and keyboard-focus failures listed separately and explicitly, not buried among cosmetic nits.
- Already-consistent areas: a short note on what is solid, so the report stays balanced.
- Top three drift removers: the changes that would eliminate the most repeated violations, ordered by leverage.
Lead with systemic issues (a missing token, a repeated bad pattern, a global outline: none) over one-off nits.
Safety
- Review against the project's existing tokens and system; do not impose a new design language.
- Static and visual review only — do not refactor component APIs or rename props as a side effect.
- Keep recommendations token-based and minimal-diff; change one component at a time, since shared-token edits cascade to every consumer.
- Treat contrast and keyboard-focus issues as accessibility blockers, not optional polish.
- Do not modify shared token files without confirming every consuming component still renders correctly.
- Redact any secret-like values surfaced while reading config; describe key names only.
Completion criteria
Done means spacing, color, typography, interactive states, responsive behavior, and accessibility basics were each checked against the project's own system; every finding carries a severity and a concrete token/value fix with file:line; systemic issues are prioritized over isolated nits; accessibility blockers are called out separately from cosmetic drift; and the report ends with the three highest-leverage changes.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.