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.
A site that works on desktop but breaks on mobile is not a finished site. Responsive design is not a feature — it is a baseline requirement. This audit verifies that every layout, component, and typographic decision adapts correctly across all screen sizes from 320px to 1920px, in both portrait and landscape orientations.
The goal is not pixel-perfect recreation of the desktop layout on every device. The goal is that every user, on every device, can access all content and complete all tasks without horizontal scrolling, broken layouts, or unusably small touch targets.
| Level | Description | Action |
|---|---|---|
| Critical | Layout breaks or content becomes inaccessible on a screen size | Fix before any other work |
| High | Significant usability problem on mobile or tablet | Fix before launch |
| Medium | Suboptimal experience that reduces comfort of use | Fix within current sprint |
| Low | Minor improvement opportunity | Fix when convenient |
Base styles must target mobile. Media queries must use min-width to enhance for larger screens — never max-width to override for smaller ones.
/* ❌ Desktop-first — overrides for mobile */
.card-grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: var(--space-6);
}
@media (max-width: 768px) {
.card-grid { grid-template-columns: 1fr; }
}
/* ✅ Mobile-first — enhances for larger screens */
.card-grid {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-4);
}
@media (min-width: 768px) {
.card-grid {
grid-template-columns: 1fr 1fr;
gap: var(--space-6);
}
}
@media (min-width: 1024px) {
.card-grid { grid-template-columns: 1fr 1fr 1fr; }
}Flag every max-width media query overriding a desktop-first base style.
Do not duplicate base styles in breakpoints — media queries contain only the differences:
/* ❌ Duplicating common styles */
@media (min-width: 768px) {
.card {
background: var(--bg-surface); /* Same as base */
border-radius: var(--radius-md); /* Same as base */
padding: var(--space-6); /* Different — belongs here */
}
}
/* ✅ Only what changes */
@media (min-width: 768px) {
.card { padding: var(--space-6); }
}The project must use a consistent breakpoint scale throughout. No arbitrary breakpoints per component.
/* ✅ Standard breakpoint scale */
/* Base: Mobile — no media query needed */
@media (min-width: 640px) { /* sm — landscape phones */ }
@media (min-width: 768px) { /* md — tablets */ }
@media (min-width: 1024px) { /* lg — laptops */ }
@media (min-width: 1280px) { /* xl — desktops */ }
@media (min-width: 1536px) { /* 2xl — large desktops */ }Flag one-off breakpoints like @media (min-width: 850px) — these indicate a layout problem that should be solved differently, not with a custom breakpoint.
Fixed font sizes create abrupt jumps at breakpoints. clamp() creates smooth scaling. The value must always include rem — viewport units alone ignore browser font preferences.
/* ❌ Viewport unit only — ignores user font preferences */
h1 { font-size: 5vw; }
/* ❌ Fixed sizes with abrupt breakpoint jumps */
h1 { font-size: 2rem; }
@media (min-width: 768px) { h1 { font-size: 3rem; } }
/* ✅ Fluid scale — rem anchored, smooth scaling */
:root {
--text-sm: clamp(0.875rem, 0.8rem + 0.375vw, 1rem);
--text-base: clamp(1rem, 0.9rem + 0.5vw, 1.125rem);
--text-lg: clamp(1.125rem, 1rem + 0.625vw, 1.25rem);
--text-xl: clamp(1.25rem, 1rem + 1.25vw, 1.5rem);
--text-2xl: clamp(1.5rem, 1.25rem + 1.25vw, 2rem);
--text-3xl: clamp(1.875rem, 1.5rem + 1.875vw, 2.5rem);
--text-4xl: clamp(2.25rem, 1.75rem + 2.5vw, 3.5rem);
}Flag headings with hardcoded px font sizes. Flag clamp() values using only vw without rem.
What to check:
1rem (16px) on mobilefont-size: 1rem — prevents iOS auto-zoom on focus0.875rem (14px)line-height: 1.5 on body text, 1.2 on headingsmax-width: 65ch on paragraph text for optimal reading width:root {
--space-4: clamp(0.5rem, 0.4rem + 0.5vw, 0.75rem);
--space-8: clamp(1rem, 0.8rem + 1vw, 1.5rem);
--space-12: clamp(1.5rem, 1.2rem + 1.5vw, 2.5rem);
--space-16: clamp(2rem, 1.5rem + 2.5vw, 4rem);
--space-24: clamp(3rem, 2rem + 5vw, 6rem);
}Flag hardcoded px padding and margin on section-level elements that should scale.
100vh on mobile includes the browser UI (address bar). When visible, content gets cut off.
/* ❌ Causes overflow on mobile browsers */
.hero { height: 100vh; }
/* ✅ With fallback for older browsers */
.hero {
height: 100vh; /* Fallback */
height: 100dvh; /* Dynamic — accounts for browser UI */
}| Unit | Behavior | Use Case |
|---|---|---|
vh | Fixed to initial viewport | Avoid on full-screen sections |
dvh | Updates when browser UI changes | Full-screen hero sections |
svh | Browser UI fully visible | Conservative minimum |
lvh | Browser UI fully hidden | Maximum available space |
Flag every 100vh on full-screen sections without a dvh override.
/* ✅ Fluid container pattern */
.container {
width: 90%;
max-width: 1200px;
margin-inline: auto;
}Flag containers with fixed px widths. Flag containers without max-width.
/* ✅ Auto-fit — wraps naturally without media queries */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr));
gap: var(--space-6);
}/* ✅ Wraps with minimum item width */
.features {
display: flex;
flex-wrap: wrap;
gap: var(--space-6);
}
.features__item {
flex: 1 1 280px;
}Flag flex containers without flex-wrap: wrap that could overflow on mobile.
Secondary content like sidebars should not appear before main content on mobile. Use order to reorder without changing DOM.
The most disruptive mobile failure — forces users to scroll sideways.
/* ✅ Global overflow protection */
html, body { overflow-x: hidden; }
img { max-width: 100%; height: auto; }
p, li, td, h1, h2, h3 {
overflow-wrap: break-word;
word-break: break-word;
}
.table-wrapper { width: 100%; overflow-x: auto; }Flag any element with fixed px width wider than 320px without max-width: 100%. Flag long strings without overflow-wrap.
Mobile navigation must have a toggle button with correct ARIA, update aria-expanded on click, and use hidden attribute for open/close state.
Full navigation pattern with HTML, CSS, and JS: see references/responsive-patterns.mdWhat to check:
aria-expanded, aria-controls, and aria-labelaria-expanded and hidden on clickdisplay: noneAll interactive elements must be minimum 44×44px on mobile with at least 8px spacing between them. Small icons can expand their tap area with ::after pseudo-element.
Full touch target code examples: see references/responsive-patterns.mdFlag every interactive element below 44px height on mobile. Flag interactive elements with less than 8px spacing.
On mobile there is no hover. Hover effects get stuck after a tap.
/* ❌ Hover stuck on mobile */
.card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-lg);
}
/* ✅ Hover only on devices that support it */
@media (hover: hover) {
.card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-lg);
}
}Flag all :hover rules not wrapped in @media (hover: hover) when they involve transforms or state changes that could get stuck on touch.
Flag user-scalable=no — prevents zoom, accessibility violation. Content must be usable at 200% zoom.
Fixed elements at the bottom must respect the iPhone home indicator and notch area. Requires viewport-fit=cover in meta viewport.
.bottom-nav {
position: fixed;
bottom: 0;
padding-bottom: max(1rem, env(safe-area-inset-bottom));
padding-left: env(safe-area-inset-left);
padding-right: env(safe-area-inset-right);
}Flag fixed bottom elements without env(safe-area-inset-bottom).
Note: Image format, srcset, sizes, loading priority, fetchpriority, object-fit, and decoding are covered in Audit 04 — Performance. This section covers only how images integrate with responsive layouts.
/* ✅ Global image rule */
img { max-width: 100%; height: auto; display: block; }
/* ✅ Hero image fills viewport responsively */
.hero__image {
width: 100%;
height: 60vh;
height: 60dvh;
object-fit: cover;
}
/* ✅ Card images maintain aspect ratio */
.card__image {
width: 100%;
aspect-ratio: 16 / 9;
object-fit: cover;
}Flag images with fixed px widths exceeding mobile viewport. Flag hero images that distort on mobile.
Check for each explicitly — the most frequently occurring problems:
width: 800px → use width: 100%; max-width: 800px;font-size: 14px → use font-size: 1remheight: 200px → use aspect-ratio: 16/9; object-fit: coverVerify at these specific sizes, in both portrait and landscape:
| Viewport | Device reference | Priority |
|---|---|---|
| 320px | iPhone SE (smallest common) | Critical |
| 375px | iPhone standard | Critical |
| 414px | iPhone Pro Max | High |
| 768px | iPad portrait | High |
| 1024px | iPad landscape / laptop | High |
| 1280px | Standard desktop | Medium |
| 1440px | Large desktop | Medium |
| 1920px | Wide desktop | Low |
Responsive Design Audit — [Project Name]
Date: [Date]
Tested viewports: 320px, 375px, 414px, 768px, 1024px, 1280px, 1440px
Orientations tested: Portrait and Landscape
Summary
Critical issues: X
High priority: X
Medium priority: X
Low priority: X
Most affected breakpoint: [mobile / tablet / desktop]
Overall: [Fully responsive / Partially responsive / Broken on mobile]
Critical Issues
[Issue title]
Viewport affected: [320px–767px / 768px–1023px / 1024px+ / all]
Orientation: [Portrait / Landscape / Both]
File: [filename and line]
Issue: [What breaks and how it affects the user]
Fix: [Specific correction with code example]
High Priority
[Same format]
Medium Priority
[Same format]
Low Priority
[Same format]
Recommended Fix Order
Horizontal overflow — affects all content on all pages
Navigation — affects all pages
Input font sizes — iOS zoom breaks layouts
Touch targets — affects all interactions
Typography and spacing — affects readability
Hover states — affects mobile polish
Layout refinements — affects visual qualityFull quick-reference checklist: see references/checklist.md~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.