frontend-design — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited frontend-design (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.
Use this when the task is not just "make it work" but "make it look designed."
This skill is for product pages, dashboards, app shells, components, or visual systems that need a clear point of view instead of generic AI-looking UI.
Pick a direction and commit to it.
Safe-average UI is usually worse than a strong, coherent aesthetic with a few bold choices.
#### 1. Frame the interface first
Before coding, settle:
Possible directions:
Do not mix directions casually. Choose one and execute it cleanly.
#### 2. Build the visual system
Define:
Use CSS variables or the project's token system so the interface stays coherent as it grows.
#### 3. Compose with intention
Prefer:
Avoid defaulting to a symmetrical card grid unless it is clearly the right fit.
#### 4. Make motion meaningful
Use animation to:
Do not scatter generic micro-interactions everywhere. One well-directed load sequence is usually stronger than twenty random hover effects.
#### Typography
#### Color
#### Background
Use atmosphere:
Flat empty backgrounds are rarely the best answer for a product-facing page.
#### Layout
Never default to:
Before delivering:
#### WCAG 2.2 Level AA (Required)
#### Touch Targets
Minimum 44×44 CSS pixels for all interactive elements (WCAG 2.5.8). For icon-only buttons, add invisible padding to reach the minimum, do not enlarge the visual icon.
#### 8-Point Grid System
All margins, paddings, gaps, and component heights must be multiples of 8px. Use 4px for micro-adjustments (icon gutters, badge offsets) only.
/* PASS: GOOD — multiples of 8 */
padding: 16px 24px;
gap: 8px;
height: 48px;
/* FAIL: BAD — arbitrary values */
padding: 13px 19px;
gap: 6px;#### Semantic Color Palette, Design Tokens Required
Never use hardcoded hex values in component files. Define all colours as design tokens:
/* tokens.css */
:root {
--color-primary-500: #2563eb;
--color-surface-default: #ffffff;
--color-text-primary: #111827;
--color-feedback-error: #dc2626;
}
[data-theme="dark"] {
--color-surface-default: #0f172a;
--color-text-primary: #f8fafc;
}/* PASS: GOOD — tokens */
<Button style={{ background: 'var(--color-primary-500)' }} />
/* FAIL: BAD — hardcoded */
<Button style={{ background: '#2563eb' }} />#### Mobile-First Responsive Design
min-width media queries only (never max-width)sm: 640px, md: 768px, lg: 1024px, xl: 1280px/* PASS: GOOD — mobile-first */
.card { padding: 16px; }
@media (min-width: 768px) { .card { padding: 24px; } }
/* FAIL: BAD — desktop-first */
.card { padding: 24px; }
@media (max-width: 767px) { .card { padding: 16px; } }#### Dark Mode, Day One Requirement
Dark mode is not optional. Implement using semantic tokens (see above) from the start of every project:
var(--token)): never Tailwind arbitrary values like bg-[#fff]#### Animations & Motion
All animations must respect prefers-reduced-motion:
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}Timing guidelines:
#### Loading States
aria-busy="true" on the container while loading// PASS: GOOD — skeleton
{isLoading ? <ArticleSkeleton /> : <ArticleCard article={article} />}
// FAIL: BAD — spinner blocks content area
{isLoading ? <FullPageSpinner /> : <ArticleCard article={article} />}#### Form UX Rules
aria-describedby pointing to the error element ID<input
id="email"
aria-describedby={emailError ? 'email-error' : undefined}
aria-invalid={!!emailError}
/>
{emailError && <p id="email-error" role="alert">{emailError}</p>}#### Defensive UI Patterns
blocking confirmation dialog
#### Internationalisation (i18n) Layout Budgets
margin-inline-start, padding-block-end): never usemargin-left/padding-right for layout
Intl API for all number, date, and currency formatting: never hardcode locale-specific formats// PASS: GOOD
const formatted = new Intl.NumberFormat(locale, { style: 'currency', currency: 'EUR' }).format(price)
// FAIL: BAD
const formatted = `€${price.toFixed(2)}`~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.