• Design Token์€ ๋””์ž์ธ ๊ฒฐ์ •์„ ํ”Œ๋žซํผ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ด๋ฆ„๊ณผ ๊ฐ’์œผ๋กœ ํ‘œํ˜„ํ•œ ์ตœ์†Œ ๋‹จ์œ„
  • ์ƒ‰์ƒ, ๊ฐ„๊ฒฉ, ๊ธ€๊ผด, ๋ฐ˜๊ฒฝ, ๊ทธ๋ฆผ์ž ๊ฐ™์€ ์‹œ๊ฐ ๊ทœ์น™์„ ์ฝ”๋“œ์™€ ๋””์ž์ธ ๋„๊ตฌ ์‚ฌ์ด์—์„œ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•œ ๊ณตํ†ต ์–ธ์–ด
  • ํŠน์ • ํ™”๋ฉด์˜ UI ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ํ™”๋ฉด๊ณผ ํ”Œ๋žซํผ์—์„œ ๋ฐ˜๋ณต ์‚ฌ์šฉ๋˜๋Š” ์Šคํƒ€์ผ ๊ฒฐ์ •์„ ๋‹ด๋Š” ๋””์ž์ธ ์‹œ์Šคํ…œ ๋ฐ์ดํ„ฐ

ํ•ด๋‹น ๊ฐœ๋…์ด ํ•„์š”ํ•œ ์ด์œ 

  • ๋””์ž์ด๋„ˆ๊ฐ€ ์ •ํ•œ ์ƒ‰์ƒ, spacing, typography๋ฅผ Flutter, Web, iOS, Android์—์„œ ๊ฐ™์€ ์˜๋ฏธ๋กœ ์“ฐ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค.
  • #ff8a65 ๊ฐ™์€ ์›์‹œ๊ฐ’์„ ์ฝ”๋“œ ๊ณณ๊ณณ์— ์ง์ ‘ ์“ฐ์ง€ ์•Š๊ณ  color.background.brand ๊ฐ™์€ ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค.
  • light/dark mode, ๋ธŒ๋žœ๋“œ ํ…Œ๋งˆ, ์ ‘๊ทผ์„ฑ ์ˆ˜์ •์ฒ˜๋Ÿผ ์ „์—ญ ๋””์ž์ธ ๋ณ€๊ฒฝ์ด ์ƒ๊ฒผ์„ ๋•Œ ํ•œ ๊ณณ์—์„œ ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค.

AS-IS

Container(
  color: const Color(0xffff8a65),
  padding: const EdgeInsets.all(16),
  child: Text(
    '๋กœ๊ทธ์ธ',
    style: TextStyle(
      color: Color(0xff222222),
      fontSize: 20,
    ),
  ),
)

TO-BE

Container(
  color: PencilTokensLight.colorBackgroundBrand,
  padding: EdgeInsets.all(PencilTokensLight.dimensionSpacingMd),
  child: Text(
    '๋กœ๊ทธ์ธ',
    style: TextStyle(
      color: PencilTokensLight.colorTextPrimary,
      fontSize: PencilTokensLight.dimensionFontTitle,
    ),
  ),
)

Design Token์ด ๋‹ด๋Š” ๊ฒƒ

Design Token์€ โ€œ๋ฒ„ํŠผ์„ ์–ด๋””์— ๋‘˜์ง€โ€ ๊ฐ™์€ ํ™”๋ฉด ๋ฐฐ์น˜ ์ž์ฒด๋ณด๋‹ค, โ€œ๋ธŒ๋žœ๋“œ ๋ฐฐ๊ฒฝ์ƒ‰์€ ๋ฌด์—‡์ธ์ง€โ€, โ€œ์นด๋“œ ๋ฐ˜๊ฒฝ์€ ๋ช‡ px์ธ์ง€โ€, โ€œ๋ณธ๋ฌธ ๊ธ€๊ผด์€ ๋ฌด์—‡์ธ์ง€โ€ ๊ฐ™์€ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๋””์ž์ธ ๊ฒฐ์ •์„ ๋‹ด๋Š”๋‹ค.

์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

{
  "color.background.brand": "#ff8a65",
  "color.text.primary": "#222222",
  "dimension.card.radius": 12,
  "font.family.ui": "Pretendard"
}

์ด ๊ฐ’๋“ค์€ ๊ทธ๋Œ€๋กœ ์•ฑ์— ๋“ค์–ด๊ฐ€๊ธฐ๋ณด๋‹ค, ๋ณดํ†ต DTCG ๊ฐ™์€ ํ‘œ์ค€ํ™” ํฌ๋งท์œผ๋กœ ์ •๊ทœํ™”๋œ ๋’ค ํ”Œ๋žซํผ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ์˜ Design Token

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” design/ohmybaby.pen ์•ˆ์˜ variables๊ฐ€ ๋””์ž์ธ ํ† ํฐ์˜ ์›๋ณธ์— ๊ฐ€๊น๋‹ค. extract-pencil-tokens.mjs๊ฐ€ Pencil variables๋ฅผ ์ฝ๊ณ , color/number/string ๊ฐ’์„ token JSON์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

์ดํ›„ Style Dictionary๊ฐ€ ๊ทธ token JSON์„ ์ฝ์–ด Flutter์—์„œ ์‚ฌ์šฉํ•  Dart ์ƒ์ˆ˜ ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค.

sequenceDiagram
    autonumber
    participant Pen as ohmybaby.pen variables
    participant Extractor as extract-pencil-tokens.mjs
    participant Json as DTCG token JSON
    participant SD as Style Dictionary
    participant Dart as Flutter Dart constants
    Pen->>Extractor: ๋””์ž์ธ ๋ณ€์ˆ˜ ์ฝ๊ธฐ
    Extractor->>Json: ํ† ํฐ JSON ์ƒ์„ฑ
    Json->>SD: ํ”Œ๋žซํผ ๋ณ€ํ™˜ ์ž…๋ ฅ
    SD->>Dart: Dart ์ƒ์ˆ˜ ์ƒ์„ฑ

์ฐธ๊ณ  ๋ฌธ์„œ