Wireframes to hi-fi
Climb the fidelity ladder on purpose: each step from wireframe to hi-fi forces one new decision and defers the rest.
In one line: fidelity is a ladder, not a switch — each rung from wireframe to hi-fi forces exactly one new decision, so climbing on purpose keeps you from arguing about button colour before the layout is even settled.
What it is
Fidelity is how finished a design looks. A lo-fi wireframe is grey boxes and placeholder bars: it shows where things sit and in what order, and nothing else. A mid-fi mock adds real words, grouping, and the states a screen can be in — still in greyscale, so nobody mistakes "draft" for "done". A hi-fi screen adds the last layer: colour, type, and the small feedback that tells a person they succeeded or slipped.
The ladder is the same screen at each rung. You do not redraw it three times; you let detail rise on top of a layout you have already agreed on. Lo-fi answers where. Mid-fi answers what it says and what can go wrong. Hi-fi answers how it feels.
Why it matters
Skip straight to hi-fi and every conversation collides at once. Someone debates the accent colour while the field order is still wrong; the polish makes the screen look decided, so the cheap-to-fix structural problems quietly survive. Climbing on purpose separates the questions, and separation is the whole point: you settle layout when changing it costs nothing, lock copy and states before pixels harden, and save taste for last when the bones are sound.
It also protects feedback. A wireframe invites "the steps are in the wrong order"; a glossy mock invites "I don't love that blue". Show the rung that asks for the feedback you actually need. The discipline is restraint — at each step, decide the one new thing the rung forces and deliberately defer the rest.
See it
Tweak it3
How it works
The trick is keeping the layout fixed while only the detail changes. Each slot on the screen — heading, field, button, fine print — exists at every fidelity; what fills it is all that moves.
- Lo-fi (where). Every slot is a grey box or a placeholder bar. No copy, no colour. The only decision on the table is arrangement: which block sits where, and in what reading order.
- Mid-fi (what). Boxes become real copy and labels, grouped and spaced. States appear — a validation line, a filled-in value — but everything stays greyscale so the conversation is about meaning, not taste.
- Hi-fi (how it feels). Now colour arrives through accent tokens, type gets its weight, and feedback reads clearly: a success hint in green, an error in red. The layout has not budged since rung one.
Because the boxes never move, the reader watches detail rise instead of the page reflowing — which is also why there is no layout shift between rungs.
Build it
You can fake the whole ladder with one CSS class. Build the screen once in HTML, then add a .lofi class on a wrapper that greys everything out via custom properties. Drop the class to reveal the hi-fi version — same markup, same layout, different fidelity.
<!-- Remove the `lofi` class to jump from wireframe to hi-fi. -->
<article class="card lofi">
<h2 class="card__title">Join the seed-swap newsletter</h2>
<p class="card__lede">
Trade heirloom seeds with neighbours. One short note every other Sunday.
</p>
<label class="card__label" for="email">Email address</label>
<input class="card__input" id="email" type="email" placeholder="you@example.com" />
<p class="card__hint">Looks good — we'll send a confirmation link.</p>
<button class="card__submit" type="button">Subscribe</button>
<p class="card__fine">No spam. Unsubscribe from any email.</p>
</article>.card {
/* Hi-fi values live in custom properties so .lofi can override them. */
--ink: oklch(0.205 0.013 262);
--muted: oklch(0.452 0.017 258);
--accent: oklch(0.591 0.246 353);
--accent-ink: oklch(1 0 0);
--positive: oklch(0.448 0.110 160);
display: grid;
gap: 0.5rem;
max-width: 22rem;
padding: 1.25rem;
border: 1px solid oklch(0.922 0.008 255);
border-radius: 0.75rem;
background: oklch(1 0 0);
font: 1rem/1.5 system-ui, sans-serif;
color: var(--ink);
transition: color 200ms ease, background 200ms ease;
}
.card__title { margin: 0; font-size: 1.05rem; }
.card__lede,
.card__hint,
.card__fine { margin: 0; font-size: 0.85rem; color: var(--muted); }
.card__hint { color: var(--positive); }
.card__label { font-size: 0.75rem; font-weight: 600; color: var(--muted); }
.card__input {
padding: 0.55rem 0.7rem;
border: 1px solid oklch(0.922 0.008 255);
border-radius: 0.5rem;
font: inherit;
}
.card__submit {
padding: 0.55rem 0.9rem;
border: 0;
border-radius: 0.5rem;
background: var(--accent);
color: var(--accent-ink);
font-weight: 600;
cursor: pointer;
}
/* Lo-fi mode: flatten every colour to greyscale. Same layout, less finish. */
.card.lofi {
--ink: oklch(0.564 0.017 257);
--muted: oklch(0.704 0.015 256);
--accent: oklch(0.860 0.011 255);
--accent-ink: oklch(0.452 0.017 258);
--positive: oklch(0.704 0.015 256);
}
.card.lofi .card__title,
.card.lofi .card__lede,
.card.lofi .card__hint,
.card.lofi .card__label,
.card.lofi .card__fine {
/* Hide copy behind a placeholder bar without changing the box size. */
color: transparent;
background: oklch(0.922 0.008 255);
border-radius: 0.25rem;
}
@media (prefers-reduced-motion: reduce) {
.card { transition: none; }
}Make it yours
Use the controls beside the demo above to change fidelity, field state, and show decision caption — each change updates the example live.
Experiment in the playgroundReproduce it with an LLM
Reproduce it with an LLM
You are a product designer. Describe the same screen — 'a sign-up form for a newsletter' — at three fidelities: (1) lo-fi wireframe: just boxes, labels, and hierarchy, no color or copy; (2) mid-fi: real copy, grouping, states, and spacing decisions, still greyscale; (3) hi-fi: color, type, motion notes, and edge states (error, loading, success). For each step, say what new decision it forces you to make and what you should NOT decide yet. Return three short labelled sections.
Pitfalls & accessibility
Related
UI vs UX, clearly
UI is what a person sees and operates; UX is the whole experience of reaching their goal. You design both, on purpose.
The UX process end to end
A lightweight path from a fuzzy problem to a shipped feature: discover, define, develop, deliver — diverging then converging, twice.
Information architecture
Group and name a product's content by the user's task, not your org chart, so people can find things without thinking about structure.
Further reading
- Your design tool's documentation on component variants — the cleanest way to keep one layout while swapping detail per fidelity.
- A primer on progressive disclosure, for the same instinct applied to a screen's content rather than its finish.
- Any writing on "design tokens", to understand why colour and type belong in named variables you can swap, exactly as the
.loficlass does here.