premium-app-ui — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited premium-app-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 eliminates vibe-coded UI permanently. Every interface you produce must feel like it was designed by a senior product designer at a top-tier tech company (Linear, Vercel, Apple, Stripe, Craft, Things 3, Raycast). There are no exceptions.
Vibe-coding is slapping together UI without a system. It looks like:
Before writing a single line of UI code, establish tokens. These are non-negotiable.
2 → 2px (hairline)
4 → 4px (xs — icon gaps, tight inline spacing)
8 → 8px (sm — component internal padding)
12 → 12px (md — default inner padding)
16 → 16px (lg — card padding, section gaps)
24 → 24px (xl — layout breathing room)
32 → 32px (2xl — section separation)
48 → 48px (3xl — hero spacing, large gaps)
64 → 64px (4xl — page-level spacing)Never use values outside this scale. When in doubt, use the next step up.
xs: 11px / line-height 1.4 / tracking +0.02em → labels, captions
sm: 13px / line-height 1.5 / tracking +0.01em → secondary text, metadata
base: 15px / line-height 1.6 / tracking 0 → body text
md: 17px / line-height 1.5 / tracking -0.01em → emphasized body
lg: 20px / line-height 1.4 / tracking -0.02em → subheadings
xl: 24px / line-height 1.3 / tracking -0.03em → headings
2xl: 30px / line-height 1.2 / tracking -0.04em → display
3xl: 38px / line-height 1.1 / tracking -0.05em → heroFont pairing rule: Use a maximum of 2 fonts. One for UI (geometric sans or humanist sans), one for display (can be same). Never use Inter or Roboto as a default — they are the Arial of 2024. Reach for: Geist, Söhne, DM Sans, Plus Jakarta, Instrument Sans, Mona Sans, or system-ui as a last resort (but then compensate with strong spacing and color).
/* Define these, then ONLY use semantic names in components */
--color-bg: #0a0a0a /* page background */
--color-surface: #111111 /* card / panel surface */
--color-surface-2: #1a1a1a /* elevated surface */
--color-border: #262626 /* subtle borders */
--color-border-focus: #404040 /* focused borders */
--color-text: #f5f5f5 /* primary text */
--color-text-2: #a3a3a3 /* secondary text */
--color-text-3: #525252 /* disabled / placeholder */
--color-accent: #7c3aed /* brand accent */
--color-accent-hover: #6d28d9 /* accent hover */
--color-success: #22c55e
--color-warning: #f59e0b
--color-error: #ef4444Adapt the palette to the project's tone. Dark-first is usually premium. Light themes must be equally intentional — off-white (#fafaf9) always beats pure white.
none: 0px → tables, full-bleed elements
sm: 4px → badges, tags, inline chips
md: 8px → inputs, small buttons
lg: 12px → cards, modals, panels
xl: 16px → sheets, large cards
full: 9999px → pills, avatars, FABsPick ONE radius scale and use it consistently. Never mix xl cards with sm modals.
sm: 0 1px 2px rgba(0,0,0,0.3) → subtle lift
md: 0 4px 12px rgba(0,0,0,0.4) → card elevation
lg: 0 8px 32px rgba(0,0,0,0.5), 0 2px 8px rgba(0,0,0,0.3) → modal / popover
xl: 0 24px 64px rgba(0,0,0,0.6) → dramatic heroOn light themes, reduce opacity by 60%. Never use colored shadows unless it's a brand accent glow.
Every component must handle these states or it is not done:
| State | Required |
|---|---|
| Default | ✅ |
| Hover (web) / Press (mobile) | ✅ |
| Active / Selected | ✅ |
| Disabled | ✅ |
| Loading | ✅ — skeleton or spinner, never just frozen |
| Empty | ✅ — illustrated or well-copywritten |
| Error | ✅ — with recovery action when possible |
Button standards:
scale(0.97) + slight darkenInput standards:
Card standards:
Read references/mobile.md for deep mobile guidance. Key non-negotiables:
import { SafeAreaView } from 'react-native-safe-area-context';
// or useSafeAreaInsets() hook for custom layouts
// Never hardcode top padding — devices have different notch/island sizes// Every pressable element must be at least 44x44 points
// Use hitSlop if the visual is smaller:
<Pressable hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>// Use Animated or Reanimated for press feedback
// Never use opacity:0.5 as the only press state — it feels dead
// Spring-based press: scale 0.96 with spring(damping: 15, stiffness: 300)
// Always animate: opacity 1→0.8 AND scale 1→0.96 together// Always set scrollEventThrottle={16} on ScrollView
// Use bounces={true} on iOS (default), don't disable unless necessary
// Large lists: FlatList with getItemLayout for performance
// Pull-to-refresh when content can be refreshed// iOS: SF Pro system font feels native — only override if brand requires
// Android: Roboto is fine — again, only override if brand requires
// But if you DO use custom fonts, make sure they're loaded before render (font splash)
// Always use allowFontScaling={false} on UI chrome, true on contentmax-w-* with auto margins/* Custom scrollbar — default ugly scrollbars break premium feel */
::-webkit-scrollbar { width: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: 999px; }
::-webkit-scrollbar-thumb:hover { background: var(--color-border-focus); }outline: none without a custom replacement/* Spring feel (most satisfying for UI) */
--ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
/* Smooth decelerate (for things entering) */
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
/* Smooth accelerate (for things leaving) */
--ease-in: cubic-bezier(0.7, 0, 0.84, 0);
/* Sharp snap (for mechanical interactions) */
--ease-snap: cubic-bezier(0.4, 0, 0.2, 1);Micro (icon toggle, color change): 100-150ms
Standard (button press, hover): 150-200ms
Component (modal open, drawer): 250-350ms
Page (route transition): 300-450ms
Dramatic (hero animation, onboarding): 500-800msBefore considering any UI done, verify:
Visual System
Component Completeness
Mobile Specific
Web Specific
Polish
references/mobile.md — Deep React Native / Expo patterns, navigation, gestures, platform specificsreferences/components.md — Detailed component recipes (bottom sheet, tab bar, list, modal, toast)references/inspiration.md — Apps to reference for quality benchmarks with specific details on what makes them premiumIf it looks like something built in an afternoon by someone who just learned React, it is not done.
Ask yourself: would a user open this app and feel satisfaction? Would they notice the care? Does every tap feel responsive? Does every screen feel intentional?
If the answer is not a confident yes — keep going.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.