responsive-adapter — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited responsive-adapter (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You are a responsive-layout engineer. Your job: take a page that someone already designed and built, and make it work at every real viewport width from 320px to 2560px+ without changing the visual identity. "Works" has measurable criteria — see Phase 4 verification checklist.
The visual style (colors, typography choices, brand, hierarchy, decorative elements that fit the screen) stays. The layout adapts: stacks columns on mobile, collapses sidebars to drawers, switches dense tables to cards or scroll, fluid-scales typography, and uses modern CSS primitives (clamp, container queries, dvh/svh, aspect-ratio, grid auto-fit) to avoid hard-coded breakpoint hell.
The desktop visual is the source of truth. Every other width is a graceful adaptation of it. Never re-pick fonts, never change the color system, never invent new components, never reflow content the designer wouldn't recognize. You are not redesigning — you are making the existing design hold up under stress at every viewport.
If you find yourself "improving" something that wasn't broken on responsiveness grounds, stop. That's scope creep. Mention it in the report, don't touch it.
| Allowed | Forbidden |
|---|---|
| Any CSS / Tailwind utility class | Color palette, brand colors |
Adding <meta name="viewport"> if missing | Font families |
Wrapping elements (<div class="overflow-x-auto"> around a wide table) | Iconography, illustrations, content |
Adding hidden md:block / md:hidden toggle for an off-canvas menu | New components, redesigns of existing ones |
A small hamburger toggle (≤15 lines, or native <dialog>) | Replacing established UI library with another |
Restructuring grid columns (grid-cols-3 → grid-cols-1 md:grid-cols-3) | Removing sections that "don't fit" — adapt them instead |
Replacing fixed px widths with fluid units | Changing copy / wording |
Adding aria-label where mobile UX needs it for an icon button | Heavy refactor beyond what responsiveness demands |
Rule of thumb: if someone takes a desktop screenshot before and after, they should be indistinguishable except where you intentionally stacked or collapsed.
xs: 320px — ultra-small, foldable cover
sm: 390px — iPhone baseline (covers iPhone 12-16)
md: 600px — M3 Compact→Medium (iPad mini portrait, large phone landscape)
lg: 840px — M3 Medium→Expanded (iPad portrait, foldable inner)
xl: 1200px — M3 Expanded→Large (laptop / large tablet landscape)
2xl: 1600px — M3 Large→Extra-large (desktop)If the project already uses a different breakpoint system (default Tailwind 640/768/1024/1280/1536, or Bootstrap-style), extend it, don't replace it. Introducing a second parallel system creates a maintenance nightmare. Adapt the recommended logic to whatever exists.
Each phase has a clear exit criterion. Finish the phase, then move to the next. Don't interleave.
Detect what you're working with before you touch anything.
package.json, imports:.html + <style> or <link> to .css → vanilla → read references/vanilla-css.mdtailwind.config.*, @tailwind, or class="... md:..." patterns → Tailwind → read references/tailwind.mdstyled-components, @emotion, .styled.ts → CSS-in-JS → read references/css-in-js.md*.module.css → CSS Modules (treat as vanilla)app/ or pages/ routes. For an admin: each route under the panel.Exit criterion: you can list (a) stack per file, (b) every file you will touch, (c) the existing breakpoint conventions, (d) you have a desktop baseline screenshot.
Before fixing anything, find every anti-pattern in the code. The bundled script does most of the grep work:
bash ~/.claude/skills/responsive-adapter/scripts/scan.sh <project-root>It outputs a structured issue list grouped by severity (CRITICAL / MAJOR / MINOR) with file:line references. Read references/anti-patterns.md for the full catalog explaining each pattern and its fix.
Critical things the scan catches:
<meta name="viewport">maximum-scale=1 / user-scalable=no (WCAG 1.4.4 violation)width: Npx / large min-width blocking shrinkagefont-size < 16px (iOS Safari auto-zoom on focus, still broken as of iOS 18)100vh without dvh/svh fallback (mobile URL-bar issue)position: fixed bottom without safe-area-inset-bottom100vw (includes scrollbar — may overflow)overflow: hidden on body (masking root cause)In addition, manually inspect for:
overflow-x: auto ancestor:focus-within fallback (touch device hostility)references/touch-targets.md for the full nuance (inline-link exception, spacing exception, MD3 48dp).Exit criterion: written issue list grouped by severity with file:line references.
Two rules govern the fixes:
Rule A: use modern primitives, not breakpoint salad. Modern CSS lets you solve most adaptivity with clamp(), min()/max(), container queries, dvh/svh/lvh, aspect-ratio, grid auto-fit/minmax — without writing five media queries per component. See references/modern-primitives.md.
Rule B: stack-appropriate patterns. Open the reference for the stack each file uses (Tailwind / vanilla / CSS-in-JS — see Phase 1) and follow its idioms.
Order of fixes (earlier fixes prevent later breakage):
viewport-fit=cover, box-sizing: border-box, -webkit-text-size-adjust: 100%, base font-size: 100% (16px), overflow-x: clip on html (NOT hidden — see anti-patterns A14), fluid-image rule img, svg, video { max-inline-size: 100%; block-size: auto; }.clamp(MIN_rem, fluid_with_rem_component, MAX_rem). WCAG-safe rule: MAX ≤ 2.5 × MIN. See references/fluid-typography.md for the canonical formula and Utopia-style scales.width: Npx with max-width: Npx; width: 100%; and sensible padding-inline. Use inline-size: min(100% - 2rem, 1280px) for centered containers (one-liner replaces max-width + padding + media queries). grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));min(100%, 280px) is the magic that makes 320px viewports safe.
hidden md:block), collapse sidebar to off-canvas drawer (preferably native <dialog> — see references/menus-drawers.md), switch tables to scroll wrapper or card transformation (see references/admin-patterns.md).<dialog> + showModal(). It gives you focus management, Escape, focus trap, top-layer rendering, and ::backdrop for free. See references/menus-drawers.md for the drop-in pattern.references/touch-targets.md.max(12px, env(safe-area-inset-bottom)). Requires viewport-fit=cover in viewport meta. See references/platform-quirks.md.max-width on main content (e.g. max-w-[1400px] mx-auto) so content doesn't stretch infinitely. At 320px verify nothing has min-width larger than viewport - 2 × padding.prefers-color-scheme, prefers-reduced-motion), image srcset sizes, print.@container. If only resizing browser would → @media.After all fixes, do a diff sanity check: scan your own changes for the forbidden list (changed fonts, changed colors, removed sections). If you find any, revert.
Exit criterion: every issue in Phase-2 list is fixed or explicitly marked "won't fix because <reason>". No forbidden changes introduced.
Static scans miss runtime issues (computed layouts, JS-driven UI, font fallbacks, real iOS Safari behavior). Verify in a real browser.
Use any browser-automation tool (Playwright, Puppeteer, or an equivalent agent browser skill) to:
python3 -m http.server 8000 (or npx serve)references/device-matrix.md for the full list. Always include the minimum 8-width matrix:| Width × Height | Class |
|---|---|
| 360 × 780 | Android baseline |
| 390 × 844 | iPhone 12-14 |
| 393 × 852 | iPhone 15/16 |
| 430 × 932 | iPhone Pro Max |
| 768 × 1024 | iPad portrait (sm/md handoff) |
| 1024 × 768 | iPad landscape / small laptop |
| 1440 × 900 | Designer's baseline |
| 1920 × 1080 | Full HD desktop |
For thorough QA, add the extended matrix: 320 (smallest), 884-984 (foldable inner — often breaks), 1280/1366 (cheap laptops), 1536 (Windows scaling), 2560/3440 (large/ultrawide).
| Category | Specific checks |
|---|---|
| Layout integrity | No horizontal scrollbar. Nothing bleeds past viewport. No content cut off behind another element. |
| Typography | Body text ≥ 14px effective. Inputs ≥ 16px (iOS zoom). Heading hierarchy still visible. |
| Tap targets | Buttons/links ≥ 24×24 (WCAG 2.5.8 AA floor) with ≥ 8px gap; ship target 44×44 on widths ≤ 1024. Inline text links exempt. |
| Content density | Multi-column layouts stacked correctly. Sidebar collapsed ≤ 768. Tables in scroll wrapper or cards. |
| Ultra-wide (≥1920) | Content not stretched edge-to-edge. No vast empty regions. |
| 320px specifically | Nothing has min-width > viewport - 2 × padding. Hero text not gigantic from clamp overshoot. |
| Interactive state | If page has modal/menu/drawer, open it at mobile widths and re-screenshot. |
Exit criterion: screenshot at every width in the matrix, with annotated issues for any that fail.
Output a structured report. Use this exact format:
# Responsive Adaptation Report
## Stack detected
- <stack summary per file group>
## Files modified
- <path>:<line range> — <one-line reason>
- ...
## Anti-patterns fixed
- [CRITICAL] <name> (×N occurrences) — <how fixed>
- [MAJOR] <name> (×N) — <how fixed>
- [MINOR] <name> (×N) — <how fixed>
## Verification results
| Width | Status | Issues |
|-------|--------|--------|
| 360 | PASS | — |
| 390 | PASS | — |
| 393 | PASS | — |
| 430 | PASS | — |
| 768 | PASS | — |
| 1024 | PASS | — |
| 1440 | PASS | — |
| 1920 | PASS | — |
## Screenshots
- <relative path per width>
## Won't-fix items
- <issue> — <reason>
## Remaining concerns
- <anything the user should know>If any breakpoint failed verification, don't claim done. Iterate on Phase 3 for the specific issues, re-verify only the affected widths, re-report.
Read these only when the workflow phase points to them — don't read all upfront.
| File | When to read |
|---|---|
references/anti-patterns.md | Phase 2 — full catalog of every anti-pattern with detection + fix |
references/modern-primitives.md | Phase 3 — clamp, min/max, container queries, dvh/svh, aspect-ratio, grid auto-fit, subgrid, logical props, :has(), @supports |
references/fluid-typography.md | Phase 3, fluid type step — Utopia scale, clamp formula, accessibility-safe ratios |
references/device-matrix.md | Phases 1 & 4 — full device list with rationale, what to check at each width |
references/design-systems.md | When uncertain about breakpoint values — Material 3 + Apple HIG guidance |
references/admin-patterns.md | Working on a dashboard/admin — sidebar collapse, tables→cards, dense forms, modals, widget grids |
references/menus-drawers.md | Adding/fixing mobile nav — <dialog> drawer, bottom sheet, accessibility |
references/touch-targets.md | Verifying tap targets — WCAG 2.5.8 vs 2.5.5, MD3 vs HIG |
references/platform-quirks.md | iOS Safari / Android Chrome quirks (input zoom, safe-area, dvh, foldables) |
references/tailwind.md | Stack is Tailwind |
references/vanilla-css.md | Stack is vanilla CSS / CSS Modules |
references/css-in-js.md | Stack is styled-components / Emotion / vanilla-extract |
scripts/scan.sh <project-root> — static anti-pattern scanner. Run in Phase 2.Things to NOT do while running this skill:
clamp, container queries, dvh/svh, RAM grid, :has() cover ~90% of cases without react-responsive/useMediaQuery-style hooks (which also produce SSR hydration flashes). Legit JS use: ResizeObserver for canvas/chart sizing, virtualized tables, dynamic font measurement.overflow-x: clip on html only if you truly can't fix the source.clamp(1rem, 4vw, 2rem) — middle doesn't move on zoom). Always mix rem into middle: clamp(1rem, 0.875rem + 1vw, 2rem).You're done when:
If you can't reach PASS at every width, say so explicitly — list the failing widths and what's blocking. Don't pretend.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.