Responsive
Make the target work correctly at every screen size, then prove it. This is a mechanical discipline with a pass/fail gate, not a matter of taste — a layout either survives 320px and 400% zoom or it does not.
Responsive is not "it has breakpoints." A page with md: and lg: variants everywhere can still fail every gate below. What counts is measured behavior at real widths.
The gate
The work is done when all seven hold on every surface in scope. Report each one explicitly; never claim "responsive" without walking this list.
- No horizontal scroll at any width from 320px upward. Not hidden — absent.
- Content reflows at 320px with nothing lost or unreachable (WCAG 1.4.10). Two-dimensional content — data tables, maps, diagrams, code — may scroll inside its own container.
- Usable at 400% zoom on a 1280px viewport, which is the same 320 CSS px reflow requirement reached the other way. Test both; they expose different bugs.
- Every interactive target is at least 24×24 CSS px (WCAG 2.2 AA, SC 2.5.8), or has 24px of clear spacing around it. Primary touch actions get 44×44.
- Body text is at least 16px on mobile. Below that, iOS Safari zooms the whole page when a field takes focus.
- No fixed heights on anything containing text. Text grows with translation, user font settings, and long content.
- No content under the notch, home indicator, or browser chrome on devices that have them.
A gate item you could not verify is reported as unverified, never as passed.
Procedure
1. Scope and map
Name the surfaces in scope. If the user said "the whole app," list the routes and confirm the list rather than sweeping silently — a full app sweep is many surfaces, and they should know what you are about to touch.
For each surface, note which of its regions are structural (page shell, navigation, main grid) and which are components that get reused in different-sized slots. Structural regions belong to media queries; reusable components belong to container queries. Getting this split right prevents most of the churn.
2. Sweep
Inspect each surface in the preview at this ladder, in this order:
| Width |
What it represents |
What it catches |
| 320px |
WCAG reflow floor, smallest real phone |
overflow, unbreakable strings, cramped targets |
| 390px |
the common phone |
real-world mobile layout |
| 768px |
tablet portrait |
the awkward middle where layouts collapse badly |
| 1024px |
tablet landscape, small laptop |
premature desktop layout |
| 1440px |
standard desktop |
the intended design |
| 1920px+ |
large desktop |
unbounded line lengths, stretched containers |
Then two more passes that are not widths:
- 400% zoom at 1280px. Catches what narrow-viewport testing misses, because zoom scales text and spacing together.
- The in-between drag. Move slowly through the range rather than sampling the six fixed widths. Breakage clusters just before and after breakpoints, which is exactly where fixed-width testing has blind spots.
At each stop, check in this order: horizontal overflow first (it invalidates everything else), then reading order and grouping, then touch targets, then text truncation and wrapping, then images and media, then sticky and fixed elements, then interactive states.
Record every failure with its width, its file, and the element. A failure without a location is not actionable.
3. Diagnose
Route each failure through reference/failures.md, which maps symptoms to causes to fixes. Find the actual cause before editing. The same symptom — horizontal scroll — has a dozen distinct causes, and the fix for one makes another worse.
Never apply overflow-x: hidden to body or html. It hides the symptom, leaves the offending element still overflowing and unreachable, and silently breaks position: sticky on every descendant. If you find it already there, treat it as a bug to remove and fix underneath, not as a solution.
4. Fix
- Mobile-first. Base styles describe the smallest screen; every variant adds capability upward. In Tailwind, unprefixed utilities are the mobile state and
md: / lg: layer on top. Writing desktop styles as the base and overriding them downward is how a codebase accumulates specificity fights.
- Fix at the source. A width constraint belongs on the element that owns the width, not on an ancestor patched to contain it.
- Prefer the intrinsic solution to the breakpoint. Techniques in reference/techniques.md — fluid
clamp() type, intrinsic grid, container queries — remove whole classes of breakpoint. Reach for a media query when the layout genuinely changes structure, not to nudge a value.
- Preserve the design. This skill makes the existing design work at every size. If the layout needs a different structure on mobile because the experience should genuinely differ there, that is a design decision — say so and hand off, do not redesign under the banner of a responsive fix.
- One concern per change. Overflow fixes, target-size fixes, and type-scale fixes touch different properties; batching them makes regressions untraceable.
5. Verify
Re-sweep the full ladder from step 2 on everything you touched. A fix that resolves 320px and breaks 768px is common enough that the re-sweep is not optional.
Then report the gate: each of the seven items with pass, fail, or unverified, and for anything not passing, what remains and where. See reference/checklist.md for the full verification protocol and the report format.
Scope boundaries
- Not visual redesign. Preserve the identity, palette, type, and component character. If they need to change, that is the
art-direction skill's job.
- Not a native-app skill. This covers web and mobile web. Native iOS/Android layout follows platform conventions instead.
- Not performance work, except where a responsive decision causes it: oversized images served to phones, layout shift from unreserved media, and hidden-but-loaded desktop markup are in scope precisely because they are responsive failures.
1---2name: responsive3description: Use when the user wants an app, site, page, or component to work correctly on every screen size — "make it responsive", "fix it on mobile", "it breaks on my phone", "it doesn't look right on tablet", "there's horizontal scrolling", "the layout overflows", "make it work on small screens", "test it at different breakpoints", "adapt it to any device". Covers auditing every width from 320px up, diagnosing overflow and reflow failures, applying fluid type and container queries, meeting touch-target and zoom accessibility requirements, and verifying the result against a pass gate. This is execution and verification rather than visual redesign — use it to make a layout actually work at every size, not to decide what the experience should be.4---56# Responsive78Make the target work correctly at every screen size, then prove it. This is a mechanical discipline with a pass/fail gate, not a matter of taste — a layout either survives 320px and 400% zoom or it does not.910**Responsive is not "it has breakpoints."** A page with `md:` and `lg:` variants everywhere can still fail every gate below. What counts is measured behavior at real widths.1112## The gate1314The work is done when all seven hold on every surface in scope. Report each one explicitly; never claim "responsive" without walking this list.15161. **No horizontal scroll** at any width from 320px upward. Not hidden — absent.172. **Content reflows at 320px** with nothing lost or unreachable (WCAG 1.4.10). Two-dimensional content — data tables, maps, diagrams, code — may scroll inside its own container.183. **Usable at 400% zoom** on a 1280px viewport, which is the same 320 CSS px reflow requirement reached the other way. Test both; they expose different bugs.194. **Every interactive target is at least 24×24 CSS px** (WCAG 2.2 AA, SC 2.5.8), or has 24px of clear spacing around it. Primary touch actions get 44×44.205. **Body text is at least 16px on mobile.** Below that, iOS Safari zooms the whole page when a field takes focus.216. **No fixed heights on anything containing text.** Text grows with translation, user font settings, and long content.227. **No content under the notch, home indicator, or browser chrome** on devices that have them.2324A gate item you could not verify is reported as unverified, never as passed.2526## Procedure2728### 1. Scope and map2930Name the surfaces in scope. If the user said "the whole app," list the routes and confirm the list rather than sweeping silently — a full app sweep is many surfaces, and they should know what you are about to touch.3132For each surface, note which of its regions are structural (page shell, navigation, main grid) and which are components that get reused in different-sized slots. Structural regions belong to media queries; reusable components belong to container queries. Getting this split right prevents most of the churn.3334### 2. Sweep3536Inspect each surface in the preview at this ladder, in this order:3738| Width | What it represents | What it catches |39|---|---|---|40| **320px** | WCAG reflow floor, smallest real phone | overflow, unbreakable strings, cramped targets |41| **390px** | the common phone | real-world mobile layout |42| **768px** | tablet portrait | the awkward middle where layouts collapse badly |43| **1024px** | tablet landscape, small laptop | premature desktop layout |44| **1440px** | standard desktop | the intended design |45| **1920px+** | large desktop | unbounded line lengths, stretched containers |4647Then two more passes that are not widths:4849- **400% zoom at 1280px.** Catches what narrow-viewport testing misses, because zoom scales text and spacing together.50- **The in-between drag.** Move slowly through the range rather than sampling the six fixed widths. Breakage clusters just before and after breakpoints, which is exactly where fixed-width testing has blind spots.5152At each stop, check in this order: horizontal overflow first (it invalidates everything else), then reading order and grouping, then touch targets, then text truncation and wrapping, then images and media, then sticky and fixed elements, then interactive states.5354Record every failure with its width, its file, and the element. A failure without a location is not actionable.5556### 3. Diagnose5758Route each failure through [reference/failures.md](reference/failures.md), which maps symptoms to causes to fixes. Find the actual cause before editing. The same symptom — horizontal scroll — has a dozen distinct causes, and the fix for one makes another worse.5960**Never apply `overflow-x: hidden` to `body` or `html`.** It hides the symptom, leaves the offending element still overflowing and unreachable, and silently breaks `position: sticky` on every descendant. If you find it already there, treat it as a bug to remove and fix underneath, not as a solution.6162### 4. Fix6364- **Mobile-first.** Base styles describe the smallest screen; every variant adds capability upward. In Tailwind, unprefixed utilities are the mobile state and `md:` / `lg:` layer on top. Writing desktop styles as the base and overriding them downward is how a codebase accumulates specificity fights.65- **Fix at the source.** A width constraint belongs on the element that owns the width, not on an ancestor patched to contain it.66- **Prefer the intrinsic solution to the breakpoint.** Techniques in [reference/techniques.md](reference/techniques.md) — fluid `clamp()` type, intrinsic grid, container queries — remove whole classes of breakpoint. Reach for a media query when the layout genuinely changes structure, not to nudge a value.67- **Preserve the design.** This skill makes the existing design work at every size. If the layout needs a different structure on mobile because the experience should genuinely differ there, that is a design decision — say so and hand off, do not redesign under the banner of a responsive fix.68- **One concern per change.** Overflow fixes, target-size fixes, and type-scale fixes touch different properties; batching them makes regressions untraceable.6970### 5. Verify7172Re-sweep the full ladder from step 2 on everything you touched. A fix that resolves 320px and breaks 768px is common enough that the re-sweep is not optional.7374Then report the gate: each of the seven items with pass, fail, or unverified, and for anything not passing, what remains and where. See [reference/checklist.md](reference/checklist.md) for the full verification protocol and the report format.7576## Scope boundaries7778- **Not visual redesign.** Preserve the identity, palette, type, and component character. If they need to change, that is the `art-direction` skill's job.79- **Not a native-app skill.** This covers web and mobile web. Native iOS/Android layout follows platform conventions instead.80- **Not performance work**, except where a responsive decision causes it: oversized images served to phones, layout shift from unreserved media, and hidden-but-loaded desktop markup are in scope precisely because they are responsive failures.