ํ๊ตญ์ด ยท English ยท ๆฅๆฌ่ช ยท ไธญๆ
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์ ๊ฐ์ด ๊ฐ๋ผ์ง ์ ์๋ค.
| ํ์ผ | ๋ด์ฉ |
|---|---|
| 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 ๋งค๋ํ์คํธ๋ฅผ ์ฝ์ด ๊ฐ์ ๋ณ์๋ฅผ ์ฌํํ ์ ์๋ค.
| ํ์ผ | ์ญํ |
|---|---|
| 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๋ฅผ ์ฝ์ด๋ผ. ์์ฝํ๋ฉด:
- git ์ํ๋ฅผ ๋ฐ๊พธ๋ ๋ช
๋ น ๊ธ์ง (
stashยทreset --hardยทcheckout -- .โฆ) โ ์ฌ๋ฌ ์์ด์ ํธ๊ฐ ๊ฐ์ ์ํฌํธ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ค. PreToolUse ํ ์ด ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ฐจ๋จํ๋ค. - ํ๋์ฝ๋ฉ ๊ธ์ง โ ์ยทํฌ๊ธฐยท๊ฐ๊ฒฉ์
var(--ds-*), ๋ฌธ๊ตฌ๋labelsprop. - ์ด๋ฏธ ์๋ ๊ฒ์ ๋๊ณ ์๋ก ๋ง๋ค์ง ๋ง๋ผ โ ํยท๋น ์ํยทํด๋ฐยทํ์ธ์ฐฝ์ ์ด๋ฏธ ์๋ค. ๊ธฐ์กด ๊ฒ์ ์ต์ ๋ ์ถ์ ์ถ๊ฐํ๋ผ.
- ๋๋ฌ๋ค๊ณ ๋งํ๊ธฐ ์ ์ ๊ฒ์ดํธ๋ฅผ ์ค์ ๋ก ๋๋ ค๋ผ.