Visual Hierarchy Refactoring
Take a real screen or component and refactor it so the eye lands on the right things in the right order. The deliverable is refactored code plus a before/after hierarchy audit — not design commentary. Governing principles: hierarchy is a function of size, weight, and lightness contrast — color is the last resort, and the fastest fix is de-emphasis: quiet the noise before amplifying the signal.
When to use / handoffs
- Use when a specific screen is cluttered, flat, unscannable, or "looks off" despite sane tokens.
- No consistent tokens exist at all (every fix would be a new magic number) →
skills/frontend-design/design-foundationfirst. - The problem is structural (columns misaligned, breaks on mobile) →
skills/frontend-design/layout-system. - Font sizes themselves are chaotic across the app →
skills/frontend-design/typography-system. - Palette is the problem (clashing hues, contrast failures everywhere) →
skills/frontend-design/color-system.
Step 1 — Inspect the target
- Get the actual component. Read the file(s) for the screen the user named; if none named, ask for the one screen that matters most (this is the only intake question that blocks). Render or screenshot it if the environment allows.
- Read the available tokens (spacing scale, text sizes, grey ramp) — every fix must use them.
- Detect hierarchy smells in the code, with counts:
- Emphasis inflation: how many elements per screen are bold, colored, large, or bordered? (>3 competing emphases = nothing is emphasized)
- Cramped spacing: padding/margins ≤8px between unrelated groups
- True greys / pure black:
#808080-family,#000,text-gray-500on colored surfaces - Uniform sizing: title, body, and metadata within a step of each other
- Even spacing everywhere: identical gap inside and between groups (kills Gestalt grouping)
- Border overuse: boxes-in-boxes where spacing would separate
Step 2 — Build the hierarchy audit
For the target screen, list every visible element and assign:
- Intended priority: P1 (the one thing this screen exists for — one, maybe two elements), P2 (supporting), P3 (metadata/chrome).
- Current visual weight: loud / medium / quiet, judged from size, weight, color, and surroundings.
Every mismatch is a work item. If you can't name the single P1, ask the user one question: "What should a user do or see first on this screen?" — then proceed.
Step 3 — Refactor, in this order
Apply changes strictly in this sequence — each pass often removes the need for the next:
- Whitespace first. Start with too much and pull back. Double the spacing between unrelated groups; keep related items close (label 8px from its input; 24px+ between form groups). If a standard margin is 16px, try 32–48px between sections. Spacing must come from the token scale.
- De-emphasize P2/P3 before touching P1: drop bold from labels, lighten metadata to a mid-grey step (
gray-500/600), remove borders/backgrounds that box in secondary content, shrink or icon-ify tertiary actions. Secondary buttons go outline/ghost; destructive actions become quiet until confirmed. - Then amplify P1 — usually needs only one move once the noise is gone: one size step up, or weight 600→700, or the darkest text step, or the single saturated CTA. Not all four.
- Contrast ladder via lightness, not hue: P1 text = darkest grey step, P2 = gray-600/700, P3 = gray-500. Tinted greys only (matching brand temperature) — never
#808080/#000. Reserve saturated color for interactive elements and status. - Group with Gestalt rules: proximity (spacing shows relationships — the gap between groups ≥2× the gap within), similarity (identical roles look identical), common region (a card/background only when spacing can't do the job). Full principle set with CSS:
references/gestalt-principles.md. - Size ratios: adjacent hierarchy levels differ by ~1.25–1.5×; P1 vs body ~1.5–2×. If two levels are within 10% of each other, merge them.
Canonical before/after (the shape of most fixes)
/* BEFORE: cramped, uniform, grey-on-grey */
.card { padding: 8px; }
.card h2 { font-size: 16px; font-weight: 400; color: #666; margin-bottom: 4px; }
.card p { font-size: 14px; color: #999; line-height: 1.3; }
/* AFTER: room, clear ladder, tinted greys */
.card { padding: var(--space-6); }
.card h2 { font-size: var(--text-xl); font-weight: 600; color: var(--gray-900); margin-bottom: var(--space-2); }
.card p { font-size: var(--text-base); color: var(--gray-600); line-height: 1.6; }
.card .meta { font-size: var(--text-sm); color: var(--gray-500); }
Required output format
Deliver code plus this audit:
## Hierarchy audit — [screen name]
| Element | Intended | Was | Problem | Change |
| Submit button | P1 | quiet (same as Cancel) | competing siblings | solid brand bg; Cancel → ghost |
| Section labels | P3 | loud (bold, dark) | emphasis inflation | weight 400, gray-500 |
| Card metadata | P3 | medium | too prominent | text-sm, gray-500 |
| ... every element with a mismatch |
## Refactored code
[full component/CSS — same styling system, tokens only]
## What changed and why (≤5 bullets)
- [pass applied → effect, e.g. "Doubled inter-group spacing (space-4 → space-8): groups now scannable"]
## Scan test
First / second / third thing the eye hits now: [P1] → [P2] → [P2]. Matches intent: [yes / remaining gap]
Quality bar (check before delivering)
- [ ] Exactly one P1 per screen, and it wins the 5-second scan
- [ ] ≤3 emphasized elements per screen; everything else visibly quiet
- [ ] Gap between unrelated groups ≥2× gap within a group; all spacing on the token scale
- [ ] ≤3 font weights in the result; bold never applied to whole paragraphs
- [ ] Text ladder uses lightness steps of tinted greys; no
#808080, no#000, no new hues introduced for emphasis - [ ] De-emphasized text still meets WCAG AA (4.5:1) — quiet ≠ illegible; P3 may go 3:1 only at large size
- [ ] Adjacent size levels differ ≥1.25×; no two levels within 10%
- [ ] Borders/boxes removed wherever spacing alone groups the content
- [ ] Every change references a token — zero new magic numbers
Integration
- Consumes: tokens from
skills/frontend-design/design-foundation, type scale fromskills/frontend-design/typography-system, grey ramp fromskills/frontend-design/color-system, page structure fromskills/frontend-design/layout-system. - Produces: refactored components that
skills/frontend-design/component-architecturegeneralizes into the library; contrast decisions verified byskills/frontend-design/accessibility-excellence. - In
skills/frontend-design/frontend-orchestratorpaths, this runs after tokens exist (Path B step 2) or as margin-level refinement (Path C).
References
references/gestalt-principles.md— all six Gestalt principles (proximity, similarity, figure/ground, closure, symmetry, common region) with CSS applications, plus extended before/after refactor examples. Read when a grouping problem isn't solved by proximity alone or you need more worked examples.