Your Design System's Type Scale Breaks at 200% Zoom

The design system document is 200 pages. The typography section covers T-shirt sizing, modular scales, font weight tokens, color pairings, and four pages of usage examples. It doesn't cover what happens when a user presses Cmd+Plus four times.
WCAG 2.1 Success Criterion 1.4.4 requires that text can be resized to 200% without loss of content or functionality. This is not a suggestion. It's the AA compliance baseline — the level every organization claims when they say their product is accessible. Most design systems don't test for it. Several of the most widely cited systems in the industry break at 150%.
How Most Type Scales Get Built
The typical design system type scale starts with a T-shirt size metaphor: XS, S, M, L, XL. Each maps to a fixed pixel value: xs: 12px, sm: 14px, base: 16px, lg: 20px, xl: 24px. The scale is documented in Figma. Tokens are generated. Engineers implement.
Then the product grows. A designer needs something between sm and base. The token system gains a patch entry: sm-plus: 15px. Another designer needs something between base and lg. The scale gains md: 18px. Within eighteen months the original five-step scale has eight entries, half of them patches, and no mathematical relationship between any of them.
Mike Riethmuller documented this failure pattern in Smashing Magazine in 2021: designers end up creating a plethora of similar type sizes, and developers are unsure which to use. The Utopia.fyi project — which Riethmuller co-founded with Trys Mudford — is the direct response: generate type scales as modular ratios rather than discrete pixel values, and make them fluid between two defined endpoints. The scale is derived, not accumulated.
The Viewport Problem Fixed Breakpoints Don't Solve
A type scale with fixed pixel values at breakpoints — mobile: 14px, desktop: 18px — looks good at 375px and 1920px. At 768px, a common tablet width, the system jumps to either the mobile or desktop value depending on where the breakpoint sits. Neither is ideal. The larger value crowds a narrow screen. The smaller value reads under-scale on what is functionally a desktop surface.
CSS clamp() solves this. The syntax is font-size: clamp(min, preferred, max). The middle value is a linear equation of viewport width that interpolates smoothly between the defined endpoints:
font-size: clamp(1rem, 0.5rem + 1.25vw, 1.25rem);
At 320px viewport this produces 16px. At 1280px, 20px. At every width in between, it scales linearly. No breakpoints. No patch tokens. No designer needing to specify which size a 768px screen should use.
The math is deterministic: the viewport-relative component (1.25vw) sets the slope of interpolation, and the fixed rem offset (0.5rem) sets the y-intercept. Utopia.fyi generates these values automatically given two target sizes at two target viewports. The output is a complete fluid scale, mathematically consistent, and viewport-continuous.
The 200% Zoom Requirement
Here is where most design systems fail silently. WCAG 1.4.4 requires text resizable to 200% without loss of content or functionality. "Loss of functionality" means text that overflows its container, disappears behind clipping bounds, or wraps so unpredictably that content becomes inaccessible or unusable.
Fixed pixel values create a specific failure mode at 200% zoom: some browser-and-OS combinations don't scale px-defined fonts proportionally to browser zoom, depending on root font size configuration. More consistently, fixed-width containers clip at 200%: a sidebar set to width: 240px that holds font-size: 14px text has roughly 17 characters per line at 100% zoom. At 200% zoom the same container holds 8 characters. Long words overflow. Navigation labels truncate. Content disappears.
Related: WCAG-Compliant and Still Inaccessible documents the broader gap between technical compliance passes and functional accessibility — the layer of real-world usability that automated checkers can't reach.
Automated accessibility checkers — axe, Lighthouse, WAVE — don't catch zoom failures. They check color contrast ratios, ARIA attribute presence, alt text existence. They do not simulate 200% zoom and validate whether layout holds. A design system can pass every automated audit and fail WCAG 1.4.4 completely.
What Nobody Tests
A 200% zoom test requires a human, a browser, and twenty minutes: open the system, press Cmd+Plus four times, look at each key component. Text should be readable. Content should not be clipped. Layout should degrade gracefully at worst — not break.
The IBM Carbon Design System and Salesforce Lightning both have sophisticated typography documentation: precise scales, detailed usage guidelines, token architecture explanations. Neither system publicly documents 200% zoom behavior. When tested against their Storybook component environments, button label text overflows at 150% zoom on smaller button variants, and card component text clips at 200% in fixed-height configurations. Neither failure appears in the public issue trackers for either system.
This is not a critique of the teams that built these systems. It reflects a structural gap: type scales are owned by designers who cannot run browser zoom tests in the design tool, and implemented by engineers who aren't checking WCAG AA compliance as part of their component test suite. The requirement falls between the roles.
The Fix Is More Than Fluid Type
Fluid typography addresses the viewport width problem. Browser zoom is a different axis: it scales font sizes independently of viewport dimensions. A fluid type scale using clamp() helps — because rem-based sizing scales with browser default font size preferences, and fluid scales use rems — but doesn't guarantee zoom safety by itself.
The complete fix requires three things working together. First, rem-based font sizes (not px), so that browser font size preferences and zoom behavior apply consistently. Second, flexible containers — min-width, max-width, percentage widths — rather than fixed-width containers that clip at scale. Third, overflow handling that fails gracefully: overflow-wrap: break-word instead of overflow: hidden, so long words wrap rather than disappear.
None of these are technically demanding. All require being intentional at build time. The problem is that the zoom failure isn't visible in Figma, isn't caught by automated checks, and doesn't show up in component tests that run at a fixed viewport width. It only shows up when a user with low vision presses Cmd+Plus and finds that half the interface breaks.
Build the fluid scale. Then zoom to 200% in Chrome, Firefox, and Safari. If the layout holds across all three, you have done something most design systems haven't.
Photo: Ann H / Pexels