03. ์ํ โ ๊ณต์ Figma MCP
์ํ 1: ์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ React๋ก ๋ณํ
Figma ์ธก ์ค๋น
โข
Desktop App ์ด๊ธฐ
โข
๋ณํํ Card ์ปดํฌ๋ํธ 1๊ฐ ์ ํ
Copilot ์ฑํ ์ ๋ ฅ
ํ์ฌ Figma์์ ์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ React + TypeScript + Tailwind๋ก ๋ง๋ค์ด์ค.
ํ์ผ์ src/components/UserCard.tsx๋ก ์์ฑํด์ค.
Plain Text
๋ณต์ฌ
MCP ํธ์ถ ํ๋ฆ (์๋)
1. get_selection() โ { nodeId: "123:45", name: "UserCard" }
2. get_code(nodeId) โ JSX/CSS ๊ตฌ์กฐ
3. get_variable_defs(nodeId) โ { color.primary: "#2563EB", ... }
4. get_image(nodeId) โ PNG (LLM ๋ณด์กฐ)
Plain Text
๋ณต์ฌ
์์ ๊ฒฐ๊ณผ ์ฝ๋
// src/components/UserCard.tsx
type UserCardProps = {
name: string
role: string
avatarUrl: string
}
export function UserCard({ name, role, avatarUrl }: UserCardProps) {
return (
<div className="flex items-center gap-3 rounded-lg bg-white p-4 shadow-sm">
<img src={avatarUrl} alt={name} className="h-12 w-12 rounded-full" />
<div>
<p className="text-base font-semibold text-gray-900">{name}</p>
<p className="text-sm text-gray-500">{role}</p>
</div>
</div>
)
}
TypeScript
๋ณต์ฌ
์ํ 2: ๋์์ธ ํ ํฐ ์ถ์ถ
ํ๋กฌํํธ
ํ์ฌ ํ์ด์ง์์ ์ฌ์ฉ๋ ๋ชจ๋ Color/Spacing/Typography Variable์
tokens.ts ํ์ผ๋ก exportํด์ค.
Plain Text
๋ณต์ฌ
๊ฒฐ๊ณผ
// src/design-system/tokens.ts
export const tokens = {
color: {
primary: '#2563EB',
secondary: '#10B981',
'text-primary': '#111827',
'text-secondary': '#6B7280',
},
spacing: {
xs: 4, sm: 8, md: 12, lg: 16, xl: 24,
},
fontSize: {
sm: 14, base: 16, lg: 18, xl: 20,
},
} as const
TypeScript
๋ณต์ฌ
์ํ 3: ํ์ด์ง ์ ์ฒด ๋ณํ
ํ๋กฌํํธ
์ ํํ "Dashboard" ํ๋ ์์ Next.js App Router ๊ตฌ์กฐ๋ก ๋ง๋ค์ด์ค.
- app/dashboard/page.tsx
- ์น์
์ SidebarNav, MetricCard, ChartPanel ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌ
- ๊ธฐ์กด src/components์ Button, Card ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ
Plain Text
๋ณต์ฌ
ํต์ฌ ํฌ์ธํธ
โข
์ปดํฌ๋ํธ ๋ถ๋ฆฌ ์ง์๊ฐ ๊ฒฐ๊ณผ ํ์ง์ ์ข์ฐ
โข
"๊ธฐ์กด ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ" ๋ช
์ โ Code Connect ๋งคํ ํ์ฉ
โข
ํ์ผ ๊ฒฝ๋ก ๋ช
์ โ ์ํฌ์คํ์ด์ค์ ์ฆ์ ์ ์ฅ
์ํ 4: Code Connect ๋งคํ ํ์ธ
ํ๋กฌํํธ
์ ํํ Button ์ปดํฌ๋ํธ๊ฐ ์ฝ๋์ ์ด๋ค ์ปดํฌ๋ํธ์ ๋งคํ๋์ด ์๋์ง ์๋ ค์ค.
Plain Text
๋ณต์ฌ
MCP ํธ์ถ
get_code_connect_map(nodeId)
โ {
figmaComponent: "Button/Primary",
codeComponent: "@/components/ui/button",
importPath: "import { Button } from '@/components/ui/button'",
propsMapping: { variant: "primary", size: "md" }
}
Plain Text
๋ณต์ฌ
์ํ 5: ๋์์ธ ๊ฒํ (Visual Review)
ํ๋กฌํํธ
์ ํํ LoginForm์ ์ฝ๋๋ก ๋ณํํ์ ๋ ๋๋ฝ๋๊ฑฐ๋ ๋ค๋ฅธ ๋ถ๋ถ์ด ์์์ง ๊ฒํ ํด์ค.
์คํฌ๋ฆฐ์ท๊ณผ ๋ณํ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํด์ค.
Plain Text
๋ณต์ฌ
ํ์ฉ
โข
AI๊ฐ get_image + get_code๋ฅผ ๋ชจ๋ ํธ์ถ
โข
์๊ฐ/๊ตฌ์กฐ ์ฐจ์ด๋ฅผ ๋ถ์ํ์ฌ ๋ณด๊ณ ์ ํ์์ผ๋ก ์ถ๋ ฅ

