figma-driven-nextjs
npx skills add https://github.com/richorpoverty/agent-skills --skill figma-driven-nextjs
Agent 安装分布
Skill 文档
Figma-Driven Next.js å¼åæè½
åºäº Figma 设计驱å¨ç Next.js å¼åæè½ï¼ç»å vercel-react-best-practices å web-design-guidelines æè½ï¼ä»¥ Figma 设计æä»¶ä¸ºæ ¸å¿è®¾è®¡æ¥æºã
ææ¯æ
| ç±»å« | ææ¯éå |
|---|---|
| åç«¯æ¡æ¶ | Next.js (App Router) |
| å端æå¡ | Supabase |
| æ ·å¼æ¹æ¡ | Tailwind CSS |
| 徿 åº | Lucide (https://lucide.dev/) |
| å¨ç»åº | Motion (https://motion.dev/) |
| 工使µ | Figma MCP â Trae IDE |
æ ¸å¿åå
Figma ä¼å
ææè®¾è®¡å³ç以 Figma æä»¶ä¸ºåï¼vercel-react-best-practices å web-design-guidelines ä½ä¸ºä»£ç è´¨éåæä½³å®è·µçè¡¥å
æå¯¼ã
设计令çç³»ç»
1. é¢è²è§è
æ¥æº: ä¸¥æ ¼éµå¾ª Figma æä»¶ä¸çé¢è²å®ä¹
å®ç°: å建ç»ä¸çé¢è²ä»¤çæä»¶ /styles/tokens/colors.ts
Dark 模å¼:
- èªå¨æ¨å¯¼ Dark 模å¼é¢è²ï¼åºäº Figma åå§é¢è²æºè½çæï¼
- éµå¾ª WCAG 对æ¯åº¦æ å
- ä» æ¯æ Light/Dark å主é¢ï¼ä¸æ¯æå¤ä¸»é¢
é¢è²ä»¤çç»æ:
// /styles/tokens/colors.ts
export const colors = {
light: {
primary: '#ä»Figmaæå',
secondary: '#ä»Figmaæå',
background: '#ä»Figmaæå',
foreground: '#ä»Figmaæå',
// ... å
¶ä»é¢è²
},
dark: {
primary: '#èªå¨æ¨å¯¼',
secondary: '#èªå¨æ¨å¯¼',
background: '#èªå¨æ¨å¯¼',
foreground: '#èªå¨æ¨å¯¼',
// ... èªå¨çæ
}
}
Dark æ¨¡å¼æ¨å¯¼è§å:
- èæ¯è²ï¼éä½äº®åº¦ï¼ä¿æè²ç¸
- 忝è²ï¼æé«äº®åº¦ï¼ç¡®ä¿å¯¹æ¯åº¦ ⥠4.5:1
- 强è°è²ï¼å¾®è°äº®åº¦ï¼ä¿æåçè¯å«åº¦
- è¾¹æ¡è²ï¼éä½é¥±å度å亮度
2. åä½è§è
æ¥æº: ä½¿ç¨ Figma æä»¶ä¸çåä½è§è
å®ç°: å建åä½ä»¤çæä»¶ /styles/tokens/typography.ts
å å«: å使ãåå·ãåéãè¡é«ãåé´è·
// /styles/tokens/typography.ts
export const typography = {
fontFamily: {
sans: 'ä»Figmaæå',
serif: 'ä»Figmaæå',
mono: 'ä»Figmaæå',
},
fontSize: {
xs: 'ä»Figmaæå',
sm: 'ä»Figmaæå',
base: 'ä»Figmaæå',
lg: 'ä»Figmaæå',
xl: 'ä»Figmaæå',
'2xl': 'ä»Figmaæå',
// ... å
¶ä»å°ºå¯¸
},
fontWeight: {
normal: 400,
medium: 500,
semibold: 600,
bold: 700,
},
lineHeight: {
tight: 'ä»Figmaæå',
normal: 'ä»Figmaæå',
relaxed: 'ä»Figmaæå',
},
letterSpacing: {
tight: 'ä»Figmaæå',
normal: 'ä»Figmaæå',
wide: 'ä»Figmaæå',
},
}
3. é´è·è§è
æ¥æº: éµå¾ª Figma æä»¶ä¸çé´è·å®ä¹
å®ç°: å建é´è·ä»¤çæä»¶ /styles/tokens/spacing.ts
ä¼å: å¯è¿è¡åçä¼åï¼ä½éæç¡®åç¥ç¨æ·ä¼åäºä»ä¹ååå
// /styles/tokens/spacing.ts
export const spacing = {
0: '0',
1: 'ä»Figmaæå', // å¦ 4px
2: 'ä»Figmaæå', // å¦ 8px
3: 'ä»Figmaæå', // å¦ 12px
4: 'ä»Figmaæå', // å¦ 16px
// ... å
¶ä»é´è·
}
4. é´å½±è§è
æ¥æº: ä» Figma æåé´å½±ææ
å®ç°: å建é´å½±ä»¤çæä»¶ /styles/tokens/shadows.ts
// /styles/tokens/shadows.ts
export const shadows = {
sm: 'ä»Figmaæå',
md: 'ä»Figmaæå',
lg: 'ä»Figmaæå',
xl: 'ä»Figmaæå',
}
å¸å±è§è
åå
ååºå¼å¸å±ä¼å ï¼èªéåºæ¹æ³
æç¹çç¥
- ä¼å : æ ¹æ® Figma 设计æºè½æ¨èæç¹
- å¤é: 使ç¨è¡ä¸æ åæç¹ï¼å½ Figma æ æç¡®æç¹æ¶ï¼
| æç¹åç§° | æå°å®½åº¦ | ç¨é |
|---|---|---|
sm |
640px | ææºæ¨ªå± |
md |
768px | å¹³æ¿ç«å± |
lg |
1024px | å¹³æ¿æ¨ªå±/å°ç¬è®°æ¬ |
xl |
1280px | æ¡é¢æ¾ç¤ºå¨ |
2xl |
1536px | 大屿¾ç¤ºå¨ |
èªéåºæ¹æ³
- ä½¿ç¨ CSS Grid å Flexbox å®ç°èªéåºå¸å±
- 使ç¨
clamp()彿°å®ç°æµä½åä½åé´è· - 使ç¨å®¹å¨æ¥è¯¢ï¼Container Queriesï¼å®ç°ç»ä»¶çº§ååºå¼
- 使ç¨ç¸å¯¹åä½ï¼remãemãvwãvhã%ï¼æ¿ä»£åºå®åç´ å¼
Figma æºè½æ¨èè§å
- åæ Figma ä¸ç Auto Layout 设置
- æ ¹æ® Figma ç»ä»¶ç约æï¼Constraintsï¼æ¨æååºå¼è¡ä¸º
- æ ¹æ® Figma åä½ï¼Variantsï¼è¯å«ä¸åæç¹ç设计
ç»ä»¶åºæ¶æ
ååè®¾è®¡æ¹æ³è®º
/components
/atoms # ååç»ä»¶ï¼Button, Input, Icon...ï¼
/molecules # ååç»ä»¶ï¼SearchBar, Card...ï¼
/organisms # ææºä½ç»ä»¶ï¼Header, Footer...ï¼
/templates # 模æ¿ç»ä»¶
/pages # 页é¢ç»ä»¶
ç»ä»¶æä»¶ç»æ
/components
/atoms
/Button
Button.tsx # ç»ä»¶å®ç°
Button.types.ts # ç±»åå®ä¹
index.ts # 导åº
ç»ä»¶å½åæ å°è§å
è¦æ±: å建 /docs/component-mapping.md æä»¶
æ ¼å¼:
| Figma ç»ä»¶å | 代ç ç»ä»¶å | æä»¶è·¯å¾ |
|-------------|-----------|---------|
| Button/Primary | Button | /components/atoms/Button |
| Button/Secondary | Button | /components/atoms/Button |
| Input/Text | Input | /components/atoms/Input |
徿 å¤ç
徿 æ¥æº
- Figma 徿 : ä» Figma 导åºçèªå®ä¹å¾æ
- Lucide 徿 åº: https://lucide.dev/ ä½ä¸ºè¡¥å 徿 åº
å®ç°è§è
- Figma 徿 : SVG ç»ä»¶åï¼åæ¾äº
/components/icons/ - Lucide 徿 : æéå¯¼å ¥ï¼Tree-shakable
- èªå®ä¹è½å: æ¯æå°ºå¯¸ãé¢è²ãæè¾¹å®½åº¦èªå®ä¹
å½åè§è
- Figma 导åº:
Icon[Name].tsx - Lucide 使ç¨: ç´æ¥å¯¼å
¥
import { IconName } from 'lucide-react'
徿 ç»ä»¶æ¥å£
interface IconProps {
size?: number
color?: string
strokeWidth?: number
className?: string
}
å¨ç»è§è
å¨ç»åº
Motion: https://motion.dev/ – ç产级å¨ç»åº
æ§è½ä¼å
- 使ç¨
willChangeæç¤ºæµè§å¨ä¼å - ä¼å
使ç¨
transform屿§ - é¿å å¨ç»å¸å±å±æ§ï¼width, height, top, leftï¼
æ éç¢
æ¯æ prefers-reduced-motion åªä½æ¥è¯¢
å¨ç»ç±»å
- å ¥åºå¨ç»ï¼Enterï¼
- éåºå¨ç»ï¼Exitï¼
- æ»å¨å¨ç»ï¼Scrollï¼
- æå¿å¨ç»ï¼Gestureï¼
- å¸å±å¨ç»ï¼Layoutï¼
Motion 使ç¨ç¤ºä¾
import { motion, AnimatePresence } from 'motion/react'
<AnimatePresence>
{isVisible && (
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -20 }}
transition={{ duration: 0.3 }}
style={{ willChange: 'transform, opacity' }}
/>
)}
</AnimatePresence>
主é¢åæ¢æºå¶
å®ç°æ¹å¼
- CSS åé: ä½¿ç¨ CSS èªå®ä¹å±æ§å®ä¹é¢è²
- Tailwind Dark 模å¼:
darkMode: 'class'é ç½® - 忢æ¹å¼: ç³»ç»åå¥½æ£æµ + æå¨åæ¢
- æä¹ å: localStorage åå¨ç¨æ·å好
䏻颿ä¾è
// /components/ThemeProvider.tsx
'use client'
import { createContext, useContext, useEffect, useState } from 'react'
type Theme = 'light' | 'dark'
type ThemeContextType = {
theme: Theme
setTheme: (theme: Theme) => void
}
const ThemeContext = createContext<ThemeContextType | undefined>(undefined)
export function ThemeProvider({ children }: { children: React.ReactNode }) {
const [theme, setTheme] = useState<Theme>('light')
const [mounted, setMounted] = useState(false)
useEffect(() => {
setMounted(true)
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
const savedTheme = localStorage.getItem('theme') as Theme | null
setTheme(savedTheme || (prefersDark ? 'dark' : 'light'))
}, [])
useEffect(() => {
if (mounted) {
document.documentElement.classList.toggle('dark', theme === 'dark')
localStorage.setItem('theme', theme)
}
}, [theme, mounted])
if (!mounted) return null
return (
<ThemeContext.Provider value={{ theme, setTheme }}>
{children}
</ThemeContext.Provider>
)
}
export const useTheme = () => {
const context = useContext(ThemeContext)
if (!context) throw new Error('useTheme must be used within ThemeProvider')
return context
}
æ éç¢è§è
éµå¾ª web-design-guidelines æè½ä¸çæ éç¢è§åï¼
| ç±»å« | è¦æ± |
|---|---|
| è¯ä¹å HTML | ä½¿ç¨æ£ç¡®ç HTML å ç´ |
| ARIA 屿§ | å¿ è¦æ¶æ·»å aria-labelãaria-describedby ç |
| é®çå¯¼èª | ææäº¤äºå ç´ å¯éè¿é®çè®¿é® |
| ç¦ç¹ç®¡ç | å¯è§çç¦ç¹ç¶æï¼ä½¿ç¨ focus-visible |
| é¢è²å¯¹æ¯åº¦ | 符å WCAG AA æ åï¼4.5:1ï¼ |
å¾çå¤ç
- æ¥æº: Figma ä¸çå¾çèµæº
- å®ç°:
- ä½¿ç¨ Next.js
<Image>ç»ä»¶ - èªå¨ä¼ååæå è½½
- ååºå¼å¾ç
- æä¾ alt ææ¬
- ä½¿ç¨ Next.js
代ç 飿 ¼
| ç±»å« | è§è |
|---|---|
| è¯è¨ | TypeScriptï¼å¼ºç±»åå®ä¹ï¼ |
| ç»ä»¶æä»¶ | PascalCaseï¼å¦ Button.tsxï¼ |
| å·¥å ·å½æ° | camelCaseï¼å¦ formatDate.tsï¼ |
| 常é | UPPER_SNAKE_CASEï¼å¦ API_BASE_URLï¼ |
工使µç¨
Figma æä»¶ (MCP)
â
æå设计令ç
(é¢è²ãåä½ãé´è·ãç»ä»¶)
â
çæè®¾è®¡ç³»ç»æä»¶
(tokens/*.ts)
â
å建ç»ä»¶æ å°æä»¶
(component-mapping.md)
â
å建åºç¡ç»ä»¶
(åºäº Figma ç»ä»¶)
â
åºç¨æä½³å®è·µ
(vercel-react-best-practices)
â
æ éç¢ä¸ UX 审æ¥
(web-design-guidelines)
â
宿´é¡µé¢å®ç°
è¾åºæä»¶æ¸ å
æ¯æ¬¡ä» Figma åå»ºé¡¹ç®æ¶ï¼åºè¾åºä»¥ä¸æä»¶ï¼
/styles/tokens/colors.ts– é¢è²ä»¤çï¼å« Light/Darkï¼/styles/tokens/typography.ts– åä½ä»¤ç/styles/tokens/spacing.ts– é´è·ä»¤ç/styles/tokens/shadows.ts– é´å½±ä»¤ç/styles/tokens/index.ts– ç»ä¸å¯¼åº/styles/globals.css– å ¨å±æ ·å¼/docs/component-mapping.md– ç»ä»¶å½åæ å°è§å/components/ThemeProvider.tsx– 䏻颿ä¾è/tailwind.config.ts– Tailwind é ç½®ï¼å«è®¾è®¡ä»¤çï¼
è§¦åæ¡ä»¶
å½ä»¥ä¸æ åµåçæ¶ï¼èªå¨åºç¨æ¤æè½ï¼
- ç¨æ·è¯·æ±ä» Figma 设计å建页é¢/ç»ä»¶
- ç¨æ·æå° “æ ¹æ® Figma…” æ “æç §è®¾è®¡ç¨¿…”
- ç¨æ·æä¾ Figma æä»¶é¾æ¥æ MCP æ°æ®
- ç¨æ·è¯·æ±å建设计令ç
注æäºé¡¹
- é¢è²æ¥æº: ææé¢è²å¿ é¡»ä» Figma æåï¼ä¸ä½¿ç¨æè½å ç½®é¢è²
- é´è·ä¼å: å¦éä¼åé´è·ï¼å¿ é¡»åç¥ç¨æ·ä¼åå 容ååå
- Dark 模å¼: å³ä½¿ Figma 没æ Dark 模å¼è®¾è®¡ï¼ä¹å¿ é¡»èªå¨çæ
- ç»ä»¶æ å°: å¿ é¡»å建ç»ä»¶å½åæ å°æä»¶ï¼ä¿æ Figma ä¸ä»£ç çä¸è´æ§
- æ éç¢: ææç»ä»¶å¿ 须符å WCAG AA æ å
å®è£ 说æ
å®è£ å½ä»¤
npx skills add https://github.com/Zekiwest/agent-skills --skill figma-driven-nextjs
èªå¨å建 Next.js 项ç®
å®è£ æ¤æè½æ¶ï¼ä¼èªå¨æ§è¡ä»¥ä¸æä½ï¼
-
æ£æµé¡¹ç®ç¶æï¼
- 妿å½åç®å½æ¯ç©ºç®å½ â å建æ°ç Next.js 项ç®
- 妿å½åç®å½å·²æ Next.js é¡¹ç® â ä» å®è£ ä¾èµåé ç½®
- 妿å½åç®å½æå ¶ä»æä»¶ â æç¤ºé误并éåº
-
å建 Next.js 项ç®ï¼ç©ºç®å½æ¶ï¼ï¼
npx create-next-app@latest . --typescript --tailwind --eslint --app --src-dir -
å®è£ é¢å¤ä¾èµï¼
motion– å¨ç»åºlucide-react– 徿 åº@supabase/supabase-js– Supabase 客æ·ç«¯
-
åå»ºè®¾è®¡ç³»ç»æä»¶ç»æï¼
src/ âââ styles/ â âââ tokens/ â âââ colors.ts # é¢è²ä»¤ç â âââ typography.ts # åä½ä»¤ç â âââ spacing.ts # é´è·ä»¤ç â âââ shadows.ts # é´å½±ä»¤ç â âââ index.ts # ç»ä¸å¯¼åº âââ components/ â âââ atoms/ # ååç»ä»¶ â âââ molecules/ # ååç»ä»¶ â âââ organisms/ # ææºä½ç»ä»¶ â âââ templates/ # 模æ¿ç»ä»¶ â âââ icons/ # 徿 ç»ä»¶ â âââ ThemeProvider.tsx # 䏻颿ä¾è âââ docs/ âââ component-mapping.md # ç»ä»¶æ å°æä»¶ -
é ç½® Tailwind å主é¢ï¼
- æ´æ°
tailwind.config.tsæ¯æè®¾è®¡ä»¤ç - æ´æ°
globals.cssæ¯æ Light/Dark ä¸»é¢ - æ´æ°
layout.tsxéæ ThemeProvider
- æ´æ°
æå¨è¿è¡å®è£ èæ¬
妿éè¦éæ°è¿è¡å®è£ èæ¬ï¼
# å¨é¡¹ç®æ ¹ç®å½æ§è¡
bash .agents/skills/figma-driven-nextjs/scripts/install.sh
éè¦ï¼å®è£ ä½ç½®
æè½å¿ é¡»å®è£ å°å½åå·¥ä½åºæ ¹ç®å½ä¸æè½çæã
Trae IDE åªä¼æ«æ”å½åå·¥ä½åºæ ¹ç®å½”ä¸ç .agents æä»¶å¤¹ã
Monorepo 项ç®ç»æ
å¦æä½ çé¡¹ç®æ¯ Monorepo ç»æï¼å¦ project/web/app/page.tsxï¼ï¼è¯·ç¡®ä¿ï¼
- 确认å½åå·¥ä½åºæ ¹ç®å½ï¼IDE æå¼çæä»¶å¤¹æ¯åªä¸ªï¼
- å®è£ å°æ£ç¡®ä½ç½®ï¼æè½å¿ é¡»å®è£ å°å·¥ä½åºæ ¹ç®å½
# æ£ç¡®ç¤ºä¾ï¼å·¥ä½åºæ¯ web å项ç®
project/
âââ web/ # â å·¥ä½åºæ ¹ç®å½
â âââ .agents/ # â æè½å®è£
ä½ç½®
â â âââ skills/
â â âââ figma-driven-nextjs/
â âââ app/
â â âââ page.tsx # â ä½ æå¼çæä»¶
â âââ skills-lock.json # â éæä»¶
âââ other-folder/
# é误示ä¾ï¼æè½è£
å¨ä¸ä¸çº§ç®å½
project/
âââ .agents/ # â é误ä½ç½®ï¼IDE æ«æä¸å°
â âââ skills/
âââ web/ # â å·¥ä½åºæ ¹ç®å½
â âââ app/
â â âââ page.tsx
â âââ (æ .agents) # â è¿é没ææè½
éªè¯å®è£
å¨é¡¹ç®æ ¹ç®å½æ§è¡ä»¥ä¸å½ä»¤éªè¯æè½æ¯å¦æ£ç¡®å®è£ ï¼
# æ¥çå·²å®è£
çæè½
npx skills list
# åºè¯¥è½çå° figma-driven-nextjs
éæ°å®è£ å°æ£ç¡®ä½ç½®
妿æè½å®è£ ä½ç½®é误ï¼è¯·å¨æ£ç¡®çå·¥ä½åºæ ¹ç®å½éæ°æ§è¡å®è£ å½ä»¤ï¼
cd /path/to/your/workspace/root
npx skills add https://github.com/Zekiwest/agent-skills --skill figma-driven-nextjs
å®è£ ä½ç¨å
- Projectï¼æ¨èï¼: ä» å½å项ç®å¯ç¨
- Global: ææé¡¹ç®å¯ç¨ï¼éè¦ç®¡çåæéï¼
ä¾èµæè½
æ¤æè½ä¾èµä»¥ä¸æè½ï¼å»ºè®®ä¸å¹¶å®è£ ï¼
npx skills add https://github.com/vercel-labs/agent-skills --skill vercel-react-best-practices
npx skills add https://github.com/vercel-labs/agent-skills --skill web-design-guidelines