Properties · Content
Label과 그 앞에 붙는 Prefix를 조합합니다. Label이 없으면 Icon only가 됩니다.
Label
Prefix + Label
Icon only
Label 없이 Leading element만 두며 정사각 폭을 사용합니다.
짧은 Label로 값 하나를 표시하고, 쓰임에 따라 전체를 눌러 상태를 바꾸거나 개별로 지웁니다.
선택한 값이나 필터 항목을 한 줄 Container로 표시하는 컴포넌트입니다.
Size와 Shape, 상태, 내부 요소를 조합해 확인합니다.
전체를 누르는 Chip과 Remove button은 함께 둘 수 없습니다. Container 전체가 Button인데 안에 또 Button을 두면 어느 것을 눌렀는지 알 수 없습니다.
Chip을 구성하는 실제 요소와 문서에서 사용하는 명칭입니다.
Basic anatomy
Extended anatomy
Chip
├─ Leading element (Optional)
├─ Prefix (Optional)
├─ Label
├─ Trailing element (Optional)
└─ Remove button (Optional)한 줄 Form control이 공유하는 공통 Control Height를 그대로 사용합니다. 각 카드에 Label이 있는 경우와 Icon only를 함께 둡니다.
XSmall · 28px
Small · 32px
Regular · 36px · Default
Large · 40px
XLarge · 48px
공통 모양 어휘 중 Circle과 Rounded를 제공합니다.
Circle · Default
Rounded
Active 여부를 확인합니다. Hover, Pressed와 Focus 피드백은 각 카드에서 실제로 확인할 수 있습니다.
Default
Active
선택 배경이 Hover와 Pressed 하이라이트보다 우선합니다.
Label과 그 앞에 붙는 Prefix를 조합합니다. Label이 없으면 Icon only가 됩니다.
Label
Prefix + Label
Icon only
Label 없이 Leading element만 두며 정사각 폭을 사용합니다.
Label 앞뒤에 놓이는 선택 요소입니다. Chip에서는 Icon만 둡니다.
Leading element
Trailing element
Leading + Trailing
전체를 누르는 Chip과 Remove button을 가진 Chip은 함께 만들지 않습니다.
Clickable
Container 전체가 Button이며 누르면 Active가 바뀝니다.
Remove button
Chip 자체를 삭제합니다. Trailing element와 별개 요소입니다.
Chip을 쓰임마다 어떻게 조합하는지 정리합니다.
어느 쓰임으로 쓰든 지켜야 하는 규칙입니다.
콘텐츠를 감싸는 너비
담을 폭을 넘는 값
Circle · 기본
Rounded · Selection
Do
누르면 바로 끝나는 동작이므로 아이콘만으로 읽힙니다.
Don’t
Remove button과 함께 쓰지 않습니다.
쓰임마다 사용하는 동작이 갈립니다. onClick과 onRemove는 타입으로 갈라 함께 넘길 수 없으므로, 어느 쓰임인지 먼저 정한 뒤 요소를 조합합니다.
| 쓰임 | 모양 | 누르는 동작 | 개별 제거 | Active |
|---|---|---|---|---|
| Filter | circle | 조건을 켜고 끄거나 선택 화면을 엽니다 | 두지 않습니다. 초기화가 담당합니다 | 사용합니다 |
| Selection | rounded | 값을 고르고 해제합니다 | 두지 않습니다 | 사용합니다 |
| Suggestion | circle | 누르면 값이 채워집니다 | 두지 않습니다 | 사용하지 않습니다 |
| Input | circle | 두지 않습니다 | Remove button을 사용합니다 | 사용하지 않습니다 |
| 정보 표시 | circle | 두지 않습니다 | 두지 않습니다 | 사용하지 않습니다 |
콘텐츠 목록에서 조건의 적용 및 해제를 제어하는 Filter 역할로 사용할 때는 Filter Bar를 사용합니다.
Filter bar
짧은 키워드 여러 개를 나열해 그중 하나 이상을 고르는 자리입니다.
키워드 선택
rounded를 쓰는 것은 Selection뿐이며 Input, Select, Number Input과 같은 8px 모서리를 씁니다.onClick 하나로 켜고 끄며 Remove button은 두지 않습니다.사용자에게 다음 입력을 제안하는 자리입니다. 검색어 추천과 채팅방 안의 답변 추천이 여기에 해당합니다.
검색어 추천
고른 값을 계속 보여 주고 개별로 지우는 자리입니다.
선택 결과
여러 값을 나열해 각 값이 구분되어 읽히게 하는 자리입니다. 리뷰 관리 화면에서 사용자가 주문한 메뉴를 보여 주는 경우가 여기에 해당합니다.
주문 메뉴
주문 메뉴
onClick도 onRemove도 주지 않습니다. 읽는 것이 전부입니다.현재 구현에서 확인되는 Property와 허용 값입니다.
| Property | Values | Default | Status |
|---|---|---|---|
| controlSize | xsmall | small | regular | large | xlarge | regular | Draft |
| shape | circle | rounded | circle | Draft |
| active | boolean | false | Draft |
| children | string | undefined | Label |
| prefix | string | undefined | Draft |
| leadingElement / trailingElement | ReactNode | undefined | Icon only |
| leadingTone / trailingTone | secondary | tertiary | secondary | Draft |
| onClick | () => void | undefined | onRemove와 배타 |
| onRemove / removeLabel | () => void / string | undefined | onClick과 배타 |
| ariaLabel | string | undefined | Icon only에서 필수 |
packages/ui/src/chip.tsx
선택한 값이나 필터 항목을 한 줄 Container로 표시한다.
Extended anatomy는 선택 요소를 표시한다.
내부 순서는 Leading element → Prefix → Label → Trailing element → Remove button이다. Leading element와 Trailing element에는 Icon만 둔다.
controlSize: compact | xsmall | small | regular | large | xlarge, 기본값 regular. compact를 뺀 나머지의 높이는 interaction.md의 「공통 Control Height」를 따른다. 그 다섯 단계는 Input·Select·Combobox가 제공하는 넷에 Suggestion용 XSmall 28px을 더한 것이다. Selection이 폼 요소와 같은 페이지에서, 때로는 같은 Field 안에서 쓰이므로 폼 요소의 단계를 모두 가져야 나란히 놓았을 때 높이를 맞출 수 있다. 공통 scale의 XXSmall 24px과 XXLarge 56px은 폼 요소도 갖지 않으므로 제공하지 않는다compact는 컨트롤 높이 scale을 따르지 않는 20px이며 interaction.md의 「Compact」가 소유한다. 컨트롤 줄에 끼지 않고 글자 옆에 붙는 자리에만 쓴다. 필터 패널에서 축 이름 옆에 조건이 몇 개 걸렸는지 알리며 그 축만 지우는 Chip이 이 크기를 쓰는 자리다. 이때 Label에 담기는 것은 값이 아니라 개수다shape: circle | rounded, 기본값 circle. vocabulary.md의 공통 모양 어휘를 사용하며 rounded는 interaction.md의 「공통 Control Radius」를 따른다active: boolean, 기본값 falsechildren: Label 문자열. 없으면 Icon only이며 높이와 같은 정사각 폭을 사용한다prefix: Label 앞에 붙는 짧은 문자열. Label이 없는 Icon only에서는 함께 넘겨도 그리지 않는다. 정사각 폭에 글자가 들어갈 자리가 없기 때문이다leadingElement, trailingElement: ReactNodeleadingTone, trailingTone: secondary | tertiary, 기본값 secondaryonClick: Container 전체를 누르는 동작onRemove, removeLabel, removeTooltip: Chip 자체를 삭제하는 Remove buttonariaLabel: Icon only에서 필수이며, Label이 있는 Chip에서는 그 Label을 담은 이름만 받는다. 규칙은 아래 Guidelines의 「Label을 담은 이름만 보태기」에 있다Style variant는 제공하지 않는다. 고르지 않은 Chip은 Neutral border와 기본 surface를, 고른 Chip은 어두운 Neutral surface를 사용하며 화면이 그 색을 고르지 않는다.
onClick과 onRemove는 타입으로 갈라 함께 넘길 수 없다. Container 전체가 Button인데 안에 또 Button을 두면 어느 것을 눌렀는지 알 수 없다.
oe-background-bold-primary 배경을 채우며, Label과 아이콘은 oe-foreground-inverse, Prefix는 oe-foreground-inverse-secondary를 사용한다. Button의 뉴트럴 fill이 neutral-600인 것과 달리 한참 진한 단계를 쓰는 것은, 고른 Chip이 뉴트럴 Button과 같은 모양으로 보이면 누르면 실행되는 자리인지 골라지는 자리인지 화면에서 갈리지 않기 때문이다.oe-foreground-inverse-secondary에서 oe-foreground-inverse로 올린다. 뉴트럴 Hover 층이 Black alpha라 어두운 surface 위에서는 보이지 않으며, 밝은 alpha 층은 현재 token이 없다.text-oe-label token의 13px/16px로 줄이고 굵기도 font-normal로 한 단계 내린다. 나머지 단계는 다른 컨트롤과 같은 14px과 font-medium을 사용한다. 28px 상자에 14px 글자를 그대로 담으면 위아래 여유가 남지 않는다. 아이콘도 같은 이유로 XSmall에서만 12px을 사용하고 Small 이상은 16px 또는 20px을 사용한다.secondary가 Label과 같은 위계, tertiary가 한 단계 옅은 위계다. Active에서도 같은 관계를 inverse 계열 안에서 유지한다.rounded는 interaction.md의 「공통 Control Radius」를 따른다. Chip이 공통 Control Height를 따르고 같은 페이지에서, 때로는 같은 Field 안에서 다른 컨트롤과 함께 놓이기 때문이다.removeLabel, 보이는 문구는 removeTooltip이 소유한다.Studio 화면의 Guidelines와 소제목을 동일하게 유지한다.
고른 Chip은 어두운 Neutral로 채우며 화면이 그 색을 바꾸지 않는다. brand를 옅게 까는 채움을 함께 두고 화면이 고르게 했었으나, 그러면 같은 「고른 값」이 화면마다 다른 색으로 보인다. 근거는 interaction.md의 「선택 상태와 Hover·Pressed」이며, 그 절이 면을 칠해 선택을 알리는 요소에 brand를 쓰지 않도록 정한다.
Chip이 작은 면이라 선이 아니라 채움으로 알리는 이유도 같은 절에 있다. 선 색만 진해져서는 고르지 않은 Chip과 갈리지 않는다.
circle이 기본이며 rounded는 Selection에서만 사용한다. Selection이 폼 요소와 나란히 놓이는 유일한 쓰임이므로 그 자리에서만 모서리를 맞출 이유가 있다.ariaLabel로 이름을 보탤 수 있지만, 그 이름은 화면에 보이는 Label을 그대로 포함해야 한다. 「2」를 「조건 지우기」로 바꿔 부르면 화면을 보며 말하는 사람과 듣는 사람이 같은 것을 가리키지 못한다. Label을 담지 않은 이름은 붙지 않으며 개발 중에 경고한다.onClick과 onRemove는 타입으로 갈라 함께 넘길 수 없으므로, 어느 쓰임인지 먼저 정한 뒤 요소를 조합한다.
| 쓰임 | 모양 | 누르는 동작 | 개별 제거 | Active |
|---|---|---|---|---|
| Filter | circle |
조건을 켜고 끄거나 선택 화면을 연다 | 두지 않는다. 초기화가 담당한다 | 사용한다 |
| Selection | rounded |
값을 고른다. 여러 개를 고르는 자리는 다시 눌러 해제하고, 하나만 고르는 자리는 해제하지 않는다 | 두지 않는다 | 사용한다 |
| Suggestion | circle |
누르면 값이 채워진다 | 두지 않는다 | 사용하지 않는다 |
| Input | circle |
두지 않는다 | Remove button을 사용한다 | 사용하지 않는다 |
| 정보 표시 | circle |
두지 않는다 | 두지 않는다 | 사용하지 않는다 |
콘텐츠 목록에서 조건의 적용 및 해제를 제어하는 Filter 역할로 사용할 때는 Filter Bar를 사용한다.
짧은 키워드 여러 개를 나열해 그중 하나 이상을 고르는 자리다.
rounded를 쓰는 것은 Selection뿐이다. Input, Select, Number Input과 같은 페이지에서 값을 고르는 자리이며 Field에서 다루기도 하므로, 나란히 놓였을 때 모서리가 갈리지 않아야 한다. 값은 interaction.md의 「공통 Control Radius」가 소유한다.onClick 하나로 켜고 끄며 Remove button은 두지 않는다.사용자에게 다음 입력을 제안하는 자리다. 검색어 추천과 채팅방 안의 답변 추천이 여기에 해당한다.
고른 값을 계속 보여 주고 개별로 지우는 자리다.
여러 값을 나열해 각 값이 구분되어 읽히게 하는 자리다. 리뷰 관리 화면에서 사용자가 주문한 메뉴를 보여 주는 경우가 여기에 해당한다.
onClick도 onRemove도 주지 않는다. 누를 수도 지울 수도 없으며 읽는 것이 전부다.