@highpixel-co/palda-design-system 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -2
- package/dist/guide/LICENSE +21 -0
- package/dist/guide/NOTICE +29 -0
- package/dist/guide/README.md +57 -0
- package/dist/guide/catalog/components.yml +272 -0
- package/dist/guide/catalog/drafts.yml +333 -0
- package/dist/guide/catalog/icons.yml +309 -0
- package/dist/guide/catalog/patterns.yml +124 -0
- package/dist/guide/catalog/tokens.yml +14 -0
- package/dist/guide/docs/ACCESSIBILITY.md +10 -0
- package/dist/guide/docs/AI_UI_DESIGNER_HANDOFF.md +256 -0
- package/dist/guide/docs/COMPONENT_POLICY.md +105 -0
- package/dist/guide/docs/CONSUMER_GUIDE.md +131 -0
- package/dist/guide/docs/CONTENT.md +148 -0
- package/dist/guide/docs/DESIGN_GRAMMAR.md +378 -0
- package/dist/guide/docs/DESIGN_PRINCIPLES.md +254 -0
- package/dist/guide/docs/FIGMA_ALIGNMENT_DELTA.md +141 -0
- package/dist/guide/docs/FIGMA_NAME_MAPPING.md +84 -0
- package/dist/guide/docs/FIGMA_WORKFLOW.md +33 -0
- package/dist/guide/docs/ICON_POLICY.md +175 -0
- package/dist/guide/docs/LAYOUT.md +221 -0
- package/dist/guide/docs/PATTERN_POLICY.md +13 -0
- package/dist/guide/docs/TOKEN_POLICY.md +255 -0
- package/dist/guide/icons/manifest.json +572 -0
- package/dist/harness/check.mjs +330 -0
- package/dist/harness/cli.mjs +88 -0
- package/dist/harness/metadata.json +1323 -0
- package/dist/scripts/check-examples.mjs +444 -0
- package/package.json +13 -2
package/README.md
CHANGED
|
@@ -8,8 +8,8 @@ npm 패키지입니다.
|
|
|
8
8
|
계정이나 읽기 토큰 없이 설치할 수 있습니다.
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
|
-
npm install @highpixel-co/palda-design-system
|
|
12
|
-
# pnpm 프로젝트: pnpm add @highpixel-co/palda-design-system
|
|
11
|
+
npm install --save-exact @highpixel-co/palda-design-system
|
|
12
|
+
# pnpm 프로젝트: pnpm add --save-exact @highpixel-co/palda-design-system
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
## 사용
|
|
@@ -31,6 +31,25 @@ import { Button } from '@highpixel-co/palda-design-system/ui';
|
|
|
31
31
|
|
|
32
32
|
루트 경로에서는 아이콘, UI와 패턴을 함께 내보냅니다. JS 토큰은 `/tokens`에서만 가져옵니다.
|
|
33
33
|
|
|
34
|
+
## 설명서와 앱 검사
|
|
35
|
+
|
|
36
|
+
이 패키지는 같은 버전의 사용 문서·catalog·앱용 하네스를 함께 포함합니다. 별도의 DS clone은
|
|
37
|
+
필요하지 않습니다. Node.js 22.12 이상에서 실행합니다.
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pnpm exec palda-ds guide
|
|
41
|
+
pnpm exec palda-ds check
|
|
42
|
+
pnpm exec palda-ds screens # HTML 화면 시안이 있는 프로젝트
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
npm은 `npm exec -- palda-ds check`로 실행합니다. [사용 설명서](./dist/guide/docs/CONSUMER_GUIDE.md)에
|
|
46
|
+
검사 범위, 경로 설정, 기존 코드 예외, AI 작업 규칙과 CI 연결 방법이 있습니다. `guide` 명령은
|
|
47
|
+
설치된 설명서의 파일 경로를 출력합니다. 기계가 읽는 export·자산 상태 목록은 `/catalog`에 있습니다.
|
|
48
|
+
|
|
49
|
+
앱은 DS 버전을 정확히 고정하고 package.json과 잠금 파일을 함께 갱신합니다. 앱의 기존 전체
|
|
50
|
+
검사와 CI에 `palda-ds check`를 한 번 연결합니다. 작업 중 검사 시점은 AI가 판단하고, 제출 전에는
|
|
51
|
+
전체 검사를 수행합니다. GitHub에서 검사 통과를 병합 조건으로 지정하는 것은 관리자 설정입니다.
|
|
52
|
+
|
|
34
53
|
## 릴리스
|
|
35
54
|
|
|
36
55
|
내부 `@palda/tokens`, `@palda/icons`, `@palda/ui`, `@palda/patterns` workspace는 개별 배포하지
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 highpixel Co., Ltd.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
Palda Design System
|
|
2
|
+
Copyright (c) 2026 highpixel Co., Ltd.
|
|
3
|
+
|
|
4
|
+
이 저장소는 MIT 라이선스로 배포한다. 전문은 `LICENSE`에 있다.
|
|
5
|
+
|
|
6
|
+
## 상표
|
|
7
|
+
|
|
8
|
+
"Palda", "팔다", "highpixel"의 이름과 로고, 그 밖의 브랜드 표지는 highpixel Co., Ltd.의
|
|
9
|
+
상표다. MIT 라이선스는 이 상표를 사용할 권리를 부여하지 않는다. 이 저장소에서 파생한 결과물이
|
|
10
|
+
highpixel의 제품이거나 highpixel이 보증한다는 인상을 주는 방식으로 브랜드 표지를 쓰지 않는다.
|
|
11
|
+
|
|
12
|
+
그래서 로고 원본은 이 저장소에 담지 않는다. `assets/logos/`는 비어 있고 `.gitignore`가
|
|
13
|
+
막는다. MIT로 배포되는 자리에 상표를 두면 두 규칙이 서로 반대말을 하기 때문이다
|
|
14
|
+
(`docs/decisions/0028`).
|
|
15
|
+
|
|
16
|
+
## 서드파티
|
|
17
|
+
|
|
18
|
+
### Lucide (ISC)
|
|
19
|
+
|
|
20
|
+
`icons/svg/`의 아이콘 일부는 Lucide(https://lucide.dev)의 path 데이터를 Palda 아이콘 규격으로
|
|
21
|
+
변환한 것이다. 아이콘마다의 출처는 `icons/manifest.json`의 `origin`에 있고, 세트별 목록과
|
|
22
|
+
라이선스 전문은 거기서 생성되는 `icons/NOTICE`에 있다 (`docs/decisions/0027`). npm으로 배포하는
|
|
23
|
+
파일의 `NOTICE`에도 이 전문을 함께 넣는다.
|
|
24
|
+
|
|
25
|
+
### Pretendard (SIL Open Font License 1.1)
|
|
26
|
+
|
|
27
|
+
기본 서체는 Pretendard(https://github.com/orioncactus/pretendard)를 CSS에서 이름으로만
|
|
28
|
+
참조하며, 이 저장소는 폰트 파일을 포함하거나 배포하지 않는다. 폰트 파일을 함께 배포하려면
|
|
29
|
+
OFL 1.1 전문을 동봉해야 한다.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Palda Design System
|
|
2
|
+
|
|
3
|
+
Palda의 디자인 원칙, 토큰, 컴포넌트, 아이콘, 패턴을 관리하는 단일 원본(SSOT)입니다.
|
|
4
|
+
|
|
5
|
+
## 시작하기
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm install
|
|
9
|
+
pnpm storybook
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 제품에서 사용하기
|
|
13
|
+
|
|
14
|
+
공개 npm 패키지 하나만 설치합니다. 계정이나 읽기 토큰은 필요하지 않습니다.
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install --save-exact @highpixel-co/palda-design-system
|
|
18
|
+
# pnpm 프로젝트: pnpm add --save-exact @highpixel-co/palda-design-system
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
예전에 이 패키지를 GitHub Packages에서 설치했다면 `npm config get
|
|
22
|
+
@highpixel-co:registry`로 사용자 설정을 확인합니다. 결과가 `https://npm.pkg.github.com`이고 같은
|
|
23
|
+
scope의 다른 비공개 패키지를 쓰지 않는다면 `npm config delete @highpixel-co:registry
|
|
24
|
+
--location=user`로 예전 설정을 지운 뒤 다시 설치합니다.
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import '@highpixel-co/palda-design-system/styles.css';
|
|
28
|
+
|
|
29
|
+
import { SearchIcon } from '@highpixel-co/palda-design-system/icons';
|
|
30
|
+
import { EmptyState } from '@highpixel-co/palda-design-system/patterns';
|
|
31
|
+
import { SemanticSpaceGapLg } from '@highpixel-co/palda-design-system/tokens';
|
|
32
|
+
import { Button } from '@highpixel-co/palda-design-system/ui';
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`styles.css`를 함께 불러오지 않으면 토큰이 없어 색이 나오지 않습니다.
|
|
36
|
+
|
|
37
|
+
`tokens/`, `icons/`, `components/`, `patterns/`는 저장소 내부 모듈이며 개별 배포하지 않습니다.
|
|
38
|
+
배포와 소비 설정은 [`packages/palda-design-system/README.md`](https://github.com/highpixel-co/palda-design-system/blob/0504d8eaa033955d7a70414616ee999e447a0ced/packages/palda-design-system/README.md)를
|
|
39
|
+
따릅니다.
|
|
40
|
+
|
|
41
|
+
- 디자이너: [`docs/REPOSITORY_GUIDE.md`](https://github.com/highpixel-co/palda-design-system/blob/0504d8eaa033955d7a70414616ee999e447a0ced/docs/REPOSITORY_GUIDE.md)부터 읽습니다.
|
|
42
|
+
- 디자인 원칙: [`docs/DESIGN_PRINCIPLES.md`](docs/DESIGN_PRINCIPLES.md)
|
|
43
|
+
- Figma 운영: [`docs/FIGMA_WORKFLOW.md`](docs/FIGMA_WORKFLOW.md)
|
|
44
|
+
- 기여 절차: [`docs/CONTRIBUTING.md`](https://github.com/highpixel-co/palda-design-system/blob/0504d8eaa033955d7a70414616ee999e447a0ced/docs/CONTRIBUTING.md)
|
|
45
|
+
|
|
46
|
+
현재 토큰과 컴포넌트 값은 구조를 보여주기 위한 예시이며, 디자이너 검토 후 확정해야 합니다.
|
|
47
|
+
|
|
48
|
+
## 라이선스
|
|
49
|
+
|
|
50
|
+
MIT 라이선스로 배포합니다. 전문은 [`LICENSE`](LICENSE)에 있습니다.
|
|
51
|
+
|
|
52
|
+
"Palda", "팔다", "highpixel"의 이름과 로고는 highpixel Co., Ltd.의 상표입니다. MIT
|
|
53
|
+
라이선스는 이 상표를 사용할 권리를 부여하지 않습니다.
|
|
54
|
+
|
|
55
|
+
포함된 서드파티 저작물과 상표 조건은 [`NOTICE`](NOTICE)를 따릅니다.
|
|
56
|
+
|
|
57
|
+
Copyright (c) 2026 highpixel Co., Ltd.
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
alert:
|
|
2
|
+
status: draft
|
|
3
|
+
source: components/src/Alert/Alert.tsx
|
|
4
|
+
story: components/src/Alert/Alert.stories.tsx
|
|
5
|
+
figma: TODO
|
|
6
|
+
use_for:
|
|
7
|
+
- 화면에 남아 있는 안내·경고·오류 배너
|
|
8
|
+
- 안내와 함께 이어서 할 액션을 하나 내놓기 (action 슬롯)
|
|
9
|
+
avoid_for:
|
|
10
|
+
- 잠깐 떴다 사라지는 알림 (Toast를 쓴다)
|
|
11
|
+
- 흐름을 끊고 확인·결정을 받는 것 (Modal을 쓴다)
|
|
12
|
+
- 입력 필드 하나의 오류 (TextField의 error를 쓴다)
|
|
13
|
+
- 섹션 단위 오류 (FormSection을 쓴다)
|
|
14
|
+
- 행 하나의 실패 (그 행의 Badge를 쓴다 — 0024)
|
|
15
|
+
variant:
|
|
16
|
+
neutral: 분류 없는 안내. 기본값이다
|
|
17
|
+
accent: 이어서 할 일이 있는 안내
|
|
18
|
+
warning: 되돌릴 수 있는 주의 상황
|
|
19
|
+
danger: 오류와 실패
|
|
20
|
+
note: >-
|
|
21
|
+
role은 prop이 아니라 variant에서 파생한다(0004) — danger만 role="alert"이고 나머지는
|
|
22
|
+
role="status"다. 색은 제목과 아이콘이 내고 본문은 text/primary다. 여러 줄로 읽는 문장이라
|
|
23
|
+
틴트 배경 위 글자를 text/{family}로 두는 Badge와 갈린다. 보더를 주지 않는다(0011).
|
|
24
|
+
planned: >-
|
|
25
|
+
시안 없이 만든 초안. 파랑 계열 primitive가 없어 info variant가 없고, 명세의 파란 배너는
|
|
26
|
+
neutral로 받는다. 닫기 버튼은 두지 않았다 — 닫는 배너가 쓰이는 자리가 아직 없다.
|
|
27
|
+
|
|
28
|
+
badge:
|
|
29
|
+
status: stable
|
|
30
|
+
source: components/src/Badge/Badge.tsx
|
|
31
|
+
story: components/src/Badge/Badge.stories.tsx
|
|
32
|
+
figma: TODO
|
|
33
|
+
use_for:
|
|
34
|
+
- 항목의 상태나 분류를 읽기 전용으로 표시
|
|
35
|
+
- 목록·카드에 덧붙이는 짧은 라벨
|
|
36
|
+
avoid_for:
|
|
37
|
+
- 누르는 동작. 배지는 누를 수 없다 (Chip이나 Button을 쓴다)
|
|
38
|
+
- 상태에 따라 달라지는 표시 (hover·focus·disabled가 없다)
|
|
39
|
+
|
|
40
|
+
button:
|
|
41
|
+
status: stable
|
|
42
|
+
source: components/src/Button/Button.tsx
|
|
43
|
+
story: components/src/Button/Button.stories.tsx
|
|
44
|
+
figma: TODO
|
|
45
|
+
use_for:
|
|
46
|
+
- 주요 액션
|
|
47
|
+
- 폼 제출
|
|
48
|
+
avoid_for:
|
|
49
|
+
- 아이콘만 남는 액션 (IconButton을 쓴다)
|
|
50
|
+
- 처리 중 표시 (loading prop이 없다. disabled로 표현한다)
|
|
51
|
+
variant:
|
|
52
|
+
primary: 화면에서 가장 중요한 액션. 기본값이다
|
|
53
|
+
accent: 브랜드 포인트를 주는 강조 액션
|
|
54
|
+
secondary: 눈에 띄어야 하는 보조 액션
|
|
55
|
+
outline: 주 액션 옆에 놓는 보조 액션. 취소·뒤로
|
|
56
|
+
subtle: 최소 강조. 인라인과 툴바
|
|
57
|
+
|
|
58
|
+
checkbox:
|
|
59
|
+
status: draft
|
|
60
|
+
source: components/src/Checkbox/Checkbox.tsx
|
|
61
|
+
story: components/src/Checkbox/Checkbox.stories.tsx
|
|
62
|
+
figma: TODO
|
|
63
|
+
use_for:
|
|
64
|
+
- 여러 개를 동시에 켜고 끄는 폼 입력
|
|
65
|
+
- 약관 동의처럼 하나를 켜고 끄는 폼 입력
|
|
66
|
+
avoid_for:
|
|
67
|
+
- 상호 배타적인 단일 선택 (Radio를 쓴다)
|
|
68
|
+
- 저장 없이 즉시 반영되는 설정 켜기·끄기 (Switch를 쓴다)
|
|
69
|
+
- 목록을 좁히는 필터 토글 (Chip을 쓴다)
|
|
70
|
+
note: 라벨을 넘기지 않으면 접근 가능한 이름을 `aria-label`로 준다. 히트 영역은 `<label>` 전체라 라벨을 눌러도 켜진다. 체크 표시는 아이콘 세트를 쓰지 않고 컨트롤이 직접 그린다 — `check` 아이콘의 `avoidFor`에 "체크박스 컨트롤"이 있다.
|
|
71
|
+
planned: 상자 보더 1.5px은 시안 값이라 그대로 뒀다 (시스템 보더 1px 규칙의 예외, 2026-08-05 확정). disabled + checked의 체크 표시는 시안대로 흰색(`primary/subtle`)이다. 밝은 배경 규칙(`state/disabled`)을 그대로 따르면 채움과 같은 색이라 체크가 사라지고, 지금 값은 채움 위 대비가 1.1:1이라 흐리게 보인다. 시안에 hover가 없어 hover 채움은 두지 않았다(2026-08-05 확정). 부분 선택(indeterminate)은 시안에 없어서 없다.
|
|
72
|
+
|
|
73
|
+
chip:
|
|
74
|
+
status: stable
|
|
75
|
+
source: components/src/Chip/Chip.tsx
|
|
76
|
+
story: components/src/Chip/Chip.stories.tsx
|
|
77
|
+
figma: TODO
|
|
78
|
+
use_for:
|
|
79
|
+
- 목록을 좁히는 필터 토글
|
|
80
|
+
- 여러 개를 켜고 끄는 선택지 모음
|
|
81
|
+
avoid_for:
|
|
82
|
+
- 읽기 전용 분류 표시 (Badge를 쓴다)
|
|
83
|
+
- 상호 배타적인 단일 선택 (Radio를 쓴다)
|
|
84
|
+
note: 선택 상태는 색만으로 전달하지 않도록 `aria-pressed`로 함께 노출한다. 아이콘은 라벨 뒤에 온다.
|
|
85
|
+
|
|
86
|
+
dropdown-button:
|
|
87
|
+
status: draft
|
|
88
|
+
source: components/src/DropdownButton/DropdownButton.tsx
|
|
89
|
+
story: components/src/DropdownButton/DropdownButton.stories.tsx
|
|
90
|
+
figma: TODO
|
|
91
|
+
use_for:
|
|
92
|
+
- 버튼 하나에 묶이는 여러 액션
|
|
93
|
+
- 목록의 정렬·보기 방식 바꾸기
|
|
94
|
+
- 라디오를 펼쳐 놓을 자리가 없는 단일 선택
|
|
95
|
+
avoid_for:
|
|
96
|
+
- 액션이 하나뿐일 때 (Button을 쓴다)
|
|
97
|
+
variant:
|
|
98
|
+
outline: 테두리가 있는 기본 트리거
|
|
99
|
+
subtle: 테두리 없는 저강도 트리거. 툴바와 인라인
|
|
100
|
+
note: 트리거는 시안 확정. 메뉴 패널·align·chevron 아이콘은 확정 전이다.
|
|
101
|
+
planned: 다중 선택은 아직 없다. 들일 때 선택된 항목은 체크 아이콘(`CheckIcon`)으로 표시한다(2026-07-31 확정). 아이콘은 2026-07-31에 추가했다. 남은 것은 `DropdownButtonItem`에 선택 상태를 어떻게 두고 `onSelect`가 무엇을 돌려줄지 정하는 것이며, 공개 API가 바뀌므로 결정 기록을 함께 남긴다.
|
|
102
|
+
|
|
103
|
+
icon-button:
|
|
104
|
+
status: stable
|
|
105
|
+
source: components/src/IconButton/IconButton.tsx
|
|
106
|
+
story: components/src/IconButton/IconButton.stories.tsx
|
|
107
|
+
figma: TODO
|
|
108
|
+
use_for:
|
|
109
|
+
- 아이콘만으로 뜻이 통하는 액션
|
|
110
|
+
- 툴바·입력 안쪽처럼 라벨을 놓을 자리가 없는 액션
|
|
111
|
+
avoid_for:
|
|
112
|
+
- 라벨을 놓을 자리가 있는 액션 (Button을 쓴다)
|
|
113
|
+
note: variant 다섯 종의 뜻은 Button과 같다. 접근 가능한 이름은 `label`로 주며 필수다.
|
|
114
|
+
|
|
115
|
+
link:
|
|
116
|
+
status: draft
|
|
117
|
+
source: components/src/Link/Link.tsx
|
|
118
|
+
story: components/src/Link/Link.stories.tsx
|
|
119
|
+
figma: TODO
|
|
120
|
+
use_for:
|
|
121
|
+
- 눌러서 다른 주소로 이동하는 것. 문장 안 인라인과 보조 안내 줄에 쓴다
|
|
122
|
+
- 새 탭으로 여는 외부 문서 (external을 켠다)
|
|
123
|
+
avoid_for:
|
|
124
|
+
- 이동하지 않는 동작 (Button을 쓴다). 반대로 이동하는 것을 Button으로 대신하지도 않는다 —
|
|
125
|
+
새 탭·주소 복사·가운데 클릭이 전부 달라진다
|
|
126
|
+
- 화면의 주 액션 (Button을 쓴다)
|
|
127
|
+
note: >-
|
|
128
|
+
밑줄은 rest에서도 있다. 색만으로 링크임을 전하지 않는다(docs/ACCESSIBILITY.md).
|
|
129
|
+
variant는 primary(먹색)와 accent(보라) 둘이고, accent는 아껴 쓴다 — 한 화면에서 강조는
|
|
130
|
+
하나다. 읽은 링크는 text/primary-sub로 물러난다. 전용 visited 색 토큰은 없고, 두려면
|
|
131
|
+
새로 정해야 한다. 상태를 prop으로 갖지 않는다(0004) — hover·focus·visited는 전부 CSS다.
|
|
132
|
+
|
|
133
|
+
modal:
|
|
134
|
+
status: draft
|
|
135
|
+
source: components/src/Modal/Modal.tsx
|
|
136
|
+
story: components/src/Modal/Modal.stories.tsx
|
|
137
|
+
figma: TODO
|
|
138
|
+
use_for:
|
|
139
|
+
- 흐름을 멈추고 확인·결정을 받는 대화상자
|
|
140
|
+
- 본문 위에서 처리하는 짧은 작업
|
|
141
|
+
avoid_for:
|
|
142
|
+
- 흐름을 끊지 않아도 되는 알림 (Toast를 쓴다)
|
|
143
|
+
- 뒤 화면을 보면서 해야 하는 일 (인라인으로 펼친다)
|
|
144
|
+
- 필드가 여러 개인 편집 폼 (새 페이지로 연다)
|
|
145
|
+
- 모달 위에 다시 여는 것 (이중 모달은 금지다)
|
|
146
|
+
note: >-
|
|
147
|
+
시안은 카드 표면만 정의한다. 기본 폭 480px. 포커스 트랩과 스크롤 잠금은 접근성 요구라 시안
|
|
148
|
+
대상이 아니고 디자인 판단으로 뒤집지 않는다 — 4층이 흐름을 끊는다는 정의를 이 둘이 만든다.
|
|
149
|
+
스크림은 overlay/dim(70%)으로 두는 것을 2026-08-31에 확정했다. 시안에서 온 값은 아니지만
|
|
150
|
+
옅게 잡으면 모달 카드가 흰색인 것(0013)이 성립하지 않는다 — 근거는
|
|
151
|
+
docs/DESIGN_GRAMMAR.md §띄우나 마나에 있고, 그 문서가 언제 모달인지와 겹침 규칙의 정본이다.
|
|
152
|
+
|
|
153
|
+
navigation-button:
|
|
154
|
+
status: draft
|
|
155
|
+
source: components/src/NavigationButton/NavigationButton.tsx
|
|
156
|
+
story: components/src/NavigationButton/NavigationButton.stories.tsx
|
|
157
|
+
figma: TODO
|
|
158
|
+
use_for:
|
|
159
|
+
- 사이드바·내비게이션의 화면 이동 항목
|
|
160
|
+
- 지금 보고 있는 화면을 목록에서 표시하기
|
|
161
|
+
avoid_for:
|
|
162
|
+
- 화면을 옮기지 않는 액션 (Button을 쓴다)
|
|
163
|
+
- 목록을 좁히는 필터 토글 (Chip을 쓴다)
|
|
164
|
+
note: 현재 위치는 색만으로 전달하지 않도록 `aria-current="page"`로 함께 노출한다. 아이콘은 라벨 앞에 온다. 폭은 부모를 채우고 라벨은 넘치면 잘린다.
|
|
165
|
+
planned: 시안에 hover/pressed가 없어 default 위에 `state/hover-pressed` 채움만 얹는 것으로 정의했고 확정 전이다. 선택 안 된 항목의 텍스트는 시안대로 `text/disabled`라 흰 배경에서 대비가 2.3:1로 미달이다. `<a href>` 렌더는 두지 않았다.
|
|
166
|
+
|
|
167
|
+
progress-bar:
|
|
168
|
+
status: draft
|
|
169
|
+
source: components/src/ProgressBar/ProgressBar.tsx
|
|
170
|
+
story: components/src/ProgressBar/ProgressBar.stories.tsx
|
|
171
|
+
figma: TODO
|
|
172
|
+
use_for:
|
|
173
|
+
- 끝이 정해진 작업이 얼마나 찼는지 보여 주기
|
|
174
|
+
avoid_for:
|
|
175
|
+
- 얼마나 걸릴지 모르는 대기 (스피너를 쓴다)
|
|
176
|
+
- 단계 목록 자체를 보여 주기 (진행률은 값 하나다)
|
|
177
|
+
note: >-
|
|
178
|
+
막대만으로는 무엇의 진행률인지 알 수 없어 label이 필수다. 채움은 accent가 아니라 primary다 —
|
|
179
|
+
한 화면에 여럿 놓이고 강조가 아니라 값을 읽는 자리다. 0~100을 벗어난 값은 잘라서 그리고,
|
|
180
|
+
aria와 채움이 같은 값을 쓴다.
|
|
181
|
+
planned: >-
|
|
182
|
+
시안 없이 만든 초안. 높이 8px은 명세 실측값이고 대응 토큰이 없다. variant와 size를 두지
|
|
183
|
+
않았다 — 색으로 상태를 가르는 자리도, 다른 높이가 필요한 자리도 아직 없다.
|
|
184
|
+
|
|
185
|
+
radio:
|
|
186
|
+
status: stable
|
|
187
|
+
source: components/src/Radio/Radio.tsx
|
|
188
|
+
story: components/src/Radio/Radio.stories.tsx
|
|
189
|
+
figma: TODO
|
|
190
|
+
use_for:
|
|
191
|
+
- 상호 배타적인 선택지 하나 고르기
|
|
192
|
+
- 폼의 단일 선택 필드
|
|
193
|
+
avoid_for:
|
|
194
|
+
- 여러 개를 동시에 고르는 선택 (Chip을 쓴다)
|
|
195
|
+
- 즉시 반영되는 켜기·끄기 (Switch를 쓴다)
|
|
196
|
+
- 선택지를 펼쳐 놓을 자리가 좁을 때 (DropdownButton을 쓴다)
|
|
197
|
+
note: 라벨을 넘기지 않으면 접근 가능한 이름을 `aria-label`로 준다.
|
|
198
|
+
|
|
199
|
+
switch:
|
|
200
|
+
status: stable
|
|
201
|
+
source: components/src/Switch/Switch.tsx
|
|
202
|
+
story: components/src/Switch/Switch.stories.tsx
|
|
203
|
+
figma: TODO
|
|
204
|
+
use_for:
|
|
205
|
+
- 즉시 반영되는 설정 켜기/끄기
|
|
206
|
+
- 저장 버튼 없이 값이 바뀌는 단일 옵션
|
|
207
|
+
avoid_for:
|
|
208
|
+
- 저장 버튼을 눌러야 반영되는 값
|
|
209
|
+
- 선택지가 둘보다 많은 경우 (Radio를 쓴다)
|
|
210
|
+
note: 라벨 슬롯이 없어서 접근 가능한 이름을 `aria-label`이나 바깥 label로 준다.
|
|
211
|
+
|
|
212
|
+
tab:
|
|
213
|
+
status: draft
|
|
214
|
+
source: components/src/Tab/Tab.tsx
|
|
215
|
+
story: components/src/Tab/Tab.stories.tsx
|
|
216
|
+
figma: TODO
|
|
217
|
+
use_for:
|
|
218
|
+
- 같은 화면 안에서 보이는 내용만 갈아 끼우는 전환
|
|
219
|
+
- 한 번에 하나만 열리는 상호 배타적인 화면 묶음
|
|
220
|
+
- 목록 위에서 갈래를 가르는 단일 선택 필터 (2026-09-01에 FilterTabs를 흡수했다, 0023)
|
|
221
|
+
avoid_for:
|
|
222
|
+
- 다른 화면으로 옮기는 이동 (NavigationButton을 쓴다)
|
|
223
|
+
- 여러 개를 동시에 거는 토글 (Chip을 쓴다)
|
|
224
|
+
- 상호 배타적인 폼 입력값 (Radio를 쓴다)
|
|
225
|
+
note: 항목 하나만 있는 컴포넌트다. `role="tab"`이 유효하려면 쓰는 쪽이 `role="tablist"`로 감싸야 하고, 화살표 키 이동(roving tabindex)과 패널 연결(`aria-controls`)도 쓰는 쪽 몫이다. 선택 상태는 색과 밑줄만으로 전달하지 않도록 `aria-selected`로 함께 노출한다. 아이콘은 라벨 앞에 온다. 폭은 라벨 길이만큼이고 라벨은 접히지 않는다. 탭은 이것 하나다 — 2026-09-01에 `FilterTabs` pattern을 흡수했고, 목록을 좁히는 자리와 패널을 갈아 끼우는 자리가 같은 값을 쓴다(0023). 줄 전체를 받치는 1px 선도 감싸는 쪽이 갖는다.
|
|
226
|
+
planned: 선택 밑줄 2px은 시안 값이라 그대로 뒀다 (시스템 보더 1px 규칙의 예외, 2026-08-05 확정). 안 고른 탭의 텍스트는 `text/primary-sub`다 — 시안의 `text/disabled`는 대비 2.3:1 미달이고 disabled와 색이 같아 안 고른 탭이 꺼진 탭으로 읽혀서 0023에서 뒤집었다. 아이콘 색은 아직 `state/disabled`라 글자와 짝이 맞지 않는다. 시안의 채움이 각져서 다른 컨트롤과 달리 `radius/control`을 쓰지 않는다. 시안에 없는 것 — 고른 탭의 hover는 안 고른 탭과 같은 채움으로 정의했고, disabled는 안 고른 탭에 커서만 바꿔 정의했다. 모두 확정 전이다. TabList 컨테이너는 두지 않았다.
|
|
227
|
+
|
|
228
|
+
textfield:
|
|
229
|
+
status: stable
|
|
230
|
+
source: components/src/TextField/TextField.tsx
|
|
231
|
+
story: components/src/TextField/TextField.stories.tsx
|
|
232
|
+
figma: TODO
|
|
233
|
+
use_for:
|
|
234
|
+
- 한 줄 텍스트 입력
|
|
235
|
+
- 글자 수 제한이 있는 긴 문장 입력
|
|
236
|
+
avoid_for:
|
|
237
|
+
- 읽기 전용 표시 (`readOnly`를 설계상 두지 않았다. decisions/0004 참고)
|
|
238
|
+
- 여러 줄 입력에 `sm` (`sm`은 40px 한 줄 input이다)
|
|
239
|
+
variant:
|
|
240
|
+
outline: 흰 배경에 회색 보더. 대부분의 입력이고 기본값이다
|
|
241
|
+
accent: 흰 배경에 보라 보더. 강조하는 입력
|
|
242
|
+
subtle: 배경과 보더 없음. 인라인과 저강도
|
|
243
|
+
note: 크기가 렌더 요소를 정한다. `md`는 120px textarea, `sm`은 40px input이다. 글자 수 표시는 `maxLength`로 켠다.
|
|
244
|
+
|
|
245
|
+
toast:
|
|
246
|
+
status: draft
|
|
247
|
+
source: components/src/Toast/Toaster.tsx
|
|
248
|
+
story: components/src/Toast/Toaster.stories.tsx
|
|
249
|
+
figma: TODO
|
|
250
|
+
use_for:
|
|
251
|
+
- 작업 결과를 흐름을 끊지 않고 알리기
|
|
252
|
+
- 실행취소처럼 잠깐만 유효한 액션 내놓기
|
|
253
|
+
avoid_for:
|
|
254
|
+
- 확인이나 결정을 받아야 하는 경우 (Modal을 쓴다)
|
|
255
|
+
- 성공·경고·정보를 색으로 구분하기 (대응 token이 없어 variant가 둘뿐이다)
|
|
256
|
+
variant:
|
|
257
|
+
primary: 일반 알림. `role=status`로 읽힌다
|
|
258
|
+
danger: 오류와 실패. `role=alert`로 읽힌다
|
|
259
|
+
note: 시안 없이 만든 초안. 공개 API는 `<Toaster />` 하나와 `toast()` 함수이고 Toast 자체는 내부 구현이다. variant는 토큰이 있는 primary·danger 둘뿐이고 success·warning·info는 토큰이 없어 두지 않았다. 자동 닫힘 5초·폭 400px·뜨는 자리는 확정 전이다.
|
|
260
|
+
|
|
261
|
+
tooltip:
|
|
262
|
+
status: draft
|
|
263
|
+
source: components/src/Tooltip/Tooltip.tsx
|
|
264
|
+
story: components/src/Tooltip/Tooltip.stories.tsx
|
|
265
|
+
figma: TODO
|
|
266
|
+
use_for:
|
|
267
|
+
- 트리거만 봐서는 모자란 짧은 보충 설명
|
|
268
|
+
- 아이콘 버튼의 동작을 글로 덧붙이기
|
|
269
|
+
avoid_for:
|
|
270
|
+
- 아이콘 버튼의 접근 가능한 이름 (aria-label을 쓴다)
|
|
271
|
+
- 툴팁을 열어야만 알 수 있는 정보 (터치에는 hover가 없다)
|
|
272
|
+
note: 시안 없이 만든 초안. placement·최대 폭·여는 지연·화살표 크기는 확정 전이다. 트리거는 포커스를 받을 수 있는 요소 하나여야 한다.
|