audit-responsive — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited audit-responsive (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.
Comprehensive audit of responsive design across all viewport sizes. Detects layout issues that break on phones, tablets, and intermediate sizes.
/audit:responsive — audit only, print results/audit:responsive <path> — scope to a directory (e.g., src/components/)/audit:responsive --fix — auto-fix issues after audit/audit:responsive --report — save report to _local/reports/audit-responsive-<YYYY-MM-DD>.mdRead project config to determine what responsive system is in use:
| Check | How | Records |
|---|---|---|
| Framework | package.json: next, react, vue, angular, svelte, astro. index.html for static. | Framework |
| CSS approach | package.json: tailwindcss, styled-components, emotion. Glob for *.module.css, *.scss. | CSS system |
| Tailwind version | If Tailwind: check version in package.json. v3 uses tailwind.config.js, v4 uses @theme in CSS. | Tailwind version |
| Breakpoints | If Tailwind: use defaults (sm:640, md:768, lg:1024, xl:1280). If custom CSS: grep for @media queries and extract breakpoint values. | Breakpoint list |
| Viewport meta | Grep HTML files / layout files for <meta name="viewport". | Present/missing |
| Email template | Check for <table layout patterns, mso- conditionals, inline styles only. | Is email? |
Print detected setup:
Project: [name]
Type: Next.js 15 + React 19 + Tailwind 4
Breakpoints: sm:640 md:768 lg:1024 xl:1280
Scope: [full project or specified path]The #1 mobile layout killer. On a 375px phone, padding: 48px on each side leaves only 279px for content.
How to search:
padding: with values containing 48px, 40px, 36px, or higher horizontal valuespx-12, px-10, px-8 WITHOUT responsive prefixes (no sm:, md:, lg: before them)padding-left: and padding-right: with fixed values > 24pxFindings:
section-px, @apply, CSS class)Anti-hallucination: Only report findings from actual grep results with file:line evidence. If grep returns 0 matches, report "no instances found."
Flex/grid layouts that don't stack on mobile cause horizontal scroll.
How to search:
display: "flex" or display: flex WITHOUT flex-direction: column or flex-wrap nearbyflex: with fixed basis values like "0 0 50%", "0 0 40%", "1 1 60%"flex class WITHOUT flex-col or flex-wrap on the same elementgridTemplateColumns: with fixed multi-column values like "1fr 1fr", "repeat(2, 1fr)", etc.flex-col lg:flex-row, flex-col md:flex-row, grid-cols-1 md:grid-cols-2Findings:
xl: when content overflows at md:)Anti-hallucination: For each finding, verify by reading the actual element's full className + style props. A flex container with flex-wrap is acceptable.
Elements with fixed pixel widths that exceed mobile viewport.
How to search:
width: with values > 400px (inline styles)w-[ with values > 400px (Tailwind arbitrary values)maxWidth: or max-width: with values > 400px that lack responsive alternativesminWidth: or min-width: with values > 300pxFindings:
width > viewport (375px) without responsive overridemaxWidth > 600px without responsive reductionmaxWidth with margin: "0 auto" is usually fine (content just gets narrower)Multi-column grids that don't reduce columns on mobile.
How to search:
grid-cols-2, grid-cols-3, grid-cols-4 WITHOUT responsive prefixgridTemplateColumns: with repeat(N, 1fr) where N > 1gridTemplateColumns: "1fr 1fr" etc..responsive-grid or equivalent CSS utility existsFindings:
Mobile navigation is essential — desktop nav links don't fit on 375px.
How to search:
<nav, TopNav, Header, Navbar)hidden lg:flex pattern on nav linksmenuOpen state, toggle function, body scroll lockposition: fixed or position: sticky on mobile menu — verify no ancestor has overflow: hidden or backdrop-filter (both break position: fixed/sticky)Findings:
backdrop-filter (creates containing block, clips fixed positioning)Anti-hallucination: Read the actual nav component file. Don't assume a hamburger exists — verify by finding the toggle button/icon.
Elements that cause horizontal scroll on mobile.
How to search:
margin-left: or margin-right: with negative values, marginLeft: -, marginRight: -lg:ml-[-200px] only on desktop, zero on mobile)overflow: hidden on parent containers — these can break position: sticky for childrenwidth={1400} or similar without className="w-full"Findings:
overflow: hidden on containers with sticky childrenLarge font sizes that overwhelm mobile screens.
How to search:
fontSize: with values > 32px (inline styles)text-4xl, text-5xl, text-6xl etc. without responsive prefixclamp() is used for large headingsletterSpacing > 3px (causes overflow on narrow screens with long words)Findings:
Interactive elements must be at least 44x44px on mobile for reliable tapping.
How to search:
padding < 8px or height < 36pxwidth: 20px or similar without adequate paddingfont-size: 11px or text-xs on interactive elements (too small to read/tap)Findings:
Images that don't scale or are oversized for mobile.
How to search:
<img without className="w-full" or max-width: 100%next/image usage (preferred over <img>)width and height attributes but no responsive classNameaspect-ratio usage on image containers (helps maintain proportions)Findings:
<img> in Next.js projects (should use next/image)Footers with multi-column grids, badge rows, or complex layouts.
How to search:
<footer, Footer)gap values > 32px, fixed paddingflex-wrapFindings:
Sticky elements that break on mobile due to parent overflow or incorrect top values.
How to search:
position: sticky or sticky classoverflow: hidden, overflow: auto, or backdrop-filter on any ancestortop values: do they account for the mobile nav height?Findings:
overflow: hidden parent (sticky won't work)top values (element hides behind nav)Sidebars that consume too much horizontal space on phones.
How to search:
w-[220px], w-[280px], fixed-width side panelshidden sm:block, hidden md:blockFindings:
Buttons that look awkward left-aligned on mobile when content is centered.
How to search:
btn-filled, btn-primary, btn-cta)text-center sm:text-left or justify-center sm:justify-startflex-col sm:flex-rowFindings:
Skip if: no Tailwind detected.
How to search:
sm:, md:, lg:, xl:) across all component filesstyle={{ inline occurrencesFindings:
Visual layouts with absolute positioning that break on small screens.
How to search:
position: absolute or position: "absolute" with percentage-based left/top valuesviewBox elements with hardcoded dimensionsFindings:
Each check scores 0-10:
| Score | Meaning |
|---|---|
| 10 | No findings |
| 8-9 | Only LOW findings |
| 6-7 | Some MEDIUM findings, no HIGH |
| 4-5 | HIGH findings present |
| 2-3 | Multiple HIGH findings |
| 0-1 | CRITICAL — site is unusable on mobile |
Overall grade = weighted average (Critical checks 2x weight):
## Responsive Audit — [Project Name]
### Type: [detected] | Date: [YYYY-MM-DD] | Scope: [path]
| # | Check | Score | Severity | Key Issues |
|---|-------|-------|----------|------------|
| 1 | Fixed Padding | 8/10 | LOW | 3 files with >24px unguarded |
| 2 | Side-by-Side Layouts | 3/10 | HIGH | 12 flex layouts don't stack |
| ... | ... | ... | ... | ... |
| **Overall** | **6.2/10** | **D** | |
### Critical Viewport: 375px (iPhone SE)
- Usable content width with current padding: Xpx
- Horizontal overflow detected: Yes/No
- Navigation: Mobile menu present/missing
### Priority Actions
1. [CRITICAL] Add mobile hamburger menu — nav links overflow on phones
2. [HIGH] Add responsive stacking to 12 side-by-side layouts: flex-col lg:flex-row
3. [HIGH] Replace fixed 48px padding with responsive scale (16px mobile → 48px desktop)
...For each HIGH/CRITICAL finding, note which breakpoints are affected:
| Finding | <375px | 375-639px | 640-767px | 768-1023px | 1024px+ |
|---------|--------|-----------|-----------|------------|---------|
| Nav overflow | BROKEN | BROKEN | BROKEN | OK | OK |
| 3-col grid | BROKEN | BROKEN | CRAMPED | OK | OK |Apply fixes in this order:
flex-col lg:flex-row stackingoverflow: hidden from sticky ancestors, adjust top valueshidden sm:blocktext-center sm:text-leftclamp() or responsive font sizes for large headingsw-full h-auto classesResponsive padding:
px-4 sm:px-6 md:px-8 lg:px-12Or define a CSS utility:
@utility section-px {
padding-left: 1rem; padding-right: 1rem;
@media (min-width: 640px) { padding-left: 1.5rem; padding-right: 1.5rem; }
@media (min-width: 768px) { padding-left: 2rem; padding-right: 2rem; }
@media (min-width: 1024px) { padding-left: 3rem; padding-right: 3rem; }
}Side-by-side stacking:
flex flex-col lg:flex-row items-center gap-8 lg:gap-16Grid collapse:
grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3Dynamic grid columns (CSS var):
.responsive-grid { display: grid; grid-template-columns: 1fr; gap: 16px; }
@media (min-width: 768px) { .responsive-grid { grid-template-columns: repeat(var(--cols, 3), 1fr); } }Usage: className="responsive-grid" style={{ '--cols': n }}
Desktop-only features (negative margins, bleeds):
.hero-bleed { margin: 0; }
@media (min-width: 1024px) {
.hero-bleed { margin-right: var(--bleed-r, 0); margin-top: var(--bleed-t, 0); }
}Mobile menu (essential pattern):
lg:hidden (hidden on desktop)hidden lg:flex (hidden on mobile)position: fixed — MUST be outside any backdrop-filter ancestordocument.body.classList.add("menu-open") with cleanup on unmountInline style vs CSS class conflict:
display: "flex" overrides lg:hidden — move display to classNamepadding shorthand overrides Tailwind px-* — split into paddingTop/paddingBottommargin shorthand overrides Tailwind responsive marginsSticky element requirements:
overflow: hidden, overflow: auto, or overflow: scrollbackdrop-filter (creates containing block)top value accounting for sticky nav heightCarousel/slider responsiveness:
containerWidth < 640 ? containerWidth - 32 : CARD_W_DESKTOPsetCardW(prev => prev === newW ? prev : newW)Complex visual layouts (hub-and-spoke, SVG diagrams):
hidden md:blockmd:hidden grid grid-cols-1 sm:grid-cols-2 gap-3TOC/sidebar on mobile:
<div className="hidden sm:block">sm:flex sm:gap-10 (flex only on tablet+)Footer badges on mobile:
transform: scale(N) to enlarge small badges (inline maxHeight can't be overridden by CSS)margin to compensate for scale (scale is visual only, doesn't affect layout flow)flex-direction: column via CSS class~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.