web-design — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited web-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.
Before doing anything in this skill, read `./brain/brand-guide/brand-guide.md`.
That file is authoritative for colors, typography, gradients, buttons, tags, cards, spacing, shadows, and dark-theme rules. This skill does not redefine any of those. If you find yourself about to write a hex code, type scale, or button variant into a page, stop — reference brand-guide instead.
Production source of truth for component patterns: [your-site-repo-path]/src/.
In scope:
[your-site-repo-path]hubspot-landing-page for template mechanics)Out of scope — use the right skill instead:
brand-designhubspot-emailhubspot-landing-pagehubspot-ctaimage-gencopywriting / copy-editingLoad the reference file for the problem you are solving. Do not load all of them.
When the user asks for review, polish, or critique, pick the workflow that matches. Don't announce the workflow — just do it.
Used when asked to "audit," "check," or "review" a page for correctness.
accessibility.md, responsive.md, interaction.md.agent-browser and snapshot it. Mandatory for any shipped page — don't audit from source alone, class names drift.Used when asked "what's wrong with this" or "does this feel right."
anti-patterns.md and component-composition.md..od-tag--outline--sm at 2px 8px per brand-guide").Used before a page ships or when asked to "polish" / "tighten" / "finalize."
anti-patterns.md, motion.md, interaction.md.all 0.3s (or the production value in use).Used when asked to fix fonts, hierarchy, or "the text feels wrong."
-1.72px desktop / -0.8px mobile), positive on body (0.4px / 0.3px).uppercase. Gradient headlines use three-color gradient only via background-clip: text.Used when asked to fix spacing, alignment, or "rhythm feels off."
1080px centered.64px 32px, mobile 32px 16px.20px, it's probably wrong — round to 16px or 24px with a reason.32px. Buttons 12px. Tags 5px. No 999px.Every design change to a shipped page must be verified with `agent-browser` before declaring it done. This is a hard rule (see memory: HubSpot form renderer incident). Class names in source != class names in the live DOM. Snapshot the live page, confirm the change rendered, confirm nothing else regressed.
Pulled forward from brand-guide + project memory. If you see any of these in a page, fix them:
background-clip: text. (Hard rule from memory.)#50F6E8 → #8B55FF for UI decorations; three-color for text effects only.8px, buttons 12px, cards 32px..od-tag, .od-tag--outline, .od-tag--outline--sm). No pink/purple tags.1px solid rgba(69, 69, 69, 0.5) for section dividers / inline separators, or opaque 1px solid #454545 for card containers. Nothing else.rgba(15, 15, 15, 0.4)) with backdrop-filter: blur(12px) — see brand-guide "Site Header" for the full spec. Use the pattern from go.[your-site]/request-a-demo-thanks.An image (or any element) that hides mostly behind a card, peeks out with a subtle bounce to tease interaction, then slides fully into view on hover. On mobile (no hover), show the element statically.
Key implementation detail: CSS animations override transitions on the same property. If the bounce and hover both animate transform on the same element, the first hover jumps instead of transitioning. Fix: use a tiny JS snippet that adds a class on first mouseenter to kill the animation, letting the CSS transition take over cleanly. This keeps the bounce on the actual container (the whole frame moves, not just content inside it).
.peek-container {
transform: translateY(14px); /* mostly hidden behind the card below */
transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
margin-bottom: -100px; /* overlap with card */
overflow: hidden;
border-radius: 20px 20px 0 0;
animation: peekBounce 3s ease-in-out 1.5s infinite;
}
.peek-container.peek-hovered {
animation: none; /* JS adds this on first hover */
}
@keyframes peekBounce {
0%, 100% { transform: translateY(14px); }
50% { transform: translateY(6px); }
}
.parent:hover .peek-container {
transform: translateY(-86px); /* fully revealed */
}
.card { position: relative; z-index: 1; }
/* Mobile: static, no tricks */
@media (max-width: 960px) {
.peek-container { transform: none; margin-bottom: 16px; animation: none; }
.parent:hover .peek-container { transform: none; }
}// Kill bounce animation on first hover so CSS transition takes over
document.addEventListener('DOMContentLoaded', function() {
var parent = document.querySelector('.parent');
var peek = document.querySelector('.peek-container');
if (parent && peek) {
parent.addEventListener('mouseenter', function() {
peek.classList.add('peek-hovered');
}, { once: true });
}
});Tune the translateY values per image height and desired peek amount. The 1.5s animation delay prevents the bounce from firing during page load animations. First shipped on the CNCF happy hour landing page (2026-04-16).
[your-site-repo-path]/src/components/. Copy its patterns — don't invent parallel ones.agent-browser if it's shipping.Built pages go wherever the framework dictates (e.g., src/ for Next.js). Supporting docs (specs, audit notes) go to marketing/pages/[page-slug]/ — confirm the project slug with the user before creating files.
<!-- Updated by /reflect. Promote stable patterns to the main skill body. -->
[your-site]/assets/renders/ are SVGs with embedded PNGs; extract layers with base64 decode when needed for compositing. (Session 85, 2026-04-16)filter: invert(1) hue-rotate(180deg) directly on the image. Don't wrap in dark containers/bands/panels. (Session 87, 2026-04-17)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.