product-ui — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited product-ui (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.
This skill guides creation of production-grade product interfaces that feel polished, responsive, and premium. The goal: interfaces that look like they came from an expert product designer, not AI-generated templates.
Inspiration: Linear, Stripe, Superhuman, Figma, Notion, Slack
Production quality comes from invisible craft — details users feel but can't pinpoint:
If users notice the interface, something is wrong. Great product UI disappears.
| Scenario | Approach | Timing |
|---|---|---|
| Button hover/active | CSS transition | 100-150ms |
| Dropdown open | CSS or spring | 150-200ms |
| Modal/dialog | Spring animation | 200-300ms |
| List reorder | Layout animation | spring |
| State indicator | CSS transition | instant-150ms |
| Loading spinner | Linear rotation | continuous |
Rule: If you're debating whether to animate something, make it instant. Animation should be obvious wins.
| Duration | Pattern |
|---|---|
| <200ms | No indicator (feels instant) |
| 200ms-2s | Spinner in context |
| >2s | Skeleton screen |
| Unknown/long | Progress bar + message |
Ask: "What should the user do next?"
Detailed implementation patterns organized by domain:
useEffect(() => {
const handler = (e: KeyboardEvent) => {
if ((e.metaKey || e.ctrlKey) && e.key === 'k') {
e.preventDefault();
setOpen(prev => !prev);
}
};
window.addEventListener('keydown', handler);
return () => window.removeEventListener('keydown', handler);
}, []);// Framer Motion presets
const springs = {
snappy: { type: 'spring', stiffness: 400, damping: 30 },
smooth: { type: 'spring', stiffness: 300, damping: 30 },
bouncy: { type: 'spring', stiffness: 400, damping: 15 },
};:root {
/* Surfaces */
--surface-primary: #ffffff;
--surface-secondary: #f9fafb;
--surface-hover: rgba(0, 0, 0, 0.04);
/* Text */
--text-primary: #111827;
--text-secondary: #6b7280;
--text-tertiary: #9ca3af;
/* Accent */
--accent: #3b82f6;
--accent-subtle: rgba(59, 130, 246, 0.1);
}.skeleton {
background: linear-gradient(90deg,
var(--surface-secondary) 0%,
var(--surface-tertiary) 50%,
var(--surface-secondary) 100%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
}
@keyframes shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}<motion.div
initial={{ opacity: 0, y: 20, scale: 0.95 }}
animate={{ opacity: 1, y: 0, scale: 1 }}
exit={{ opacity: 0, scale: 0.95 }}
transition={{ type: 'spring', stiffness: 400, damping: 25 }}
>Don't:
ease or linear for UI transitions (use ease-out or springs)alert() or browser-native dialogsDo:
prefers-reduced-motion~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.