Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

138 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Design-System-Hub-Tools

ํ•œ๊ตญ์–ด ยท English ยท ๆ—ฅๆœฌ่ชž ยท ไธญๆ–‡

Storybook React TypeScript Vite Figma Plugin API pnpm


ํ”„๋กœ์ ํŠธ ๋ชฉ์  / ๋ฐฐ๊ฒฝ

Storybook(React)๊ณผ Figma๊ฐ€ ๊ฐ™์€ ํ† ํฐยท๊ฐ™์€ ์ด๋ฆ„ยท๊ฐ™์€ ๋ณ€ํ˜•์œผ๋กœ ๋งž๋ฌผ๋ฆฌ๋Š” ๋””์ž์ธ ์‹œ์Šคํ…œ์ด๋‹ค. React ์†Œ์Šค๊ฐ€ ๋‹จ์ผ ์ถœ์ฒ˜(SSOT)์ด๊ณ , Figma๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด ๊ทธ๊ฒƒ์„ ๋ฏธ๋Ÿฌ๋งํ•œ๋‹ค.

๋ฐฐ๊ฒฝ โ€” ์™œ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์—ˆ๋‚˜

๋””์ž์ธ ์‹œ์Šคํ…œ์ด ๊นจ์ง€๋Š” ์ง€์ ์€ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‘ ์‹œ์Šคํ…œ ์‚ฌ์ด์˜ ํ‹ˆ์ด๋‹ค.

  • ๋””์ž์ด๋„ˆ๊ฐ€ Figma์—์„œ ๋ฉ”์ธ ์ปฌ๋Ÿฌ๋ฅผ ๋ฐ”๊ฟจ๋Š”๋ฐ ๋ฒ„ํŠผ ํ•˜๋‚˜๋งŒ ์•ˆ ๋ฐ”๋€๋‹ค โ†’ ๊ทธ ๋ฒ„ํŠผ์€ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ raw hex๋กœ ์น ํ•ด์ ธ ์žˆ์—ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ prop ์ด๋ฆ„์„ Price โ†’ price๋กœ ๊ฐœ๋ช…ํ–ˆ๋Š”๋ฐ Figma ํ™”๋ฉด์˜ ์ƒํ’ˆ ์นด๋“œ 10์žฅ์ด ์ „๋ถ€ ๊ธฐ๋ณธ๊ฐ€๋กœ ๋ Œ๋”๋œ๋‹ค โ†’ ์ธ์Šคํ„ด์Šค ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ๊ฒฝ๊ณ  ์—†์ด ๋Š๊ฒผ๋‹ค.
  • ๊ฐ™์€ GNB ๋ฉ”๋‰ด๊ฐ€ ๋‘ ํŒŒ์ผ์— ์„ ์–ธ๋ผ ์„œ๋กœ ์–ด๊ธ‹๋‚œ๋‹ค โ†’ ๋‘ ๋ฒˆ์งธ๋กœ ์ ๋Š” ์ˆœ๊ฐ„ ๋‘ ๊ฐ’์€ ๊ฐˆ๋ผ์ง„๋‹ค.

์ด ์ €์žฅ์†Œ๋Š” ๊ทธ ํ‹ˆ์„ ๋ฌธ์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฒŒ์ดํŠธ๋กœ ๋ง‰๋Š”๋‹ค. ์ด๋ฆ„ยท๊ฐ’ยท๋ฐ”์ธ๋”ฉยท์กฐ๋ฆฝ์ด ์–ด๊ธ‹๋‚˜๋ฉด pnpm verify:all์ด ๋นจ๊ฐ„๋ถˆ์„ ๋‚ธ๋‹ค. ์‚ฌ๋žŒ์˜ ์ฃผ์˜๋ ฅ์— ๊ธฐ๋Œ€์ง€ ์•Š๋Š” ๊ฒƒ์ด ์„ค๊ณ„ ๋ชฉํ‘œ๋‹ค.

๋ฌด์—‡์„ ํ•˜๋Š”๊ฐ€

๋””์ž์ธ ํ† ํฐ SSOT tokens/*.json ํ•˜๋‚˜์—์„œ Storybook CSS ๋ณ€์ˆ˜ ยท TS ํƒ€์ž… ยท Figma ํ”Œ๋Ÿฌ๊ทธ์ธ ํ”„๋ฆฌ์…‹์ด ํ•จ๊ป˜ ํŒŒ์ƒ๋œ๋‹ค. ์†์œผ๋กœ ๋‘ ๋ฒˆ ์ ๋Š” ๊ณณ์ด ์—†๋‹ค.
DS ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 155๊ฐœ ์ปดํฌ๋„ŒํŠธ(์ฝ”์–ดยท์–ด๋“œ๋ฏผยท์‚ฌ์ดํŠธยทํ•œ๊ตญํ˜• KR 20์ข…). ์ƒ‰์€ ์ „๋ถ€ var(--ds-*), ๋ฌธ๊ตฌ๋Š” ์ „๋ถ€ labels prop.
Figma ์ƒ์„ฑ๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด Variables 3์ปฌ๋ ‰์…˜ ยท Text Styles ยท ์ปดํฌ๋„ŒํŠธ ์„ธํŠธ ยท ์–ด๋“œ๋ฏผ/ํ”„๋ก ํŠธ ํ™”๋ฉด ยท ๋ฌธ์„œ ํŽ˜์ด์ง€๋ฅผ Figma์— ์ง์ ‘ ์ƒ์„ฑํ•œ๋‹ค.
ํŒŒ๋ฆฌํ‹ฐ ๊ฒŒ์ดํŠธ 7์ข… ์ฝ”๋“œโ†”Figma์˜ ์ด๋ฆ„ยท๊ฐ’ยท๋ฐ”์ธ๋”ฉยทํ™”๋ฉด ์กฐ๋ฆฝ์„ ๊ธฐ๊ณ„๋กœ ๊ฒ€์ฆํ•œ๋‹ค.
CSS ํ”„๋ ˆ์ž„์›Œํฌ ๋น„๊ต Bootstrap/Tailwind/Bulma/Foundation/Materialize/Semantic/Skeleton์„ Shadow DOM์œผ๋กœ ๊ฒฉ๋ฆฌํ•ด ํ•œ ํ™”๋ฉด์—์„œ ๋Œ€์กฐ.

์ „์ฒด ๊ทœ์•ฝ์€ CLAUDE.md, ๋„ค์ด๋ฐ ๊ทœ์น™์€ docs/naming-parity.md ์ฐธ์กฐ.


๊ธฐ์ˆ  ์Šคํƒ

์˜์—ญ ์‚ฌ์šฉ ๊ธฐ์ˆ 
์ฝ”์–ด React 18 ยท TypeScript 5 ยท Vite 5
๋ฌธ์„œ/์นดํƒˆ๋กœ๊ทธ Storybook 8 (@storybook/react-vite) + addon-essentials / a11y / designs
์Šคํƒ€์ผ CSS Modules ยท Tailwind 3.4 ยท SCSS(sass) ยท styled-components ยท color-mix() ํ† ํฐ ์Šคํ‚จ
ํ† ํฐ ํŒŒ์ดํ”„๋ผ์ธ JSON โ†’ scripts/build-tokens.mjs โ†’ CSS ๋ณ€์ˆ˜ + TS ํƒ€์ž… + ํ”Œ๋Ÿฌ๊ทธ์ธ ํ”„๋ฆฌ์…‹ (style-dictionary ๋ณ‘์šฉ)
Figma Figma Plugin API (figma-plugin/) ยท Variables ยท Component Set / Variant / Instance Swap
๊ฒ€์ฆ ๊ฒŒ์ดํŠธ Node ESM ์Šคํฌ๋ฆฝํŠธ 7์ข… (scripts/verify-*.mjs) + PreToolUse git ๊ฐ€๋“œ ํ›…
ํ”„๋ ˆ์ž„์›Œํฌ(๋น„๊ต์šฉ) bootstrap ยท tailwindcss ยท bulma ยท foundation-sites ยท materialize-css ยท semantic-ui-css ยท skeleton-css
์•„์ด์ฝ˜ Lucide(์ •๋ณธ) ยท Heroicons ยท Tabler ยท Material Symbols(?raw SVG) ยท Bootstrap Icons(ํฐํŠธ)
์ฐจํŠธ Chart.js + react-chartjs-2
ํฐํŠธ Pretendard ยท Inter (@fontsource)
์Šค๋ƒ…์ƒท Playwright (Storybook ๋ Œ๋” โ†’ PNG โ†’ Figma ๋ฐฐ์น˜)
๋ฐฐํฌ GitHub Pages (๋ฌธ์„œ ์‚ฌ์ดํŠธ + ์„ ์–ธ ํ˜ธ์ŠคํŒ…) ยท GitHub Actions ยท jsDelivr @gh
ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ pnpm ์›Œํฌ์ŠคํŽ˜์ด์Šค + corepack (Node 22)

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

Design-System-Hub-Tools/
โ”œโ”€ tokens/                          # โญ ๋ณ€์ˆ˜ SSOT โ€” bootstrap.json ยท tailwind.json ยท toss.json
โ”‚
โ”œโ”€ scripts/                         # ๋นŒ๋“œ ยท ๊ฒ€์ฆ ๊ฒŒ์ดํŠธ (Node ESM)
โ”‚  โ”œโ”€ build-tokens.mjs              #   ํ† ํฐ JSON โ†’ CSS ๋ณ€์ˆ˜ ยท TS ํƒ€์ž… ยท ํ”Œ๋Ÿฌ๊ทธ์ธ ํ”„๋ฆฌ์…‹
โ”‚  โ”œโ”€ build-story-manifest.mjs      #   src/ds โ†’ Figma ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์ง๋ ฌํ™” + ์™•๋ณต ๋™์ผ์„ฑ ๊ฒ€์ฆ
โ”‚  โ”œโ”€ capture-snapshots.mjs         #   Storybook ๋ Œ๋” โ†’ PNG (Playwright)
โ”‚  โ”œโ”€ validate-tokens.mjs           #   ํ† ํฐ ์Šคํ‚ค๋งˆ ๊ฒ€์ฆ
โ”‚  โ”œโ”€ verify-parity.mjs             #   โ‘  ํ† ํฐ ๊ฐ’ยท๋ณ€์ˆ˜๋ช… ํŒจ๋ฆฌํ‹ฐ
โ”‚  โ”œโ”€ verify-mapping.mjs            #   โ‘ก ์ปดํฌ๋„ŒํŠธ ์ปค๋ฒ„๋ฆฌ์ง€
โ”‚  โ”œโ”€ verify-naming.mjs             #   โ‘ข ์ฝ”๋“œ ์ด๋ฆ„ โ†” Figma ์†์„ฑยท๋ ˆ์ด์–ด ์ด๋ฆ„
โ”‚  โ”œโ”€ verify-screen-props.mjs       #   โ‘ฃ ํ™”๋ฉด inst() ์˜ค๋ฒ„๋ผ์ด๋“œ โ†” ์„ธํŠธ ์†์„ฑ ์ด๋ฆ„
โ”‚  โ”œโ”€ verify-bindings.mjs           #   โ‘ค ์š”์†Œ๊ฐ€ ์‹ค์ œ๋กœ ๋ณ€์ˆ˜์— ๋ฌผ๋ ธ๋Š”๊ฐ€ (raw hex ๊ธˆ์ง€)
โ”‚  โ””โ”€ lib/
โ”‚     โ”œโ”€ ds-props.mjs               #     TSX props ํŒŒ์„œ (union/boolean/string/ReactNode ๋ถ„๋ฅ˜)
โ”‚     โ”œโ”€ figma-sets.mjs             #     ์ƒ์„ฑ๊ธฐ์—์„œ ์‹ค์ œ Figma ์„ธํŠธ ์„ ์–ธ ์ถ”์ถœ
โ”‚     โ””โ”€ css-classes.mjs            #     CSS Modules ํด๋ž˜์Šค โ†” ๋ ˆ์ด์–ด ์ด๋ฆ„ ๋Œ€์กฐ
โ”‚
โ”œโ”€ src/
โ”‚  โ”œโ”€ tokens/
โ”‚  โ”‚  โ”œโ”€ generated/                 # โš™๏ธ build-tokens ์‚ฐ์ถœ๋ฌผ (์ง์ ‘ ์ˆ˜์ • ๊ธˆ์ง€)
โ”‚  โ”‚  โ”‚  โ”œโ”€ vars-bootstrap.css      #     --ds-* CSS ๋ณ€์ˆ˜ (ํ”„๋ฆฌ์…‹๋ณ„)
โ”‚  โ”‚  โ”‚  โ”œโ”€ vars-tailwind.css
โ”‚  โ”‚  โ”‚  โ”œโ”€ vars-toss.css
โ”‚  โ”‚  โ”‚  โ”œโ”€ types.ts                #     ColorToken ยท SolidColorToken ยท SpacingToken โ€ฆ ์œ ๋‹ˆ์˜จ
โ”‚  โ”‚  โ”‚  โ””โ”€ theme.ts                #     presets ๊ฐ์ฒด + cssVar()
โ”‚  โ”‚  โ””โ”€ motion.css                 #   ๋ชจ์…˜ ํ† ํฐ
โ”‚  โ”‚
โ”‚  โ”œโ”€ shared/                       # ๊ณต์šฉ ์ธํ”„๋ผ (๋‹จ์ผ ์ถœ์ฒ˜)
โ”‚  โ”‚  โ”œโ”€ labels.ts                  #   โญ ๋ฌธ๊ตฌ ๋ณ€์ˆ˜ โ€” ๊ณต์šฉ Labels ํƒ€์ž… ยท mergeLabels ยท resolveLabel
โ”‚  โ”‚  โ”œโ”€ ThemeScope.tsx             #   data-theme ํ”„๋ฆฌ์…‹ ์Šค์œ„์ฒ˜ (ํ† ํฐ CSS ๋ณ€์ˆ˜ ์ ์šฉ)
โ”‚  โ”‚  โ”œโ”€ FrameworkScope.tsx         #   ํ”„๋ ˆ์ž„์›Œํฌ CSS๋ฅผ Shadow DOM์—๋งŒ ์ฃผ์ž… (์ „์—ญ ๊ฒฉ๋ฆฌ)
โ”‚  โ”‚  โ”œโ”€ mediaMock.ts               #   ๋ชฉ ์ด๋ฏธ์ง€ ๋‹จ์ผ ์ถœ์ฒ˜
โ”‚  โ”‚  โ”œโ”€ tableExport.ts             #   ํ‘œ ๋‚ด๋ณด๋‚ด๊ธฐ ํ—ฌํผ
โ”‚  โ”‚  โ””โ”€ placeholders.tsx           #   ํ”Œ๋ ˆ์ด์Šคํ™€๋” ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ
โ”‚  โ”‚
โ”‚  โ”œโ”€ ds/                           # ๋””์ž์ธ ์‹œ์Šคํ…œ ์ปดํฌ๋„ŒํŠธ 155์ข…
โ”‚  โ”‚  โ”œโ”€ Button ยท TextField ยท Table ยท Badge ยท Dialog โ€ฆ          # ์ฝ”์–ด ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ
โ”‚  โ”‚  โ”œโ”€ AdminListPage ยท AdminFormPage ยท AdminShell ยท AdminTable # ์–ด๋“œ๋ฏผ ์…ธ (ํ™”๋ฉด์€ ์…ธ๋กœ ์กฐ๋ฆฝ)
โ”‚  โ”‚  โ”œโ”€ SiteSection ยท SiteHeader ยท PortfolioPage ยท ShopPage โ€ฆ   # ์‚ฌ์ดํŠธ(ํ”„๋ก ํŠธ) ํ™”๋ฉด
โ”‚  โ”‚  โ””โ”€ kr/                        #   ํ•œ๊ตญํ˜• 20์ข… (์ฃผ๋ฏผ๋ฒˆํ˜ธยท๊ณ„์ขŒยท์นด๋“œยท์ฃผ์†Œยท๋ณธ์ธ์ธ์ฆยท์ „์ž์„œ๋ช…)
โ”‚  โ”‚     โ””โ”€ format.ts               #     ์ž๋™ ํ•˜์ดํ”ˆ ํฌ๋งทํ„ฐ + ๊ฒ€์ฆ์‹(์ฃผ๋ฏผ/์‚ฌ์—…์ž/์นด๋“œ Luhn)
โ”‚  โ”‚
โ”‚  โ”œโ”€ templates/                    # ํ™”๋ฉด ํ…œํ”Œ๋ฆฟ (AdminSuite ยท SiteSuite ยท Dashboard ยท Login ยท Settings)
โ”‚  โ”œโ”€ frameworks/                   # CSS ํ”„๋ ˆ์ž„์›Œํฌ 7์ข… ์‡ผ์ผ€์ด์Šค + Compare
โ”‚  โ”œโ”€ icons/ ยท styling/ ยท animations/ ยท foundation/ ยท docs/     # ์Šคํ† ๋ฆฌยทMDX ๋ฌธ์„œ
โ”‚
โ”œโ”€ figma-plugin/                    # Figma ํ”Œ๋Ÿฌ๊ทธ์ธ (๋ณ„๋„ ๋ฒˆ๋“ค ยท ๋ณ„๋„ tsconfig)
โ”‚  โ””โ”€ src/
โ”‚     โ”œโ”€ code.ts                    #   ํ”Œ๋Ÿฌ๊ทธ์ธ ์—”ํŠธ๋ฆฌ โ€” UI ๋ฉ”์‹œ์ง€ โ†’ ์ƒ์„ฑ ํŒŒ์ดํ”„๋ผ์ธ
โ”‚     โ”œโ”€ ui.html                    #   โญ ๋ณ€์ˆ˜ ์ž…๋ ฅ UI (ํ”„๋ฆฌ์…‹ ยท ์ปฌ๋Ÿฌ 9์ƒ‰ ยท ํฐํŠธ ยท ๊ธฐ์ค€ ํฌ๊ธฐ ยท ๋ฐฐ์ˆ˜)
โ”‚     โ”œโ”€ presets.ts                 #   โญ ํ‚ค ๋ชฉ๋ก ยท computeSizes ยท hexToRgb ยท firstFontFamily
โ”‚     โ”œโ”€ presets.data.ts            #   โš™๏ธ build-tokens ์‚ฐ์ถœ๋ฌผ (tokens/*.json ๋ฏธ๋Ÿฌ ยท ์ง์ ‘ ์ˆ˜์ • ๊ธˆ์ง€)
โ”‚     โ””โ”€ generators/
โ”‚        โ”œโ”€ tokens.ts               #   โญ Figma Variables 3์ปฌ๋ ‰์…˜ ์ƒ์„ฑ (generateTokens)
โ”‚        โ”œโ”€ tone.ts                 #   โญ solid/on ์ƒ‰ ํŒŒ์ƒ ๊ณต์‹ (build-tokens์™€ ๋™์ผ)
โ”‚        โ”œโ”€ sync.ts                 #   โญ ์›๊ฒฉ ํ† ํฐ JSON ๊ฒ€์ฆยท์ฃผ์ž… (validateTokens ยท importTokens)
โ”‚        โ”œโ”€ categories-shared.ts    #   โญ ๋ฐ”์ธ๋”ฉ ํ—ฌํผ ์ •๋ณธ (bindFillVar ยท boundText โ€ฆ)
โ”‚        โ”œโ”€ lib/build-set.ts        #   โญ ์ปดํฌ๋„ŒํŠธ ์„ธํŠธ ยท variant ์ถ• ยท ์†์„ฑ ์ •๋ณธ (buildSet ยท variantItem)
โ”‚        โ”œโ”€ categories*.ts          #   ์ปดํฌ๋„ŒํŠธ ์นดํ…Œ๊ณ ๋ฆฌ ํŽ˜์ด์ง€ (Input/Action/Feedback/Nav/Data/KR/Mediaโ€ฆ)
โ”‚        โ”œโ”€ admin.ts ยท screens.ts   #   ์–ด๋“œ๋ฏผ ์ปดํฌ๋„ŒํŠธ ยท ์–ด๋“œ๋ฏผ ํ™”๋ฉด 26์ข…
โ”‚        โ”œโ”€ site.ts ยท site-screens.ts #  ํ”„๋ก ํŠธ ์ปดํฌ๋„ŒํŠธ ยท ํ”„๋ก ํŠธ ํ™”๋ฉด 5์ข…
โ”‚        โ”œโ”€ foundations.ts ยท docs.ts  #  Design System ยท Icon System ยท ๋ฌธ์„œ ํŽ˜์ด์ง€
โ”‚        โ””โ”€ snapshots.ts            #   Storybook ์Šค๋ƒ…์ƒท PNG ๋ฐฐ์น˜
โ”‚
โ”œโ”€ packages/figma-story-tools/      # ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋ฐฐํฌ ํŒจํ‚ค์ง€ (npm/CDN)
โ”œโ”€ docs/                            # ์ŠคํŽ™ ยท ๋„ค์ด๋ฐ ํŒŒ๋ฆฌํ‹ฐ ยท known-issues ยท ํ”„๋กœ์„ธ์Šค ๋กœ๊ทธ
โ”œโ”€ site/                            # GitHub Pages ์ •์  ํ˜ธ์ŠคํŒ… (์„ ์–ธ JSON)
โ””โ”€ .storybook/                      # Storybook ์„ค์ • (main.ts ยท preview.tsx)

๋ณ€์ˆ˜ ๊ด€๋ฆฌ โ€” ํŒŒ์ผ ๋ฐ ์ฃผ์š” ํ•จ์ˆ˜

๋ณ€์ˆ˜๋Š” ํ•œ ๊ณณ์—์„œ ์„ ์–ธ๋˜๊ณ , ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅธ๋‹ค. ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

tokens/*.json  (SSOT โ€” ์‚ฌ๋žŒ์ด ๊ณ ์น˜๋Š” ์œ ์ผํ•œ ๊ณณ)
      โ”‚
      โ””โ”€โ”€ scripts/build-tokens.mjs
              โ”œโ”€โ”€โ–ถ src/tokens/generated/vars-*.css     (--ds-*)      โ†’ Storybook ๋Ÿฐํƒ€์ž„
              โ”œโ”€โ”€โ–ถ src/tokens/generated/types.ts       (์œ ๋‹ˆ์˜จ ํƒ€์ž…)  โ†’ ์ปดํŒŒ์ผ ํƒ€์ž„ ์•ˆ์ „๋ง
              โ”œโ”€โ”€โ–ถ src/tokens/generated/theme.ts       (presets ยท cssVar)
              โ””โ”€โ”€โ–ถ figma-plugin/src/presets.data.ts    (ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‚ด์žฅ ํ”„๋ฆฌ์…‹)
                          โ”‚
                          โ””โ”€โ”€ figma-plugin/src/generators/tokens.ts
                                  โ””โ”€โ”€โ–ถ Figma Variables 3์ปฌ๋ ‰์…˜ (color/* ยท font/* ยท radius/* ยท spacing/*)
                                          โ”‚
                                          โ””โ”€โ”€ categories-shared.ts ยท lib/build-set.ts
                                                  โ””โ”€โ”€โ–ถ ๊ฐ ๋…ธ๋“œ์˜ fillยทstrokeยทtext๊ฐ€ ๋ณ€์ˆ˜์— **๋ฐ”์ธ๋”ฉ**๋จ

presets.data.ts๊ฐ€ ์†์ด ์•„๋‹ˆ๋ผ ๋นŒ๋“œ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค โ€” ๊ทธ๋ž˜์„œ Storybook๊ณผ Figma์˜ ๊ฐ’์ด ๊ฐˆ๋ผ์งˆ ์ˆ˜ ์—†๋‹ค.

1. ๋ณ€์ˆ˜ ์›๋ณธ (SSOT)

ํŒŒ์ผ ๋‚ด์šฉ
tokens/toss.json ยท tokens/bootstrap.json ยท tokens/tailwind.json ํ”„๋ฆฌ์…‹ 3์ข…. ๊ฐ ํŒŒ์ผ์€ color(10ํ‚ค) ยท typography(fontFamily ยท baseSize ยท scale ยท sizes ยท weights) ยท radius(3) ยท spacing(6)์„ ๊ฐ–๋Š”๋‹ค.

์ƒ‰์€ base 10ํ‚ค(primary secondary error success warning neutral bg bgSubtle text border)๋งŒ ์ ๋Š”๋‹ค. ์…ฐ์ด๋“œ(100~900) ยท solid-* ยท on-*๋Š” ์ ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ณ„์‚ฐ์œผ๋กœ ํŒŒ์ƒ๋œ๋‹ค(ยง2).

2. ํ† ํฐ ๋นŒ๋“œ โ€” scripts/build-tokens.mjs

ํ•จ์ˆ˜ ์—ญํ• 
mixHex(hex, target, amt) ๋‘ ์ƒ‰์„ ๋น„์œจ๋กœ ์„ž๋Š”๋‹ค โ€” ์…ฐ์ด๋“œ(100~900) ํŒŒ์ƒ์˜ ๊ธฐ๋ฐ˜
relLuminance(hex) / contrastRatio(a, b) WCAG ์ƒ๋Œ€ํœ˜๋„ ยท ๋Œ€๋น„๋น„ ๊ณ„์‚ฐ
solidColorFor(base) base ํ†ค์—์„œ ํฐ ๊ธ€์ž๊ฐ€ AA(4.5:1)๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๋ฉด ์ƒ‰์„ ๊ณ„์‚ฐ โ†’ --ds-color-solid-*
onColorFor(base) solid ๋ฉด ์œ„์— ์˜ฌ๋ฆด ์ „๊ฒฝ์ƒ‰์„ ๊ณ„์‚ฐ (AA ๋ณด์žฅ) โ†’ --ds-color-on-*
px(n) ยท union(keys) ยท varKeys(name) ์‚ฐ์ถœ๋ฌผ ์ง๋ ฌํ™” ํ—ฌํผ (CSS px ยท TS ์œ ๋‹ˆ์˜จ ยท ๋ณ€์ˆ˜๋ช… ๋ชฉ๋ก)

์‚ฐ์ถœ๋ฌผ 4์ข…: vars-<preset>.css ยท types.ts ยท theme.ts ยท figma-plugin/src/presets.data.ts.

3. Figma ๋ณ€์ˆ˜ ์„ ์–ธ โ€” figma-plugin/src/generators/tokens.ts

ํ•จ์ˆ˜ / ์ƒ์ˆ˜ ์—ญํ• 
COLLECTION_NAMES ์ƒ์„ฑํ•  ์ปฌ๋ ‰์…˜ 3์ข… โ€” DS Color ยท DS Typography ยท DS RadiusยทSpacing
guardExisting() ๋ฉฑ๋“ฑ ๊ฐ€๋“œ โ€” ๊ฐ™์€ ์ด๋ฆ„์˜ ์ปฌ๋ ‰์…˜์ด ์ด๋ฏธ ์žˆ์œผ๋ฉด ์ƒ์„ฑ์„ ์ค‘๋‹จํ•œ๋‹ค(์‚ญ์ œํ•˜์ง€ ์•Š๋Š”๋‹ค)
generateTokens(payload) UI ์ž…๋ ฅ(ํ”„๋ฆฌ์…‹ยท์ปฌ๋ŸฌยทํฐํŠธยท๊ธฐ์ค€ ํฌ๊ธฐยท๋ฐฐ์ˆ˜)์„ ๋ฐ›์•„ Figma Variables๋ฅผ ์ƒ์„ฑํ•œ๋‹ค

generateTokens๊ฐ€ ๋งŒ๋“œ๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„ โ€” Storybook์˜ --ds-*์™€ 1:1์ด๋‹ค:

Figma ๋ณ€์ˆ˜ Storybook CSS ๋ณ€์ˆ˜ ๋น„๊ณ 
color/<key> --ds-color-<key> base 10์ƒ‰. DS Color๋Š” 3๋ชจ๋“œ(bootstrapยทtailwindยทtoss)
color/<key>/<step> --ds-color-<key>-<step> ์…ฐ์ด๋“œ 100~900 (๋ชจ๋“œ๋ณ„ base์—์„œ ๊ณ„์‚ฐ)
color/solid-<key> --ds-color-solid-<key> AA ํ†ต๊ณผ ๋ฉด ์ƒ‰
color/on-<key> --ds-color-on-<key> solid ๋ฉด์˜ ์ „๊ฒฝ์ƒ‰
font/family --ds-font-family ํŒจ๋ฐ€๋ฆฌ๋ช… 1๊ฐœ๋งŒ โ€” CSS ์Šคํƒ ์ „์ฒด๋ฅผ ๋„ฃ์œผ๋ฉด ๋…ธ๋“œ ์ƒ์„ฑ์ด ์‹คํŒจํ•œ๋‹ค
font/size/<key> --ds-font-size-<key> computeSizes(baseSize, scale) ๊ฒฐ๊ณผ 6๋‹จ๊ณ„
font/weight/<key> --ds-font-weight-<key> regular ยท medium ยท bold
radius/<key> ยท spacing/<key> --ds-radius-<key> ยท --ds-spacing-<key>

4. ํ‚ค ๋ชฉ๋ก ยท ๊ฐ’ ๋ณ€ํ™˜ โ€” figma-plugin/src/presets.ts

ํ•จ์ˆ˜ / ์ƒ์ˆ˜ ์—ญํ• 
COLOR_KEYS ยท SIZE_KEYS ยท WEIGHT_KEYS ยท RADIUS_KEYS ยท SPACING_KEYS ์ถ•์˜ ์ •๋ณธ ํ‚ค ๋ชฉ๋ก (์—ฌ๊ธฐ ์—†๋Š” ํ‚ค๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค)
computeSizes(baseSize, scale) ๊ธฐ์ค€ ํฌ๊ธฐ ร— ๋ฐฐ์ˆ˜ โ†’ xsโ€ฆxxl 6๋‹จ๊ณ„. UI์˜ ๊ธฐ์ค€ ํฌ๊ธฐ/ํฌ๊ธฐ ๋ฐฐ์ˆ˜ ์ž…๋ ฅ์ด ์—ฌ๊ธฐ๋กœ ๋“ค์–ด์˜จ๋‹ค
hexToRgb(hex) / rgbToHex(rgb) UI ์ƒ‰์ƒ ํ”ผ์ปค โ†” Figma RGB ์ƒํ˜ธ ๋ณ€ํ™˜
firstFontFamily(stack) CSS ํฐํŠธ ์Šคํƒ์—์„œ ์ฒซ ํŒจ๋ฐ€๋ฆฌ 1๊ฐœ๋งŒ ๋ฝ‘๋Š”๋‹ค (Figma๋Š” ์Šคํƒ์„ ๋ชจ๋ฅธ๋‹ค โ€” ๋„ฃ์œผ๋ฉด unloaded font๋กœ ์‹คํŒจ)
PRESETS presets.data.ts(= tokens/*.json ๋ฏธ๋Ÿฌ)๋ฅผ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ

5. ํŒŒ์ƒ ์ƒ‰ ๊ณต์‹ (Figma ์ธก) โ€” figma-plugin/src/generators/tone.ts

ํ•จ์ˆ˜ ์—ญํ• 
solidToneHex(base) / onToneHex(base) build-tokens์˜ solidColorFor / onColorFor์™€ ๋™์ผํ•œ ๊ณต์‹. ๋‘ ๊ณณ์ด ์–ด๊ธ‹๋‚˜๋ฉด verify:parity๊ฐ€ ์žก๋Š”๋‹ค
solidVarName(tone) / onVarName(tone) color/solid-<tone> ยท color/on-<tone> ์ด๋ฆ„ ์ƒ์„ฑ

6. ๋ฐ”์ธ๋”ฉ ํ—ฌํผ (์š”์†Œ๋ฅผ ๋ณ€์ˆ˜์— ๋ฌด๋Š” ๊ณณ) โ€” figma-plugin/src/generators/categories-shared.ts

์ •๋ณธ์€ ์ด ํŒŒ์ผ ํ•˜๋‚˜๋‹ค. ๋ณต์ œํ•˜๋ฉด ์‚ฌ๋ณธ ํ•˜๋‚˜๋งŒ ๊ณ ์ณ์ง€๊ณ  ๋‚˜๋จธ์ง€๊ฐ€ ์ฉ๋Š”๋‹ค โ€” verify:bindings์˜ B4๊ฐ€ ์ด๋ฅผ ๋ง‰๋Š”๋‹ค.

ํ•จ์ˆ˜ ์—ญํ• 
bindFillVar(ctx, node, varName, hex) ๋ฉด ์ƒ‰์„ ๋ณ€์ˆ˜์— ๋ฐ”์ธ๋”ฉํ•œ๋‹ค. fills = [solid(โ€ฆ)] (raw hex) ๋Œ€์‹  ๋ฐ˜๋“œ์‹œ ์ด๊ฒƒ์„ ์“ด๋‹ค
bindStrokeVar(ctx, node, varName, hex) ์„  ์ƒ‰์„ ๋ณ€์ˆ˜์— ๋ฐ”์ธ๋”ฉ
boundText(ctx, chars, size, varName, hex, bold) ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค๋ฉฐ ์ƒ‰ยทํฌ๊ธฐยท๊ตต๊ธฐยทํŒจ๋ฐ€๋ฆฌ๋ฅผ ์ „๋ถ€ ๋ณ€์ˆ˜์— ๋ฌธ๋‹ค. ๋งจ ํ…์ŠคํŠธ(txt) ๋Œ€์‹  ์ด๊ฒƒ์„ ์“ด๋‹ค
bindSolidFill(ctx, node, tone) / bindOnFill(ctx, node, tone) ํ†ค ๋ฉด ยท ๊ทธ ์œ„ ์ „๊ฒฝ์ƒ‰์„ ํ•œ ๋ฒˆ์— ๋ฐ”์ธ๋”ฉ
toneBase(ctx, tone) / onHex(ctx, tone) ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์˜ ํ†ค base hex ยท on-color hex
recolorIconVar(ctx, node, varName, hex) / recolorIconOn(ctx, node, tone) ์•„์ด์ฝ˜ ๋ฒกํ„ฐ์˜ ์ƒ‰์„ ๋ณ€์ˆ˜์— ๋ฐ”์ธ๋”ฉ
tintHex(hex, amt) ์˜…์€ ๋ฐฐ๊ฒฝ ๊ณ„์‚ฐ

7. ์ปดํฌ๋„ŒํŠธ ์†์„ฑ(๋ณ€์ˆ˜) ์„ ์–ธ โ€” figma-plugin/src/generators/lib/build-set.ts

React์˜ prop์ด Figma์˜ ์ปดํฌ๋„ŒํŠธ ์†์„ฑ์ด ๋˜๋Š” ์ง€์ . ์ด๋ฆ„์€ ์ฝ”๋“œ๊ฐ€ ์ •ํ•˜๊ณ  Figma๊ฐ€ ๋”ฐ๋ฅธ๋‹ค.

ํ•จ์ˆ˜ ์—ญํ• 
buildSet(...) ์ปดํฌ๋„ŒํŠธ ์„ธํŠธ + variant ์ถ•์„ ๋งŒ๋“ ๋‹ค (์œ ๋‹ˆ์˜จ prop โ†’ VARIANT ์ถ•)
addTextProp(set, prop, layer, def) string prop โ†’ TEXT ์†์„ฑ
addBoolProp(set, prop, layer, def) show* boolean โ†’ BOOLEAN ์†์„ฑ
addSwapProp(set, prop, layer, defKey) ReactNode ์Šฌ๋กฏ โ†’ INSTANCE_SWAP ์†์„ฑ
propKeys(set) ํ‘œ์‹œ ์ด๋ฆ„ โ†’ Figma ๋‚ด๋ถ€ ํ‚ค(Title#12:3) ๋งคํ•‘. ํ™”๋ฉด ์กฐ๋ฆฝ์˜ inst()๊ฐ€ ์ด๊ฑธ ์“ด๋‹ค
variantItem(ctx, set, state) ๋ฌธ์„œ ํŽ˜์ด์ง€์˜ ๋ณ€ํ˜• ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค (state.props / texts / swaps ์ ์šฉ)

โš ๏ธ inst()์™€ variantItem()์€ ๋ชจ๋ฅด๋Š” ์†์„ฑ ์ด๋ฆ„์„ ๊ฒฝ๊ณ ๋งŒ ํ•˜๊ณ  ๋ฌด์‹œํ•œ๋‹ค. ์„ธํŠธ์˜ ์†์„ฑ์„ ๊ฐœ๋ช…ํ•˜๋ฉด ํ™”๋ฉด ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ์กฐ์šฉํžˆ ๋Š๊ธด๋‹ค โ†’ verify:screens๊ฐ€ ์ด๊ฑธ ์žก๋Š” ์œ ์ผํ•œ ๊ฒŒ์ดํŠธ๋‹ค.

8. ์›๊ฒฉ ๋ณ€์ˆ˜ ์ฃผ์ž… โ€” figma-plugin/src/generators/sync.ts

ํ•จ์ˆ˜ ์—ญํ• 
validateTokens(json) ์™ธ๋ถ€์—์„œ ๋ฐ›์€ ํ† ํฐ JSON์˜ ์Šคํ‚ค๋งˆ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ  ์œ„๋ฐ˜ ๋ชฉ๋ก์„ ๋Œ๋ ค์ค€๋‹ค
importTokens(json) ๊ฒ€์ฆ๋œ ํ† ํฐ์„ ํ˜„์žฌ Figma ํŒŒ์ผ์˜ Variables์— ์ฃผ์ž…ํ•œ๋‹ค

ํ”Œ๋Ÿฌ๊ทธ์ธ UI์˜ โ–ธ ์„ธ๋ถ€ ์„ค์ • โ†’ ์›๊ฒฉ ์„ ์–ธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ(URL)๋กœ CDN ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ฝ์–ด ๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

9. ๋Ÿฐํƒ€์ž„ ๋ณ€์ˆ˜ ์ ์šฉ (Storybook ์ธก)

ํŒŒ์ผ ์—ญํ• 
src/shared/ThemeScope.tsx data-theme="<preset>" ์Šค์ฝ”ํ”„๋ฅผ ์”Œ์›Œ vars-<preset>.css์˜ ๋ณ€์ˆ˜๋ฅผ ์ ์šฉํ•œ๋‹ค. Storybook ํˆด๋ฐ”์˜ Preset ์Šค์œ„์ฒ˜๊ฐ€ ์ด๊ฑธ ๋ฐ”๊พผ๋‹ค
src/tokens/generated/theme.ts cssVar(token) โ†’ var(--ds-color-<token>) ๋ฌธ์ž์—ด ์ƒ์„ฑ
src/tokens/generated/types.ts ColorToken ยท SolidColorToken ยท SpacingToken โ€ฆ ์œ ๋‹ˆ์˜จ ํƒ€์ž… โ€” ์—†๋Š” ํ† ํฐ์„ ์“ฐ๋ฉด ํƒ€์ž…์ฒดํฌ๊ฐ€ ์žก๋Š”๋‹ค

10. ๋ฌธ๊ตฌ ๋ณ€์ˆ˜(labels) โ€” src/shared/labels.ts

์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ๋ชจ๋“  ๊ธ€์ž๋„ ๋ณ€์ˆ˜๋‹ค. ํ†ต๋กœ๋Š” labels prop ํ•˜๋‚˜์ด๊ณ , ํƒ€์ž…ยท๋ณ‘ํ•ฉ ํ•จ์ˆ˜๋Š” ์ด ํŒŒ์ผ์ด ๋‹จ์ผ ์ถœ์ฒ˜๋‹ค.

ํ•จ์ˆ˜ / ํƒ€์ž… ์—ญํ• 
mergeLabels(defaults, labels) ๊ธฐ๋ณธ๊ฐ’๊ณผ ๋ถ€๋ถ„ ์˜ค๋ฒ„๋ผ์ด๋“œ๋ฅผ 1๋‹จ๊ณ„ ๊นŠ์ด๊นŒ์ง€ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ‘ํ•ฉํ•œ๋‹ค. naive spread๋ฅผ ์“ฐ๋ฉด ๋ถ€๋ถ„ ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ๋‚˜๋จธ์ง€ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์šด๋‹ค
resolveLabel(...candidates) ์šฐ์„ ์ˆœ์œ„ ํ•ด์„ โ€” ๊ฐœ๋ณ„ prop > labels.* > ๊ธฐ๋ณธ๊ฐ’
resolveText(value, arg) ๊ฐ’์ด ๋ฌธ์ž์—ด์ด๋ฉด ๊ทธ๋Œ€๋กœ, ํ•จ์ˆ˜๋ฉด ์ธ์ž๋ฅผ ๋„ฃ์–ด ํ‰๊ฐ€ ((n) => \${n}๊ฑด``)
RowActionsLabels ยท EmptyLabels ยท PaginationLabels ยท SearchLabels ยท Formatters โ€ฆ ๊ณต์šฉ ๋ฌธ๊ตฌ ํƒ€์ž… โ€” ์žฌ์ •์˜ํ•˜์ง€ ๋ง๊ณ  import

11. ๋ณ€์ˆ˜ ๋“œ๋ฆฌํ”„ํŠธ ๊ฒŒ์ดํŠธ โ€” scripts/

๊ฒŒ์ดํŠธ ๋ฌด์—‡์ด ์–ด๊ธ‹๋‚˜๋ฉด ์žก๋Š”๊ฐ€
verify:parity tokens/*.json โ†” presets.data.ts โ†” --ds-* โ†” Figma ๋ณ€์ˆ˜๋ช…์ด ๊ฐ’ยท์ด๋ฆ„ ๋ชจ๋‘ ์ผ์น˜ํ•˜๋Š”๊ฐ€
verify:bindings ์š”์†Œ๊ฐ€ ์ •๋ง ๋ณ€์ˆ˜์— ๋ฌผ๋ ธ๋Š”๊ฐ€ (B1 raw fill ๊ธˆ์ง€ ยท B2 ๋ฏธ๋ฐ”์ธ๋”ฉ ํ…์ŠคํŠธ ๊ธˆ์ง€ ยท B3 ํฐํŠธ ๋ฆฌํ„ฐ๋Ÿด ๊ธˆ์ง€ ยท B4 ํ—ฌํผ ๋ณต์ œ ๊ธˆ์ง€ ยท B5 ํ…์ŠคํŠธ ๋ถˆํˆฌ๋ช…๋„ ๊ธˆ์ง€ ยท B6 appendChild ์ „ layoutPositioning ๊ธˆ์ง€ ยท B7 undefined ์บ์ŠคํŒ… ๊ธˆ์ง€)
verify:naming ์ฝ”๋“œ์˜ propยทCSS ํด๋ž˜์Šค ์ด๋ฆ„ โ†” Figma ์†์„ฑยท๋ ˆ์ด์–ด ์ด๋ฆ„ (๋ณ€ํ™˜ ์—†๋Š” ์ •ํ™• ์ผ์น˜)
verify:screens ํ™”๋ฉด์˜ inst() ์˜ค๋ฒ„๋ผ์ด๋“œ โ†” ์„ธํŠธ์˜ ์†์„ฑ ์ด๋ฆ„ (๊ฐœ๋ช…์œผ๋กœ ์กฐ์šฉํžˆ ๋Š๊ธด ์˜ค๋ฒ„๋ผ์ด๋“œ)
verify:mapping ์ปดํฌ๋„ŒํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ โ€” ์žˆ์–ด์•ผ ํ•  ๊ฒŒ ๋‹ค ์žˆ๊ณ , ์—†์–ด์•ผ ํ•  ๊ฒŒ ์—†๋Š”๊ฐ€

๊ฒŒ์ดํŠธ ๋ณด์กฐ ํŒŒ์„œ: scripts/lib/ds-props.mjs(parsePropsAt ยท classifyProps ยท indexComponents) ยท scripts/lib/figma-sets.mjs(extractFigmaSets ยท getValidIconKeys) ยท scripts/lib/css-classes.mjs(parseCssClasses ยท legalLayers).


์‹คํ–‰

pnpm install
pnpm build:tokens                 # tokens/*.json โ†’ CSS ๋ณ€์ˆ˜ ยท TS ํƒ€์ž… ยท ํ”Œ๋Ÿฌ๊ทธ์ธ ํ”„๋ฆฌ์…‹
pnpm storybook                    # ๋ฌธ์„œ ์‚ฌ์ดํŠธ (http://localhost:6006)
pnpm --dir figma-plugin build     # Figma ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฒˆ๋“ค โ†’ figma-plugin/dist/

Figma์—์„œ: Plugins โ†’ Development โ†’ Import plugin from manifestโ€ฆ โ†’ figma-plugin/manifest.json ์„ ํƒ โ†’ UI์—์„œ ํ”„๋ฆฌ์…‹ยท์ปฌ๋ŸฌยทํฐํŠธ๋ฅผ ๊ณ ๋ฅด๊ณ  [๋””์ž์ธ์‹œ์Šคํ…œ ์ƒ์„ฑ].

๊ฒ€์ฆ

pnpm verify:all     # โ† ์ด๊ฒƒ๋งŒ ์ดˆ๋ก์ด๋ฉด "์™„๋ฃŒ"๋ผ๊ณ  ๋งํ•ด๋„ ๋œ๋‹ค
๋ช…๋ น ๊ฒ€์‚ฌ
pnpm typecheck ์•ฑ ํƒ€์ž…์ฒดํฌ (noUnusedLocals ์ผœ์ ธ ์žˆ์Œ)
pnpm typecheck:figma ํ”Œ๋Ÿฌ๊ทธ์ธ ํƒ€์ž…์ฒดํฌ
pnpm verify:parity ํ† ํฐ ๊ฐ’ยท๋ณ€์ˆ˜๋ช… ํŒจ๋ฆฌํ‹ฐ
pnpm verify:mapping ์ปดํฌ๋„ŒํŠธ ์ปค๋ฒ„๋ฆฌ์ง€
pnpm verify:naming ์ฝ”๋“œ ์ด๋ฆ„ โ†” Figma ์ด๋ฆ„
pnpm verify:screens ํ™”๋ฉด ์กฐ๋ฆฝ (inst() ์˜ค๋ฒ„๋ผ์ด๋“œ)
pnpm verify:bindings ์š”์†Œโ†”๋ณ€์ˆ˜ ๋ฐ”์ธ๋”ฉ
pnpm verify:guard git ๊ฐ€๋“œ ํ›…์ด ์‹ค์ œ๋กœ ๋ฌด๋Š”์ง€ (๊ฒฐํ•จ ์ฃผ์ž… 33๊ฑด)

์š”๊ตฌ ํ™˜๊ฒฝ

  • Node 20 ๋˜๋Š” 22 (Storybook 8์€ Node 24 ๋ฏธ์ง€์›)
  • pnpm โ€” corepack enable && corepack prepare pnpm@latest --activate

๊ธฐ์—ฌ ๊ทœ์•ฝ

์ž‘์—… ์ „ CLAUDE.md๋ฅผ ์ฝ์–ด๋ผ. ์š”์•ฝํ•˜๋ฉด:

  1. git ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ๋ช…๋ น ๊ธˆ์ง€ (stash ยท reset --hard ยท checkout -- . โ€ฆ) โ€” ์—ฌ๋Ÿฌ ์—์ด์ „ํŠธ๊ฐ€ ๊ฐ™์€ ์›ŒํฌํŠธ๋ฆฌ๋ฅผ ๊ณต์œ ํ•œ๋‹ค. PreToolUse ํ›…์ด ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ฐจ๋‹จํ•œ๋‹ค.
  2. ํ•˜๋“œ์ฝ”๋”ฉ ๊ธˆ์ง€ โ€” ์ƒ‰ยทํฌ๊ธฐยท๊ฐ„๊ฒฉ์€ var(--ds-*), ๋ฌธ๊ตฌ๋Š” labels prop.
  3. ์ด๋ฏธ ์žˆ๋Š” ๊ฒƒ์„ ๋‘๊ณ  ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ๋งˆ๋ผ โ€” ํ‘œยท๋นˆ ์ƒํƒœยทํˆด๋ฐ”ยทํ™•์ธ์ฐฝ์€ ์ด๋ฏธ ์žˆ๋‹ค. ๊ธฐ์กด ๊ฒƒ์— ์˜ต์…”๋„ ์ถ•์„ ์ถ”๊ฐ€ํ•˜๋ผ.
  4. ๋๋‚ฌ๋‹ค๊ณ  ๋งํ•˜๊ธฐ ์ „์— ๊ฒŒ์ดํŠธ๋ฅผ ์‹ค์ œ๋กœ ๋Œ๋ ค๋ผ.