In a design system, how do you reconcile content-driven breakpoints with the few named breakpoints that every product team shares?
answer
- where content breaks, not popular screens
- two altitudes of breakpoint
- shell and templates versus one component
- component fixes itself against its own width
- high bar to add a shared one
basics
~20 sPlace the few shared breakpoints where the system's shell and page templates actually break, not at device widths. When one component's content breaks elsewhere, fix it inside that component against its own width instead of adding another shared breakpoint.
solid answer
~50 sA **device-driven** breakpoint copies a popular screen width; a **content-driven** one sits where real content stops working. Content-driven is the right principle, but applied literally across a design system it turns every component's quirk into a new shared breakpoint. The resolution is two altitudes. The system keeps a few named window-width classes, placed where the **app shell and page templates** break when resized with real content. Everything else is a **component threshold**: the component changes its own arrangement when *its* available width cannot fit its content, and its spec documents that. In a telecom app, a plan-comparison table that breaks between `medium` and `expanded` becomes stacked plan cards below the width it needs, rather than gaining a global `medium-plus`. A width is promoted to the shared list only when several templates break structurally in the same range.
go deeper
Recall that content-driven breakpoints sit where real content breaks, while device-driven ones copy popular screen widths.
Explain the two altitudes: shared window-width classes for the shell and templates, and component-owned thresholds measured against the component's own width.
Show how you would triage a layout break reported between two shared breakpoints, and keep the shared list from growing with every bug.
Set the bar for promoting a width to the shared list, weighing the cross-platform design and testing cost of every added range.
## Two ways to choose where layouts change A **device-driven breakpoint** is a width taken from hardware: the width of a popular phone, a common tablet, a standard laptop screen. A **content-driven breakpoint** is a width found by widening and narrowing the real content until it stops working: a line gets too long, a row of plan prices no longer fits, a label wraps into an awkward stack. | | Device-driven | Content-driven | |---|---|---| | Where the value comes from | Screen sizes of popular hardware | The width where real content breaks | | What it protects | A handful of devices at their exact widths | Every width, because the fix sits where the problem is | | How it ages | Revisited as hardware changes | Changes only when the content changes | | Main risk | Layouts that break between device widths | A different breakpoint for every piece of content | Content-driven is the better principle, but taken literally at the scale of a design system it creates its own problem: if every screen and component adds the width where *its* content breaks, the shared list grows without bound and teams stop agreeing on what "medium" means. ## Two altitudes resolve the tension Breakpoints live at two altitudes, and each is content-driven in its own way. 1. **System breakpoints (window-width classes).** A few named ranges where the **app shell and page templates** change structure: navigation moves, a second pane appears, a template gains a column. They are content-driven with respect to the shell's own content: the system team resizes the real templates and navigation and places the thresholds where those break. 2. **Component thresholds.** Widths at which **one component** changes its own arrangement, found by resizing that component with real data. They stay inside the component, are expressed against the component's own available width, are documented in its spec, and are not added to the shared list. With that split the shared list stays short and stable, and every local content problem still gets a fix at exactly the width where it occurs. ## A worked example In a telecom self-service app, the plan-comparison table shows four plans as columns with price, data allowance and roaming terms. At a width between the system's `medium` and `expanded` thresholds, the four columns no longer fit. - **Weak fix:** add a global `medium-plus` breakpoint. Every team inherits a fourth range that means nothing to their screens and must now be designed and tested. - **Weak fix:** move the `expanded` threshold so it lands on the table's width. The shell's navigation and two-pane layouts, tuned to the old value, now switch at the wrong place. - **Good fix:** the comparison table switches to stacked plan cards whenever *its own* width cannot fit the columns. It then works in the main column, in a narrower slot and on any window. ## When a new shared breakpoint is justified Promote a width to the shared list only when: - several page templates break **structurally** in the same range, not one component; - the fix is a change of arrangement at shell level (navigation, panes, template columns) that components cannot solve locally; - the system can support the extra range in design files, code, documentation and testing on every platform. Each extra shared range adds a layout variant to specify and test on every screen, so the bar is deliberately high. ## Finding the system's values 1. Build the real shell and two or three representative templates with realistic data, including long plan names and the longest supported translations. 2. Resize slowly from the narrowest supported width to the widest, noting every width where something breaks. 3. Sort the notes: breaks that belong to the shell become candidates for shared thresholds, and breaks that belong to one component become that component's own thresholds. 4. Name the resulting ranges, publish their values, and then check that common window widths, including split-screen and zoomed windows, fall sensibly into them. The last step is where device and window data belong: as a **check** on content-driven values, not as their source. If a very common width sits right on a threshold, nudging it within the content's tolerance avoids layouts flipping on tiny resizes. ## Pitfalls - Copying the widths of this year's popular devices into the shared list. - Adding a shared breakpoint for every reported layout bug. - Keeping a component's thresholds undocumented, so no one can predict how it behaves in a new slot. - Testing with short placeholder text, which places every threshold too low.
- Where does device or window-size data belong when choosing breakpoints, if not as the source?As a check. After placing thresholds where the shell's content breaks, compare them with the widths real users' windows actually have, including split-screen and zoomed windows. If a very common width sits right on a threshold, users see layouts flip on small resizes, so nudging the value within what the content tolerates is reasonable.
- How does realistic content change where content-driven breakpoints fall?Placeholder text is short and tidy; real plan names, prices with promotional notes and translated labels are longer, so content breaks at wider widths than a mock-up suggests. Resizing with the worst realistic content, including the longest supported translations, places thresholds where users will actually hit them, especially for component thresholds.
saying these in an interview costs you the question
- Breakpoints should be set at the widths of the most popular devices.
- Every content break deserves a new shared, named breakpoint.
- Shift the nearest shared breakpoint so it lands on one component's problem width.
- Content-driven means the content team chooses the breakpoint values.