---
name: taste
description: "Senior UI/UX Engineer. Architect digital interfaces overriding default LLM biases. Enforces metric-based rules, strict component architecture, hardware-accelerated CSS, and balanced design engineering. By Leon Lin & blueemi. Multi-runtime improved by shokunin."
triggers:
  - "taste"
  - "design taste"
  - "UI taste"
  - "design variance"
  - "anti-slop"
  - "creative arsenal"
  - "Leon Lin"
  - "design engineering"
negatives:
  - "animations"
  - "motion"
  - "components library"
  - "brand identity"
  - "premium agency design" -> use taste-soft
  - "minimalist editorial" -> use taste-minimalist
  - "design audit" -> use impeccable
  - "micro-interactions" -> use emil-design-eng
license: MIT (based on Leonxlnx/taste-skill)
compatibility: opencode
metadata:
  version: "2.0.0"
  author: Leon Lin, blueemi, improved by shokunin
  source: https://github.com/Leonxlnx/taste-skill

  workflow: frontend
  audience: designers---


# High-Agency Frontend Skill

## Authority References (shokunin improvement)

The rules in this skill are based on patterns observed across:
- Linear, Vercel, Stripe, Notion — product UI
- Apple Human Interface Guidelines
- Material Design 3
- Emil Kowalski's design engineering (Sonner, Vaul, animations.dev)
- Paul Lewis (Google Chrome) — compositor-only properties
- Ahmad Shadeed — Container Queries and CSS architecture
- WCAG 2.2 — Accessibility guidelines
- CSS Working Group — modern CSS features

## 1. ACTIVE BASELINE CONFIGURATION

- **DESIGN_VARIANCE**: 8 (1=Perfect Symmetry, 10=Artsy Chaos)
- **MOTION_INTENSITY**: 6 (1=Static, 10=Cinematic/Magic Physics)
- **VISUAL_DENSITY**: 4 (1=Art Gallery/Airy, 10=Pilot Cockpit/Packed Data)

These are the standard baselines. ALWAYS listen to the user: adapt these values dynamically based on what they explicitly request. Use these values as global variables driving Sections 3 through 7.

## 2. DEFAULT ARCHITECTURE & CONVENTIONS

### Framework & Interactivity
- React or Next.js. Default to Server Components (RSC).
- **INTERACTIVITY ISOLATION:** Interactive UI components with motion MUST be extracted as isolated leaf components with `'use client'` at top.
- **DEPENDENCY VERIFICATION [MANDATORY]:** Before importing ANY 3rd party library (framer-motion, lucide-react, zustand), check `package.json`. If missing, output `npm install <package>` before code. Never assume.

### Styling
- Use Tailwind CSS (v3/v4) for 90% of styling.
- **CSS vanilla alternative (shokunin improvement):** For projects without Tailwind, use CSS custom properties + modern CSS (Container Queries, clamp(), :has(), OKLCH).
- **TAILWIND VERSION LOCK:** Check `package.json`. No v4 syntax in v3 projects.
- **ANTI-EMOJI POLICY:** NEVER use emojis in code, markup, text, or alt text. Replace with Phosphor, Lucide, or clean SVG primitives.

### Responsiveness
- **Viewport Stability [CRITICAL]:** NEVER `h-screen`. Always `min-h-[100dvh]` for iOS Safari.
- **Grid over Flex-Math:** NEVER `w-[calc(33%-1rem)]`. Always CSS Grid `grid-cols-3 gap-6`.
- Standardize breakpoints: sm(640), md(768), lg(1024), xl(1280).

### Icons
- `@phosphor-icons/react` or `@radix-ui/react-icons`. Standardize `strokeWidth` (1.5 or 2.0).

## 3. DESIGN ENGINEERING DIRECTIVES (Bias Correction)

### Rule 1: Deterministic Typography
- **Display/Headlines:** `text-4xl md:text-6xl tracking-tighter leading-none`. Use `Geist`, `Outfit`, `Cabinet Grotesk`, or `Satoshi`. NEVER Inter for premium.
- **TECHNICAL UI:** Serif fonts strictly BANNED for Dashboards. Use high-end Sans-Serif: `Geist` + `Geist Mono`.
- **Body:** `text-base text-gray-600 leading-relaxed max-w-[65ch]`.

### Rule 2: Color Calibration
- Max 1 Accent Color. Saturation < 80%.
- **THE AI PURPLE BAN:** No purple button glows, no neon gradients. Use neutral bases (Zinc/Slate) with singular accents (Emerald, Electric Blue, Deep Rose).
- **OKLCH preferred (shokunin improvement):** `oklch(50% 0.2 170)` over hex `#10b981`.
- One palette for entire project. No warm/cool gray mix.

### Rule 3: Layout Diversification
- **ANTI-CENTER BIAS:** When `DESIGN_VARIANCE > 4`, centered Hero sections are BANNED. Use Split Screen (50/50), Left Aligned content + Right Aligned asset, or Asymmetric White-space.

### Rule 4: Materiality and Shadows
- **DASHBOARD HARDENING:** For `VISUAL_DENSITY > 7`, cards are BANNED. Use `border-t`, `divide-y`, or negative space. Data breathes without boxes.
- Cards only when elevation communicates hierarchy. Tint shadow to background hue.

### Rule 5: Interactive UI States
- **Mandatory:** Loading (skeletal, not spinners) → Empty (beautiful, with guidance) → Error (inline, specific) → Success.
- **Tactile Feedback:** `:active` → `scale-[0.98]`. `transition: transform 160ms ease-out`.

### Rule 6: Data & Form Patterns
- Labels ABOVE inputs. Error text BELOW input. Standard `gap-2` for input blocks.

## 4. CREATIVE PROACTIVITY (Anti-Slop Implementation)

- **"Liquid Glass":** When glassmorphism is needed, add 1px inner border + inner shadow. Never default decoration.
- **Magnetic Micro-physics** (MOTION_INTENSITY > 5): Use Framer Motion `useMotionValue` + `useTransform` outside React render cycle. NEVER `useState` for continuous animations.
- **Perpetual Micro-Interactions:** Pulse, Typewriter, Float, Shimmer. Spring physics (`type: "spring", stiffness: 100, damping: 20`). No linear easing.
- **Staggered Orchestration:** `animation-delay: calc(var(--index) * 100ms)`. 30-80ms between items. Parent + Children in same Client Component tree.
- **WAAPI fallback for heavy load (shokunin improvement):** When Framer Motion drops frames under load, use WAAPI: `element.animate(...)`. Runs off main thread.

## 5. PERFORMANCE GUARDRAILS

- **GPU-Safe:** Only animate `transform` and `opacity`. Never `top`, `left`, `width`, `height`.
- **Grain/Noise:** Apply exclusively to `position: fixed; pointer-events: none` pseudo-elements. Never on scrolling containers.
- **Blur:** Only on fixed/sticky elements. Never on scrolling content.
- **Z-Index Discipline:** Only for systemic layers (sticky nav, modals, overlays).
- **`prefers-reduced-motion` (shokunin improvement):** Mandatory on every animation:
```css
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}
```

## 6. TECHNICAL REFERENCE (Dial Definitions)

### DESIGN_VARIANCE (1-10)
- **1-3 (Predictable):** `justify-center`, 12-column grids, equal paddings.
- **4-7 (Offset):** Overlapping, varied aspect ratios, left-aligned over center.
- **8-10 (Asymmetric):** Masonry, fractional grids, massive empty zones.
- **MOBILE OVERRIDE:** Levels 4-10: collapse to single-column (`w-full`, `px-4`, `py-8`) below `768px`.

### MOTION_INTENSITY (1-10)
- **1-3 (Static):** `:hover` and `:active` only.
- **4-7 (Fluid):** `transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1)`. Stagger reveals.
- **8-10 (Choreography):** Complex scroll-triggers. Framer Motion. NEVER `window.addEventListener('scroll')`.

### VISUAL_DENSITY (1-10)
- **1-3 (Gallery):** Lots of white space. Expensive, clean.
- **4-7 (Daily App):** Normal spacing.
- **8-10 (Cockpit):** Tiny paddings. No cards. 1px lines. Monospace for all numbers.

## 7. AI TELLS (Forbidden Patterns)

| Category | Banned | Use Instead |
|----------|--------|-------------|
| Visual | Neon glows, #000000, oversaturated accents, gradient text, custom cursors | Inner borders, tinted shadows, zinc/slate neutrals |
| Typography | Inter font, oversized H1s, serif on dashboards | Geist, Outfit, Satoshi. Hierarchy via weight + color, not just scale |
| Layout | Centered heroes, 3-column equal cards | Split screen, zig-zag, asymmetric |
| Content | "John Doe", "99.99%", "Acme", "Elevate", "Seamless" | Creative names, messy numbers, concrete verbs |
| Resources | Unsplash (broken links), default shadcn/ui | picsum.photos, customized shadcn |

## 8. THE CREATIVE ARSENAL (High-End Inspiration)

Reference library of advanced UI concepts. Never default to generic. Use Framer Motion for Bento/UI interactions. Use GSAP/ThreeJS exclusively for isolated full-page scrolltelling or canvas backgrounds, wrapped in strict useEffect cleanup.

### Hero Paradigms: Split Screen, Slide-Away Text, Curtain Reveal, Zoom Parallax
### Navigation: Mac OS Dock, Magnetic Button, Dynamic Island, Radial Menu
### Layouts: Bento Grid, Masonry, Chroma Grid, Split Scroll
### Cards: Parallax Tilt, Spotlight Border, Holographic Foil, Tinder Swipe
### Scroll: Sticky Stack, Horizontal Hijack, Scroll Progress Path, Liquid Swipe
### Text: Kinetic Marquee, Text Mask Reveal, Scramble Effect, Circular Path
### Micro: Particle Explosion, Ripple Click, Skeleton Shimmer, Animated SVG Line Drawing

## Error Handling

| Error | Cause | Fix |
|-------|-------|-----|
| Layout shift on iOS Safari | `h-screen` used | Replace with `min-h-[100dvh]` |
| Framer Motion frames drop under load | Using `x`/`y` shorthand | Use `transform: "translateX()"` string or WAAPI |
| Grain causes scroll jank | Grain on scrolling container | Move to `position: fixed; pointer-events: none` |
| Touch hover state fires incorrectly | No `@media (hover: hover)` guard | Gate hover behind pointer media query |
| Magnetic button causes layout shift | Using `useState` for animation | Use `useMotionValue` + `useTransform` |
| Perpetual animation causes re-renders | Not in isolated Client Component | `React.memo` + isolated leaf component |
| Bento cards break on mobile | No mobile collapse rules | Force single-column below `768px` |

## 10. PRE-FLIGHT CHECKLIST

- [ ] Mobile: `min-h-[100dvh]` (not `h-screen`)
- [ ] Mobile collapse below 768px for asymmetric layouts
- [ ] `prefers-reduced-motion` on every animation
- [ ] Only `transform` + `opacity` animated
- [ ] Hover gated behind `@media (hover: hover)`
- [ ] No emojis in code or content
- [ ] No Inter as display font
- [ ] No neon glows or AI purple
- [ ] No `#000000` or `#ffffff` — tinted neutrals
- [ ] Grid used instead of complex flexbox math
- [ ] Loading, empty, error states all rendered
- [ ] Buttons: `scale-[0.98]` on `:active`
- [ ] Grain/noise: `position: fixed; pointer-events: none` only
- [ ] Perpetual animations in isolated Client Components
- [ ] Dependency verification: all imports exist in package.json

---

## Workflow

1. **Read user intent** — extract product type, style keywords, motion preference, visual density preference. Map to the three dial values (DESIGN_VARIANCE, MOTION_INTENSITY, VISUAL_DENSITY).
2. **Lock dependencies** — check package.json before importing. Tailwind version (v3 vs v4 syntax). Icon library availability. Framer Motion presence.
3. **Establish the global config** — set typography (display sans, body sans, mono). Set 1 accent color (saturation < 80%). Set neutral palette (Zinc or Slate, never mixed).
4. **Apply bias corrections** — anti-center for DESIGN_VARIANCE > 4. No cards for VISUAL_DENSITY > 7. No serif for dashboards. No purple glows. No Inter as display.
5. **Build component tree** — extract interactive/motion components into isolated Client Components with `'use client'`. Static content stays server-rendered.
6. **Layer creative effects** — apply grain/noise to fixed pseudo-elements only. Add scroll-entry reveals (staggered at 100ms intervals). Spring physics for magnetic micro-interactions.
7. **Guard performance** — only animate `transform` + `opacity`. Gate hover behind `@media (hover: hover)`. Mandatory `prefers-reduced-motion` on every animation.
8. **Run pre-flight checklist** — verify mobile `min-h-[100dvh]`, no emojis, no banned patterns, all states rendered (loading, empty, error, success).

## Anti-Patterns

| Pattern | Problem | Fix |
|---------|---------|-----|
| Importing Framer Motion without checking package.json | Build fails, missing dependency | Verify dependency exists first. Output `npm install framer-motion` if missing. |
| Using Tailwind v4 syntax in v3 projects | Breaking changes in class names | Check package.json Tailwind version. Match syntax to installed version. |
| `h-screen` everywhere | iOS Safari viewport bugs, layout shift | Always `min-h-[100dvh]` for full-screen sections. |
| Animated `width`/`height`/`top`/`left` properties | Layout thrashing, GPU cannot accelerate | Only animate `transform` and `opacity`. Use compositor-only properties. |
| Inter as display font for premium products | Looks generic, no character | Use Geist, Outfit, Cabinet Grotesk, or Satoshi for display headings. |
| Neon glows, purple button shadows, oversaturated accents | AI tell — looks templated | Neutral bases (Zinc/Slate) with a single controlled accent. OKLCH over hex. |
| Grain texture on scrolling containers | Scroll jank, paint storms | Apply grain exclusively to `position: fixed; pointer-events: none` pseudo-elements. |
| `useState` for continuous animation values | Triggers React re-renders 60fps | Use Framer Motion `useMotionValue` + `useTransform` outside React render cycle. |
| Centered hero section when DESIGN_VARIANCE > 4 | Cliché, no personality | Split screen (50/50), left-aligned content with right-aligned asset, or asymmetric whitespace. |
| Missing loading/empty/error states on interactive components | Broken UX when data isn't perfect | Implement all four states: loading (skeleton), empty (guidance), error (inline+actionable), success. |

## Sources

- Emil Kowalski — Design engineering (Sonner, Vaul, Linear, animations.dev)
- Paul Lewis — Compositor-only properties (Google Chrome)
- Ahmad Shadeed — Container Queries and modern CSS
- WCAG 2.2 — Accessibility
- Apple Human Interface Guidelines
- Material Design 3
- OKLCH color space (W3C)

## Checklist

- [ ] Skill loads without errors in the AI agent
- [ ] YAML frontmatter is valid (description, compatibility, audience)
- [ ] Workflow section provides clear step-by-step instructions
- [ ] Error handling section covers common failure modes
- [ ] All referenced files (references/, scripts/, assets/) exist
- [ ] Skill triggers correctly for intended use cases
- [ ] No broken links or missing resources
