@karrotmarket/design-token
λμμΈ ν ν°μ΄ 무μμΈκ°μ?
Design tokens are indivisible pieces of a design system such as colors, spacing, typography scale.
-- Design Token Working Group μ μ
λμμΈ ν ν°μ μ¬λ¬ λμμΈ λꡬ, κ°λ°νκ²½ κ°μ λμμΈ μμ€ν
μ μ΅μ λ¨μλ₯Ό 곡μ ν μ μλλ‘ νμ€μ μ 곡νλ κ²μ λͺ©νλ‘ ν©λλ€.
Goals & Non-goals
Goal
- μνΈμ΄μ©μ± μ 곡
- λΌμ΄λΈλ¬λ¦¬ λ°°ν¬λ§μΌλ‘ μ 체 μ ν리μΌμ΄μ
μ λ³κ²½ μ μ©
- λμμΈ λꡬμ ν¨μ¨μ μΌλ‘ λκΈ°ν
Non-goals
- κ°λ°ν λ νΈνλλ‘ High-level API μ 곡
Token Structures
Raw valuesλ μ΄λ€ λμ€νλ μ΄ μ₯μΉμ 그릴 μ μλ μ€μ λ¨μλ₯Ό μλ―Έν©λλ€. px, dp, rem, vw μ κ°μ΄ "ν¬κΈ°"λ₯Ό λνλ΄λ λ¨μ, #fff, rgba(123, 123, 123, 1) μ²λΌ "μμμ" λνλ΄λ λ¨μ, "Noto Sans KR" κ°μ "ν°νΈ"λ₯Ό λνλ΄λ κ° λ±μ΄ λͺ¨λ ν΄λΉλ©λλ€.
μ¬μ€μ 무νν κ°λ€ μ€μ μ€μ λ‘ μ¬μ©λ κ°μ μ ννκ³ κ³ μ ν μ΄λ¦μ λΆμ¬νλ κ²μΌλ‘ λμμΈμ μΌκ΄μ±κ³Ό μ¬μ¬μ©μ±μ μ»μ μ μμ§λ§, λ°λλ‘ λμμΈμ μ μ°μ±κ³Ό μ°½μμ±μ ν¬κ² μ νν μ μμ΅λλ€.
λΉκ·Όλ§μΌμ λμμΈ ν ν°μ μ μ°μ±μ μν΄ ν¬κ² 2λ¨κ³λ‘ κ³μΈ΅ννμ¬ μ¬μ©ν©λλ€.
Scale Tokenμ Raw value νλμ μ΄λ¦μ λΆμ¬ν κ² μ
λλ€. Scale μ μ΄λ¦μ ν΅ν΄ μ 체 λμμΈμ μ¬μ©λλ κ°μ μ ννκ² μ μ§ν©λλ€. Scaleμ μ€μ€λ‘ μ μν λ¨μλ₯Ό ν΅ν΄ κ°μ μΈλΆμ¬ν(μΆλ ₯μ₯μΉ)μ μ¨κ²¨ μ΄λ₯Ό ν΅ν΄ νΉμ νλ«νΌμ λΆκ°μ§λ‘ μ μΈ λμμΈμ μ μ§ν μ μκ² ν©λλ€.
Semantic Tokenμ Scale Tokenμ μ‘°ν©(Composition)μΌλ‘ λμμΈ μλλ₯Ό ννν λ¨μμ΄λ©°, μ€μ λμμΈκ³Ό κ°λ°κ³Όμ μμ μ£Όμ λΉλ©λΈλμΌλ‘ μ¬μ©λ©λλ€. μ¬λ¬κ°μ Scale μ‘°ν©μ΄ νλμ Semantic μ ꡬμ±ν μλ μκ³ , μ¬λ¬ Semantic μ΄ νλμ Scaleλ₯Ό μ¬μ μν΄μ μ¬μ©λ μλ μμ΅λλ€.
μμ€ν
μ μ‘΄μ¬νλ Scale κ³Ό Semantic μ μκ° μ 체 λμμΈμ Themeμ κ²°μ νκ³ , λ·°ν¬νΈλ νλ«νΌ λ± μΈλΆ νκ²½μ λ§κ² Scaleμ μ μ ν κ°μ μ£Όμ
νλ κ²μΌλ‘ μ€ν€λ§ λ³κ²½μμ΄ μ μ°νκ² Themeμ μ¬μ μν μ μμ΅λλ€.
μ¬μ©λ²
yarn add @karrotmarket/design-token
JavaScript (TypeScript)
import { colors } from '@karrotmarket/design-token';
colors.light.scheme
colors.light.semanticScheme
CSS (css-loader)
import '@karrotmarket/design-token/colors/light.css';
import '@karrotmarket/design-token/colors/dark.css';
Conditional Exports κΈ°λ₯μ΄ μ§μλμ§ μλ νκ²½μ΄λΌλ©΄ λ€μκ³Ό κ°μ΄ μ¬μ©νμΈμ.
import '@karrotmarket/design-token/lib/colors/light.css';
import '@karrotmarket/design-token/lib/colors/dark.css';
λ€μκ³Ό κ°μ΄ CSS Variables κ°μ΄ μΆκ°λ©λλ€.
.light-theme {
--color-white: #FFF;
--color-gray100: #F2F3F6;
--color-gray200: #EAEBEE;
--color-gray300: #DCDEE3;
--color-gray400: #D1D3D8;
--color-gray500: #ADB1BA;
--color-gray600: #868B94;
--color-gray700: #4D5159;
--color-gray900: #212124;
--color-carrot50: #FFF5F0;
--color-carrot100: #FFE2D2;
--color-carrot200: #FFD2B9;
--color-carrot300: #FFBC97;
--color-carrot400: #FF9E66;
--color-carrot500: #FF7E36;
--color-carrot600: #FA6616;
--color-yellow50: #FFF7E6;
--color-yellow500: #FFC552;
--color-yellow800: #CE6400;
--color-green50: #E8FAF6;
--color-green500: #00B493;
--color-green800: #008C72;
--color-red50: #FFF3F2;
--color-red800: #E81300;
--color-blue50: #EBF7FA;
--color-blue800: #0A86B7;
--color-background: var(--color-white);
--color-background-low: var(--color-gray100);
}
.dark-theme {
--color-white: #212124;
--color-gray100: #2B2E33;
--color-gray200: #34373D;
--color-gray300: #43474F;
--color-gray400: #50545C;
--color-gray500: #6D717A;
--color-gray600: #868B94;
--color-gray700: #ADB1BA;
--color-gray900: #EAEBEE;
--color-carrot50: #EDE4E0;
--color-carrot100: #EDD3C4;
--color-carrot200: #EDC4AD;
--color-carrot300: #EDB08E;
--color-carrot400: #EE9561;
--color-carrot500: #ED7735;
--color-carrot600: #E96017;
--color-yellow50: #EDE6D6;
--color-yellow500: #EDB84E;
--color-yellow800: #C05F03;
--color-green50: #D8E9E5;
--color-green500: #03A88A;
--color-green800: #03836C;
--color-red50: #EDE2E2;
--color-red800: #D81403;
--color-blue50: #DBE6E9;
--color-blue800: #0C7EAB;
--color-background: var(--color-white);
--color-background-low: #17171A;
}
CSS μμ color: var(--color-carrot400)
μ²λΌ μΈ μ μμ΅λλ€.
Theme μ μ©νκΈ°
<div class="light-theme">
Light ν
λ§κ° μ μ©λ©λλ€
<div class="dark-theme">
Dark ν
λ§κ° μ μ©λ©λλ€
</div>
</div>
Application νκ²½μμλ JavaScript λ₯Ό ν΅ν΄ Theme μ μ μ΄νλ κ²μ κΆμ₯ν©λλ€.
μμ:
if (window.matchMedia('(prefers-color-scheme: dark)')) {
document.body.classList.remove('light-theme');
document.body.classList.add('dark-theme');
} else {
document.body.classList.remove('dark-theme');
document.body.classList.add('light-theme');
}
μμ€ν
μ€μ λ§ μ¬μ©νλ μΉ νλ‘μ νΈμμλ 미리 ꡬμ±λ μ€νμΌμνΈλ₯Ό import ν΄μ μΈ μ μμ΅λλ€.
import '@karrotmarket/design-token/colors/system.css';