Help us improve
Share bugs, ideas, or general feedback.
From ai-brain-starter
Anti-slop tactical layer for React/Next.js/Tailwind frontend. Includes Dial System, Frequency Gate, Jane-Doe rules, hero discipline, Bento motion, shadow recipes, and 50-item redesign audit checklist for building/auditing UI.
npx claudepluginhub adelaidasofia/ai-brain-starterHow this skill is triggered — by the user, by Claude, or both
Slash command
/ai-brain-starter:frontend-tasteThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Anti-slop tactical layer. Sits on top of the impeccable substrate (strategy + register laws + shared design absolute bans). Adds the prescriptive recipe layer impeccable leaves under-specified.
Builds and refines React/Next.js frontend UIs with strict design taste, calibrated colors, responsive layouts, and motion rules, overriding generic LLM biases.
Generates React/Next.js UIs with Tailwind CSS enforcing strict component architecture, metric-based design rules (variance 8, motion 6, density 4), CSS hardware acceleration, and balanced aesthetics overriding LLM biases.
Generates production-quality React and Next.js UI components and full pages using Tailwind CSS and Framer Motion for hero sections, SaaS dashboards, pricing pages, bento grids, forms, cards, and animated elements.
Share bugs, ideas, or general feedback.
Anti-slop tactical layer. Sits on top of the impeccable substrate (strategy + register laws + shared design absolute bans). Adds the prescriptive recipe layer impeccable leaves under-specified.
| Layer | Source | What it carries |
|---|---|---|
| Strategy | impeccable skill (Apache 2.0) | Register split (brand vs product), color strategy (Restrained / Committed / Full palette / Drenched), theme physical-scene test, 17-font reflex-reject, aesthetic-lane reflex-reject, shared absolute bans |
| Motion philosophy | design-motion-principles skill (MIT) | Three-designer lens (Emil / Jakub / Jhey), Frequency Gate, Golden Rule, duration-by-context, accessibility (prefers-reduced-motion) |
| Tactics (this skill) | This file | Dial System, Variance Engine archetype lock-in, Jane-Doe content rules, hero discipline, Bento 2.0 motion engine, Double-Bezel nested architecture, image-first workflow, shadow/surface recipes, ~50-item redesign audit checklist, minimalist variant, anti-truncation discipline |
Do not duplicate impeccable's content. Reference impeccable's brand.md and product.md for the register-specific laws.
Three globals at the top of any frontend-taste prompt. Default 8 / 6 / 4. Tunable per-request.
DESIGN_VARIANCE: 8 // 1=symmetric, 10=asymmetric/chaotic
MOTION_INTENSITY: 6 // 1=static, 10=cinematic/physics
VISUAL_DENSITY: 4 // 1=art-gallery, 10=pilot-cockpit
Mobile override (DESIGN_VARIANCE 4-10): asymmetric layouts above md: MUST collapse to w-full px-4 py-8 single-column on <768px.
Register-default presets:
| Register | Variance | Motion | Density |
|---|---|---|---|
| Brand (marketing / landing / campaign) | 7-9 | 6-8 | 3-5 |
| Product UI (dashboard / admin / app) | 3-5 | 3-5 | 5-7 |
| Editorial / long-form | 6-8 | 4-6 | 4-6 |
| Data dashboard / cockpit | 4-6 | 2-4 | 7-10 |
The single biggest gain from impeccable is the register split. Brand vs product are different beasts.
Marketing pages, landing pages, campaign pages, portfolios, long-form content. Distinctiveness is the bar; AI-flooded average reads as mediocre.
brand.md for the full list.https://images.unsplash.com/photo-{id}?auto=format&fit=crop&w=1600&q=80 — search for the brand's physical object, not the generic category.App UIs, dashboards, admin, settings, data tables, tools, authenticated screens. Earned familiarity is the bar.
-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif). Inter IS permitted here. One family is often right. Fixed rem scale, NOT fluid clamp(). Tighter ratio (1.125-1.2) between steps.https://picsum.photos/seed/{random}/800/600 when needed. Real product screenshots > photo decoration.Before writing code, silently pick ONE combo and commit:
Vibe Archetype (pick 1): Ethereal Glass · Editorial Luxury · Soft Structuralism · Pristine Minimalism · Bold Studio Solid · Drenched
Layout Archetype (pick 1): Asymmetrical Bento · Z-Axis Cascade · Editorial Split · Cinematic Centered Minimalist · Floating Polaroid Scatter · Swiss Grid Discipline
Signature Components (pick exactly 4): diagonal staggered masonry · 3D cascading card deck · hover-accordion slice · gapless bento grid · infinite brand marquee · turning polaroid arc · vertical rhythm lines · off-grid editorial layout · product UI panel stack · split testimonial wall · layered image crop frames · Bento 2.0 motion engine
Motion Language (pick exactly 2): scrubbing text reveal · pinned narrative · staggered float-up · parallax image drift · smooth accordion expansion · cinematic fade-through
| Frequency | Recommendation |
|---|---|
| Rare (monthly) | Delightful, expressive motion welcome |
| Occasional (daily) | Subtle, fast motion |
| Frequent (100s/day) | No animation, or instant transition |
| Keyboard-initiated | Never animate |
Golden Rule: "The best animation is that which goes unnoticed." If users comment "nice animation!" on every interaction, it's too prominent for production.
Accessibility is NOT optional: every animation handles prefers-reduced-motion. Wrap motion in @media (prefers-reduced-motion: no-preference) or pair Framer Motion's useReducedMotion() hook with conditional defaults.
LLMs default to filler. Override every time.
47.2%, +1 (312) 847-1928, 1,847 users).clamp(3rem, 5vw, 5.5rem) for brand.min-h-[100dvh] not h-screen (iOS Safari viewport-jump).White cards on #f9fafb, rounded-[2.5rem], 1px border-slate-200/50, diffusion shadow shadow-[0_20px_40px_-15px_rgba(0,0,0,0.05)], p-8-p-10 padding, titles + descriptions OUTSIDE the cards.
Spring physics: type: "spring", stiffness: 100, damping: 20. No linear easing in Bento. Wrap dynamic lists in <AnimatePresence>. Memoize all perpetual animations and isolate each in its own microscopic Client Component.
Five card archetypes:
layoutId.x: ["0%", "-100%"].The "materializing" effect — opacity + translateY + blur.
initial={{ opacity: 0, translateY: "calc(-100% - 4px)", filter: "blur(4px)" }}
animate={{ opacity: 1, translateY: 0, filter: "blur(0px)" }}
transition={{ type: "spring", duration: 0.45, bounce: 0 }}
For non-container reveals: opacity 0→1, translateY ~8px→0, blur 4px→0px.
exit={{ translateY: "-12px", opacity: 0, filter: "blur(4px)" }}
Exception: user-initiated dismissal, error clearing, item deletion, page transitions with directional continuity.
| Easing | Good for |
|---|---|
ease-out | Entering view |
ease-in | Leaving view |
ease-in-out | Changing state while visible |
linear | Continuous loops, progress indicators |
spring (bounce: 0) | Interactive elements, professional UI |
spring (bounce > 0) | Playful contexts only |
Context rule: "You wouldn't use 'Elastic' for a bank's website, but it might work for a children's site."
Custom Bézier > built-in CSS easing. ease and ease-in-out lack strength.
| Context | Guideline |
|---|---|
| Product UI | Under 300ms — 180ms ideal |
| Production polish | 200-500ms |
| Brand / creative / kids | Whatever serves the effect |
animation-delay only applies once. Use:
0%, 50% { rotate: 0; } 100% { rotate: 360deg; })animation-delay: calc(var(--index) * 80ms))Use animation-fill-mode: backwards to prevent flash-at-full-opacity-before-delayed-fade-in.
.card {
background: #ffffff;
border-radius: 0.75rem;
background-clip: padding-box;
box-shadow:
0 0 0 1px rgba(15, 23, 42, 0.08),
0 1px 1px -1px rgba(15, 23, 42, 0.10),
0 3px 6px -3px rgba(15, 23, 42, 0.15);
}
.elevated {
--shadow-color: rgb(0 0 0 / 0.06);
box-shadow:
0 0 0 1px var(--shadow-color),
0 1px 1px -0.5px var(--shadow-color),
0 3px 3px -1.5px var(--shadow-color),
0 6px 6px -3px var(--shadow-color),
0 12px 12px -6px var(--shadow-color),
0 24px 24px -12px var(--shadow-color);
}
.dark-card {
background: #020617;
border-radius: 1rem;
box-shadow:
inset 0 0 0 1px rgba(255, 255, 255, 0.05),
0 12px 40px rgba(0, 0, 0, 0.75);
}
Outer 12px + padding 2px → inner 10px.
.outer { border-radius: 12px; padding: 2px; }
.inner { border-radius: 10px; }
button.mac {
all: unset;
font: 13px -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
color: #262626;
background: #ffffff;
border-radius: 5px;
height: 20px;
padding: 0 10px;
box-shadow:
0 0 0 0.5px rgba(0, 0, 0, 0.076),
0 0.5px 0 rgba(0, 0, 0, 0.035),
0 -1px 1px 0.3px rgba(0, 0, 0, 0.0255),
0 1px 1px rgba(0, 0, 0, 0.01),
-1px 1px 1px 0.3px rgba(0, 0, 0, 0.05),
1px 1px 1px 0.3px rgba(0, 0, 0, 0.05);
}
.glass {
background: rgba(15, 23, 42, 0.35);
border: 1px solid rgba(255, 255, 255, 0.18);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
box-shadow: 0 18px 45px rgba(15, 23, 42, 0.6);
}
backdrop-filter ONLY on fixed/sticky elements.
.folded {
border-radius: 1.25rem;
background: linear-gradient(135deg, #020617, #0f172a);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.16),
inset 0 -1px 0 rgba(15, 23, 42, 0.9),
0 18px 50px rgba(0, 0, 0, 0.7);
}
.button-primary {
background: #2563eb;
box-shadow: 0 10px 20px rgba(37, 99, 235, 0.35);
}
.card-accent::before {
content: "";
position: absolute;
inset: 0;
height: 6px;
background: linear-gradient(to right, #06b6d4, #6366f1);
}
Never place a premium card flatly. Nest enclosures for machined-hardware feel.
bg-black/5), hairline border (ring-1 ring-black/5), padding (p-1.5-p-2), large outer radius (rounded-[2rem]).shadow-[inset_0_1px_1px_rgba(255,255,255,0.15)]), concentric radius (rounded-[calc(2rem-0.375rem)]).active:scale-[0.98] on press; nested icon group-hover:translate-x-1 group-hover:-translate-y-[1px] and scale 1.05. NEVER useState — Framer Motion useMotionValue + useTransform.When the task is visual website work and image generation is available:
Run against any frontend surface to surface every generic AI pattern in one pass.
font-variant-numeric: tabular-nums.text-wrap: balance.#000000 background → off-black / charcoal / tinted dark.box-shadow → tint to background hue.height: 100vh → min-height: 100dvh (iOS Safari).scale(0.98) or translateY(1px).window.alert().href="#") → link real or visually disable.scroll-behavior: smooth.top / left / width / height → transform and opacity only.prefers-reduced-motion handling → wrap all motion.99.99%) → organic messy.9999) → clean z-index scale.<title>, description, og:image.When the brief is editorial / clean / quiet premium:
#FFFFFF or warm bone #F7F6F3 / #FBFBFA.1px solid #EAEAEA, 8-12px border-radius max, 24-40px internal padding.#FDEBEC text #9F2F2D, Pale Blue #E1F3FE text #1F6C9F, Pale Green #EDF3EC text #346538, Pale Yellow #FBF3DB text #956400).#000000. Off-black #111111 or #2F3437 with line-height 1.6.#111111 with #FFFFFF text, 4-6px radius, no shadow.text-xs, uppercase wide tracking 0.05em, muted pastel bg.py-24 to py-32 minimum.| Symptom | Fix |
|---|---|
| Hero jumps on iOS Safari scroll | NEVER h-screen. ALWAYS min-h-[100dvh]. |
staggerChildren only fires for first child | Parent + children MUST be in identical Client Component tree. |
| Magnetic hover collapses performance on mobile | Framer Motion useMotionValue + useTransform, NOT useState. |
| Tailwind v4 syntax in v3 project | Check package.json first. v4: @tailwindcss/postcss or Vite plugin. |
| Layout jumps from animating top/left/width/height | EXCLUSIVELY transform + opacity. |
Framer Motion x/y/scale props drop frames under load | These shorthands run on rAF/main thread, NOT the GPU. Use the full string: animate={{ transform: "translateX(100px)" }}, not animate={{ x: 100 }}. CSS animations stay smooth when the main thread is busy; Framer shorthands don't. |
| Grain/noise filters tank scroll FPS | Filters EXCLUSIVELY on fixed pointer-events-none overlays. |
'use client' everywhere | Default Server Components. Extract interactive leaves. |
backdrop-blur everywhere kills scroll FPS | ONLY fixed/sticky elements. |
window.addEventListener('scroll') | NEVER. IntersectionObserver / whileInView / useScroll. |
| Mixing GSAP and Framer Motion in same component tree | Don't. Framer Motion for UI/Bento. GSAP for isolated scrolltelling. |
prefers-reduced-motion not handled | Wrap motion in media query or use useReducedMotion(). |
Product register permits Inter, system fonts, and pragmatic defaults. Brand register applies these bans.
Geist, Outfit, Cabinet Grotesk, or Satoshi. Read impeccable's 17-font reflex-reject list for the full ban.#000000 banned. Use Off-Black, Zinc-950, or Charcoal.@phosphor-icons/react OR @radix-ui/react-icons. One stroke weight globally.shadcn/ui fine BUT NEVER default state. Customize radii, colors, shadows.When the deliverable is a full implementation, do not ship a skeleton.
Banned in code: // ..., // rest of code, // implement here, // TODO, /* ... */, // similar to above, // continue pattern, bare ....
Banned in prose: "Let me know if you want me to continue," "for brevity," "the rest follows the same pattern," "similarly for the remaining," "I'll leave that as an exercise."
If approaching the token limit, write at full quality up to a clean breakpoint and end with:
[PAUSED — X of Y complete. Send "continue" to resume from: next section name]
prefers-reduced-motion handledmin-h-[100dvh]useEffect animations have cleanupstiffness: 100, damping: 20backdrop-blur only on fixed/stickywindow.addEventListener('scroll')top / left / width / height// rest of code placeholdersBuilt by everything-comparison across all comparable sources:
| Source | License | Net-new content used |
|---|---|---|
| Leonxlnx/taste-skill | MIT | Dial System, Jane-Doe rules, Bento 2.0 archetypes, hero discipline, anti-truncation, archetype lock-in, Variance Engine, redesign audit checklist, minimalist variant, Double-Bezel |
| pbakaus/impeccable | Apache 2.0 | Register split (brand vs product), color strategy ladder, theme physical-scene test, 17-font reflex-reject, aesthetic-lane reflex-reject, absolute bans |
| kylezantos/design-motion-principles | MIT | Frequency Gate, Golden Rule, duration-by-context, motion cookbook (enter recipe, exit subtler, easing-by-context, stagger, fill mode), accessibility |
| jshmllr/tokyn | Other | Shadow-as-border, shadow stacks with negative spread, inner highlights, concentric radius, macOS micro-shadow, glass, folded panel, saturated shadows, color strip accents |
Install all four for the full ecosystem:
# This skill (frontend-taste) is part of ai-brain-starter
# Strategic layer:
npx skills add pbakaus/impeccable --skill frontend-design
# Motion philosophy:
git clone https://github.com/kylezantos/design-motion-principles ~/.claude/skills/design-motion-principles
# Source bundle (cherry-pick reference):
npx skills add Leonxlnx/taste-skill --skill design-taste-frontend
MIT. Source attributions above. This skill is a derivative cherry-pick under MIT (taste-skill) + Apache 2.0 (impeccable) + MIT (design-motion-principles) compatible licensing. Attribution preserved in sources: frontmatter.