Engineering / visual-consistency
Detect and fix visual and layout consistency defects in rendered UI, the systematic raggedness AI generators emit and seniors notice at a glance.
Signierte, abgestufte Provenienz für diesen Skill. Integrität, Urheberschaft, Capability und Aktualität als Beleg, den du abwägst, nicht als Verifiziert-Badge.
A detector and fixer for the visual and layout consistency defects that show up in rendered UI: the systematic raggedness an AI generator emits and a senior notices at a glance. It finds where repeated elements that should line up do not, where spacing is arbitrary instead of systematic, and where variable-length content breaks a clean layout, explains the cost of each, and proposes a concrete CSS fix with a source. The full catalog with detection signals, fixes, exceptions, severity, and sources is in catalog.md; copy-pasteable recipes for the flagship cases are in recipes.md. Read the catalog before a scan.
It defers two neighboring concerns to sibling skills so it does not duplicate them: color literals and contrast to theme-colors, and component, hook, and TypeScript code smells to react-stinky. The accessibility line splits the same way: this skill owns the visual and sizing side (target size, focus-ring consistency, reflow, text spacing the user can override), react-stinky owns the semantic-markup side (roles, labels, keyboard handlers). Whether a screen should exist at all is ask-ux, upstream of everything here. If a sibling is not installed, note the finding in one line and move on.
These are the defects that prompted the skill. Each has a clean, modern fix; the rest of the catalog generalizes them.
1fr auto), or margin-inline-start: auto in a flex row, and add min-width: 0 so long text truncates instead of shoving the icon. See recipes.md.13px, 7px, 22px), or mixes margin and gap, or pads similar containers differently. Snap every value to a spacing scale (4 and 8 point) referenced as a token, and prefer one gap on the parent over per-element margins. See recipes.md.Ten families, detailed with per-smell detection signals and sources in catalog.md:
tabular-nums, header not matching its column, uneven row heights.overflow-wrap, text clipped by a fixed height, positioned layers clipped by an ancestor's overflow, ellipsis with no full-text affordance, text spacing the user cannot override.aspect-ratio, skeletons sized differently from the loaded content.Color and contrast are detected only as a boundary marker and handed to theme-colors.
Match the scope to the request, then run the workflow over it.
| Mode | Trigger | What to inspect |
|---|---|---|
| Rendered screen | the app is runnable | Run it, look at the real screen and its loading, empty, long-content, and error states. The raggedness is visual; see it before you grep. |
| Component | one component or template named | Read the component and the styles that reach it; check every repeated child. |
| Folder or repo sweep | "tidy up the UI", "make it consistent" | Glob the style sources and components. Prioritize shared layout, card, list, table, and design-token files. |
| Snippet | a pasted component or stylesheet | Check only that surface. State what you assumed about anything off-screen. |
Rate every finding on two axes. Severity says how much it hurts; autonomy says who decides the fix.
Severity.
Autonomy.
The autonomy axis is the bridge to autopilot. Safe maps to in-bounds work, Judgment maps to surface-first. An autonomous run fixes Safe findings and records Judgment ones as proposals. Scope each commit to one family or one component, never a repo-wide spacing rewrite in a single diff. Let Nitpicks ride along while you are already in a file rather than earning their own commit. Verify visually: screenshot the screen before and after at a narrow and a wide width, since a layout fix can regress overflow or wrapping that a green build will not catch.
The guard that keeps this from becoming a noisy linter. Honor it.
1px hairlines and borders, optical nudges to make an asymmetric glyph look centered, a true pill radius (9999px) or circle (50%), an intrinsic asset size.theme-colors, and component or TypeScript code smells to react-stinky, rather than duplicating them.Visual Consistency report, <scope>src/components/CardGrid.tsx[Glaring / Safe] card-internals-misaligned (card grids), the .card rowSmell: each card lays out independently, so titles and CTAs land at different Y across the row.Cost: the row does not scan; the eye re-finds each section per card. Looks busy.Fix: declare the row tracks on the grid and opt each card into subgrid..grid { grid-template-rows: auto auto 1fr auto; }.card { display: grid; grid-template-rows: subgrid; grid-row: span 4; }Source: MDN Subgrid (https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout/Subgrid)[Untidy / Safe] off-grid-spacing (spacing and rhythm), line 22Smell: padding: 13px 7px is off the spacing scale.Cost: nothing aligns to the grid; spacing reads as arbitrary.Fix: snap to the scale token, padding: var(--space-3) var(--space-2) (12px 8px).Source: Material 3 spacing (https://m3.material.io/foundations/layout/understanding-layout/spacing)Summary: 1 glaring, 1 untidy across 1 file. 2 Safe, 0 Judgment.
When the scope is clean, say so plainly: "Looks clean. No visual consistency defects found in <scope>."
The flagship fixes and the catalog are grounded in MDN, web.dev, and caniuse for CSS behavior and browser support (subgrid, line-clamp, container queries, aspect-ratio, tabular-nums), the major design systems for scales and tokens (Material 3, Shopify Polaris, IBM Carbon, Atlassian), Refactoring UI and Anthony Hobday's visual rules for the consistency principles, and WCAG 2.2 for the objective accessibility floors (target size, reflow, focus). Per-smell sources are in catalog.md.