Build distinctive frontends that avoid generic AI aesthetics. Provides anti-slop enforcement, variance dials, art direction archetypes, product-specific icon-system admission, creative arsenal, and performance guardrails. Use when creating new landing pages, UI components, design systems, choosing or replacing an icon library, or when the user says "make it look good", "design direction", "avoid generic", "art direction", "design taste", "icon system", or "replace Lucide."
Adapted from tasteskill.dev and Kevin's design wiki. For Sigil projects, also read .cursor/rules/taste-enforcement.mdc which enforces these rules at the Cursor level.
LLMs default to the center of their training data: Inter font, generic card grids, blue accent, minimal animation, centered hero, blur blobs. The fix is not better prompting — it is providing a real design system with tokens, variance dials, explicit creative direction, and hard-banned patterns.
Three numbers drive all downstream decisions. Defaults shown below — adapt dynamically based on user requests.
DESIGN_VARIANCE: 8 (1=Perfect Symmetry, 10=Artsy Chaos)
MOTION_INTENSITY: 6 (1=Static, 10=Cinematic)
VISUAL_DENSITY: 4 (1=Art Gallery, 10=Cockpit)justify-center, strict 12-column symmetrical grids, equal paddings.-mt-8), varied image aspect ratios, left-aligned headers over center-aligned data.2fr 1fr 1fr), massive empty zones (pl-[20vw]).w-full px-4 py-8) below md:.:hover and :active only.cubic-bezier(0.16, 1, 0.3, 1). Cascade animation-delay for load-ins. Only transform and opacity.window.addEventListener('scroll').border-t / divide-y only. font-mono for all numbers.~/Documents/GitHub/kevin-wiki/wiki/design/design-system.md for current tokens~/Documents/GitHub/kevin-wiki/wiki/design/aesthetic-systems.md for archetypes.cursor/rules/taste-enforcement.mdcMood: confident, expensive, quiet, precise. Palette: warm white or carbon base, one deep accent, one signal color. Type: strong sans + restrained display + mono for labels. Motion: subtle reveals, one morphing hero motif.
Mood: intelligent, technical, fast, exact. Palette: paper or off-black, one electrical accent. Type: sharp grotesk + mono for labels. Motion: layout reveals, crossfades, cursor/figure markers.
Mood: schematic, conceptual, exacting. Palette: off-white, deep ink, cobalt/cyan. Type: precise sans + mono annotations. Motion: line draws, panel reveals, depth via layering.
Mood: immersive, sculpted, atmospheric, slower. Palette: shadow-heavy neutrals, two light temps max. Motion: camera drift, pointer parallax, idle loops.
Mood: blunt, memorable, anti-corporate, loud. Palette: black/white + one aggressive accent. Motion: abrupt, fast transitions, type movement, no syrupy easing.
| Variable | Options |
|---|---|
| Contrast level | low / medium / high |
| Depth level | flat / layered / scene-led |
| Type voice | engineered / editorial / luxurious / brutal |
| Surface finish | paper / glass / metal / grain / plastic / shader |
| Motion appetite | restrained / assertive / theatrical |
| Density | open / balanced / packed |
h-screen (use min-h-[100dvh])#000000 for backgrounds or text99.99%, 50%, 1234567picsum.photos/seed/{context}/W/HBefore implementing or recommending an icon-library change, read ~/Documents/GitHub/kevin-wiki/wiki/design/ui-design-defaults.md#icon-system-admission-not-pack-swapping and the project's existing icon imports.
AppIcon wrapper and semantic map. No wildcard imports, runtime package-wide lookup, or cross-pack mixing without measured output proof.Use [[thesvg]] for brand/company marks. That is a different job from interface glyphs.
Every interactive component must implement:
| State | Rule |
|---|---|
| Loading | Skeletal loaders matching layout dimensions |
| Empty | Composed empty state explaining how to populate |
| Error | Inline error reporting |
| Active/Pressed | -translate-y-[1px] or scale-[0.98] tactile feedback |
| Hover | Meaningful change, not just opacity |
text-4xl md:text-6xl tracking-tighter leading-none. Use Geist, Outfit, Cabinet Grotesk, or Satoshi for premium vibes.text-base text-[var(--s-text-secondary)] leading-relaxed max-w-[65ch].#000000. Use off-black via token var(--s-text). Secondary text via var(--s-text-muted).var(--s-*) tokens, OKLCH authored.border-t, divide-y, or negative space.gap-2 between input blocks.Beyond backdrop-blur: add border-white/10 inner border + shadow-[inset_0_1px_0_rgba(255,255,255,0.1)] for physical edge refraction.
Buttons pull toward cursor. NEVER use useState. Use Motion useMotionValue + useTransform outside the React render cycle.
Breathing status dots, typewriter effects, float animations, shimmer, carousels. Spring physics always: type: "spring", stiffness: 100, damping: 20.
Use Motion layout and layoutId for smooth reordering, resizing, shared element transitions.
Never mount lists or grids instantly. staggerChildren (Motion) or CSS animation-delay: calc(var(--index) * 80ms). Parent variants and children MUST be in the same Client Component tree.
Pull from these when building — never default to generic UI.
Before inventing a component or animation pattern, consult wiki/design/component-library-sources.md and the animated-component-libraries skill. Prefer a proven, editable source such as shadcn/ui, Skiper UI, Cult UI, Magic UI, or React Bits when it fits the direction.
transform and opacity. Never top, left, width, height.fixed inset-0 pointer-events-none, never scrolling containers.React.memo "use client" leaf components.will-change: transform only on active animations, removed after.IntersectionObserver, never window.addEventListener('scroll').Before importing ANY library, check package.json. If missing, output the install command before providing code.
"use client" leaf components.package.json — don't use v4 syntax in v3.@tailwindcss/postcss or Vite plugin, never tailwindcss in postcss.config.js.Every generation is production-critical. Banned:
// ..., // rest of code, // TODO, // implement hereWhen approaching limits, write at full quality to a clean breakpoint:
[PAUSED — X of Y complete. Send "continue" to resume from: next section]Three layers: primitive (color.gray.950, space.4), semantic (color.surface.page, motion.duration.fast), component (only when needed: button.primary.bg).
Transport: Tailwind CSS v4 @theme + runtime CSS variables + OKLCH.
All visual properties MUST reference var(--s-*) tokens. Hardcoded hex, px, font names, shadow classes, and duration values are banned.
| Layer | Tool |
|---|---|
| Tokens & styling | Tailwind CSS v4 @theme, OKLCH |
| Component motion | Motion (Framer Motion) |
| Scroll storytelling | GSAP + ScrollTrigger |
| 3D scenes | React Three Fiber + drei |
| Shader-first | OGL, custom GLSL/WGSL |
| App transitions | React startTransition, <ViewTransition> |
h-screen — only min-h-[100dvh]