디자인 토큰
디자인 토큰(Design Tokens)은 디자인 시스템을 관리하기 위한 전략입니다.
디자인 시스템의 모든 재사용 가능한 요소(예: 색상, 글꼴, 간격 등)를 독립적인 변수로 추상화하여 전체 디자인 시스템에서 통합적으로 관리하고 적용할 수 있도록 합니다.
mdui는 전역 CSS 사용자 정의 속성을 사용해 디자인 토큰을 구현합니다. 즉, CSS 사용자 정의 속성만 수정하면 모든 mdui 컴포넌트의 스타일을 전역적으로 수정할 수 있습니다. 동시에 직접 개발하는 스타일의 경우에도 CSS 사용자 정의 속성을 우선적으로 참조하여 스타일이 mdui 컴포넌트의 스타일과 통일성을 유지하고, 다이내믹 컬러를 수정할 때 자신의 스타일도 색상 구성표를 동기적으로 업데이트할 수 있도록 하는 것이 좋습니다.
색상
mdui는 라이트 모드와 다크 모드에 대해 각각 한 세트의 CSS 사용자 정의 속성을 제공합니다. 라이트 모드에서 CSS 사용자 정의 속성 이름은 --mdui-color-{name}-light이며, 여기서 {name}은 색상 이름입니다. 다크 모드에서는 --mdui-color-{name}-dark입니다.
또한, mdui는 --mdui-color-{name}이라는 CSS 사용자 정의 속성 세트를 제공합니다. 이 속성은 라이트 모드에서 --mdui-color-{name}-light를 참조하고 다크 모드에서 --mdui-color-{name}-dark를 참조하므로 현재 라이트 모드/다크 모드에 따라 자동으로 색상이 전환됩니다.
일부 색상의 CSS 사용자 정의 속성을 수정해야 하는 경우 --mdui-color-{name}-light와 --mdui-color-{name}-dark 속성을 동시에 수정해야 합니다. CSS 사용자 정의 속성을 읽을 때는 --mdui-color-{name} 속성을 직접 사용하면 됩니다.
CSS 사용자 정의 속성의 속성값은 RGB 세 가지 색상을 ,로 구분한 값입니다. 다음 예제는 색상 CSS 사용자 정의 속성의 사용법을 보여줍니다:
/* primary 색상값 수정 */
:root {
--mdui-color-primary-light: 103, 80, 164;
--mdui-color-primary-dark: 208, 188, 255;
}
/* foo 요소의 배경색을 primary로 설정 */
.foo {
background-color: rgb(var(--mdui-color-primary));
}
/* bar 요소의 배경색을 불투명도 0.8인 primary로 설정 */
.bar {
background-color: rgba(var(--mdui-color-primary), 0.8);
}
완전히 새로운 색상 구성표를 만들어야 하는 경우 setColorScheme 함수를 사용하는 것이 좋습니다. 이 함수는 지정된 하나의 색상값을 기반으로 전체 색상 구성표를 생성합니다.
| 색상명 | CSS 사용자 정의 속성 | 기본값 | 예시 |
|---|---|---|---|
| Primary | --mdui-color-primary-light |
103, 80, 164 |
|
--mdui-color-primary-dark |
208, 188, 255 |
||
--mdui-color-primary |
|||
| Primary container | --mdui-color-primary-container-light |
234, 221, 255 |
|
--mdui-color-primary-container-dark |
79, 55, 139 |
||
--mdui-color-primary-container |
|||
| On primary | --mdui-color-on-primary-light |
255, 255, 255 |
|
--mdui-color-on-primary-dark |
55, 30, 115 |
||
--mdui-color-on-primary |
|||
| On primary container | --mdui-color-on-primary-container-light |
33, 0, 94 |
|
--mdui-color-on-primary-container-dark |
234, 221, 255 |
||
--mdui-color-on-primary-container |
|||
| Inverse primary | --mdui-color-inverse-primary-light |
208, 188, 255 |
|
--mdui-color-inverse-primary-dark |
103, 80, 164 |
||
--mdui-color-inverse-primary |
|||
| Secondary | --mdui-color-secondary-light |
98, 91, 113 |
|
--mdui-color-secondary-dark |
204, 194, 220 |
||
--mdui-color-secondary |
|||
| Secondary container | --mdui-color-secondary-container-light |
232, 222, 248 |
|
--mdui-color-secondary-container-dark |
74, 68, 88 |
||
--mdui-color-secondary-container |
|||
| On secondary | --mdui-color-on-secondary-light |
255, 255, 255 |
|
--mdui-color-on-secondary-dark |
51, 45, 65 |
||
--mdui-color-on-secondary |
|||
| On secondary container | --mdui-color-on-secondary-container-light |
30, 25, 43 |
|
--mdui-color-on-secondary-container-dark |
232, 222, 248 |
||
--mdui-color-on-secondary-container |
|||
| Tertiary | --mdui-color-tertiary-light |
125, 82, 96 |
|
--mdui-color-tertiary-dark |
239, 184, 200 |
||
--mdui-color-tertiary |
|||
| Tertiary container | --mdui-color-tertiary-container-light |
255, 216, 228 |
|
--mdui-color-tertiary-container-dark |
99, 59, 72 |
||
--mdui-color-tertiary-container |
|||
| On tertiary | --mdui-color-on-tertiary-light |
255, 255, 255 |
|
--mdui-color-on-tertiary-dark |
73, 37, 50 |
||
--mdui-color-on-tertiary |
|||
| On tertiary container | --mdui-color-on-tertiary-container-light |
55, 11, 30 |
|
--mdui-color-on-tertiary-container-dark |
255, 216, 228 |
||
--mdui-color-on-tertiary-container |
|||
| Surface | --mdui-color-surface-light |
254, 247, 255 |
|
--mdui-color-surface-dark |
20, 18, 24 |
||
--mdui-color-surface |
|||
| Surface dim | --mdui-color-surface-dim-light |
222, 216, 225 |
|
--mdui-color-surface-dim-dark |
20, 18, 24 |
||
--mdui-color-surface-dim |
|||
| Surface bright | --mdui-color-surface-bright-light |
254, 247, 255 |
|
--mdui-color-surface-bright-dark |
59, 56, 62 |
||
--mdui-color-surface-bright |
|||
| Surface container lowest | --mdui-color-surface-container-lowest-light |
255, 255, 255 |
|
--mdui-color-surface-container-lowest-dark |
15, 13, 19 |
||
--mdui-color-surface-container-lowest |
|||
| Surface container low | --mdui-color-surface-container-low-light |
247, 242, 250 |
|
--mdui-color-surface-container-low-dark |
29, 27, 32 |
||
--mdui-color-surface-container-low |
|||
| Surface container | --mdui-color-surface-container-light |
243, 237, 247 |
|
--mdui-color-surface-container-dark |
33, 31, 38 |
||
--mdui-color-surface-container |
|||
| Surface container high | --mdui-color-surface-container-high-light |
236, 230, 240 |
|
--mdui-color-surface-container-high-dark |
43, 41, 48 |
||
--mdui-color-surface-container-high |
|||
| Surface container highest | --mdui-color-surface-container-highest-light |
230, 224, 233 |
|
--mdui-color-surface-container-highest-dark |
54, 52, 59 |
||
--mdui-color-surface-container-highest |
|||
| Surface variant | --mdui-color-surface-variant-light |
231, 224, 236 |
|
--mdui-color-surface-variant-dark |
73, 69, 79 |
||
--mdui-color-surface-variant |
|||
| On surface | --mdui-color-on-surface-light |
28, 27, 31 |
|
--mdui-color-on-surface-dark |
230, 225, 229 |
||
--mdui-color-on-surface |
|||
| On surface variant | --mdui-color-on-surface-variant-light |
73, 69, 78 |
|
--mdui-color-on-surface-variant-dark |
202, 196, 208 |
||
--mdui-color-on-surface-variant |
|||
| Inverse surface | --mdui-color-inverse-surface-light |
49, 48, 51 |
|
--mdui-color-inverse-surface-dark |
230, 225, 229 |
||
--mdui-color-inverse-surface |
|||
| Inverse on surface | --mdui-color-inverse-on-surface-light |
244, 239, 244 |
|
--mdui-color-inverse-on-surface-dark |
49, 48, 51 |
||
--mdui-color-inverse-on-surface |
|||
| Background | --mdui-color-background-light |
254, 247, 255 |
|
--mdui-color-background-dark |
20, 18, 24 |
||
--mdui-color-background |
|||
| On background | --mdui-color-on-background-light |
28, 27, 31 |
|
--mdui-color-on-background-dark |
230, 225, 229 |
||
--mdui-color-on-background |
|||
| Error | --mdui-color-error-light |
179, 38, 30 |
|
--mdui-color-error-dark |
242, 184, 181 |
||
--mdui-color-error |
|||
| Error container | --mdui-color-error-container-light |
249, 222, 220 |
|
--mdui-color-error-container-dark |
140, 29, 24 |
||
--mdui-color-error-container |
|||
| On error | --mdui-color-on-error-light |
255, 255, 255 |
|
--mdui-color-on-error-dark |
96, 20, 16 |
||
--mdui-color-on-error |
|||
| On error container | --mdui-color-on-error-container-light |
65, 14, 11 |
|
--mdui-color-on-error-container-dark |
249, 222, 220 |
||
--mdui-color-on-error-container |
|||
| Outline | --mdui-color-outline-light |
121, 116, 126 |
|
--mdui-color-outline-dark |
147, 143, 153 |
||
--mdui-color-outline |
|||
| Outline variant | --mdui-color-outline-variant-light |
196, 199, 197 |
|
--mdui-color-outline-variant-dark |
68, 71, 70 |
||
--mdui-color-outline-variant |
|||
| Shadow | --mdui-color-shadow-light |
0, 0, 0 |
|
--mdui-color-shadow-dark |
0, 0, 0 |
||
--mdui-color-shadow |
|||
| Surface tint | --mdui-color-surface-tint-color-light |
103, 80, 164 |
|
--mdui-color-surface-tint-color-dark |
208, 188, 255 |
||
--mdui-color-surface-tint-color |
|||
| Scrim | --mdui-color-scrim-light |
0, 0, 0 |
|
--mdui-color-scrim-dark |
0, 0, 0 |
||
--mdui-color-scrim |
둥근 모서리
mdui는 7가지 크기의 둥근 모서리를 제공합니다. 다음은 이러한 둥근 모서리의 CSS 사용자 정의 속성을 사용하는 예시입니다:
/* extra-small의 둥근 모서리 크기 수정 */
:root {
--mdui-shape-corner-extra-small: 0.3rem;
}
/* foo 요소의 둥근 모서리를 extra-small로 설정 */
.foo {
border-radius: var(--mdui-shape-corner-extra-small);
}
| CSS 사용자 정의 속성 | 기본값 | 예시 |
|---|---|---|
--mdui-shape-corner-none |
0 |
|
--mdui-shape-corner-extra-small |
0.25rem |
|
--mdui-shape-corner-small |
0.5rem |
|
--mdui-shape-corner-medium |
0.75rem |
|
--mdui-shape-corner-large |
1rem |
|
--mdui-shape-corner-extra-large |
1.75rem |
|
--mdui-shape-corner-full |
1000rem |
타이포그래피
mdui는 Display large, Display medium, Display small, Headline large, Headline medium, Headline small, Title large, Title medium, Title small, Label large, Label medium, Label small, Body large, Body medium, Body small의 15가지 텍스트 스타일을 제공합니다.
사용 예시는 다음과 같습니다:
/* Body large 텍스트 스타일 수정 */
:root {
--mdui-typescale-body-large-line-height: 1.6rem;
--mdui-typescale-body-large-size: 1.2rem;
--mdui-typescale-body-large-tracking: 0.01rem;
--mdui-typescale-body-large-weight: 400;
}
/* foo 요소의 텍스트 스타일을 Body large로 설정 */
.foo {
line-height: var(--mdui-typescale-body-large-line-height);
font-size: var(--mdui-typescale-body-large-size);
letter-spacing: var(--mdui-typescale-body-large-tracking);
font-weight: var(--mdui-typescale-body-large-weight);
}
| CSS 사용자 정의 속성 | 기본값 | 예시 |
|---|---|---|
--mdui-typescale-display-large-line-height |
4rem |
Display large |
--mdui-typescale-display-large-size |
3.5625rem |
|
--mdui-typescale-display-large-tracking |
0 |
|
--mdui-typescale-display-large-weight |
400 |
|
--mdui-typescale-display-medium-line-height |
3.25rem |
Display medium |
--mdui-typescale-display-medium-size |
2.8125rem |
|
--mdui-typescale-display-medium-tracking |
0 |
|
--mdui-typescale-display-medium-weight |
400 |
|
--mdui-typescale-display-small-line-height |
2.75rem |
Display small |
--mdui-typescale-display-small-size |
2.25rem |
|
--mdui-typescale-display-small-tracking |
0 |
|
--mdui-typescale-display-small-weight |
400 |
|
--mdui-typescale-headline-large-line-height |
2.5rem |
Headline large |
--mdui-typescale-headline-large-size |
2rem |
|
--mdui-typescale-headline-large-tracking |
0 |
|
--mdui-typescale-headline-large-weight |
400 |
|
--mdui-typescale-headline-medium-line-height |
2.25rem |
Headline medium |
--mdui-typescale-headline-medium-size |
1.75rem |
|
--mdui-typescale-headline-medium-tracking |
0 |
|
--mdui-typescale-headline-medium-weight |
400 |
|
--mdui-typescale-headline-small-line-height |
2rem |
Headline small |
--mdui-typescale-headline-small-size |
1.5rem |
|
--mdui-typescale-headline-small-tracking |
0 |
|
--mdui-typescale-headline-small-weight |
400 |
|
--mdui-typescale-title-large-line-height |
1.75rem |
Title large |
--mdui-typescale-title-large-size |
1.375rem |
|
--mdui-typescale-title-large-tracking |
0 |
|
--mdui-typescale-title-large-weight |
400 |
|
--mdui-typescale-title-medium-line-height |
1.5rem |
Title medium |
--mdui-typescale-title-medium-size |
1rem |
|
--mdui-typescale-title-medium-tracking |
0.009375rem |
|
--mdui-typescale-title-medium-weight |
500 |
|
--mdui-typescale-title-small-line-height |
1.25rem |
Title small |
--mdui-typescale-title-small-size |
0.875rem |
|
--mdui-typescale-title-small-tracking |
0.00625rem |
|
--mdui-typescale-title-small-weight |
500 |
|
--mdui-typescale-label-large-line-height |
1.25rem |
Label large |
--mdui-typescale-label-large-size |
0.875rem |
|
--mdui-typescale-label-large-tracking |
0.00625rem |
|
--mdui-typescale-label-large-weight |
500 |
|
--mdui-typescale-label-medium-line-height |
1rem |
Label medium |
--mdui-typescale-label-medium-size |
0.75rem |
|
--mdui-typescale-label-medium-tracking |
0.03125rem |
|
--mdui-typescale-label-medium-weight |
500 |
|
--mdui-typescale-label-small-line-height |
0.375rem |
Label small |
--mdui-typescale-label-small-size |
0.6875rem |
|
--mdui-typescale-label-small-tracking |
0.03125rem |
|
--mdui-typescale-label-small-weight |
500 |
|
--mdui-typescale-body-large-line-height |
1.5rem |
Body large |
--mdui-typescale-body-large-size |
1rem |
|
--mdui-typescale-body-large-tracking |
0.009375rem |
|
--mdui-typescale-body-large-weight |
400 |
|
--mdui-typescale-body-medium-line-height |
1.25rem |
Body medium |
--mdui-typescale-body-medium-size |
0.875rem |
|
--mdui-typescale-body-medium-tracking |
0.015625rem |
|
--mdui-typescale-body-medium-weight |
400 |
|
--mdui-typescale-body-small-line-height |
1rem |
Body small |
--mdui-typescale-body-small-size |
0.75rem |
|
--mdui-typescale-body-small-tracking |
0.025rem |
|
--mdui-typescale-body-small-weight |
400 |
상태 레이어 불투명도
일부 mdui 컴포넌트는 상호작용 시 그 위에 반투명 오버레이를 추가합니다. 예를 들어 <mdui-button> 컴포넌트는 마우스 호버, 포커스, 클릭 또는 드래그 시 반투명 오버레이가 나타납니다. CSS 사용자 정의 속성을 수정하여 이러한 오버레이의 불투명도를 조정할 수 있습니다.
사용 예시는 다음과 같습니다:
/* 상태 레이어 불투명도 수정 */
:root {
--mdui-state-layer-hover: 0.08;
--mdui-state-layer-focus: 0.12;
--mdui-state-layer-pressed: 0.12;
--mdui-state-layer-dragged: 0.16;
}
| CSS 사용자 정의 속성 | 기본값 | 예시 |
|---|---|---|
--mdui-state-layer-hover |
0.08 |
|
--mdui-state-layer-focus |
0.12 |
|
--mdui-state-layer-pressed |
0.12 |
|
--mdui-state-layer-dragged |
0.16 |
그림자 (음영)
일부 mdui 컴포넌트는 페이지에서의 입체감을 시뮬레이션하기 위해 그림자 효과를 가집니다. CSS 사용자 정의 속성을 수정하여 컴포넌트의 그림자 효과를 조정할 수 있습니다.
사용 예시는 다음과 같습니다:
/* level1 레벨의 그림자 수정 */
:root {
--mdui-elevation-level1:
0 0.5px 1.5px 0 rgba(var(--mdui-color-shadow), 19%),
0 0 1px 0 rgba(var(--mdui-color-shadow), 3.9%);
}
/* foo 요소의 그림자를 level1로 설정 */
.foo {
box-shadow: var(--mdui-elevation-level1);
}
| CSS 사용자 정의 속성 | 기본값 | 예시 |
|---|---|---|
--mdui-elevation-level0 |
none |
|
--mdui-elevation-level1 |
0 0.5px 1.5px 0 rgba(var(--mdui-color-shadow), 19%), 0 0 1px 0 rgba(var(--mdui-color-shadow), 3.9%) |
|
--mdui-elevation-level2 |
0 0.85px 3px 0 rgba(var(--mdui-color-shadow), 19%), 0 0.25px 1px 0 rgba(var(--mdui-color-shadow), 3.9%) |
|
--mdui-elevation-level3 |
0 1.25px 5px 0 rgba(var(--mdui-color-shadow), 19%), 0 0.3333px 1.5px 0 rgba(var(--mdui-color-shadow), 3.9%) |
|
--mdui-elevation-level4 |
0 1.85px 6.25px 0 rgba(var(--mdui-color-shadow), 19%), 0 0.5px 1.75px 0 rgba(var(--mdui-color-shadow), 3.9%) |
|
--mdui-elevation-level5 |
0 2.75px 9px 0 rgba(var(--mdui-color-shadow), 19%), 0 0.25px 3px 0 rgba(var(--mdui-color-shadow), 3.9%) |
애니메이션
mdui 컴포넌트의 애니메이션 타이밍 함수와 지속 시간은 CSS 사용자 정의 속성으로 구성할 수 있습니다.
사용 예시는 다음과 같습니다:
/* standard 타이밍 함수 및 short1 지속 시간 수정 */
:root {
--mdui-motion-easing-standard: cubic-bezier(0.2, 0, 0, 1);
--mdui-motion-duration-short1: 40ms;
}
/* foo 요소의 전환 효과를 standard 타이밍 함수와 short1 지속 시간으로 설정 */
.foo {
transition: all var(--mdui-motion-duration-short1)
var(--mdui-motion-easing-standard);
}
| 타입 | CSS 사용자 정의 속성 | 기본값 |
|---|---|---|
| 타이밍 함수 | --mdui-motion-easing-linear |
cubic-bezier(0, 0, 1, 1) |
--mdui-motion-easing-standard |
cubic-bezier(0.2, 0, 0, 1) |
|
--mdui-motion-easing-standard-accelerate |
cubic-bezier(0.3, 0, 1, 1) |
|
--mdui-motion-easing-standard-decelerate |
cubic-bezier(0, 0, 0, 1) |
|
--mdui-motion-easing-emphasized |
var(--mdui-motion-easing-standard) |
|
--mdui-motion-easing-emphasized-accelerate |
cubic-bezier(0.3, 0, 0.8, 0.15) |
|
--mdui-motion-easing-emphasized-decelerate |
cubic-bezier(0.05, 0.7, 0.1, 1) |
|
| 지속 시간 | --mdui-motion-duration-short1 |
50ms |
--mdui-motion-duration-short2 |
100ms |
|
--mdui-motion-duration-short3 |
150ms |
|
--mdui-motion-duration-short4 |
200ms |
|
--mdui-motion-duration-medium1 |
250ms |
|
--mdui-motion-duration-medium2 |
300ms |
|
--mdui-motion-duration-medium3 |
350ms |
|
--mdui-motion-duration-medium4 |
400ms |
|
--mdui-motion-duration-long1 |
450ms |
|
--mdui-motion-duration-long2 |
500ms |
|
--mdui-motion-duration-long3 |
550ms |
|
--mdui-motion-duration-long4 |
600ms |
|
--mdui-motion-duration-extra-long1 |
700ms |
|
--mdui-motion-duration-extra-long2 |
800ms |
|
--mdui-motion-duration-extra-long3 |
900ms |
|
--mdui-motion-duration-extra-long4 |
1000ms |
반응형 브레이크포인트
mdui는 일련의 반응형 브레이크포인트를 제공하며, 이러한 브레이크포인트는 CSS 사용자 정의 속성으로 구성할 수 있습니다. 사용 예시는 다음과 같습니다:
/* sm 브레이크포인트 값 수정 */
:root {
--mdui-breakpoint-sm: 560px;
}
이러한 CSS 사용자 정의 속성은 CSS 미디어 쿼리 내에서 사용할 수 없다는 점에 유의하세요. 다음은 잘못된 예시입니다:
/* 잘못된 사용법. 미디어 쿼리에서는 CSS 사용자 정의 속성을 사용할 수 없습니다 */
@media (min-width: var(--mdui-breakpoint-sm)) {
}
JavaScript에서 브레이크포인트 판단이 필요한 경우 breakpoint 함수를 사용합니다.
| CSS 사용자 정의 속성 | 기본값 |
|---|---|
--mdui-breakpoint-xs |
0px |
--mdui-breakpoint-sm |
600px |
--mdui-breakpoint-md |
840px |
--mdui-breakpoint-lg |
1080px |
--mdui-breakpoint-xl |
1440px |
--mdui-breakpoint-xxl |
1920px |