cc_with_figma_prompt - corollazer0/nhcx2025 GitHub Wiki

Figma ์ปดํฌ๋„ŒํŠธ โ†’ Vue ์ปดํฌ๋„ŒํŠธ ๋ณ€ํ™˜ ํ…œํ”Œ๋ฆฟ ํ”„๋กฌํ”„ํŠธ

Figma ์ปดํฌ๋„ŒํŠธ๋ฅผ Vue 3 ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณ€ํ™˜ ์š”์ฒญ

๋ชฉํ‘œ

ํ˜„์žฌ Figma์—์„œ ์„ ํƒ๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋””์ž์ธ๊ณผ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ Vue 3 ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.

ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ

1. Figma ์ •๋ณด ์ˆ˜์ง‘ ๋ฐ ์ค€์ˆ˜

  • REQUIRED: ๋จผ์ € ๋‹ค์Œ MCP ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ Figma ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜์„ธ์š”:
    • mcp__figma-dev-mode-mcp-server__get_code: ํ˜„์žฌ ์„ ํƒ๋œ ์ปดํฌ๋„ŒํŠธ์˜ ์ฝ”๋“œ ์ƒ์„ฑ
    • mcp__figma-dev-mode-mcp-server__get_image: ์ปดํฌ๋„ŒํŠธ ์ด๋ฏธ์ง€ ํ™•์ธ
    • mcp__figma-dev-mode-mcp-server__get_variable_defs: ๋””์ž์ธ ํ† ํฐ ์ •๋ณด ์ˆ˜์ง‘
  • Figma์˜ Properties, ์ƒ‰์ƒ, ํฐํŠธ, ๊ฐ„๊ฒฉ, ๋ณด๋” ๋“ฑ์„ 100% ์ •ํ™•ํ•˜๊ฒŒ ๊ตฌํ˜„
  • Figma ์ปดํฌ๋„ŒํŠธ์˜ ๋ชจ๋“  ์ƒํƒœ(variants, properties)๋ฅผ Vue props๋กœ ๋งคํ•‘

2. Vue 3 ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„

// ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ ์˜ˆ์‹œ
<template>
  <div class="component-name" data-testid="component-name">
    <!-- Figma ๊ตฌ์กฐ์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” HTML ๊ตฌ์กฐ -->
  </div>
</template>

<script setup lang="ts">
// 1. Figma Properties๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ TypeScript ์ธํ„ฐํŽ˜์ด์Šค
interface ComponentProps {
  // Figma์˜ ๋ชจ๋“  Properties๋ฅผ boolean, string, object ๋“ฑ์œผ๋กœ ๋งคํ•‘
  // ์˜ˆ: variant?: 'primary' | 'secondary'
  // ์˜ˆ: text?: string
  // ์˜ˆ: items?: Array<{title: string, data: string}>
}

// 2. Props ์ •์˜ (๊ธฐ๋ณธ๊ฐ’์€ Figma์˜ ๊ธฐ๋ณธ ์ƒํƒœ)
const props = withDefaults(defineProps<ComponentProps>(), {
  // Figma ๊ธฐ๋ณธ๊ฐ’๋“ค
})

// 3. ์ด๋ฒคํŠธ ์ •์˜
const emit = defineEmits<{
  click: [event: MouseEvent]
  close: []
  // ๊ธฐํƒ€ ์ƒํ˜ธ์ž‘์šฉ ์ด๋ฒคํŠธ๋“ค
}>()

// 4. ๋™์  ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง
</script>

<style scoped>
/* Figma ๋””์ž์ธ ํ† ํฐ์„ CSS ๋ณ€์ˆ˜๋กœ ์ •์˜ */
.component-name {
  --token-name: value;
  /* Figma์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ์Šคํƒ€์ผ */
}
</style>
  1. ๊ฐœ๋ฐœ์ž ์นœํ™”์  ๊ฐœ์„ ์‚ฌํ•ญ
  • ๋™์  ๋ฐ์ดํ„ฐ: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ํ…์ŠคํŠธ๋ฅผ props๋กœ ๋ฐ›๋„๋ก ๊ตฌํ˜„

  • ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ: ๋ชจ๋“  ์ƒํ˜ธ์ž‘์šฉ ์š”์†Œ์— ์ด๋ฒคํŠธ emit ๊ตฌํ˜„

  • ์ ‘๊ทผ์„ฑ: ์ ์ ˆํ•œ ARIA ์†์„ฑ, ํ‚ค๋ณด๋“œ ๋‚ด๋น„๊ฒŒ์ด์…˜, data-testid ์ถ”๊ฐ€

  • ํƒ€์ž… ์•ˆ์ „์„ฑ: ๋ชจ๋“  props์™€ emit์— TypeScript ํƒ€์ž… ์ •์˜

    1. ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ƒ์„ฑ

    Unit Test (ComponentName.spec.ts)

    // ๋‹ค์Œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋“ค์„ ํฌํ•จ: // - ๊ธฐ๋ณธ ๋ Œ๋”๋ง ํ…Œ์ŠคํŠธ // - ๋ชจ๋“  props ์กฐํ•ฉ ํ…Œ์ŠคํŠธ
    // - ์ด๋ฒคํŠธ emit ํ…Œ์ŠคํŠธ // - ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ // - ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง ํ…Œ์ŠคํŠธ

    Storybook Stories (ComponentName.stories.ts)

    // ๋‹ค์Œ ์Šคํ† ๋ฆฌ๋“ค์„ ํฌํ•จ: // - Playground (๋ชจ๋“  controls) // - Default // - ๊ฐ variant/state๋ณ„ ์Šคํ† ๋ฆฌ // - Edge cases ์Šคํ† ๋ฆฌ // - Interactive ํ…Œ์ŠคํŠธ๊ฐ€ ํฌํ•จ๋œ play ํ•จ์ˆ˜

    1. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์ค€์ˆ˜
  • ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ ๋”ฐ๋ฅด๊ธฐ

  • ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ์™€ ์ผ๊ด€์„ฑ ์œ ์ง€

  • Vue 3 Composition API + TypeScript ์‚ฌ์šฉ

  • Scoped CSS ์‚ฌ์šฉ (Tailwind ๋ฏธ์‚ฌ์šฉ)

    ์ œ์•ฝ์‚ฌํ•ญ

  • Figma ๋””์ž์ธ์—์„œ ์ ˆ๋Œ€ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ธฐ

  • ์ž„์˜๋กœ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋””์ž์ธ ๋ณ€๊ฒฝ ๊ธˆ์ง€

  • ๋ชจ๋“  Figma Properties๋Š” Vue props๋กœ ์™„์ „ํžˆ ๋งคํ•‘๋˜์–ด์•ผ ํ•จ

  • ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ์กด ํŒจํ„ด๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š์•„์•ผ ํ•จ

    ๊ฒฐ๊ณผ๋ฌผ

    1. ComponentName.vue - ๋ฉ”์ธ ์ปดํฌ๋„ŒํŠธ
    2. ComponentName.spec.ts - ๋‹จ์œ„ ํ…Œ์ŠคํŠธ
    3. ComponentName.stories.ts - ์Šคํ† ๋ฆฌ๋ถ ์Šคํ† ๋ฆฌ

๋ชจ๋“  ํŒŒ์ผ์€ src/components/ ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑํ•˜๊ณ , ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ๋“ค๊ณผ ๋™์ผํ•œ ํ’ˆ์งˆ๊ณผ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•ด์ฃผ์„ธ์š”.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ