Generate production-ready React components using shadcn/ui, 21st.dev, and Tailwind CSS. Use when user asks for UI components, buttons, forms, cards, hero sections, or mentions design inspiration.
View on GitHubFebruary 2, 2026
Select agents to install to:
npx add-skill https://github.com/fusengine/agents/blob/main/plugins/design-expert/skills/generating-components/SKILL.md -a claude-code --skill generating-componentsInstallation paths:
.claude/skills/generating-components/# Generating Components
## APEX WORKFLOW (MANDATORY)
### Phase A: ANALYZE
```
Task: explore-codebase
Prompt: "Analyze UI: components, colors, typography, spacing, animations"
```
### Phase A: SEARCH INSPIRATION
```typescript
// 21st.dev (MANDATORY FIRST)
mcp__magic__21st_magic_component_inspiration({
message: "Create a hero section",
searchQuery: "hero section glassmorphism"
})
// shadcn/ui
mcp__shadcn__search_items_in_registries({
registries: ["@shadcn"],
query: "button"
})
```
### Phase P: PLAN
TodoWrite with file breakdown (<100 lines each):
- `components/ui/HeroSection.tsx` (~60 lines)
- `components/ui/HeroBackground.tsx` (~30 lines)
### Phase E: CODE
Write component using:
- Design tokens from Phase A
- Inspiration from 21st.dev/shadcn
- Framer Motion animations
- WCAG 2.2 AA compliance
### Phase X: VALIDATE
```
Task: sniper
Prompt: "Validate component: lint, accessibility, design consistency"
```
## ANTI-AI SLOP (MANDATORY)
| FORBIDDEN | USE INSTEAD |
|-----------|-------------|
| Roboto, Arial, system default | Inter, Clash Display, Satoshi, Syne |
| Purple/pink gradients | CSS variables, sharp accents |
| Border-left indicators | Icon + bg-*/10 rounded |
| Flat backgrounds | Glassmorphism, gradient orbs |
| No animations | Framer Motion stagger |
**See:** `../../references/typography.md`, `../../references/color-system.md`
## Component Template
```tsx
"use client";
import { motion } from "framer-motion";
const variants = {
hidden: { opacity: 0, y: 20 },
show: { opacity: 1, y: 0, transition: { staggerChildren: 0.1 } }
};
export function Component({ className }: { className?: string }) {
return (
<motion.div variants={variants} initial="hidden" animate="show">
{/* Background from existing design tokens */}
<div className="absolute inset-0 -z-10">
<div className="absolute top-1/4 left-1/4 w-96 h-96 bg-primary/20 rounded-full blur-3xl" />
</div>
{/* Content */}
</motion.div>
);
}
```
##