Search

์ƒ˜ํ”Œ

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๋ฅผ ๋ชจ๋‘ ํ˜ธ์ถœ
โ€ข
์‹œ๊ฐ/๊ตฌ์กฐ ์ฐจ์ด๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋ณด๊ณ ์„œ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ