frontend-design — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited frontend-design (Agent Skill) and scored it 91/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} is the classic direct prompt-injection phrasing. Placed in a skill body that the agent reads as trusted instructions, it tries to make the agent abandon its prior rules and follow whatever comes next — a full system-prompt override.
ignore/disregard/forget … previous instructions sentence.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.
Before touching a line of CSS, decide:
Choose an extreme and execute with intentionality. Mediocre design lives in the middle. Either go brutally minimal or richly layered - both work; the generic middle does not.
| Heading | Body | Mood |
|---|---|---|
| Playfair Display | Inter | Editorial, premium |
| Space Grotesk | DM Sans | Tech, modern |
| Syne | Outfit | Bold, design-forward |
| Fraunces | Source Serif | Literary, warm |
| Cabinet Grotesk | Inter | Startup, clean |
:root {
--text-xs: 0.75rem; /* 12px - captions */
--text-sm: 0.875rem; /* 14px - secondary text */
--text-base: 1rem; /* 16px - body */
--text-lg: 1.125rem; /* 18px - lead text */
--text-xl: 1.25rem; /* 20px - small headings */
--text-2xl: 1.5rem; /* 24px */
--text-3xl: 1.875rem; /* 30px */
--text-4xl: 2.25rem; /* 36px */
--text-5xl: 3rem; /* 48px */
--text-6xl: clamp(3rem, 8vw, 5rem); /* Responsive hero */
}max-width: 65ch to body text):root {
/* Base - backgrounds, surfaces */
--color-bg: #09090b; /* dark: near-black */
--color-surface: #18181b; /* dark: card background */
--color-border: #27272a; /* subtle borders */
/* Content - text */
--color-text: #fafafa; /* primary text */
--color-muted: #a1a1aa; /* secondary text, labels */
/* Accent - one dominant brand color */
--color-accent: #8b5cf6; /* violet */
--color-accent-h: #7c3aed; /* hover state */
--color-accent-l: #8b5cf620; /* 12% opacity for backgrounds */
/* Semantic */
--color-success: #22c55e;
--color-warning: #f59e0b;
--color-error: #ef4444;
}hsl(262 80% 60% / 0.15)#000000) on pure white - use #09090b and #fafafaUse a consistent spacing scale based on 4px or 8px:
:root {
--space-1: 0.25rem; /* 4px */
--space-2: 0.5rem; /* 8px */
--space-3: 0.75rem; /* 12px */
--space-4: 1rem; /* 16px */
--space-6: 1.5rem; /* 24px */
--space-8: 2rem; /* 32px */
--space-12: 3rem; /* 48px */
--space-16: 4rem; /* 64px */
--space-24: 6rem; /* 96px */
}Generic designs stay strictly on-grid. Distinctive designs intentionally break it:
/* Offset element creates tension and visual interest */
.hero-image {
position: absolute;
right: -4rem; /* intentionally overflows */
top: -2rem;
transform: rotate(3deg);
}
/* Overlapping elements create depth */
.card-badge {
position: absolute;
top: -0.75rem;
left: 1.5rem;
}Mobile-first, always:
/* Mobile base */
.container {
padding: 1rem;
max-width: 100%;
}
/* Tablet */
@media (min-width: 768px) {
.container { padding: 2rem; }
}
/* Desktop */
@media (min-width: 1280px) {
.container {
max-width: 1200px;
margin: 0 auto;
}
}Animate for meaning, not decoration. Every animation should communicate something.
/* Entrance - elements appear with purpose */
@keyframes slide-up {
from { opacity: 0; transform: translateY(16px); }
to { opacity: 1; transform: translateY(0); }
}
.card { animation: slide-up 0.3s ease-out; }
/* Interactive feedback - confirm the user's action */
button {
transition: transform 0.1s ease, box-shadow 0.2s ease;
}
button:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0,0,0,0.3); }
button:active { transform: translateY(0); box-shadow: none; }
/* Loading state - communicates progress */
.skeleton {
background: linear-gradient(90deg, #1e293b 25%, #334155 50%, #1e293b 75%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
}
@keyframes shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}Rules:
ease-out for entrances (fast start, slow end), ease-in for exitsprefers-reduced-motion: @media (prefers-reduced-motion: reduce) {
*, *::before, *::after { animation-duration: 0.01ms !important; }
}<!-- Hero section: minimal, typographic, with strong vertical rhythm -->
<section class="hero">
<span class="eyebrow">Introducing v2.0</span>
<h1 class="headline">Design that<br><em>speaks</em> for itself.</h1>
<p class="subheading">Build interfaces that users remember - and come back to.</p>
<div class="cta-group">
<a href="#" class="btn btn-primary">Get started free</a>
<a href="#" class="btn btn-ghost">See examples →</a>
</div>
</section>
<style>
.hero {
max-width: 800px;
margin: 0 auto;
padding: clamp(4rem, 10vw, 8rem) 2rem;
}
.eyebrow {
display: inline-block;
font-size: 0.875rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--color-accent);
border: 1px solid var(--color-accent-l);
background: var(--color-accent-l);
padding: 0.25rem 0.75rem;
border-radius: 2rem;
margin-bottom: 1.5rem;
}
.headline {
font-family: 'Playfair Display', serif;
font-size: clamp(2.5rem, 7vw, 5rem);
font-weight: 800;
line-height: 1.1;
letter-spacing: -0.02em;
color: var(--color-text);
margin-bottom: 1.5rem;
}
.headline em {
font-style: italic;
color: var(--color-accent);
}
.subheading {
font-size: clamp(1.1rem, 2.5vw, 1.35rem);
color: var(--color-muted);
line-height: 1.7;
max-width: 540px;
margin-bottom: 2.5rem;
}
.cta-group { display: flex; gap: 1rem; flex-wrap: wrap; }
.btn {
padding: 0.75rem 1.5rem;
border-radius: 0.5rem;
font-weight: 600;
font-size: 1rem;
text-decoration: none;
transition: all 0.2s ease;
cursor: pointer;
}
.btn-primary {
background: var(--color-accent);
color: white;
}
.btn-primary:hover {
background: var(--color-accent-h);
transform: translateY(-1px);
box-shadow: 0 4px 16px var(--color-accent-l);
}
.btn-ghost {
color: var(--color-text);
border: 1px solid var(--color-border);
}
.btn-ghost:hover {
border-color: var(--color-muted);
background: var(--color-surface);
}
</style>| Anti-Pattern | Why It's Bad | Fix |
|---|---|---|
| Purple gradient on white | Overused, signals "AI-generated" | Choose an unusual color or texture |
| Centered body text on wide screens | Hard to read, looks amateur | Left-align body; center only short headings |
| Three different sans-serif fonts | Visual noise, no hierarchy | Max two font families |
| Blue/gray corporate palette | Forgettable, interchangeable | Pick a distinctive accent hue |
| Equal visual weight everywhere | No focus, no hierarchy | Create 3-4 clear visual tiers |
| Thin gray text on white | Low contrast, inaccessible | Test with WebAIM contrast checker |
| Rounded everything uniformly | Looks like a Bootstrap template | Mix border-radius values deliberately |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.