From design-qa
Use when capturing screenshots of a deployed web page across many viewport widths to find layout breaks. Specifically catches "grey area" widths (700, 900, 1180) where designs commonly fail between standard breakpoints. Sweeps 18 widths × light/dark/reduced-motion themes by default.
npx claudepluginhub my-stacks/claude-code-skills --plugin design-qaThis skill uses the workspace's default tool permissions.
You're capturing the responsive screenshot matrix for a design QA review.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Analyzes multiple pages for keyword overlap, SEO cannibalization risks, and content duplication. Suggests differentiation, consolidation, and resolution strategies when reviewing similar content.
Share bugs, ideas, or general feedback.
You're capturing the responsive screenshot matrix for a design QA review.
The matrix is determined by ${user_config.breakpointPreset}:
fast (5 widths × 1 theme = 5 screenshots):
375, 768, 1024, 1440, 1920
agency-default (18 widths × 3 themes = 54 screenshots):
280, 320, 360, 375, 390, 414, 480, 600, 700, 768,
834, 900, 1024, 1180, 1280, 1440, 1920, 2560
thorough (21 widths × 3 themes = 63 screenshots):
agency-default + 384 (foldable outer), 3840 (4K)
(Earlier versions of this doc listed 844x390 landscape and print media for thorough; those aren't implemented in breakpoint-sweep.mjs and the doc has been pulled back to match the runner's actual matrix.)
Why these widths: 280 covers folded foldables; 320/360/375/390/414 cover the common phone range including iPhone mini through Pro Max; 480 catches large phone landscape; 600/700 are the foldable-inner / awkward-tablet zone where designs frequently fail; 768/834/900 cover the iPad-portrait-to-landscape transition; 1024/1180/1280/1440/1920/2560 cover the laptop-to-large-monitor spectrum.
For each width, the runner captures three theme variants:
prefers-color-scheme: dark).prefers-reduced-motion: reduce) — light theme.The fast preset captures only variant 1 (light, default).
A separate focus-state pass over interactive elements happens during the run-axe.mjs accessibility audit, not in the responsive sweep.
ALWAYS, before each screenshot:
await page.waitForLoadState('networkidle').await page.evaluate(() => document.fonts.ready).*, *::before, *::after { animation-duration: 0s !important; animation-delay: 0s !important; transition-duration: 0s !important; transition-delay: 0s !important; }.The script ${CLAUDE_PLUGIN_ROOT}/bin/run-sweep.sh <url> <preset> handles all of this (delegating to breakpoint-sweep.mjs). It:
.claude/design-qa/reports/<timestamp>/screenshots/<width>-<theme>.png (one per width × theme; interaction states are exercised in the axe pass, not here).manifest.json with one entry per screenshot — the entries reference the same <width>-<theme>.png filenames and include the in-page horizontal-overflow check result.You should call this script rather than driving Playwright MCP one width at a time — it's much faster and uses far fewer tokens.
Read manifest.json. For each entry where horizontalOverflow: true, this is a Blocker if the width is ≤ 1440. Surface them.
For each width, view the screenshots side by side (light/dark) and look for:
Return a summary with: