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 GitHubfusengine/agents
fuse-design
plugins/design-expert/skills/generating-components/SKILL.md
January 22, 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
**design-expert creates specs → Delegates to technical agent.**
## 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: CREATE SPECS
Create a specs document for the technical agent:
```markdown
## Design Specs: HeroSection
### Tokens (from app): var(--primary), font-display
### Inspiration: 21st.dev hero-glassmorphism
### Requirements: glassmorphism, stagger animation, WCAG AA
### Files: HeroSection.tsx (~60 lines)
```
### Phase E: DELEGATE
```
Task: react-expert (or nextjs-expert)
Prompt: "Implement component following these design specs: [specs above]"
```
## ANTI-AI SLOP (MANDATORY)
| FORBIDDEN | USE INSTEAD |
|-----------|-------------|
| Inter, Roboto, Arial | 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" />