Visual Design. Making the structure of a product visible.
Visual design is not paint on top of a finished product. It is how the product tells people what matters, what belongs together, what they can do and what just happened. This guide teaches you to do that on purpose: hierarchy, space, grids, color, shape, depth, icons and the final tidy pass, with enough practice that you can make your own screens calm and clear without a designer next to you.
Reading timeAbout 4 hours, in 5 sittings (one per part)
TeachersWathan & Schoger, Müller-Brockmann, Vignelli, Kenya Hara, Albers, Tufte, Rams
By the end you will be able to
Explain why visual design is communication, and name the seven levers of hierarchy (understand).
Run the squint test on any screen and say what it ranks first, second and third (analyse).
Lay out a screen on a column grid and an 8-point spacing scale, with grouping that matches meaning (apply).
Build a small palette: hue-biased neutrals, one accent, semantic colors, a 10-step scale and a real dark mode (create).
Use radius, borders, shadows and icons consistently, and know when to leave them out (apply).
Tidy a messy screen in five deliberate passes and explain every change (evaluate and create).
Warm-up: what do you already see?
Before learning names for things, notice what your eye already does. You have looked at screens for thousands of hours, and your eye has opinions. This guide gives those opinions a vocabulary and a method.
Look at the screen below for three seconds, then look away. What did you see first? What did you see second? Could you tell what the screen is for, and what you are supposed to do on it?
A typical first draft. Everything is bold, everything has a box, four buttons shout at the same volume. Your eye bounces. Keep this screen in mind: in the last chapter you will tidy a screen just like it, in five passes.
Diagnostic
The most urgent thing on that screen is that the card expires in nine days. Why does the screen fail to communicate it?
Emphasis is relative. When every label is bold, every box has a border and every button is solid, the warning has nothing quieter to stand out against. Making it redder only adds to the noise. The fix is mostly subtraction: quiet the rest so the important thing can speak. You will learn this as "emphasize by de-emphasizing" in chapter 3.
How to study this guide
Read one part per sitting. Five parts: Seeing, Space, Color, Form, Craft. Each ends with a recap question that links back to earlier ideas.
Play with every lab. The sliders are not decoration. Moving a value and watching what breaks teaches faster than any paragraph.
Do the exercises on your own product. Pick one real screen now (your main screen, the one people see most) and use it all the way through. By the end it will be noticeably better.
Keep a "swipe file". A folder of screenshots of screens you admire, each with one sentence saying why. Taste is built by naming what you notice.
For the solo creator
You do not need to become an illustrator or a brand designer. You need to make clear, consistent, calm screens quickly, mostly in code. Almost everything in this guide is a decision you make once (a spacing scale, a palette, a radius, a shadow, an icon set) and then reuse forever. That is how one person gets a product that looks like a team made it.
Part one
Seeing: communication and hierarchy
The first part is about what visual design is for, and about its most important tool: hierarchy, the order in which things are seen. If you only learn one part of this guide, learn this one.
1
Visual design is communication
Taught by Dieter Rams, with Edward Tufte and Masaaki Kurosu
Every visual choice on a screen either tells people something true about the product, or it is noise. Good visual design makes the structure visible: what matters, what belongs together, what you can do and what state things are in.
People often treat visual design as the last coat of paint: you build the feature, then "make it pretty". That is backwards. A screen is a message. Size says "this is important". Space says "these belong together, those do not". Color says "this is clickable" or "this went wrong". Position says "start here". If those signals are random, the screen lies, even when every word on it is correct.
Think of it as four jobs. Every visual property you set should be doing at least one of them:
The four jobs. Group (proximity and similarity), rank (hierarchy), guide (focal point, flow, affordance) and signal (state: error, success, selected, disabled). A fifth, quieter job is tone: whether the product feels calm, playful, serious or cheap. Tone comes mostly from restraint and consistency, not from decoration.
Decoration versus communication
A useful test for any visual element: if I removed it, what information would be lost? If the answer is "nothing", it is decoration. Decoration is not forbidden, but it has a cost: it competes for the same attention as the things that carry meaning. Tufte called the ink that carries no information "non-data-ink" and argued for erasing it; Rams called his version "as little design as possible". Both are saying the same thing: every mark should earn its place.
Don't
Why it fails. Colored circles imply meaning that is not there (is green "good"?), the banner and stars shout, and the sparkline has no scale. The eye works hard and learns little.
Do
Why it works. One number is clearly the headline. Color appears once, and it means something (the change is good). Space, not boxes, separates the two supporting numbers.
Why looking good matters anyway
None of this means appearance is unimportant. In 1995 Masaaki Kurosu and Kaori Kashimura at Hitachi showed people different layouts of the same ATM interface. People rated the more attractive layouts as easier to use, even though the functions were identical. This became known as the aesthetic-usability effect: people perceive attractive products as more usable, and they are more patient with their flaws. (The psychology is covered in The Human Mind.)
Two lessons follow. First, polish buys you trust and patience, which a new product from an unknown solo maker badly needs. Second, polish can hide problems in testing: people will say a pretty prototype is "easy" while failing to complete the task. Watch what they do, not what they say (see Testing & Iteration).
Key idea
Visual design is the part of the interface people read before they read anything. Make it say true things.
Do
Ask of every visual property: which job is it doing (group, rank, guide, signal)?
Let structure come from the content: decide what matters before choosing sizes and colors.
Treat consistency as meaning: the same look should always mean the same thing.
Use polish to earn trust, then test behavior, not opinions.
Don't
Add ornament to fill space or because a screen "feels empty".
Use color, icons or boxes that imply meaning they do not carry.
Leave visual design to the end as a separate phase.
Mistake "visually busy" for "feature rich".
In the wild
iA WriterInformation Architects, 2010
The writing screen is almost only text. The few visual signals that exist (a muted Markdown symbol, a highlighted current sentence in Focus Mode) each carry a specific meaning. When decoration is gone, every remaining mark is read as a signal, so make each one count.
Stripe DashboardStripe, 2010s to today
Dense financial data, yet it reads calmly: one accent color for interactive elements, muted grey labels, strong numbers, status shown as small tinted badges. Complexity can look calm if every visual choice maps to one job.
Braun ET66 calculatorDieter Rams & Dietrich Lubs, 1987
Dark body, round keys, and a single yellow-accented equals key. The one color marks the one action you finish with. Color used once is a signal. Color used everywhere is wallpaper.
Common mistakes
Designing "the look" before the content
It is fun to pick colors and fonts first, and a mood board feels like progress.
Write the real content of the screen first, rank it (1, 2, 3), then design. Style comes from structure.
Filling space because it feels empty
An unfinished-looking screen makes builders anxious, so they add a banner, an illustration or a stats row.
Empty space is not a problem to solve. If the screen is truly empty, design a proper empty state (see Structure & Interaction).
Meaningless color
Color makes things lively, so it gets sprinkled across icons and headings.
Reserve color for meaning: interactive, selected, success, warning, error. Everything else is neutral.
Check yourself
You run a small note-taking app. Testers say your new pastel redesign is "much easier", but task completion in the same test dropped. What is the best reading?
Attractive designs get rated as easier even when they are not. Keep what is better about the new look, but find the specific steps where behavior got worse (often low-contrast pastel controls or a hidden action) and fix those.
Exercise 1.1 30 minutes · on your own product
The four-jobs audit
Take a screenshot of your main screen. Print it or open it in any markup tool.
Circle every visual element that is not plain text: colors, borders, icons, backgrounds, shadows, dividers, badges.
Label each circle G (group), R (rank), Gd (guide), S (signal) or D (decoration).
For every D, write what would be lost if you removed it. For every S, check it means the same thing everywhere else in the app.
You're done when: you have a marked-up screenshot and a list of at least three elements you will remove or change.
Beginner
Competent
Strong
Labels a handful of elements; most marked "D" with no plan.
Labels every element; finds three removable decorations.
Also finds signals that are inconsistent (the same color meaning two things) and proposes one rule for each.
2
Visual hierarchy: the seven levers
Taught by Adam Wathan & Steve Schoger, with Jan Tschichold and the Gestalt psychologists
Hierarchy is the order in which the eye visits things. You control it with seven levers: size, weight, color, contrast, position, spacing and proximity. Good hierarchy means the most important thing is seen first, and the eye never has to fight.
Your eye does not read a screen top-left to bottom-right like a page of a novel. It jumps. First it lands on whatever has the most visual weight (the biggest, darkest, most saturated, most isolated thing), then hops to the next heaviest, and so on. A designer's job is to make that sequence of jumps match the order of importance. When it does, the screen feels "obvious". When it does not, people say it is "busy" or "confusing", even if they cannot say why.
The seven levers. The first four change how heavy an element is. The last three change where it sits and what it belongs to. You rarely need more than two levers at once to rank something: a heading that is bigger and bolder and colored and underlined is shouting.
How the levers combine
Each lever adds visual weight. Weight is roughly additive, which is why beginners overshoot: they make a title larger, then bolder, then a different color, then put it in a box. Experienced designers use the fewest levers that produce a clear ranking, and they use the same levers for the same level everywhere, so people learn the system.
A practical rule: plan for three levels, rarely four. Primary (the one thing this screen is about), secondary (supporting content people will read), tertiary (metadata, hints, timestamps). Give each level a fixed recipe, for example:
Level
Typical recipe
Example on a note list
Primary
Largest size, semibold or bold, full ink color
Note title, 17px, 600, ink
Secondary
Body size, regular weight, full or slightly reduced ink
First line of the note, 15px, 400, ink
Tertiary
Smaller, regular, muted color
"Edited 2h ago", 13px, 400, muted grey
Notice that the recipe varies two levers per step (size and weight, then size and color), not all of them. Size and typographic detail are covered deeply in Typography.
The squint test
The fastest hierarchy check ever invented costs nothing: step back from the screen and squint (or blur a screenshot). Squinting removes detail and leaves only masses of weight. Whatever blob you still see clearly is what people will see first. If you see five equal blobs, you have no hierarchy. If the biggest blob is a decorative banner and not the main action, the hierarchy is wrong.
Lab: the squint test
Weak hierarchy
Your reading stats
You have read 23 articles this week.
Your streak is 6 days.
Average time per article: 7 minutes.
ShareDetailsStart reading
Strong hierarchy
This week
23 articles
6-day streak · about 7 min each
Start readingDetails
Drag the slider to about 4 px. On the left, everything melts into a uniform grey texture; you cannot tell what matters. On the right, two shapes survive: the big number and the dark button. That is the hierarchy, and it matches the order of importance.
One focal point per screen
A screen can have only one "first thing". If two elements compete for first place (a hero image and a big button, or two solid primary buttons), the eye ping-pongs between them and the user hesitates. Decide what the screen is for, give that one thing the most weight, and make everything else visibly secondary.
Don't
Three things fight for first place. The bright banner, the headline and two identical buttons. "Skip" looks as recommended as "Import".
Do
One first thing. The heading states the purpose, one solid button is the obvious next step, and skipping is still possible but visibly second.
Hierarchy is a path. On the left the eye has no reason to go anywhere in particular. On the right it goes headline, explanation, action: the same order a person needs to understand and act.
Watch out
Hierarchy is relative. A 24px heading is not "big" in itself; it is big only compared with everything around it. That is why adding emphasis to one element often fails: the real problem is that its neighbors are too loud.
Do
Rank the content in writing (1, 2, 3) before designing a screen.
Use two levers per level, and the same recipe everywhere.
Squint or blur a screenshot after every significant change.
Give each screen one focal point, usually the main content or main action.
Don't
Stack every lever (big, bold, colored, boxed, underlined) on one element.
Put two solid primary buttons side by side.
Rely on position alone: the top of a screen is not automatically important if it is quiet.
Let decoration (banners, illustrations) be heavier than the content.
In the wild
Apple WeatherApple, iOS
The current temperature is set enormous and thin; the condition and high/low sit smaller beneath; hourly and daily forecasts are clearly third. Blur the screen and you still read "the temperature". The answer to the user's main question gets the most weight.
Things 3Cultured Code, 2017
Task titles in full ink, notes and checklists hidden until opened, dates and tags small and muted. Only the "today" star and deadline flags use color. A strict three-level system makes a dense list feel light.
Google Search resultsGoogle
Each result has a clear recipe: a larger linked title, a smaller source line, and grey snippet text. Thousands of results, one learned pattern. Consistent hierarchy recipes let people scan without reading.
Common mistakes
Everything is important
As the builder, you care about every feature, so you give each one equal prominence.
Force a ranking: if a user could see only three things, which three? Everything else drops a level.
Too many levels
Each new feature gets its own heading size and gray, until there are seven sizes and five grays.
Cap yourself at three or four text levels on any screen, built from your type scale.
Hierarchy by color only
Color is the easiest property to change, so it becomes the main tool.
Rank with size, weight and space first; check in grayscale. Color should confirm the hierarchy, not create it.
Check yourself
You blur your invoice screen and the biggest blob is the company logo in the header, then a row of four equally dark tab labels. The total due is barely visible. What do you change first?
The question the screen answers is "how much do I owe, and by when?". The total must win the squint test. You raise it and lower the competitors at the same time; red would wrongly signal an error, and a box adds noise without solving the ranking.
Exercise 2.1 40 minutes · on your own product
Rank, blur, fix
For your main screen, write the three things a user most needs, in order.
Take a screenshot and blur it (any image editor, or CSS filter: blur(4px) on the page in your browser's dev tools).
Number the blobs you see in the order your eye visits them. Compare with your written ranking.
Change at most two levers per element to make the blurred order match. Re-blur and repeat until it does.
You're done when: you have before and after blurred screenshots, side by side, and the after matches your written ranking.
Beginner
Competent
Strong
Makes the top item bigger; others still compete.
Blurred order matches the ranking; one focal point.
Matches the ranking using fewer levers than before, by quieting rather than adding; writes the three-level recipe down for reuse.
3
Emphasize by de-emphasizing
Taught by Adam Wathan & Steve Schoger (Refactoring UI, 2018), with Edward Tufte and Josef Albers
Most screens are fixed by taking things away, not by adding emphasis. Quiet the secondary content, drop redundant labels and borders, add space, and the important parts rise on their own.
Refactoring UI is a book and video series by Adam Wathan (a developer, creator of Tailwind CSS) and Steve Schoger (a visual designer). It is aimed squarely at developers who design their own interfaces, which makes it unusually useful for you. Its tactics are concrete and repeatable. This chapter collects the ones that matter most, explains why each works, and lets you toggle them on a real card.
Tactic 1: start with too much white space
When builders lay out a screen, they add space until things stop touching. The result is cramped, because "not touching" is the minimum, not the goal. Wathan and Schoger suggest the opposite: start with clearly too much space, then remove it until it looks right. You almost never end up back at the cramped version. Space is cheap, and it is the main tool for grouping and calm.
Don't
Minimum space. Elements merely avoid touching. Everything reads as one dense lump.
Do
Generous space. Three clear groups: what it is, what it does, what to do. Same content, far calmer.
Tactic 2: de-emphasize instead of emphasize
When something does not stand out enough, the reflex is to make it louder. Often the better move is to make its neighbors quieter. In a sidebar where the active item does not pop, do not make it bigger and bolder; make the inactive items muted. Emphasis is a ratio, and you can change either side of it. Quieting also has a nice side effect: the screen gets calmer overall instead of louder.
Don't
Louder and louder. To beat bold neighbors, the active item needed a highlight, caps, a bigger size and a star. The whole sidebar now shouts.
Do
Quieter around it. Inactive items go muted and regular. The active one needs only full ink, semibold and a soft background to be unmistakable.
Tactic 3: labels are a last resort
Builders think in database fields, so screens often look like forms: Name: Ana Ruiz, Email: ana@…, Role: Designer. But most data explains itself by its format. An email address looks like an email address. A price looks like a price. "Designer" under a name is obviously a role. Drop the label, and use hierarchy to show what the value is. When a label is truly needed, make the label quiet and the value strong, because the value is what people came for. Better still, combine label and value into natural language: "12 left in stock" instead of "Stock: 12".
Don't
A database row, not a person. Bold labels win the squint test, so the eye reads "Name, Role, Email, Phone" instead of the person.
Do
A person. Format and hierarchy do the labeling. The one number that would be ambiguous ("4") gets words instead of a label.
Tactic 4: not every number needs a label, and not every number needs to be big
Dashboards built by engineers often show every metric with equal size and a label above it. Ask which number answers the user's real question, make that one large, and turn the rest into a sentence or a quiet row. "₹4,280 earned this month, from 37 sales" says in one line what a grid of four labeled tiles struggles to.
Tactic 5: use fewer borders
Borders are the default way to separate things, and they add up fast: a card border, a header underline, a border on every input, a divider between list items. Each one is a line the eye must process. Albers noticed, and Tufte later popularized, that two black lines on white create a third shape, the white channel between them: "1 + 1 = 3". Every border you add creates extra shapes you did not intend. Alternatives that separate with less noise:
Space. A larger gap between groups than within them (proximity).
Background. A slightly different surface color for a sidebar or a card.
Shadow. A soft shadow lifts a card without drawing an outline.
Alignment. A shared left edge implies a column without any line.
Don't
A cage of lines. Nine rectangles and lines, all the same weight. The structure is there, but the eye has to count boxes to find it.
Do
Separation without lines. Inputs are soft filled shapes, the group gap does the dividing, and one solid button marks the main action.
Watch out
"Fewer borders" does not mean "no visible edges". Form inputs still need a boundary people can see (WCAG asks for 3:1 contrast for the visual boundary of controls needed to identify them). A filled input on a contrasting surface, or a clear 1px border, both work. See Accessible & Inclusive.
Tactic 6: button hierarchy
Not every action is primary. Give each screen one solid primary button, use outlined or soft buttons for secondary actions, and plain text links for tertiary ones. Destructive actions are not automatically primary: "Delete account" on a settings page is usually a quiet red text link, and it becomes a solid red button only inside the confirmation step, where deleting is the main action.
Action hierarchy. The visual weight of a button should match how often and how likely people are to want it, not how much the builder worked on it.
Put it together: the hierarchy fixer
Below is a typical card from a builder's first draft: every field labeled and bordered, everything bold, three solid buttons. Switch on the tactics one at a time and watch which ones make the biggest difference. Then switch them all on.
Lab: hierarchy fixer
Product:Field Notes Pro
Price:₹1,499
Billing:per year, cancel any time
Includes:Sync, themes, export to PDF
UpgradeCompare plansNot now
Nothing switched on: the squint test shows five equal boxes and three equal buttons.
Notice that four of the six tactics are subtractions. Only "size for the key facts" adds emphasis, and it works far better once the noise is gone.
Key idea
When something does not stand out, first ask what is competing with it, and quiet that.
Do
Start with too much space, then tighten.
Make labels quiet and values strong, or turn them into a phrase.
Separate with space, background and alignment before reaching for a line.
Use exactly one solid primary button per view.
Use muted color (not lighter weight alone) for secondary text, and check it still meets contrast.
Don't
Fix weak emphasis by adding more emphasis.
Bold the labels and leave the values regular.
Wrap every group in a bordered box.
Use a light grey on a colored background for secondary text (it looks washed out); instead pick a tint of the background hue.
In the wild
LinearLinear, 2019 to today
Issue rows show title in full ink, while identifiers, labels and assignee avatars are small and muted. There are almost no borders: rows are separated by hover backgrounds and spacing. Dense software can be calm when secondary data is consistently quiet.
Apple SettingsApple, iOS
Grouped lists use background color to separate sections instead of drawn boxes; the value on the right of a row ("On", "English") is muted while the setting name is in ink. The thing you are choosing is primary; its current value is secondary.
Tailwind UI and Refactoring UIWathan & Schoger, 2018 onward
The book's examples are presented as before/after pairs, and almost every "after" is the "before" with things removed or quieted. Study before/after pairs; they train the eye faster than finished designs.
Common mistakes
Using opacity or light grey everywhere for "secondary"
Grey is the quick way to de-emphasize, so it ends up on half the text, often too light to read.
Use one muted color token that passes 4.5:1 on your surfaces. If you need a third level, use size or weight, not a lighter grey.
Removing every border, including on inputs
Flat, borderless forms look clean in mockups.
Inputs must be findable: a fill with enough contrast against the surface, or a visible border. Clean is not the same as invisible.
Treating destructive as primary
Danger feels important, so "Delete" gets a big red button next to "Save".
Keep destructive actions quiet until the user has chosen them, then make them the clear primary in the confirm step.
Check yourself
A product page lists "Price: ₹999", "Rating: 4.6", "Reviews: 1,240", "Delivery: Tomorrow" in four identical labeled rows. Which rewrite applies the chapter best?
The price is the decision-maker, so it gets size. The rest becomes natural language that needs no labels ("from 1,240 reviews" explains itself) and is visibly secondary. B, C and D all add emphasis or decoration without ranking anything.
Connect the ideas: Part one recap
In The Human Mind you met the Gestalt principle of proximity. Which tactic from this part relies on it most directly?
Proximity says things close together are seen as a group. That is exactly what lets you delete divider lines and boxes: if the gap between groups is clearly larger than the gap within them, the eye groups correctly with no lines at all. Part two turns this into a spacing system.
Exercise 3.1 60 minutes · on your own product
Subtract to emphasize
Pick one card, panel or list row from your product. Screenshot it.
Apply the six tactics in this order: space, borders, labels, de-emphasize, size, buttons. Change the real code (or a copy) after each tactic and screenshot again.
Count elements before and after: borders, labels, bold runs, solid buttons.
Write one sentence per tactic: did it help, and why?
You're done when: you have a strip of six or seven screenshots showing the progression, and the final version has fewer elements than the first.
Beginner
Competent
Strong
Applies two or three tactics; adds emphasis as often as it removes.
Applies all six; final passes the squint test with one focal point.
Final version has at least 30% fewer visual elements, still meets contrast, and the change is shipped.
For the solo creator
You will not have a designer review your pull requests, so make these six tactics a checklist you run on every new screen before merging. It takes five minutes and catches most "developer-designed" tells.
Part two
Space: grids, spacing, alignment and layout
Hierarchy decides what is seen first. Space decides what belongs together and how calm the screen feels. This part gives you the systems professional designers use (grids, spacing scales, alignment rules) and the judgment to pick a layout and a density that fit the job.
4
Grids: invisible structure
Taught by Josef Müller-Brockmann, with Massimo Vignelli and Jan Tschichold
A grid is a small set of lines you agree to obey. It replaces hundreds of tiny placement decisions with one decision, which makes layouts consistent, faster to build and easier to read.
Swiss designers of the 1950s and 60s, Josef Müller-Brockmann most famously, turned grids into a discipline. His book Grid Systems in Graphic Design (1981) argues that a grid brings order and objectivity to a page: the reader senses the underlying structure even if they never see a line. Massimo Vignelli built his career on the same belief; his "Unigrid" system for the US National Park Service brochures (1977) let dozens of different publications share one structure and still feel designed.
On screens, a grid does three practical things. It gives every element a place to snap to, so edges line up. It creates consistent widths, so cards and columns feel related. And it gives you a vocabulary for responsive layout ("this spans 8 of 12 columns on desktop, all 4 on mobile").
The grid system is an aid, not a guarantee.Josef Müller-Brockmann, Grid Systems in Graphic Design, 1981
Four kinds of grid
Pick the grid for the content. A reading app needs a manuscript grid (one comfortable column, see Typography on measure). A dashboard needs columns. A photo library needs a modular grid. A baseline grid keeps text and elements on a shared vertical rhythm, usually in multiples of 4 or 8 px.
Anatomy of a column grid
A column grid has three parts: columns (where content goes), gutters (the fixed gaps between columns) and margins (the space at the outer edges). Content spans whole columns, starting and ending on column edges, never inside a gutter.
Twelve columns. Twelve is popular because it divides evenly by 2, 3, 4 and 6, so halves, thirds and quarters all land on column edges. Inside the main area, two cards each span four columns and still align with everything above.
Don't
Five left edges. Nothing is badly wrong, yet it looks hand-placed and slightly nervous. The red lines show every distinct edge.
Do
Two edges. Same elements, snapped to a grid. Fewer distinct edges is the single most visible sign of a designed layout.
Grids in practice, in code
You no longer need a framework for this. CSS Grid lets you declare the structure directly, and it is the clearest way to design in code:
Most app screens do not need twelve columns everywhere. A list screen might be one column with a fixed maximum width. A settings page might be a two-column label/control grid. The point is not "always 12 columns"; it is "decide the structure once and snap to it".
Myth
"Grids make everything look the same." Müller-Brockmann's own posters are wildly varied, all built on strict grids. A grid constrains where things go, not what they are. The variety comes from which cells you fill and which you leave empty.
Do
Choose a grid that matches the content type (manuscript, column, modular).
Keep gutters constant and margins at least as wide as gutters.
Count distinct left edges on a screen and reduce them.
Turn on a grid overlay in your browser or design tool while you work.
Don't
Let content start inside a gutter.
Use a grid so fine (24 tiny columns) that it no longer constrains anything.
Force a multi-column grid onto long-form reading.
Break the grid by accident; break it on purpose, rarely, for emphasis.
In the wild
NPS Unigrid brochuresMassimo Vignelli, 1977
A black band at the top with the park name in Helvetica, and a modular grid underneath that every brochure in the system shares. One grid can carry a whole family of documents; a product with many screens is the same problem.
Apple PhotosApple
A strict modular grid of square thumbnails with tiny, constant gutters. Pinch to change the column count; the grid re-flows but never breaks. A modular grid makes thousands of items feel orderly.
Medium article pagesMedium, 2012 onward
A single reading column of about 680px, with images allowed to break out wider. Manuscript grid for reading; deliberate breaks for emphasis.
Common mistakes
Grid in the design file, not in the code
You draw a nice grid in Figma, then implement with ad-hoc flexbox and margins.
Encode the grid in CSS (grid-template-columns and a shared container). If the code does not know the grid, the product will drift.
Aligning text boxes, not text
Containers align, but padding differs, so the actual text edges do not.
Align what the eye sees: the first letter of text, the edge of an image. Check with a ruler overlay.
Check yourself
You are designing a recipe app screen with a large photo, a title, an ingredient list and steps. On a 1200px desktop, which grid decision is most sensible?
Steps are long-form reading (wants a comfortable column), ingredients are a reference list you glance at while reading (a sidebar). A 12-column grid gives you that split and collapses cleanly. A modular grid suits uniform items like photos, not mixed content.
Exercise 4.1 45 minutes · on your own product
Find your grid
Screenshot three different screens of your product.
Draw every distinct left edge on each (a vertical line). Count them.
Propose a grid (columns, gutter, margin) that would let you reduce the count by at least half.
Implement it on one screen in CSS Grid and re-count.
You're done when: one screen runs on an explicit CSS grid and its left-edge count has dropped by half or more.
Beginner
Competent
Strong
Counts edges but does not change code.
Implements a grid on one screen; fewer edges.
Grid is a shared layout component used across screens, with a documented mobile behavior.
5
Spacing systems and the 8-point grid
Taught by Adam Wathan & Steve Schoger, with the Material Design team and the Gestalt psychologists
Pick a small scale of spacing values and use only those. A scale turns "how much space here?" from a fresh guess into a choice between a few options, and it makes grouping consistent across the whole product.
Without a system, spacing drifts: 10px here, 14px there, 15px because it "looked right" one afternoon. Each value is defensible alone, but together they create a faint visual noise that people feel as "something is slightly off". A spacing scale fixes that the same way a type scale fixes font sizes.
Why 8?
Most product teams use multiples of 8 (with 4 for small adjustments). Google's Material Design uses an 8dp grid, and many design systems follow it. The reasons are practical. Eight divides evenly into common screen dimensions. It scales cleanly at 1.5x, 2x and 3x pixel densities (8 × 1.5 = 12, a whole pixel; 5 × 1.5 = 7.5, a blurry half-pixel). And it is coarse enough that 16 versus 24 is a visible, deliberate difference, while 15 versus 16 is not a decision anyone can see.
A scale, not a ruler
A good spacing scale is not linear (8, 16, 24, 32, 40, 48…). It gets more spread out as values grow, because we notice differences relative to size: 4 versus 8 is a big change, 64 versus 68 is invisible. Refactoring UI suggests that no two adjacent values should be closer than about 25% apart. A typical scale:
A non-linear scale. Small values for spacing inside components (icon to label, label to input), middle values between items in a group, large values between sections. Name them as tokens (space-1 to space-9, or xs to 3xl) so code uses names, not numbers. See Systems & Platforms for tokens.
The one spacing rule that matters most
Space inside a group must be clearly smaller than space between groups. This is Gestalt proximity turned into a rule. The classic failure is a form where the gap between a label and its input equals the gap between that input and the next label, so labels float halfway between two fields and the eye cannot tell which one they belong to.
Don't
Equal gaps everywhere. "Password" sits as close to the email field as to its own. Each label could belong up or down.
Do
Close inside, far between. Label-to-input is 4 to 8px, field-to-field is 24px. Every label obviously belongs to the field below it.
Nested proximity. Icon to text (small), row to row (medium), card to card (large). If any two of these are equal, a level of grouping disappears.
Lab: spacing scale playground
Morning pages
3 entries · last written today
Daily reminder7:00
Word goal750
Lock with Face IDOn
Write nowSettings
Try base 4 (compact, tool-like), 8 (balanced) and 11 (airy, editorial). Everything re-spaces in proportion because every gap is a multiple of the base. Then switch to "same gap everywhere": the title, the list and the buttons stop reading as separate groups.
For the solo creator
Define the scale once as CSS custom properties (--space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 24px; --space-6: 32px; --space-7: 48px; --space-8: 64px) or use Tailwind's built-in 4px-based scale. Then ban raw pixel values in margins and padding during code review of your own work. A quick search for px in your stylesheets is a five-minute audit you can run monthly.
Do
Use an 8-based scale with 4 for fine adjustments.
Make inside-group gaps clearly smaller than between-group gaps.
Name spacing values as tokens and use the names in code.
Use more space between sections than you think; then tighten if needed.
Don't
Use a linear scale where adjacent steps are indistinguishable.
Use odd one-off values (13px, 15px, 22px) to "fix" a layout.
Give a label equal space above and below.
Treat padding inside components and gaps between them as unrelated.
In the wild
Tailwind CSSTailwind Labs, 2017 onward
Its default spacing scale is based on 0.25rem (4px) steps, with named sizes like p-4 (16px) and gap-6 (24px). Developers pick from the scale instead of typing pixels. A scale baked into your tools enforces itself.
Material DesignGoogle, 2014 onward
Components and layouts align to an 8dp grid, with icons and small type on a 4dp grid. Two granularities: a coarse one for layout, a fine one for details.
Apple NotesApple
The note list uses a tight gap between title and preview line, and a clearly larger gap between notes. Proximity alone, with a thin divider at most, makes each note read as one unit.
Common mistakes
Spacing by eye, every time
It feels faster to nudge until it looks right.
Nudge within the scale only. If nothing on the scale looks right, the problem is usually grouping or hierarchy, not the number.
Forgetting that line-height is space
You set a 16px margin under a heading, but the heading's line-height adds 6px of invisible space above the text.
Measure from the visible text, and consider trimming leading (CSS text-box-trim where supported) or account for it in the scale.
Symmetric padding on everything
Equal padding feels tidy.
Buttons and badges often look better with more horizontal padding than vertical (for example 8px by 16px), because text is wider than it is tall.
Check yourself
On your pricing page, each plan card has a feature list. People keep reading the last feature of one plan as belonging to the next plan. What is the most likely cause?
When between-group space is close to within-group space, the eye regroups items by distance. Increase the between-card gap a couple of steps up the scale (for example from 16 to 32) and the confusion goes away, no extra borders needed.
Exercise 5.1 60 minutes · on your own product
Adopt a spacing scale
Search your CSS for every margin, padding and gap value. List the distinct values you find (most products have 15 to 30).
Map each to the nearest step on an 8-based scale. Note any that sit right between two steps: those are where grouping is unclear.
Define the scale as tokens and replace the values on your main screen.
Check proximity: for each group, is inside-space smaller than outside-space by at least one step?
You're done when: your main screen uses only scale tokens, and you can name the step used for each of the three levels of grouping.
Beginner
Competent
Strong
Lists values; replaces a few.
Main screen fully on tokens; grouping clearer.
Whole product on tokens, distinct values reduced to 8 or fewer, and a lint rule or search check keeps it that way.
6
Alignment: edges and optics
Taught by Robin Williams (The Non-Designer's Design Book), with type designers and icon designers
Align things to as few edges as possible, and align what the eye sees, not what the code measures. When geometry and perception disagree, trust perception.
Robin Williams's The Non-Designer's Design Book (first published 1994) reduced layout to four principles: contrast, repetition, alignment and proximity. Her rule for alignment is blunt: nothing should be placed on the page arbitrarily; every element should have a visual connection with another element. On a screen, that connection is usually a shared edge.
Edge alignment
Left-aligned text has a strong, straight left edge that the eye can return to at the start of every line. Centered text has two ragged edges and no anchor. That is why long text, lists and forms should be left-aligned (in left-to-right languages), and centering should be kept for short, symmetric things: a single heading on an empty state, a dialog with one sentence, a button label.
Don't
Centered list. Every line starts somewhere new. Scanning down means re-finding the start each time.
Do
One edge. The eye drops straight down the left edge. The same shapes now read as a tidy list.
Optical alignment: when the math is wrong
Our eyes judge size by area and mass, not by bounding boxes. A circle and a square with the same height do not look the same size: the circle looks smaller, because it has less area near its edges. A triangle looks smaller still. Type designers have known this for centuries. Round letters like O and pointed ones like A slightly overshoot the baseline and cap height, so they look the same height as flat letters like H. Icon designers do the same with keylines: on Material Design's 24-unit icon grid, a circle is drawn about 20 units wide while a square is about 18, so they look equal.
Trust your eye over the bounding box. When you place a round avatar next to a square thumbnail, or a circular icon next to a square one, nudge the round shape a little larger. Good icon sets have already done this for you inside each icon.
Aligning icons with text
An icon next to a label is a classic place where code alignment fails. Flexbox's align-items: center centers the icon on the line box of the text, which includes space for ascenders and descenders. But the eye judges the text by its x-height or cap height. Lowercase labels often need the icon nudged down 1px, because the visible mass of lowercase text sits low in the line box. Check at real size, and fix with a small offset in the icon component, once, so every use inherits it.
Don't
Math-centered. The icon floats a little high against lowercase text.
Do
Eye-centered. A 1 to 2px nudge, defined once in the icon component.
More places where optics beat math
Hanging punctuation. An opening quotation mark at the start of a pull quote makes the text edge look indented. Hang the mark outside the edge (CSS hanging-punctuation is supported in Safari; elsewhere use a small negative indent).
Text inside buttons. Uppercase or digit-only labels look high or low depending on the font's metrics. Look at the real rendering, not the padding numbers.
Play and arrow icons. A triangle centered by its bounding box looks off-center to the left. It must move toward its point. (More in chapter 18.)
Numbers in tables. Right-align numbers and use tabular figures, so digits line up by place value. (See Information & Data.)
Do
Left-align text, lists and forms; center only short, symmetric content.
Align visible edges (text, image edges), not invisible boxes.
Make round shapes slightly larger than square ones next to them.
Fix optical offsets inside components so you do it once.
Don't
Center long paragraphs or multi-line form labels.
Mix left, center and right alignment in one block.
Trust align-items: center blindly for icons and text.
Over-correct: optical nudges are 1 to 3px, not 10.
In the wild
SF SymbolsApple, 2019 onward
Symbols are designed to align with San Francisco text: they come in weights and scales that match the font, and they align to the text baseline and cap height, so an icon in a label sits right without manual nudging. The best fix for icon-text alignment is an icon system designed with the type.
Apple's app icon gridApple
Apple publishes an icon template with a grid of circles and squares (keylines) so that icons of different shapes feel the same size on the home screen. Keylines are written-down optical corrections.
Common mistakes
Center-everything mobile layouts
On narrow screens centering feels balanced, so whole flows end up centered.
Keep body text and forms left-aligned on mobile too. Center headings on empty or celebratory states only.
Padding that shifts edges
A card with 16px padding sits under a heading with 0 padding, so the text edges differ by 16px.
Either align the heading with the card's text (indent it), or let the card's edge align with the heading and remove the card's visible container.
Check yourself
In your sidebar, a circular avatar (32px) sits above square app-section icons (32px). The avatar looks smaller than the icons. What do you do?
A circle has less area than the square that contains it, so it reads smaller. A small overshoot compensates. Alignment is judged by the eye; the bounding box is only a starting point.
Exercise 6.1 30 minutes · on your own product
The edge hunt
Open your main screen at 200% zoom.
Find every icon-plus-label pair. Check each against the x-height of its label; list the ones that look high or low.
Find every centered block of text longer than one line; list them.
Fix the icon offset in the shared component, and left-align the multi-line blocks.
You're done when: every icon-label pair looks centered at 100% and 200% zoom, and no multi-line text is centered unless you can say why.
Beginner
Competent
Strong
Spots a few misalignments.
Fixes icon alignment in one component; removes centered paragraphs.
Also corrects round/square size mismatches and hanging punctuation; documents the offsets.
7
White space as structure
Taught by Kenya Hara, with Naoto Fukasawa and Jan Tschichold
White space is not leftover space. It is an active material that frames, groups, slows the eye and signals calm. What you leave empty is as designed as what you fill.
Kenya Hara, art director of MUJI since 2002, writes about emptiness as a design idea. In books like Designing Design and White, he contrasts "simplicity" (removing things to make them efficient) with "emptiness" (leaving room so that the person can bring their own meaning). He compares a good design to an empty vessel: its value is the space it offers. MUJI's 2003 "Horizon" campaign showed little more than a person standing on a vast, flat horizon, such as Bolivia's Uyuni salt flat. The ads said almost nothing, and that was the message.
You do not need a philosophy to use this, but it helps to stop thinking of empty space as waste. On screens, white space does four concrete jobs:
White space is working. Framing gives an element importance without making it bigger. Grouping uses gaps instead of lines. Pacing lets people finish one idea before the next. And generous space reads as confidence: the product is not trying to sell you everything at once.
Macro and micro white space
Macro white space is the large stuff: page margins, space between sections, the empty area around a hero. Micro white space is the small stuff: line-height, letter-spacing, padding inside a button, the gap between an icon and its label. Macro space shapes the layout and mood; micro space shapes legibility. Most "cramped" screens fail on micro space first (tight line-height, buttons with 4px padding), and most "empty and lost" screens fail on macro space (content floating in a sea with no frame or alignment).
Don't
No room to breathe. Everything sells at once, so nothing is heard.
Do
Framed by emptiness. One message, one action. The space says "we are confident in this one thing".
The cost of white space
White space is not free. Every pixel of space is a pixel not showing content, and in tools people use all day (email, spreadsheets, code editors, trading screens) too much space means more scrolling, more eye travel and less overview. The right amount depends on what the person is doing. Reading and deciding want space. Scanning, comparing and monitoring want density. Chapter 9 is about choosing between them.
Myth
"More white space is always more premium." Space signals calm only when the content is organized. A disorganized screen with lots of space looks unfinished, not luxurious. Space amplifies whatever structure is already there.
Do
Use macro space to frame the focal point of each screen.
Check micro space first when something feels cramped: line-height, button padding, icon gaps.
Let empty states actually be calm, with one message and one action.
Leave space unfilled on purpose, and be able to say why.
Don't
Fill empty areas with banners, tips or promotions because they "look empty".
Use big margins to hide a lack of structure.
Apply editorial spaciousness to a power-user tool that needs overview.
Shrink space before you have removed unnecessary content.
In the wild
Google Search home pageGoogle, since 1998
A logo, one input and two buttons in a mostly empty page. For years competitors were dense "portals"; Google's emptiness said "we do one thing". Emptiness can be a product's whole positioning.
MUJIRyohin Keikaku, art direction by Kenya Hara
Products, stores and ads share plain materials, muted colors and lots of space, so the product and the customer's use of it are the focus. Emptiness invites the person to fill it with their own use.
iA WriterInformation Architects
A blank page with a single column of text and wide margins; the interface appears only when needed. In a tool for thinking, empty space is the feature.
Common mistakes
Equal space everywhere
"Generous spacing" gets applied uniformly, so the extra space no longer groups anything.
Be generous between groups and around the focal point; stay tight within groups.
Wide screens with stretched content
The layout fills the browser width, so lines of text become 200 characters long and space ends up inside paragraphs instead of around them.
Cap content width (for text, about 60 to 75 characters) and let the extra width become margin.
Check yourself
Your habit tracker's home screen shows today's three habits. Testers call it "empty and a bit lost". It has big margins and centered items with equal gaps. What is the best change?
"Lost" is a structure problem, not a quantity problem. Space works when it frames a clear grouping. Alignment and tighter within-group gaps turn the same emptiness into calm.
Exercise 7.1 40 minutes · on a product you admire and your own
Map the emptiness
Screenshot a screen you find calm (iA Writer, Things, Apple Notes, a MUJI page).
With a marker, shade every area of white space larger than about 24px. Label each shaded area with its job: frame, group, pace or calm.
Do the same on your own main screen.
Find one place where you could remove content and let space take over, and one place where space is doing no job.
You're done when: you have two shaded screenshots and one concrete change to make on your own screen.
Beginner
Competent
Strong
Shades space but cannot name its jobs.
Labels jobs on both screens; proposes a change.
Makes the change, and explains which job the new space does.
8
Responsive layout thinking
Taught by Ethan Marcotte, with Luke Wroblewski and Jen Simmons
A layout is not a picture at one size; it is a set of rules for how content behaves as space changes. Design the rules (what stretches, what wraps, what moves, what hides) instead of drawing three fixed screens.
Ethan Marcotte coined "responsive web design" in a 2010 article in A List Apart, combining fluid grids, flexible images and media queries. Luke Wroblewski's Mobile First (2011) added the discipline of designing the smallest screen first, which forces you to decide what matters. Jen Simmons later championed "intrinsic web design", where layouts lean on CSS Grid and Flexbox to size themselves from content rather than from a few fixed breakpoints.
Four things a layout can do as space changes
Decide per component. For each part of a screen, choose which of the four behaviors it uses. That decision list is your responsive design, and it is easy to write down before you code.
Fluid first, breakpoints where the content breaks
Start fluid: widths in fractions, a max-width for readability, sizes that scale with clamp(). Then add breakpoints only where the content starts to look wrong (a line gets too long, a card gets too narrow), not at the widths of particular phones. Devices change every year; your content's needs do not.
.title { font-size: clamp(1.5rem, 1.1rem + 2vw, 2.5rem); }
.cards { display: grid; gap: 24px;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }
/* No breakpoint needed: cards wrap when there is no room for another 240px column. */
Container queries: components that know their own space
Media queries ask "how wide is the window?". But a card does not care about the window; it cares about the box it sits in. The same card might sit in a wide main column and a narrow sidebar on the same screen. Container queries, supported in all major browsers since 2023, let a component change its layout based on its container's width.
One component, two layouts. The card stacks its image on top when its container is narrow and sits it beside the text when the container is wide, regardless of window size.
Shrunk, not designed. The desktop layout scaled down: unreadable text, 10px tap targets, a sidebar eating a quarter of the width.
Do
Re-designed for the space. One column, text at full size, a 44pt-tall primary action, navigation repositioned to a thumb-reachable tab bar.
For the solo creator
Design in the browser at a narrow width first (about 375 to 400px) and drag the window wider. Every time something looks wrong, fix it with a fluid rule or a content-based breakpoint. You will end up with fewer breakpoints than you expect, often two or three, and no separate "mobile design" to maintain.
Do
Write down, per component, whether it reflows, repositions, hides or transforms.
Use fluid units, minmax() and clamp() before media queries.
Use container queries for reusable components.
Keep tap targets at least 44 by 44pt (Apple) or 48 by 48dp (Material).
Don't
Pick breakpoints from a list of device widths.
Hide important features on mobile just because they are hard to fit.
Shrink text below 16px on mobile body copy.
Let hover-only interactions carry essential features on touch screens.
In the wild
GmailGoogle
On wide screens the folder list sits on the left; as space narrows it collapses to icons, then to a hidden drawer on phones. The message list stays the constant. Reposition and hide navigation; never the main content.
NotionNotion Labs
The sidebar can be collapsed by the user on desktop and is a slide-over panel on mobile; pages are a single centered column with a max width, with a toggle for full width. Let readers choose width where content varies.
Common mistakes
Desktop-first, mobile as an afterthought
You build on a big monitor and check the phone at the end.
Keep a narrow browser window open while you build, or start each screen at 400px.
Breakpoints that fight each other
Every component gets its own media queries at slightly different widths.
Share a small set of layout breakpoints for page structure, and use container queries inside components.
Check yourself
Your "project card" appears in a 3-column grid on the dashboard and in a narrow 280px panel on the project page. At 280px its horizontal layout breaks. Best fix?
The window is wide in both places; only the card's container differs. A container query handles both contexts with one component. A second component doubles maintenance; a min-width causes overflow.
Exercise 8.1 45 minutes · on your own product
Write the responsive rules
List the main components of your main screen (navigation, header, main content, side panel, actions).
For each, write its behavior as the screen narrows: reflow, reposition, hide or transform, and at what content condition.
Open the screen at 400px, 768px and 1280px. Mark where reality disagrees with your rules.
Fix one disagreement, preferring a fluid rule over a new breakpoint.
You're done when: you have a short table of components and behaviors, and the screen works without horizontal scrolling at 400px.
Beginner
Competent
Strong
Screen works at 400px but by accident; no written rules.
Rules written; one fix made with a fluid rule.
A reusable component uses a container query, and breakpoints are reduced.
9
Common layouts and the right density
Taught by Edward Tufte, with the designers of Bloomberg, Apple and Linear
Most software screens are variations of a handful of proven layouts. Pick the one that matches how people move through your content, then choose a density that matches how often and how expertly they use it.
You do not need to invent a layout. People already know how a sidebar works, how a list opens into a detail view, how a grid of cards behaves. Reusing these patterns costs them nothing to learn (Jakob's law: people spend most of their time in other products). Your design work is choosing the right pattern and then executing it well.
Six layouts cover most apps. Choose by the user's movement: reading straight through (single column), switching between areas (sidebar), picking one item from many (list-detail, three-pane), browsing by appearance (cards), watching many numbers (dashboard).
Layout
Use when
Avoid when
Examples
Single column
Content is read in order; mobile
People need to compare items side by side
Medium, Substack, iA Writer
Sidebar + content
5 or more top-level sections; desktop
Only 2 or 3 sections (use tabs)
Notion, Slack, Figma
List-detail
Triage: scan many, open one, return
Items have no meaningful detail
Apple Mail, Things, Linear
Card grid
Items are recognized by image
Items are text-heavy or need sorting by fields (use a table)
Photos, Dribbble, Netflix
Dashboard
Monitoring known metrics at a glance
As a default home for a new product with no data yet
Stripe, Vercel, Plausible
The list-detail pattern deserves extra respect. On wide screens both panes are visible; on phones the detail pushes in over the list. Apple's split views and Android's list-detail canonical layout both formalize this. If your product is about a collection of things (notes, tasks, documents, clients), this is probably your layout.
Density: compact versus comfortable
Density is how much information fits in a given area. It is not good or bad; it is a fit. A Bloomberg Terminal is famously dense: black background, amber and colored text, many panels of numbers. Professional traders want it that way, because they compare and monitor many values at once and they use it all day, so they have learned where everything is. Apple Notes is the opposite: one note, a big text area, a short list. Its users open it for a few seconds to jot something down; density would only slow them.
Density follows use. The more often and the more expertly people use a screen, and the more they need to compare, the denser it can be. Density earned through familiarity feels powerful; density forced on newcomers feels hostile.
Compact versus comfortable
Invoice #1042 · Asha Designs₹18,000
Invoice #1041 · Kite Labs₹42,500
Invoice #1040 · Moon Café₹6,200
Invoice #1039 · Field Studio₹12,750
Invoice #1042 · Asha Designs₹18,000
Invoice #1041 · Kite Labs₹42,500
Invoice #1040 · Moon Café₹6,200
Invoice #1039 · Field Studio₹12,750
Invoice #1038 · Rao & Sons₹9,900
Invoice #1037 · Asha Designs₹15,000
Invoice #1036 · Northwind₹31,200
Invoice #1035 · Kite Labs₹40,000
Invoice #1034 · Moon Café₹5,800
Comfortable: about 48px rows, 15px text. Easy to read and tap; four invoices fit. Right for a freelancer checking a few invoices a week on a phone.
Compact: about 28px rows, 12.5px text. Nine invoices in the same height. Right for an accountant reconciling hundreds at a desk; too tight for touch.
Rules for dense screens that still feel calm
Reduce chrome before reducing space. Remove borders, icons and repeated labels first; they consume more area than padding.
Keep hierarchy strict. In a dense table, the one column people scan by must be in full ink; the rest muted.
Align relentlessly. Density without alignment is chaos; density with alignment is a table.
Use tabular figures so numbers line up.
Offer a density setting if your audience is split. Gmail offers Default, Comfortable and Compact; many tools offer a compact mode for power users.
Do
Pick a layout from how people move through the content.
Use list-detail for collections of things.
Match density to frequency, expertise and comparison needs.
Keep touch targets comfortable even in compact modes on touch devices.
Don't
Default to a dashboard because it looks impressive.
Use cards for items people need to sort and compare (use a table).
Make a beginner tool dense or an expert tool sparse.
Shrink text to fit more; remove chrome instead.
In the wild
Bloomberg TerminalBloomberg, since the 1980s
Extremely dense panels on a dark background, keyboard-driven, with color used to code types of information. Its users invest weeks learning it and use it for hours a day. Density is a reward for expertise; it fits when people live in the tool.
LinearLinear
Compact issue lists with small type and tight rows, but very little chrome, so it reads as clean rather than crowded. Dense and calm are compatible if you subtract chrome.
Apple NotesApple
A list-detail layout that becomes a single stack on iPhone, with generous text and almost no controls visible. Occasional, quick tasks want sparse screens.
Common mistakes
Cards for everything
Cards look modern and are easy to build.
Text-heavy, comparable items (invoices, users, issues) belong in lists or tables. Cards are for visual browsing.
The empty dashboard
Dashboards look impressive in screenshots.
For a new user with no data, a dashboard is a page of zeros. Lead with the first action instead, and earn the dashboard later.
Check yourself
You are building a tool for freelance translators to track 50 to 200 active jobs, used several hours a day on a laptop. Which layout and density?
Many comparable items, all-day use, laptop: that is a list-detail or table layout at moderate-to-high density. Cards waste space and hinder comparison; a dashboard does not help people do the work of each job.
Connect the ideas: Part two recap
You switch your app to a compact density. Which earlier rule must you check first so the denser screen still groups correctly?
When you scale spacing down uniformly, gaps can collapse to the same value and grouping disappears. Scaling from a base unit (as in the spacing lab) keeps the ratios, which keeps the grouping.
Exercise 9.1 45 minutes · on your own product
Name your layout and density
Name the layout pattern of each of your three main screens. If you cannot, sketch which of the six it is closest to.
Write down, for your main user: how often they use it, how expert they are, and whether they compare items.
Place your product on the density spectrum. Does the current density match?
If not, change one screen: remove chrome first, then adjust spacing using your scale.
You're done when: each main screen has a named layout, and you have a one-paragraph density decision you could defend.
Beginner
Competent
Strong
Names layouts; no density reasoning.
Density decision tied to frequency, expertise and comparison.
Implements the change and verifies with one real user or with a timing test of a common task.
Part three
Color: models, palettes, meaning and dark mode
Color is the most emotional visual tool and the easiest to misuse. This part treats it as a system: how color is described on screens, how to build a small palette that works, what colors mean, and how to make a dark mode that is designed rather than inverted. In the demos of this part, literal colors are the subject, so you will see real values.
10
How color works on screens
Taught by Josef Albers, with Björn Ottosson (Oklab) and the Stripe design team
Screens mix red, green and blue light, but people do not see in RGB. Use a color model that matches perception (OKLCH) when you build palettes, so that "same lightness" actually looks the same lightness.
Josef Albers's Interaction of Color (1963) begins with a humbling lesson: color is the most relative medium in art. The same grey looks lighter on black than on white; the same orange looks different next to blue than next to red. You can never judge a color alone, only in context. That is why you build palettes as systems and test them on real screens.
Three ways to describe a color
RGB / hex
How much red, green and blue light the screen emits, for example #2457C5. Precise for machines, nearly impossible for people to reason about ("make it a bit lighter" changes all three numbers).
HSL
Hue (angle on a color wheel, 0 to 360), saturation and lightness. Much easier to think in. But its "lightness" is mathematical, not perceptual: at 50% lightness, yellow looks far brighter than blue.
OKLCH
Lightness, chroma (colorfulness) and hue, built on Oklab, a perceptual color space Björn Ottosson published in 2020. Equal L values look roughly equally light across hues. Available in CSS as oklch(L C H) and supported in all major browsers since 2023.
Why this matters: when you generate a palette in HSL by keeping lightness fixed and rotating hue, you get a yellow that is nearly invisible on white and a blue that is nearly black. Text colored with them fails contrast unpredictably. In OKLCH, if your blue at L 0.55 passes contrast on white, your green and red at L 0.55 will be close too. Toggle the demo to see the difference.
Same "lightness", two models
0°
55°
120°
190°
235°
290°
25°
95°
145°
210°
265°
320°
HSL: all six have lightness 50%, yet the yellow glows and the blue is dark. Squint and you see a bumpy row. Any rule like "use the 50% shade for text" will fail for some hues.
OKLCH: all six have L 0.68. Squint: the row is an even band. A palette built this way behaves predictably for contrast across every hue.
Hue, chroma and lightness as design decisions
Three separate knobs. In OKLCH, making a color "lighter" only changes L; making it "calmer" only lowers C. In hex, both require changing three numbers and guessing.
:root {
--accent: oklch(0.55 0.16 255); /* button, links */
--accent-hover: oklch(0.50 0.16 255); /* just darker: change L only */
--accent-soft: oklch(0.95 0.03 255); /* tinted background: high L, low C */
}
Watch out
Not every OKLCH value can be shown on a typical screen. High chroma at very high or very low lightness falls outside the sRGB gamut, and browsers will map it to the nearest displayable color. Keep chroma modest (about 0.02 to 0.18 for UI colors) and check the result, or use a palette tool that shows gamut limits.
Do
Build palettes in a perceptual space (OKLCH, or LCH/CIELAB in tools).
Make hover and pressed states by changing lightness only.
Judge colors in context, next to their real neighbors.
Store colors as tokens, not scattered hex values.
Don't
Assume HSL lightness predicts contrast.
Pick colors alone on a white artboard and expect them to work in the UI.
Push chroma to the maximum for UI colors.
Eyedrop colors from screenshots of other apps as your palette.
In the wild
Stripe's accessible color systemStripe, 2019
Stripe described rebuilding its palette in a perceptually uniform space (CIELAB), so that colors at the same level have similar contrast across hues, making accessible combinations predictable. Perceptual models turn contrast from guesswork into a rule.
Tailwind CSS v4Tailwind Labs, 2025
The default palette was redefined in OKLCH. The industry has moved; there is no reason to start a new palette in HSL.
LinearLinear, 2024 redesign
Linear has written about generating its themes in the LCH color space from a few inputs (base color, accent, contrast), so custom themes stay legible. A perceptual model lets a small set of inputs generate a whole, consistent theme.
Common mistakes
Hover by opacity
Lowering opacity is a quick way to show a hover.
Opacity lets the background show through, so the result changes with context. Darken or lighten in L instead.
Judging color on a perfect display only
You design on a bright, calibrated laptop screen.
Check on a cheap phone outdoors and on an older monitor. Subtle tints often disappear.
Check yourself
You generated status colors in HSL, all at 45% lightness. Your warning yellow text fails contrast on white while the error red passes. What is the root cause?
Yellow emits a lot of perceived light. To use it for text you need a dark, brownish yellow (in OKLCH, a lower L). In a perceptual model, equal L gives roughly equal contrast, so you would have caught this up front.
Exercise 10.1 30 minutes · on your own product
Translate your colors
List every color in your product's CSS (search for #, rgb, hsl). Count them.
Convert each to OKLCH (browser dev tools can show any color in OKLCH; online converters also work).
Sort them by L. Spot near-duplicates (L within 0.02, same H), and colors with very different C for the same role.
Merge duplicates into tokens.
You're done when: you have a table of your colors in OKLCH and a shorter list of tokens to replace them.
Beginner
Competent
Strong
Lists colors.
Converts, sorts and merges duplicates.
Replaces them with tokens in code and has fewer than about 15 color values in total.
11
Building a palette that works
Taught by Adam Wathan & Steve Schoger, with the makers of Radix Colors and Material Design
A product palette is mostly neutrals. Add one accent for interaction and identity, a few semantic colors for state, and build each as a scale of shades. That is enough for almost any product.
Beginners pick five brand colors and try to use all of them. Look closely at calm products and you will see something different: 90% greys (often slightly tinted), one accent used sparingly, and red, green and amber reserved for status. Refactoring UI makes this point strongly: you need more shades of fewer colors, not more colors.
The parts of a UI palette
Three families. Each family is a scale of shades, so you can make backgrounds, borders and text from the same hue. (The info swatch uses this course's focus blue.)
Neutrals with a hue bias
Pure greys (zero chroma) can look cold and lifeless, especially next to a colorful accent. Most polished products tint their neutrals very slightly, toward warm (yellow, red) or cool (blue). The chroma is tiny, around 0.005 to 0.015 in OKLCH, so you barely notice the tint, but the whole interface feels more coherent. A cool bias suits technical, precise products; a warm bias suits reading, writing and personal products. This course itself uses a slightly warm paper.
Pure grey
Neutral, slightly clinical. Fine, but can feel cold.
Warm bias (H 80)
Paper-like. Suits reading and writing tools.
Cool bias (H 255)
Crisp, technical. Suits developer and data tools.
60-30-10: proportion matters more than hue
An old interior-design rule of thumb says a room looks balanced when about 60% is a dominant color, 30% a secondary color and 10% an accent. Treat it as a starting point, not a law. For software it translates well: about 60% background, 30% surfaces and text, and no more than about 10% accent. The accent works because it is rare. If everything clickable, every icon and every heading is accent-colored, it no longer marks anything.
Rarity gives the accent its power. If your accent covers more than about a tenth of a typical screen, it has turned into a background color.
Scales: tints and shades from one hue
Every family needs a range of shades: a very light tint for subtle backgrounds, light shades for borders and hover fills, a solid middle for buttons, and dark shades for text on tinted backgrounds. A common convention numbers them 50, 100, 200 … 900. Radix Colors goes further and assigns each of its 12 steps a job (steps 1 and 2 for backgrounds, 3 to 5 for component backgrounds, 6 to 8 for borders, 9 and 10 for solid fills, 11 and 12 for text), which is a very useful way to think even if you build your own.
Build your scale in the lab. Pick a hue, set the chroma, and see ten steps generated with even perceptual lightness. Each swatch shows its contrast against white and black, so you can see which steps are safe for text.
Lab: color scale generator
Ratios use the WCAG formula. 4.5:1 is the minimum for body text, 3:1 for large text and for UI parts such as input borders and icons. Switch to HSL and move the hue to yellow (about 60°) and then blue (about 240°): watch where the "AA on white" line jumps. In OKLCH it stays near the same step for every hue.
Contrast rules and how to test them are covered in depth in Accessible & Inclusive. The short version: body text at least 4.5:1 against its background, large text and essential UI boundaries at least 3:1.
Do not design a palette from scratch every time. Start from a well-made open scale (Radix Colors, Tailwind's palette) for neutrals and semantics, and choose only your accent hue. Spend your taste on the accent and the neutral bias; borrow the rest.
Do
Make neutrals the bulk of your palette, with a slight hue bias.
Choose one accent and protect its rarity.
Build every family as a 9 to 12 step scale with assigned jobs.
Check which steps pass 4.5:1 and 3:1 before using them for text and icons.
Don't
Use more than one or two "brand" hues inside the product UI.
Use the accent for decoration, headings and icons all at once.
Use semantic red or green as a brand color (every error will look like branding, and vice versa).
Pick tints by lowering opacity; define real tint steps.
In the wild
Radix ColorsRadix team, now part of WorkOS
Open 12-step scales with documented roles for each step, in light and dark versions designed together. A scale is more useful when every step has a job.
Things 3Cultured Code
Almost entirely white and grey, with blue for selection and interaction and a yellow star for Today. Color appears only where it means something. A calm palette is a restrained palette.
SpotifySpotify
A dark neutral interface with the brand green reserved for the main play control and a few active states. Album art provides the color. Let content be colorful and keep the chrome neutral.
Common mistakes
The five-color brand palette
A logo designer delivered five colors, so you use all five.
Keep the brand colors for marketing and illustration; inside the app, use one accent and neutrals.
Grey text on colored backgrounds
Grey is the secondary-text color, so it gets used everywhere.
On a tinted background, use a darker or lighter step of the same hue for secondary text. Grey on blue looks dirty.
Missing in-between steps
You defined only "primary" and "primary-light".
You will need hover, pressed, soft background, border and text variants. Generate a full scale once.
Check yourself
Your accent purple is used for buttons, links, headings, icons, the sidebar background and chart lines. Users miss the main "Create" button. Best fix?
The accent has lost its power through overuse. Restoring rarity (10% or less) fixes the problem at its root; changing hue or adding motion just starts the arms race again.
Exercise 11.1 60 to 90 minutes · on your own product
Your palette on one page
Choose a neutral bias (warm, cool or none) and write one sentence on why it fits your product.
Choose one accent hue. Generate a 10-step scale in the lab or a tool; note which steps pass 4.5:1 on your background.
Choose semantic colors (success, danger, warning, info), each with a solid step and a soft background step.
Write all of it as CSS tokens, and replace the colors on your main screen.
You're done when: a single tokens file defines every color your main screen uses, and the accent covers no more than about 10% of it.
Beginner
Competent
Strong
Picks colors but no scales or contrast checks.
Full token set with checked contrast; main screen migrated.
Whole product migrated; each scale step has a documented job; palette reviewed in context on two devices.
12
Color meaning, state and color blindness
Taught by Josef Albers, with the W3C accessibility guidelines and Kenya Hara
Colors carry meaning from culture and from convention, and in an interface they mostly signal state. Use them consistently, never as the only signal, and remember that about one in twelve men see red and green differently.
Meaning comes from convention and culture
No color has a universal meaning, but software has built strong conventions: red for errors and destructive actions, green for success, amber for warnings, blue for links and information. Break them and people misread your interface. At the same time, some meanings are cultural. In Western stock markets green means "up"; in mainland China, red means up and green means down. Red is the color of luck and celebration in China and of brides and auspicious occasions in much of India, while white is associated with mourning in parts of East and South Asia. If your product shows financial change or is used across cultures, decide deliberately, and prefer signals that do not depend on color alone (arrows, signs, words).
Color
Common UI meaning
Cautions
Red
Error, destructive, urgent, recording, "live"
Market "up" in China; festive in India and China. Overuse causes alarm fatigue.
Green
Success, online, safe, money in
Market "down" in China. Confused with red by many color-blind users.
Amber / yellow
Warning, pending, attention
Poor contrast as text on white; use a dark variant.
Blue
Link, interactive, information, selection
So common it reads as "clickable": avoid blue for non-interactive text.
Grey
Disabled, secondary, inactive
Too-light greys fail contrast; disabled is the one place lower contrast is allowed.
Color for state
Interactive elements move through states: default, hover, pressed, focused, selected, disabled, and for inputs, error and success. Design them as a set, and use color changes that follow a rule (for example "hover = one step darker, pressed = two steps darker, selected = soft accent background"). Then every component behaves alike.
A state system. Hover and pressed change lightness step by step. Focus adds a ring (visible on any background) instead of changing color. Errors pair a red border with an icon and a message, so the color is never the only clue.
Never color alone
WCAG success criterion 1.4.1 says color must not be the only visual means of conveying information. The reason is simple: roughly 8% of men and 0.5% of women (of Northern European descent; rates vary by population) have some form of color vision deficiency, most commonly red-green. For them, a red error border and a green success border can look nearly identical. Others use your app in sunlight, on a dim screen, or in grayscale mode. Add a second channel: an icon, a word, a pattern, a position, or a change in shape or weight.
Status by color only, simulated
Typical vision: the top row uses only red and green dots for "failed" and "passed". The bottom row adds a symbol and a word.
Simulated deuteranopia (using the Machado, Oliveira and Fernandes 2009 model): the red and green dots in the top row become two similar olive tones. The bottom row still works, because the symbol and word carry the meaning.
You can check your own screens: Chrome's DevTools has a Rendering panel with "Emulate vision deficiencies", and Figma and other tools have simulation plugins. A quick, crude check is to view a screenshot in grayscale: if states become indistinguishable, you depend on color alone.
Don't
Color-coded legend. Readers must match colors between lines and legend; red and green lines may be indistinguishable.
Do
Direct labels and dash styles. Each line is named where it ends, and the line styles differ, so color is a bonus, not a requirement. (More in Information & Data.)
Do
Follow strong conventions: red for errors and danger, green for success.
Pair every color signal with an icon, word, shape or position.
Define state colors as a rule (steps on a scale), not one-offs.
Check screens in grayscale and with a deficiency simulator.
Don't
Use color as the only difference between states or chart series.
Use red for anything that is not a problem or a danger.
Rely on red versus green as the only distinction.
Assume a color's meaning travels across cultures, especially for money.
In the wild
GitHubGitHub
Pull request and check states pair color with distinct icons (a check, an x, a dot, a merge symbol) and words such as "Open", "Merged" and "Closed". GitHub also offers color-blind friendly themes. Shape and text carry meaning; color reinforces it.
Chinese brokerage and market appsmainland China
Rising prices are shown in red and falling prices in green, the reverse of most Western apps. Many international trading apps let users pick the convention. When meaning is cultural, make it a setting.
Common mistakes
Red badges for everything
Red gets attention, so it is used for counts, "new" tags and promotions.
Keep red for problems. Use neutral or accent badges for counts and news, or people stop noticing real errors.
Disabled looks like secondary
Both use grey.
Disabled controls need an additional cue (reduced contrast plus no hover, a lock icon, or an explanation of why), and secondary buttons must stay clearly enabled.
Check yourself
Your deploy list shows a colored dot per deploy: green succeeded, red failed, yellow building. A color-blind user says "they all look the same". Best fix?
Blue/orange (d) is a better color pair for most deficiencies and is worth doing for charts, but it still uses color alone. Shapes and words work for everyone, including in grayscale and in bright sunlight.
Exercise 12.1 30 minutes · on your own product
The grayscale and simulator pass
Open your product in Chrome, then DevTools, Rendering, Emulate vision deficiencies. Try deuteranopia and protanopia. Also turn on your OS grayscale filter.
List every place where meaning is lost: states, charts, tags, links.
For each, add a non-color signal. Prefer text first, then icons, then patterns.
You're done when: every state in your product is understandable in grayscale.
Beginner
Competent
Strong
Finds problems, fixes some.
All states readable in grayscale.
Also reviews culturally loaded colors (money, celebration) and documents the state color rule.
13
Dark mode, designed not inverted
Taught by the Material Design and Apple Human Interface teams
Dark mode is a second palette with its own rules: surfaces get lighter as they rise, accents get lighter and calmer, text is off-white rather than pure white, and shadows mostly stop working. Inverting your light theme breaks all four.
Apple added a system-wide dark mode in macOS Mojave (2018) and iOS 13 (2019); Android 10 (2019) did the same. Since then people expect it, and many use it all the time. Designing it well is mostly about knowing what changes when the background goes dark.
Inverted versus designed
Reading list
12 articles saved · 3 unread this week
The craft of quiet software
A long essay on interfaces that respect attention, and why fewer features can mean more use.
ContinueDue today
Reading list
12 articles saved · 3 unread this week
The craft of quiet software
A long essay on interfaces that respect attention, and why fewer features can mean more use.
ContinueDue today
Inverted: pure black background, pure white text (maximum contrast that glares and can smear on OLED when scrolling), a glowing "shadow", a white border to separate the card, a saturated blue button that vibrates, and a pure red tag.
Designed: a very dark grey base, the card raised by being lighter, off-white headings and grey body text, a lighter and calmer blue, and a softened red. Same structure, far easier on the eyes.
Rule 1: elevation by lightness
In light mode, a raised card is shown with a shadow. On a dark background a shadow is nearly invisible. Instead, raised surfaces get lighter, as if closer to a light source. Material Design's dark theme (2019) formalized this: a base surface of #121212 with white overlays that increase with elevation, from about 5% at the lowest level to about 16% at the highest. Apple's dark mode similarly uses lighter "elevated" background colors for sheets and popovers.
Base background
Level 1 cards
Level 2 raised, hover
Level 3 menus, dialogs
Rule 2: lighter, calmer accents
A saturated color that looks fine on white can appear to vibrate or glow on a dark background, and it may fail contrast for text. In dark mode, use a lighter, slightly less saturated step of your accent and semantic colors (Material recommends lighter tones of the primary color for dark themes). In OKLCH terms: raise L, lower C a little.
Rule 3: off-white text, and fewer levels of it
Pure white on pure black is the maximum possible contrast, 21:1. For long reading, many people find it harsh, and people with astigmatism often report a halo or blur around light text on dark backgrounds. Use off-white for primary text (Material 2 used white at 87% opacity for high-emphasis text and 60% for medium) and keep body text comfortably above 4.5:1, ideally well above it.
Rule 4: pure black is an option, not the default
Pure black backgrounds do have uses. On OLED screens, black pixels are switched off, saving some battery and giving a seamless edge in a dark room, which is why reading apps often offer a true-black theme for night reading. But as a default for text-heavy UIs, a very dark grey is calmer and leaves room to show elevation. Consider offering both: dark (dark grey) and "black" or "OLED" for those who want it.
Not an inversion. Each property follows its own rule. Design both themes from the same scales by mapping each token to a different step, which is exactly what this course's own stylesheet does with --paper, --panel and --ink.
If your colors are tokens, dark mode is a second set of values, not a second design. Build both themes from day one even if dark mode is rough at first; retrofitting hundreds of hard-coded colors later is miserable. Test every new screen in both themes before shipping, the same way this course's checker renders every page in light and dark.
Do
Raise surfaces by making them lighter.
Use lighter, calmer accents and off-white text.
Follow the system setting by default and offer a manual override.
Offer a true-black option for reading and OLED lovers if it suits your product.
Don't
Invert colors or use a CSS filter to make dark mode.
Rely on shadows for depth on dark backgrounds.
Use your light-mode saturated accent unchanged.
Forget images, illustrations and logos with dark text that vanish on dark backgrounds.
In the wild
Apple system dark modeApple, macOS 2018, iOS 2019
Uses "base" and "elevated" background colors so that sheets and popovers sit lighter than the screen below, and adapts system colors for dark backgrounds. Semantic colors that change per theme make dark mode almost automatic.
Material Design dark themeGoogle, 2019
Defined a dark grey base surface, white elevation overlays, desaturated primaries and text emphasis by opacity. The clearest public write-up of dark-theme rules; worth reading in full.
Reading apps with a black themee.g. e-reader and read-later apps
Many offer separate "dark" and "black" themes so night readers can choose the darkest possible screen. Pure black is a user choice, not your default.
Common mistakes
Borders become the only structure
Without shadows, designers add bright borders around everything.
Use surface lightness steps first, then faint borders (a low-contrast step), only where needed.
Forgotten assets
Logos, charts and screenshots are designed for white.
Provide dark variants or transparent assets; check every image in both themes.
Text too dim
After hearing "avoid pure white", grey text is pushed too far down.
Off-white primary text should still be very light; keep body text well above 4.5:1.
Check yourself
In your dark theme, dialogs are hard to tell apart from the page behind them. They use the same grey as the page and the same shadow as light mode. What do you change?
In the dark, elevation is shown with lighter surfaces; a scrim behind modal dialogs helps in both themes. A bigger black shadow is still invisible against a dark grey, and accent borders spend your accent on decoration.
Connect the ideas: Part three recap
Which combination from this part makes building dark mode easiest for a solo developer?
Tokens (chapter 11) plus perceptual scales (chapter 10) mean each role (background, surface, text, accent) can point to a different step in dark mode, with predictable contrast. That is the whole trick.
Exercise 13.1 60 minutes · on your own product
Design your dark theme from tokens
List your color tokens. For each, choose the dark-mode value using the four rules (elevation by lightness, lighter accents, off-white text, dark grey base).
Implement with prefers-color-scheme plus a manual toggle.
Check contrast of body text, muted text and accent text in dark mode.
Screenshot the main screen in both themes side by side, and squint: is the hierarchy the same?
You're done when: both themes pass contrast, and the squint test gives the same focal point in each.
Beginner
Competent
Strong
Dark mode exists but is close to an inversion.
Follows all four rules; contrast passes.
Images and charts adapted; optional true-black theme; tested on an OLED phone at night.
Part four
Form: shape, depth, icons and imagery
Corners, edges, shadows, icons and pictures give an interface its physical character. Each is a small decision, and each one, made inconsistently, makes a product look assembled from parts. This part shows how to make them once, well, and reuse them.
14
Shape, borders and corner radius
Taught by Dieter Rams, with Apple's industrial and interface designers
Corner radius sets the personality of an interface, and consistency sets its quality. Pick a small radius scale, scale radius with element size, and when shapes nest, make the outer radius equal the inner radius plus the gap between them.
What radius says
Sharp corners read as precise, technical, serious, sometimes severe. Small radii (4 to 8px) read as neutral and modern. Large radii and pill shapes read as soft, friendly, touchable. None is correct in general; what matters is that the choice fits the product and is applied consistently. A banking tool with bubbly pill cards feels unserious; a children's app with razor corners feels cold.
Radius is tone. Choose one point on this spectrum for your product and derive the rest. A typical scale: 4px for small things (checkboxes, tags), 8px for buttons and inputs, 12 to 16px for cards and dialogs, full pill for chips and toggles.
Radius should grow with the size of the element. A 16px radius on a large card looks gentle; the same 16px on a 32px-tall button makes it nearly a pill. That is why a radius scale works better than a single value.
The nested radius rule
When a rounded shape sits inside another rounded shape (a button inside a card, an image inside a frame, a selected segment inside a segmented control), the two curves should look parallel, as if one were drawn around the other. Geometrically, that means they share a center: outer radius = inner radius + padding. If you use the same radius for both, the gap between them is wider at the corners than along the edges, and the inner shape looks pinched or the outer one looks bloated.
Shared centers. The dot marks the center of the inner corner's arc. On the right, the outer arc is centered on the same point, so the gap is even all the way round. Look at the corners of any Apple device and its screen: the same rule.
Lab: nested radius
inner
Set padding to around 24 and switch between the two rules. With "same as inner", the dark frame's corners look heavy and the yellow shape looks like it is being squeezed. With "inner + padding", the frame hugs the inner shape evenly.
Continuous corners
A normal CSS border-radius is a quarter circle joined to a straight edge. Where they meet, the curvature jumps abruptly from zero to a constant, and a sharp eye can see the "kink". Apple uses continuous corners (often called squircles) on app icons and hardware: the curvature ramps up gradually, so the corner flows out of the edge. In UI code this is a refinement, not a requirement. SwiftUI offers it via a continuous corner style; on the web, it is usually approximated with SVG masks, and a proposed CSS property (corner-shape) aims to support it natively.
A subtle difference. Magnified, the circular corner has two visible "joins" (red dots). The continuous corner has none. At small sizes the difference is tiny; on large app icons and device-like frames it is noticeable.
Borders, when you do use them
Chapter 3 argued for fewer borders. When you need one, make it quiet: 1px, in a low-contrast neutral step (unless it is an input that needs 3:1). Prefer borders that are inside the element's box (CSS box-shadow: inset 0 0 0 1px or outline tricks) when you want the border not to change layout size. And keep border colors as tokens, like everything else.
Don't
Five radii, no system. 2, 18, 10, 20 and 0 on one screen. Each piece looks borrowed from a different kit.
Do
A scale. Container 14 (6 + 8 padding), inner items 6, buttons 8. Everything looks like one family.
Do
Choose a radius personality and a 3 or 4 step scale.
Scale radius with element size.
Use outer = inner + padding for nested shapes.
Keep borders 1px, quiet and tokenized.
Don't
Mix sharp and very round corners at the same level.
Use the same radius for a container and the element inside it.
Round images inside sharp containers, or the reverse, without a reason.
Use thick or dark borders to "fix" weak grouping.
In the wild
iPhone hardware and screenApple
Since the iPhone X (2017), the display corners are rounded to sit concentric with the rounded device corners, and iOS widgets and sheets echo those curves. The nested radius rule, applied from the glass to the pixels.
Stripe and Linearweb apps
Both use small, consistent radii (around 4 to 8px) on controls and slightly larger ones on cards and menus, matching their precise, professional tone. Small radii signal a serious tool.
Common mistakes
Radius copied from a UI kit
Components come from different libraries, each with its own radius.
Override every component's radius with your tokens on day one.
Clipped content in rounded containers
An image or header inside a rounded card has square corners that poke out.
Use overflow: hidden on the container, or give the child its own radius (outer minus padding, or equal to outer if it touches the edge).
Check yourself
A card has 20px padding and a 12px radius. Inside it, a thumbnail image should look concentric with the card. What radius should the image have, and what should you change?
Outer = inner + padding. With 20px padding, a 12px outer radius would need a negative inner radius, so the corners can never look concentric. Raise the outer radius (24 = 4 + 20) or tighten the padding. Option d is a valid stylistic choice, but it does not make the shapes concentric.
Exercise 14.1 30 minutes · on your own product
Radius audit
Search your CSS for every border-radius value. List them with where they are used.
Choose a 3 or 4 step scale and a personality sentence ("precise and calm", "soft and friendly").
Find every nested rounded pair and check outer = inner + padding.
Replace values with tokens.
You're done when: your product uses only your radius tokens and every nested pair is concentric.
Beginner
Competent
Strong
Lists radii.
Scale defined and applied; nesting fixed on main screen.
Taught by Jony Ive's iOS 7 team, the Material Design team, and a decade of trends
Depth tells people what is on top of what: what floats, what can be moved, what will go away. Shadows should behave like light: one consistent source, two layers (a tight contact shadow and a soft ambient one), and bigger, softer shadows for higher things.
Why depth helps
A menu that floats above the page, a dialog over a dimmed screen, a card you can drag: these are layers, and people understand layers from the physical world. Depth answers "what is in front?", "what is temporary?", "what can I pick up?". Used for those jobs, it is communication. Used everywhere (every card floating, every button glowing) it becomes noise, and nothing reads as "on top" any more.
How real shadows work
In the real world, a raised object casts two kinds of shadow. Right where it nearly touches the surface there is a small, dark, sharp contact shadow. Around it there is a larger, lighter, blurry ambient shadow from light coming from many directions. The higher the object, the more offset, larger and softer the shadow gets. A single CSS shadow with a big blur and high opacity looks like a smudge; two layers look like an object.
Elevation changes the shadow. Keep the light source in the same place for every shadow in the product (usually straight above, so shadows offset downward only). A shadow offset to the right on one card and downward on another breaks the illusion instantly.
Lab: shadow builder
Weekly digest
Ready every Monday at 8:00
Compare one layer against two at elevation 3. One layer looks like a grey haze; two layers look like a card resting above the page. Then push opacity to 250%: heavy shadows make a calm interface feel cheap. Try this in dark theme too, where shadows almost disappear (which is why dark mode uses lighter surfaces instead).
A short history of depth on screens
Interface depth has swung like a pendulum, and knowing the swings helps you avoid copying a trend at its peak.
The pendulum. Each style overcorrected the one before. The durable lesson from all of them is the same: use depth where it tells people something about layers.
Skeuomorphism (iPhone OS to iOS 6, 2007 to 2012, and the Mac of the same era). Interfaces imitated physical materials: stitched leather in Find My Friends and the Mac's iCal, green felt in Game Center, a wooden bookshelf in iBooks. It helped people who were new to touchscreens understand what was pressable, but the textures carried no information and aged quickly.
Flat (Windows Phone's Metro, 2010; iOS 7, 2013). Microsoft's Metro design language and then Apple's iOS 7, led by Jony Ive after Scott Forstall's departure, stripped textures and most shadows. Typography, color and layering through blur took over. Early flat design overcorrected: some buttons became plain text with no affordance at all.
Material Design (Google, 2014). A middle path: flat surfaces like sheets of paper, with elevation expressed by shadows that follow consistent rules. It reintroduced depth as information.
Neumorphism (around 2019 to 2020). A popular trend on design showcase sites: shapes that seem extruded from a single soft background with paired light and dark shadows. It looked lovely in still images but had very low contrast, so buttons and states were hard to see. It mostly stayed a showcase style, which is itself a lesson.
Glass and translucency. Translucent, blurred layers have been part of iOS since iOS 7; Microsoft's Fluent "Acrylic" (2017) and "Mica" (Windows 11, 2021) and macOS Big Sur (2020) leaned in further, and Apple's "Liquid Glass" (announced in 2025 across its platforms) made translucency and refraction central to controls and bars.
Skeuomorphic
Gloss and bevel say "press me" loudly, at the cost of noise.
Flat + subtle depth
Solid fill, clear shape, a whisper of shadow: the durable middle.
Neumorphic
Beautiful in a still image, nearly invisible as a control.
Using glass and translucency well
Translucent layers keep context visible (you can see the page under a toolbar as you scroll), and they make layering obvious. The cost is legibility: text over a moving, colorful background can become unreadable. Rules that keep glass usable:
Blur strongly enough that underlying content becomes soft color, not readable shapes.
Add a tint (a semi-opaque surface color) so text always has a predictable background.
Use it for chrome (bars, sidebars, menus), not for content cards or long text.
Respect accessibility settings: iOS and macOS have "Reduce Transparency", and the web has an emerging prefers-reduced-transparency media query. Provide an opaque fallback.
Do
Use depth to show layering: menus, dialogs, dragged items, sticky bars.
Build shadows from two layers and one light source.
Define 3 to 5 elevation tokens and reuse them.
Give translucent chrome a tint and an opaque fallback.
Don't
Put shadows on every card in a list.
Use pure black, high-opacity shadows.
Mix light directions.
Adopt a trend (neumorphism, heavy glass) at the expense of contrast.
In the wild
iOS 7Apple, 2013
Removed textures and most shadows, and used translucent, blurred layers (Control Center, notification center) to show what sat on top. Depth can come from translucency and motion, not just shadows.
Material DesignGoogle, 2014
Specified elevation for each component (cards low, menus higher, dialogs higher still) with matching shadows. Make elevation a token with meaning, not an aesthetic choice per screen.
Things 3Cultured Code
Mostly flat, but an open to-do lifts into a card with a soft shadow, and dragged items float. Reserve depth for the moment something becomes active.
Common mistakes
Shadow as a border substitute everywhere
Soft shadows look nicer than borders, so every card gets one.
Flat cards with space or a faint background are calmer. Save shadows for things that truly float.
Default framework shadows
The kit's default shadow is dark and single-layer.
Write your own 3 to 5 elevation tokens with two layers each and low opacity.
Check yourself
In your app, cards, buttons, inputs and the header all have the same medium drop shadow. Dropdown menus also have it. Users sometimes do not notice a menu has opened. Fix?
When everything floats, nothing appears to float. Flattening the resting elements restores the meaning of elevation, so the open menu is obviously on top.
Exercise 15.1 40 minutes · on your own product
Elevation tokens
List every element with a shadow. Mark which ones truly sit above other content.
Remove shadows from the rest.
Define three elevation tokens (raised, overlay, modal) using two-layer shadows from the lab, all with the same light direction.
Decide what dark mode uses instead (lighter surfaces, faint borders).
You're done when: every shadow in the product uses one of three tokens, and each token has a documented meaning.
Beginner
Competent
Strong
Tunes shadows, but still on everything.
Shadows only on floating layers, from tokens.
Dark mode elevation designed too, and a translucent chrome element has an opaque fallback.
16
Iconography
Taught by Susan Kare, with the SF Symbols and Material Symbols teams
Icons are a small visual language. They help when they are consistent, recognizable and paired with words; they hurt when they are decorative, ambiguous or mixed from different sets.
Susan Kare designed the original Macintosh icons (1984) on a 32 by 32 pixel grid: the trash can, the paintbrush, the "happy Mac". They worked because each was a simple, recognizable object and all shared the same grid, line weight and spirit. Those are still the rules.
What makes an icon set consistent
An icon set is consistent when every icon shares the same grid (usually 24 by 24 with about 2 units of padding), the same stroke weight (for example 1.5 or 2 at 24px), the same corner treatment (round or square joins and caps), the same style (outline, filled or duotone) and the same level of detail. Mixing two sets breaks all five at once, and people notice even if they cannot say what is wrong.
Shared rules make a family. The keylines (circle and square) are the optical corrections from chapter 6: a round icon uses the larger circle, a square icon the smaller square, so they look the same size.
Don't
Five icons, five sets. Filled, hairline, heavy, colored and square-capped. The toolbar looks assembled from leftovers.
Do
One set. Same stroke, caps and visual size. The eye reads them as a toolbar, not as five separate things.
Icon plus label, almost always
Very few icons are universally understood without a label: perhaps search (magnifier), home, print, close (x), play and pause. Most others (share, archive, sync, the many "sparkle" icons for AI features) mean different things in different apps. Nielsen Norman Group's long-running advice is that icons need a text label to be clear, especially for anything beyond the most standard actions. A label also gives a larger click target and helps screen reader users if wired correctly. Icon-only buttons are acceptable when space is tight and the icon is standard, and they still need a tooltip and an accessible name.
Icon-only versus icon + label
Icons only: home and account are guessable. Is the sparkle "favorites", "magic", "new" or "AI"? Is the box "archive", "inbox" or "packages"? Is the circular arrow "sync", "refresh" or "history"?
With labels: no guessing. The labels cost a few pixels of height and remove a whole class of errors.
Metaphors and when not to use icons
Icons are metaphors, and metaphors age. The floppy disk still means "save" to many people who have never seen one; the phone handset still means "call". These survive because they became conventions. Inventing new metaphors is risky: for abstract concepts (permissions, workflow, integrations), a word is clearer than any picture. Do not use icons:
to decorate every list item or heading (they add noise and dilute meaning);
for abstract ideas with no established symbol;
when two similar icons would sit next to each other (archive versus inbox);
as the only way to tell states apart (see chapter 12).
Choosing an icon set
Set
Character
Good for
SF Symbols (Apple)
Thousands of symbols in nine weights and three scales, designed to match the San Francisco font; many support multiple rendering modes.
Native Apple platform apps (licensed for use on Apple platforms).
Material Symbols (Google)
A variable icon font with fill, weight, grade and optical size axes; outlined, rounded and sharp styles.
Android and web; lets you tune weight to match your text.
Lucide
Open-source community fork of Feather; clean 24px outline icons with 2px strokes; large and growing.
Web apps, especially React; calm, neutral tools.
Phosphor
Open-source family in six weights (thin, light, regular, bold, fill, duotone).
Products that need weight variety or a slightly friendlier look.
Heroicons
By the makers of Tailwind CSS; outline and solid styles at 24px, plus mini and micro sizes.
Tailwind-based web apps.
Match the icon stroke weight to your text weight: thin icons next to bold text (or the reverse) look mismatched. At 16 to 20px sizes, use the set's smaller optical size if it has one, because a 24px icon simply scaled down gets spindly and blurry.
For the solo creator
Pick one set on day one and never mix. If you need an icon the set lacks, draw it on the same grid with the same stroke (most sets publish their rules) or, better, use a word. Wrap icons in a single component with a size prop and an optical offset (chapter 6), so every icon in the product goes through one place.
Do
Use one icon set everywhere.
Pair icons with labels except for the most universal actions.
Give icon-only buttons a tooltip and an accessible name.
Match icon weight to text weight and use optical sizes.
Don't
Mix outline and filled styles at random (filled for "selected" is a fine rule).
Invent metaphors for abstract features.
Decorate every row and heading with an icon.
Scale icons by arbitrary amounts; use a size scale (16, 20, 24).
In the wild
Original Macintosh iconsSusan Kare, 1984
Simple objects on a tiny pixel grid, with a consistent spirit and clear metaphors (trash, document, folder). Constraints breed consistency; metaphors work when they are concrete.
iOS tab barsApple
Standard tab bars show an icon with a short label beneath, outline when inactive and filled when selected. Icon plus label, with fill as the state signal, is a proven pattern.
GmailGoogle, 2011 redesign
The redesign replaced text buttons such as "Archive" and "Report spam" with icons, and Gmail added a setting to show text button labels instead. When even a huge team adds a "show labels" option, take the hint: labels matter.
Common mistakes
Icon soup
Icons feel like visual polish, so every menu item gets one.
Keep icons where they speed up recognition (primary navigation, frequent actions). Remove them from long menus where they all look alike.
Emoji as icons
Emoji are free and colorful.
Emoji render differently on every platform and clash with UI icons. Use them as content, not as interface.
Check yourself
Your editor's toolbar has eight icon-only buttons. In a test, people find bold and italic instantly but cannot find "insert footnote" or "toggle focus mode". Best fix?
Bold and italic have strong conventions; footnote and focus mode do not, and no drawing will make them universal. Words solve abstract actions; tooltips help the rest.
Exercise 16.1 45 minutes · on your own product
Icon inventory
Screenshot every icon in your product onto one canvas, at the same scale.
Group them by set. Mark any that differ in stroke, style or visual size.
Mark every icon-only control and rate it: universal, guessable, or ambiguous.
Replace mismatches from your one chosen set, and add labels or tooltips to every ambiguous control.
You're done when: your icon canvas shows one consistent family, and no ambiguous icon appears without a label.
Beginner
Competent
Strong
Finds mismatches.
One set; ambiguous icons labeled.
Icons wrapped in one component with sizes and optical offset; decorative icons removed.
17
Imagery and illustration in software
Taught by the illustrators behind Notion, Mailchimp and Duolingo
Images and illustrations earn their place when they show the real thing, explain an idea faster than words, or set a tone at a quiet moment. Generic stock and filler illustrations cost attention and trust.
When imagery helps
Showing the real thing. A screenshot of your actual product, a photo of the actual product, a preview of the user's own content. Real beats representative.
Explaining. A small diagram of how sync works, or a before/after, can replace paragraphs.
Quiet moments. Empty states, onboarding, success and error pages: moments with little content, where a small illustration sets tone and lowers stress.
Identity. A consistent illustration style becomes part of the brand (see Identity & Launch).
When it hurts
Generic stock photos (smiling people pointing at laptops, handshake close-ups) signal "template" and lower trust, because everyone has seen them on a hundred other sites. The same happened to the flat, bendy-limbed illustration style that spread across tech companies in the late 2010s, sometimes nicknamed "Corporate Memphis": once friendly, now so common it reads as no personality at all. And any image inside a working screen (a dashboard, an editor) competes with the content people came to work on.
Don't
Could be any product. The photo shows people, not the product; the headline is equally generic.
Do
Shows the real thing. A screenshot of the actual invoice screen plus a specific promise. People can see what they would get.
Consistency rules for illustration
If you use illustrations, they must look like one artist made them: the same line weight, the same palette (ideally drawn from your UI palette), the same level of detail, the same way of drawing people or objects. Mixing a free pack from one site with icons from another produces the same "leftovers" feel as mixed icon sets. If you cannot draw, a few options work well for solo makers: simple geometric spot illustrations built from your icon set's shapes; monochrome line drawings in your ink color; or no illustration at all, with confident typography doing the work.
Text on images
Text placed directly on a photo is readable only where the photo happens to be plain. Since you cannot control every image (especially user content), add a scrim: a gradient or semi-opaque overlay behind the text, or place text below the image instead. Check contrast against the busiest part of the image, not the calmest.
Don't
Text fights the picture. Deliberately broken: the title is readable over the dark block and unreadable where it crosses the light circle.
Do
A scrim guarantees contrast. The overlay darkens only the bottom, keeping most of the image vivid.
Fixed aspect ratios. Pick two or three (1:1, 4:3, 16:9) and crop to them with aspect-ratio and object-fit: cover, so grids stay aligned whatever users upload.
Placeholders. Reserve the image's space before it loads (a neutral or dominant-color block) so the layout does not jump.
Dark mode. Very bright images can glare on dark backgrounds; some products dim them slightly.
Alt text for meaningful images; empty alt for decorative ones (see Accessible & Inclusive).
Do
Show your real product and real content.
Use illustration at quiet moments (empty, success, error, onboarding).
Keep one illustration style and draw its palette from your UI tokens.
Use scrims or move text off images.
Don't
Use generic stock photos of people with laptops.
Mix free illustration packs.
Put decorative images inside working screens.
Trust that text on a photo is readable because it is on your test photo.
In the wild
Notionillustrations by Roman Muradov
Black-and-white, hand-drawn, slightly whimsical figures used on the website, in empty states and templates. They match the product's mostly monochrome interface. An illustration style can extend the UI's palette instead of fighting it.
MailchimpIntuit Mailchimp
Freddie the chimp and a distinctive illustration style give personality to success moments (the famous high-five after sending a campaign) without intruding on the editing tools. Spend personality at moments of relief, not during work.
DuolingoDuolingo
A tightly specified cast of characters and shapes, drawn with consistent geometry, appears across lessons, notifications and marketing. Consistency of style is what makes illustration feel like a brand.
Common mistakes
The illustrated empty state that hides the action
A big illustration feels welcoming.
Keep the illustration small; the one action ("Create your first note") must win the squint test.
Mockups instead of screenshots
Floating 3D phones look slick.
Flat, legible screenshots of real states (with real-looking data) persuade better and are easier to keep up to date.
Check yourself
Your journaling app's onboarding uses three free illustrations from different packs and a stock photo. What is the best change given you cannot hire an illustrator?
Real screenshots show the actual value, and a single minimal style is achievable alone. Mixed styles, however polished each is, make the product feel assembled.
Exercise 17.1 40 minutes · on your own product
Image audit
List every image and illustration in your product and landing page.
For each, write its job: show the real thing, explain, quiet moment, or identity. Mark any with no job.
Remove or replace those with no job; replace stock with real screenshots.
Add a scrim or move text for any text-on-image, and test with your three busiest images.
You're done when: every remaining image has a written job and passes contrast where text overlays it.
Beginner
Competent
Strong
Lists images.
Removes jobless images; fixes text overlays.
Defines a single illustration approach and fixed aspect ratios for user images.
Part five
Craft: consistency, polish and the visual review
The last part is about finish. Consistency turns many good decisions into one coherent product; polish removes the small flaws people feel without seeing; and a repeatable review process lets you tidy any screen in under an hour.
18
Consistency, rhythm and polish details
Taught by Dieter Rams ("thorough down to the last detail"), with Loren Brichter and Mike Matas
Quality is mostly consistency: the same thing always looks and behaves the same. Polish is the last 5%: crisp lines, centered icons, visible focus, honest hover states. People rarely notice polish, but they always notice its absence.
Repetition and rhythm
Repetition is how people learn an interface. When every primary button is the same shape and color, people find primary buttons without thinking. When every list uses the same row height, spacing and hierarchy, scanning becomes automatic. Repetition also creates rhythm: a steady beat of spacing and sizes that makes a long screen feel organized, the way regular line spacing makes a page of text calm. Break the rhythm only on purpose, to signal "this is different".
Consistency at scale comes from tokens and components: named values for color, space, type, radius and elevation, and components that use only those values. That is the subject of Systems & Platforms. In this guide, the point is simpler: every decision you made in chapters 4 to 17 should exist exactly once, as a token or a component, and everything else should refer to it.
Rhythm is felt, not seen. On the left, row heights, gaps and radii vary slightly. Nothing is "wrong", but the list feels nervous. On the right, one row recipe repeats, and the list feels calm.
The "everything aligned" pass
Before you call a screen finished, do one pass looking only at alignment and consistency. Turn on a grid or ruler overlay. Check that every left edge sits on the grid, every icon is the same size and centered against its label, every gap is a scale value, every corner is a radius token, and every repeated element is pixel-identical to its siblings. It is tedious; it takes 15 minutes; and it is the difference between "looks fine" and "looks made".
Pixel snapping and hairlines
Screens draw in physical pixels. A 1px line placed at a fractional position (say y = 10.5 in a scaled layout) is split across two pixel rows, and it renders as a blurry 2px grey line instead of a crisp 1px dark one. The same happens to icons whose paths sit on half pixels. On high-density screens (2x, 3x) the blur is smaller but still visible as softness.
Snap to whole pixels. In design tools, enable pixel snapping and keep positions and sizes whole numbers. In CSS, avoid transforms like translate(-50%, -50%) on elements with odd sizes (they land on half pixels); and design icons on an integer grid.
A hairline is the thinnest line the screen can draw: one physical pixel. On a 2x display that is 0.5 CSS pixels. Hairline dividers look elegant and quiet, and Apple's own UIs use them; but on 1x screens 0.5px may round unpredictably. The safe approach: use 1px CSS borders in a low-contrast color, and use true hairlines only where you know the display density.
Optical centering: the play button
A play triangle centered by its bounding box looks shifted to the left, because most of its visual mass is on the flat left side. Move it right until it looks centered; a common starting point is to center the triangle's centroid instead, which shifts it right by about one sixth of its width.
Don't
Math-centered. The bounding box is centered, but the triangle looks like it is drifting left.
Do
Eye-centered. Shifted right by about 6 units (one sixth of the triangle's width), so the mass sits in the middle.
Focus rings and hover states
Every interactive element needs a visible keyboard focus state and, on devices with a pointer, a hover state. These are not decoration; they answer "where am I?" and "what can I click?". Removing the browser's focus outline (outline: none) without replacing it is one of the most common accessibility failures on the web. Use :focus-visible so the ring appears for keyboard users but not on every mouse click, make it at least 2px, offset it from the element, and give it enough contrast against both the element and the background (WCAG 2.2 adds specific focus appearance guidance). This course uses a 2px blue outline with a 2px offset; press Tab to see it.
Don't
Invisible focus. A keyboard user pressing Tab has no idea where they are.
Do
Visible, offset focus. Note the ring's radius follows the nested radius rule (outer = inner + offset).
For hover: a subtle background change (one neutral step) for rows and ghost buttons, one lightness step for solid buttons, and an underline or color shift for links. Keep hover transitions fast (around 100 to 150ms) or instant; see Motion & Feel. And never put essential information only in a hover state, because touch screens have no hover.
A polish punch list
Detail
What good looks like
Truncation
Long names end in an ellipsis with the full text on hover or in detail view, never overflow or clip mid-letter.
Numbers
Tabular figures in tables and counters, so values do not jiggle as they change.
Loading
Skeletons match the final layout so nothing jumps when content arrives.
Icons
One set, one size scale, optically centered with labels.
Polish is where solo makers can beat big teams: you have no hand-off where details get lost. Keep a running "polish list" file. Whenever you notice a small flaw while working on something else, add a line instead of fixing it immediately; then spend one session a week clearing it. Loren Brichter and Mike Matas, both famous for small-team or solo polish, are good evidence that care shows.
Do
Make every repeated element pixel-identical to its siblings.
Snap to whole pixels in design and code.
Use :focus-visible with a clear 2px offset ring.
Give every interactive element a hover state on pointer devices.
Don't
Remove focus outlines without a replacement.
Use 0.5px lines on 1x screens.
Center play and arrow icons by their bounding box.
Hide essential information in hover-only tooltips.
In the wild
TweetieLoren Brichter, 2008 to 2010
A one-person Twitter client celebrated for crisp details and for introducing pull-to-refresh. Its polish set a bar that much bigger teams copied. Detail is a competitive advantage for small makers.
LinearLinear
Known for consistent focus states, keyboard navigation and pixel-precise alignment across a large app. Consistency at scale comes from a small set of strictly reused components.
Common mistakes
Fixing polish one screen at a time
You tweak spacing directly on a screen until it looks right.
Fix it in the token or component, so every screen improves at once.
Polishing before structure
Pixel-perfecting is satisfying.
Polish last. A perfectly crisp icon on a screen with the wrong hierarchy is wasted work.
Check yourself
Your dividers look slightly blurry and uneven on some screens but crisp on others. The list is inside a modal centered with top: 50%; transform: translateY(-50%). Likely cause?
Percentage transforms on odd-sized elements land on fractional pixels. Center with flexbox or grid on the parent instead, or round the position, and the lines snap back to crisp.
Exercise 18.1 45 minutes · on your own product
The polish sweep
Unplug your mouse (or ignore it) and Tab through your main flow. Note every element where focus is invisible or unclear.
Hover every interactive element with a pointer. Note any with no hover state.
Zoom a screenshot to 400% and look at every line and icon for blur.
Run the polish punch list table above. Fix the top five issues in shared components.
You're done when: you can complete your main flow by keyboard with a visible focus at every step, and your polish list's top five are fixed.
Beginner
Competent
Strong
Finds issues; fixes on one screen.
Focus and hover fixed in components; lines crisp.
Polish list is a standing weekly habit; punch list run on every new screen.
19
The visual review: tidy a screen in five passes
A worked example that uses every chapter of this guide
Do not try to fix everything at once. Tidy a screen in five passes, from the most structural to the most cosmetic: content, layout, spacing, hierarchy, then color and details. Each pass makes the next one easier.
The order matters. If you start by picking colors, you will polish elements that pass 1 deletes. If you fix hierarchy before spacing, the groups will be wrong and your type sizes will compensate for it. Structural decisions first, cosmetic decisions last. Here is the whole process on one screen, a messy settings page like the one in the warm-up.
Start. A realistic first draft of a notes app's settings. Squint: five boxes and four buttons compete, and the red "upgrade" nag is the loudest thing on the screen.Pass 1: content and order. Before touching any pixel, decide what belongs on the screen and in what order. This pass removes about a third of the elements, and no styling skill is needed.Pass 2: layout and alignment. A simple two-column grid: labels on one edge, values on the other. Already it reads as a list instead of a scatter.Pass 3: spacing and grouping. Three steps from the spacing scale (small, medium, large) make the sections visible with no borders at all.Pass 4: hierarchy and type. Emphasize by de-emphasizing: quiet headings and values, regular-weight labels, one title. The squint test now shows the title, then three clean groups.Pass 5: color, shape and details. Grouped surfaces with a consistent radius, hairline dividers, one accent for the on-state and the plan, chevrons as affordances, red only where it means danger.
The five passes, as a procedure
Content and order (chapters 1 to 3). Write the screen's purpose in one sentence. Remove anything that does not serve it. Group what remains, order groups by frequency or importance, and put destructive or rare actions last.
Layout and alignment (chapters 4, 6, 8, 9). Choose the layout pattern and grid. Snap everything to as few edges as possible. Check the narrow width.
Spacing and grouping (chapters 5 and 7). Apply three steps from your scale: within items, between items, between groups. Remove borders that spacing now makes unnecessary.
Hierarchy and type (chapters 2 and 3, and Typography). Rank: one focal point, three text levels. De-emphasize labels and metadata. Squint.
Color, shape and details (chapters 10 to 18). Neutrals first, one accent for interaction, semantic colors only for state. Radius and elevation tokens. Icons from one set. Focus and hover states. Polish punch list.
Key idea
Structure before style. Every pass should make the screen simpler than the one before.
Checklist: visual review of one screen
1 · Content and order
2 · Layout and alignment
3 · Spacing and grouping
4 · Hierarchy
5 · Color, shape and details
For the solo creator
Run the five passes in code, not in a design tool, unless the screen is brand new. Commit after each pass. The git history becomes your before/after record, and if a pass makes things worse you can see exactly which one.
Do
Work from structure to style, one pass at a time.
Screenshot after each pass and compare side by side.
Fix problems in tokens and components, not per screen.
Stop when the checklist passes; perfect is the enemy of shipped.
Don't
Start with colors or a new font.
Fix hierarchy by adding emphasis before you have removed clutter.
Do all five passes at once in a single sitting without screenshots.
Skip the narrow-width and dark-mode checks.
In the wild
Refactoring UI case studiesWathan & Schoger
Steve Schoger's well-known design tips and redesign videos show this same order: remove, align, space, rank, then color and details. Watching someone tidy a real screen step by step is one of the fastest ways to learn.
iOS SettingsApple
The end state of our example is close to Apple's own grouped settings lists: grouped surfaces, muted section headers, values on the right, chevrons for drill-down, switches for booleans. When a platform convention fits, converging on it is not copying; it is respecting what people already know.
Common mistakes
Polishing a screen that should not exist
You start at pass 5 because it is the fun part.
Pass 1 often removes whole sections or merges screens. Always do it first.
Restyling instead of tidying
A tidy pass turns into a full redesign with a new palette and font.
The five passes use your existing tokens. A redesign is a different project.
Judging only at full size on your own monitor
That is where you work.
Check every pass at 400px, in dark mode, and blurred.
Check yourself
You have one hour to improve your app's cluttered dashboard. Which plan follows this chapter?
Structure first: removal and grouping give the biggest improvement per minute. Color and details come last and can be skipped if time runs out, because they matter least.
Connect the ideas: whole-guide recap
A tester says your app "looks cheap" but cannot say why. Which combination of causes from this guide is most likely?
"Cheap" usually means "inconsistent" and "noisy". People feel many small mismatches as low quality. The cure is tokens, one icon set, a radius and elevation scale, and a protected accent (chapters 11, 14, 15, 16, 18).
Exercise 19.1 2 to 3 hours · on your own product (the capstone of this guide)
Tidy your main screen in five passes
Screenshot your main screen at desktop width, at 400px and in dark mode. This is your "start".
Run pass 1 to pass 5, committing and screenshotting after each.
Run the visual review checklist above and tick what passes; fix what does not, if time allows.
Lay out the six screenshots in a row with one sentence per pass, like the worked example.
Show the start and end versions to one person who uses your product, without explanation. Ask which is easier to use and why.
You're done when: you have a six-step before/after strip, the checklist is at least 80% ticked, and the change is shipped.
Beginner
Competent
Strong
Improves the screen, but passes are mixed together and not documented.
Five documented passes; checklist mostly passes; shipped.
All of that, plus the improvements live in tokens and components that improved other screens too, and a user confirmed the result.
Wrap-up
Ten things to remember
Visual design is communication: every property should group, rank, guide or signal. Everything else is noise with a cost.
Hierarchy is the order of the eye. Use the fewest levers that give a clear ranking, and check it by squinting.
One focal point per screen, and one solid primary button.
Emphasize by de-emphasizing: quiet labels, metadata, borders and neighbors before making anything louder.
Decide structure once: a grid, a spacing scale, a radius scale, elevation tokens. Then only choose from them.
Space inside a group must be smaller than space between groups. Spacing is the best divider you have.
Align to few edges and trust your eye over the bounding box when they disagree.
Palettes are mostly neutrals, with one rare accent and semantic colors for state. Build them in OKLCH so lightness means lightness.
Never let color carry meaning alone, and design dark mode as its own palette: lighter surfaces for elevation, calmer accents, off-white text.
Tidy in five passes, structure before style: content, layout, spacing, hierarchy, then color and details.
Self-assessment: I can…
Practice assignment for the next two weeks
Thirty to sixty minutes a day, all on your own product. The goal is a product whose visual system lives in tokens and whose main screens pass the visual review checklist.
Day
Practice
Output
1
Four-jobs audit and squint test of your three main screens (Ex. 1.1, 2.1)
Marked-up and blurred screenshots
2
Subtract to emphasize on one card or row (Ex. 3.1)
Progression strip
3
Grid: implement a CSS grid on one screen (Ex. 4.1)
Edge count halved
4
Spacing tokens on the main screen (Ex. 5.1)
Tokens file, values replaced
5
Alignment and white space hunt (Ex. 6.1, 7.1)
Fixed icon offsets, one space change
6
Responsive rules and density decision (Ex. 8.1, 9.1)
Behavior table, density paragraph
7
Rest and review: re-read your swipe file; add five screens with one sentence each
Updated swipe file
8
Translate colors to OKLCH and merge duplicates (Ex. 10.1)
Color table
9
Build your palette as tokens (Ex. 11.1)
Palette tokens, contrast checked
10
Grayscale and simulator pass; dark theme (Ex. 12.1, 13.1)
Both themes, no color-only meaning
11
Radius and elevation tokens (Ex. 14.1, 15.1)
Scales applied
12
Icon and image audit (Ex. 16.1, 17.1)
One icon family, jobless images gone
13
Polish sweep (Ex. 18.1)
Keyboard flow with visible focus
14
Capstone: tidy your main screen in five passes (Ex. 19.1)
Six-step strip, shipped
Reflection
At the end of the two weeks, write a short note to yourself: which pass or principle changed your product the most, which one still feels unnatural, and which screen you are now proudest of. Keep it with your swipe file; you will be surprised how much your eye changes in six months.
Reading list
Refactoring UI
Adam Wathan and Steve Schoger, 2018 · The most practical visual design book for developers who design. Read it first, with your own product open.
The Non-Designer's Design Book
Robin Williams, first edition 1994 · Contrast, repetition, alignment, proximity, explained so simply that you will never un-see them.
Grid Systems in Graphic Design
Josef Müller-Brockmann, 1981 · The classic on grids. Look at the examples more than you read the text.
The Vignelli Canon
Massimo Vignelli, 2010 · Short, opinionated, free to read online. On grids, type and the discipline of a few good choices.
Interaction of Color
Josef Albers, 1963 · Why color is relative. Do a few of the exercises with paper or a simple app; they rewire how you see.
Designing Design
Kenya Hara, 2007 · Emptiness, MUJI and the quiet power of leaving things out.
Envisioning Information
Edward Tufte, 1990 · Layering and separation, "1 + 1 = 3", and how to make dense information calm.
"A perceptual color space for image processing"
Björn Ottosson, 2020 (blog post) · The introduction of Oklab, the basis of OKLCH. Technical, but the motivation section alone is worth it.
"Designing accessible color systems"
Stripe blog, 2019 · A real team's account of building a perceptually uniform, accessible palette.
"Responsive Web Design"
Ethan Marcotte, A List Apart, 2010 · The article that started it; short and still clear.
Apple Human Interface Guidelines and Material Design 3
Apple and Google, continuously updated · Read the sections on color, dark mode, layout, icons and materials for your platform. They encode years of testing.
Next, carry this into text itself: Typography covers type scales, measure, leading and the details of type on screens, which is where most of a calm interface actually lives.