디자인 시스템의 토큰에 이름 붙이는 방법을 알아봅니디.
부제 : 비주얼 스타일을 설명하는 용어, 유형 및 분류; Base, Modifier, Objects, Namespace
원문 : https://medium.com/eightshapes-llc/naming-tokens-in-design-systems-9e86c7444676
그리고 이름을 붙이는 것은 어렵습니다.
원문에는 다양한 빅테크들이 공유한 자신들만의 방법론이 있으니 참고하세요
예시 : 세일즈 포스 (Ferrua & Rewis, Clarity 2019)
기초부터 시작하기
위의 일반적인(generics) 디자인 토큰이 아닌 더 많은 레벨을 포함한 토큰은 복잡하지만 구체적인 토큰으로 이어집니다.
$esds-color-feedback-background-error 및 $esds-font-heading-size-1은 값의 목적을 좀더 구체적으로 나타냅니다.
(각각 #B90000 및 64px에 매핑됩니다).
$esds-marquee-space-inset-2-x-media-query-s는 컴포넌트명과 category / scale의 의미를 갖고 있네요
충분한 의미를 나타내기 위해선 분류와 유형의 충분한 레벨이 필요합니다.
충분한 레벨은 그룹으로 구성하기에 충분한 수준을 의미합니다.
- Base :
- cateogry(예: color),
- concept(action)
- peoperty(size)
- 토큰의 중추 수준
- Modifier :
- variant (primary)
- state (hover)
- scale (100)
- mode (on-dark)
- 위의 어떤 것(어떤 토큰의 변종)을 하나 이상 나타내는 수준
- Object :
- component(button)
- component 내의 element(left-icon)
- component group (form)
- 컴포넌트를 나타내는 수준
- Namespace :
- system(esds)
- theme(ocean 또는 하위 브랜드)
- (비즈니스)domain(retail)
- 혹은 어떤(극단적인 경우 모두!) 무언가를 나타내는 수준
Tokens presenting a primary action’s hover color, from Bloomberg, Salesforce, Orbit, Morningstar, Infor and Adobe
Base Levels
category, property, concept
Category
카테고리는 시각적 스타일 문제에 걸쳐 있으며 때때로 겹칠 수 있습니다.
보통 각 시스템에서는 각 카테고리를 다른 방식으로 명명합니다.
일반적인 카테고리는 다음과 같습니다.
- color
- font (aka type, typography, text)
- space (aka units, dimension, spacing)
- size (aka sizing)
- elevation (aka z-index, layer, layering)
- breakpoints (aka media-query, responsive)
- shadow (aka depth)
- touch
- time (aka animation, duration)
원칙: 동음이의어를 피합니다.
Property
category는 토큰을 정의하기 위해 관련 property와 쌍을 이룰 수 있지만,
의도적으로 의미 있는 값을 정의하기에 쌍 만으론 충분하지 않을 수 있습니다.
색상과 관련한 예는 text, background, border 및 fill이 포함되며
다음과 같이 일반적인 토큰이 생성됩니다.
$color-background: #FFFFFF
$color-text: #000000
$color-border: #888888
$font-weight: normal
$font-size: 14px
$font-line-height: 1.25
범주/속성 쌍은 매우 일반적이지만, 유용하지 않습니다. concept과 modifier가 필요합니다.
Concept
- feedback (aka notification, messaging, alert)
- success , warning, error 같은 variants
- action (aka cta, interactive, interaction) to corral colors affording calls-to-action (links, buttons, …) and selected items (like tabs, navigation items, checkboxes, radio buttons, and filters).
- visualization (aka dataviz, charting, charts). The financial Morningstar Design System even includes sub-concepts within visualization for correlation, valuation, performance, and asset-allocation colors and a default visualization color order.
- variant는 시각화 대상 수치(performance 등)
- commerce colors
- variants for sale, clearance, inventory, and timing urgency.
즉 concept은 variant과 결합하여
$color-feedback-success, $color-action-primary 및
$color-visualization-performance-positive와 같은 토큰을 형성합니다.
타이포그래피 토큰은 종종 heading(aka header, heading-levels, headline, display) 및 body(text라고도 함 - 동음이의어가 또 있습니다!) 같은 개념으로 그룹화됩니다.
원리: 내부의 동질성, 간의 이질성
Modifiers
variant, state, scale, mode
Variant
variant은 대체 사용 사례를 구별합니다. 예를 들어, 디자인 언어는 다음과 같이 텍스트 색상을 변경하여 계층 구조와 대비를 만듭니다.
- primary (aka default, base)
- secondary (aka subdued, subtle)
- tertiary (aka nonessential)
- success (aka confirmation, positive)
- error (aka danger, alert, critical)
- information (aka info)
- warning
- new
$color-text-primary, $color-background-warning 및 $color-fill-new와 같은 토큰은
category / property 쌍을 variant와 결합합니다.
원칙 : 유연함 vs 특정성
$color-success와 같은 토큰은 category(cateogry)와 variant(success)을 많은 시나리오에 적용할 수 있는 간결한 식별자로 결합합니다.
사용자가 background, border 또는 font(text)에 $color-success를 적용할 수 있는 여지를 남깁니다.
State
- default
- hover, when a pointer is positioned above an object
- press / active, between the time a user presses and releases an object
- focus, when an object is able to accept input
- disabled, when an object is not able to accept input
- visited, for alternative link display when already visited
- error, when an object is in an error state
상태는 종종 Object(button) 또는 variant(secondary)가 있는 Category(color), Concept(action) , Property(text)와 연관됩니다.
그 결과 $color-action-text-secondary-focus와 같은 완전한 형태의 토큰이 생성됩니다.
Scale
- 값의 나열
- Enumerated values like heading levels’ 1, 2, 3, 4, and 5.
- 정렬된 값의 나열
- Ordered values like Google Material color levels of 50, 100, …, 900.
- 정해진 범위의 스케일
- Bounded scales like HSL’s 0 to 100 lightness value to vary shades of a tint, such as slate gray’s slate-42, slate-90, and slate-95.
- 비율
- Proportion, often establishing a base 1-x and growing (2-x, 4-x, …) and shrinking (half-x, quarter-x, …) relatively.
- 티셔츠 사이즈
- T-shirt sizes, starting with small (variants: s), medium (variants: m, standard, base, default) and large (variant: l) and expanding to xl, xs, and xxxl. Pro tip: Size ≠ space, so consider using proportion instead of t-shirts for space despite what I said four years ago.
Mode (Usually, for “Light” and “Dark”)
이것은 토큰의 양을 증가시키지만 실제로는 작은 부분집합으로 제한되며
많은 예측 가능한 목적에 재사용할 수 있는 더 간단한 값(예, $color-accent-hover-on-dark)의 별칭으로 지정함으로써 완화됩니다.
원칙: 명시적 기본값 대 잘린 기본값
반면 일부 시스템은 형제 토큰에 대한 병렬 구성에 의존하여 토큰 세트를 예측 가능하게 반복하므로
on-light, on-dark 및 on-brand 모디파이어 명이 명시적으로 필요합니다.
원칙: 수정 용어를 포함하거나 제외합니까?
Objects
component, element, component group
예를 들어, input 컴포넌트는 $esds-color-text-primary와 같은 기존 토큰을 사용하여 텍스트에 색상을 지정합니다.
반면에 토큰 컬렉션에는 input의 border 색상 및 roundness에 적용할 만한 게 없을 수 있습니다.
$esds-color-neutral-70과 같은 일반 토큰과 4px와 같은 명시적 값이면 충분하지 않습니까?
컴포넌트 내부
중첩 엘리먼트
컴포넌트 그룹
- 글로벌 토큰에 $esds-forms-color-border를 추가합니다.
- $esds-input-color-border를 $esds-forms-color-border로 바꿉니다.
- input.scss에서 $esds-input-color-border를 제거합니다.
- Select, Checkbox 및 Radio에 $esds-forms-color-border를 적용합니다.
원칙: 컴포넌트 내부에서 시작한 다음 컴포넌트 간 토큰으로 승격
원칙: 성급하게 결정을 글로벌화하지 마십시오
일관된 form 엘리먼트 테두리에 대한 공통된 필요성은 예측 가능합니다.
이러한 엘리먼트는 함께 설계되며 이러한 규칙의 필요성은 빠르게 나타납니다.
Namespaces
system name, theme, domain
System Name
- 시스템 명(System name) : comet- or orbit- 같은 시스템 이름. 5자 이하와 같은 짧은 시스템 이름은 일반적으로 잘 작동합니다. 그렇지 않으면 ...
- 시스템 약어(System acronym) : slds-(Salesforce Lightning Design System용) 또는 mds-(Morningstar Design System용)와 같은 긴 이름의 약어입니다.
결과적으로 esds로 네임스페이스가 지정된 공통 토큰은
팀이 생성하는 변수와 구별되고 상대적으로 추적하기 쉬운
$esds-color-text-primary 및 $esds-font-family-serif로 개발자에게 보여집니다.
Theme
// General tokens to alias thematic colors to many contexts
$aads-ocean-color-primary
$aads-sands-color-primary
$aads-sunset-color-secondary
// Specific token overrides and extensions
$aads-ocean-color-heading-text-1
$aads-sands-color-heading-text-1
$aads-mountain-color-alert-background-success
$aads-color-text-primary
= $aads-ocean-color-primary;
$aads-color-forms-text-metadata
= $aads-ocean-color-primary;
$aads-color-background-secondary-on-dark
= $aads-ocean-color-primary;
Domain
예를 들어, marquees, 카드 타일 시스템 및 기타 판촉 컴포넌트를 구축하는 consumer 그룹은
새로운 토큰을 광범위하게 만들 수 있습니다.
이로 인해 다음과 같은 consumer 네임스페이스에 토큰이 생성될 수 있습니다.
$esds-consumer-color-marquee-text-primary
$esds-consumer-color-promo-clearance
$esds-consumer-font-family-marquee
$esds-consumer-space-tiles-inset-2-x
Lessons Learned
Completeness
// Good
$esds-shape-tile-corner-radius
$esds-shape-tile-shadow-offset
// Bad, redundant
$esds-shape-tile-corner-radius-default-on-light
$esds-shape-tile-corner-radius-default-on-dark
$esds-shape-tile-shadow-offset-default-on-light
$esds-shape-tile-shadow-offset-default-on-dark
Order
내 프로젝트 및 기타 공개 컬렉션에 걸쳐 토큰을 검토할 때 입증된 것처럼 일반적인 토큰 수준 순서는 없습니다.
따라서 다음은 안정적으로 유지되는 것을 확인한 몇 가지 패턴입니다.
- Base 레벨은(category, property, concept) 가운데 위치하는 중추입니다.
- Base 내부 레벨 순서는 계층적 엄격성 (color-interactive-background), 가독성(interactive-background-color), 카테고리와 프로퍼티 수준을 쌍으로 나란히 위치하느냐에 따라 다릅니다. (color-background-interactive).
- Namespaces (system, theme, domain)은 처음에 위치합니다.
- Modifiers (variant, state, scale, mode) 는 마지막에 위치하는 경향이 있습니다.
- Modifier 내부 레벨의 순서는 일관적이지 않습니다. mode는 조건부로 마지막에 오는 경향이 있긴 합니다. (주로 on이 앞에 붙어있고, 색상 관련한 모드이면서, 그때도 몇몇 이유가 있을 때이긴 하지만...)
- Order within modifiers isn’t consistent, although mode is often last (given its framing of “on” and use limited to only color and, even then, only when there’s a distinction).
- Modifier 내부 레벨의 순서는 일관적이지 않습니다. mode는 조건부로 마지막에 오는 경향이 있긴 합니다. (주로 on이 앞에 붙어있고, 색상 관련한 모드이면서, 그때도 몇몇 이유가 있을 때이긴 하지만...)
- Object 레벨의 순서는 (component group, component, and nested element) 네임스페이스에 종속되며 선행할 수 있는 컨텍스트를 설정합니다.
- 따라서 네임스페이스 뒤, Base, Modifiers 앞에 나옵니다.
여기에 제시한 레벨 순서는 유일한 옵션은 아닙니다.
시스템의 레벨 순서는 사용하는 레벨, 시스템에 필요한 것, 각 팀원의 취향에 따라 다릅니다.
Polyhierarchy
이 의도적인 결정을 어느 수준에서 저장합니까?
동일한 결정을 두 개의 다른 위치에 저장해도 됩니까?
두 가지 다른 선택의 목적이 거의 동일한데 토큰을 하나로 합쳐야 할까요?
$ui-controls-color-text-error = $color-feedback-error
(= $color-red-36)
(= #B90000)
이것은 또한 ui-controls-color-text-error red가
color-feedback-error의 다른 용도에 영향을 미치지 않으면서도 나중에 조정될 수 있는 가능성에 대비합니다.
'FrontEnd' 카테고리의 다른 글
Vue3 Reactivity In Depth (뷰3의 반응성 원리 이해하기) (0) | 2022.10.06 |
---|---|
RxJS와 반응형 프로그래밍 (0) | 2022.10.06 |
Vue.js 내부 들여다보기[Demystifying Vue.js internals] (0) | 2022.10.05 |
자바스크립트 참조에 관한 시각적 가이드 [aka 자바스크립트 포인터] (0) | 2022.10.03 |
[React hooks] 리액트 훅의 원리 : 단지 배열일 뿐 (0) | 2022.10.03 |