@nurihaus/web-design-system 3.0.0 → 3.0.3
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 +104 -5
- package/dist/.storybook/story-kit.d.ts +18 -0
- package/dist/ai/components.md +742 -0
- package/dist/ai/tokens.md +319 -0
- package/dist/avatar.js +336 -0
- package/dist/check-box.js +379 -0
- package/dist/chunk-149.js +57 -0
- package/dist/chunk-298.js +34 -0
- package/dist/chunk-302.js +105 -0
- package/dist/chunk-309.js +36 -0
- package/dist/chunk-364.js +126 -0
- package/dist/chunk-387.js +37 -0
- package/dist/chunk-558.js +200 -0
- package/dist/chunk-563.js +181 -0
- package/dist/chunk-739.js +68 -0
- package/dist/chunk-777.js +117 -0
- package/dist/chunk-917.js +35 -0
- package/dist/chunk-933.js +70 -0
- package/dist/chunk-976.js +29 -0
- package/dist/collapsible-menu.js +394 -0
- package/dist/components/avatar/avatar-props.d.ts +2 -6
- package/dist/components/avatar/avatar-type.d.ts +4 -5
- package/dist/components/avatar/avatar.d.ts +1 -0
- package/dist/components/avatar/avatar.stories.d.ts +17 -1
- package/dist/components/badge/badge-props.d.ts +17 -80
- package/dist/components/badge/badge-type.d.ts +38 -2
- package/dist/components/badge/badge.stories.d.ts +25 -2
- package/dist/components/badge/base-badge.d.ts +2 -1
- package/dist/components/badge/icon-text-badge.d.ts +3 -21
- package/dist/components/badge/icon-text-option-badge.d.ts +2 -15
- package/dist/components/badge/option-badge.d.ts +3 -20
- package/dist/components/button/button-props.d.ts +2 -7
- package/dist/components/button/button-type.d.ts +11 -3
- package/dist/components/button/button.stories.d.ts +13 -10
- package/dist/components/button/cta-button.d.ts +3 -12
- package/dist/components/check-box/base-check-box.d.ts +9 -5
- package/dist/components/check-box/check-box-props.d.ts +2 -7
- package/dist/components/check-box/check-box-type.d.ts +11 -4
- package/dist/components/check-box/check-box.d.ts +3 -10
- package/dist/components/check-box/check-box.stories.d.ts +19 -4
- package/dist/components/collapsible-menu/base-collapsible-menu.d.ts +9 -5
- package/dist/components/collapsible-menu/collapsible-menu-props.d.ts +3 -12
- package/dist/components/collapsible-menu/collapsible-menu-type.d.ts +33 -9
- package/dist/components/collapsible-menu/collapsible-menu.d.ts +3 -23
- package/dist/components/collapsible-menu/collapsible-menu.stories.d.ts +20 -4
- package/dist/components/drop-down/base-drop-down.d.ts +11 -3
- package/dist/components/drop-down/drop-down-props.d.ts +3 -12
- package/dist/components/drop-down/drop-down-type.d.ts +34 -15
- package/dist/components/drop-down/drop-down.d.ts +3 -32
- package/dist/components/drop-down/drop-down.stories.d.ts +23 -4
- package/dist/components/elements/text/base-text.d.ts +3 -0
- package/dist/components/elements/text/text-props.d.ts +16 -0
- package/dist/components/elements/text/text-type.d.ts +6 -2
- package/dist/components/elements/text/text.d.ts +2 -1
- package/dist/components/elements/text/text.stories.d.ts +43 -3
- package/dist/components/loading/index.d.ts +6 -6
- package/dist/components/loading/inline-loading/base-inline-loading.d.ts +3 -0
- package/dist/components/loading/inline-loading/inline-loading-props.d.ts +9 -0
- package/dist/components/loading/inline-loading/inline-loading-type.d.ts +8 -6
- package/dist/components/loading/inline-loading/inline-loading.d.ts +3 -2
- package/dist/components/loading/inline-loading/inline-loading.stories.d.ts +5 -9
- package/dist/components/loading/overlay-loading/base-overlay-loading.d.ts +3 -0
- package/dist/components/loading/overlay-loading/overlay-loading-props.d.ts +7 -0
- package/dist/components/loading/overlay-loading/overlay-loading-type.d.ts +6 -3
- package/dist/components/loading/overlay-loading/overlay-loading.d.ts +3 -3
- package/dist/components/loading/overlay-loading/overlay-loading.stories.d.ts +8 -8
- package/dist/components/loading/spinner/base-spinner.d.ts +4 -0
- package/dist/components/loading/spinner/spinner-props.d.ts +1 -0
- package/dist/components/loading/spinner/spinner-type.d.ts +4 -4
- package/dist/components/loading/spinner/spinner.d.ts +2 -2
- package/dist/components/loading/spinner/spinner.stories.d.ts +5 -12
- package/dist/components/modal/base-modal.d.ts +17 -5
- package/dist/components/modal/modal-props.d.ts +2 -7
- package/dist/components/modal/modal-type.d.ts +20 -10
- package/dist/components/modal/modal-with-double-button.d.ts +4 -16
- package/dist/components/modal/modal.stories.d.ts +15 -2
- package/dist/components/radio/base-radio.d.ts +9 -5
- package/dist/components/radio/radio-props.d.ts +1 -0
- package/dist/components/radio/radio-type.d.ts +6 -8
- package/dist/components/radio/radio.d.ts +2 -2
- package/dist/components/radio/radio.stories.d.ts +13 -4
- package/dist/components/table/base-table.d.ts +4 -5
- package/dist/components/table/data-table.d.ts +5 -22
- package/dist/components/table/table-type.d.ts +22 -1
- package/dist/components/table/table.stories.d.ts +19 -3
- package/dist/components/tabs/base-tabs.d.ts +7 -7
- package/dist/components/tabs/tabs-props.d.ts +1 -1
- package/dist/components/tabs/tabs-type.d.ts +9 -13
- package/dist/components/tabs/tabs.d.ts +3 -3
- package/dist/components/tabs/tabs.stories.d.ts +16 -10
- package/dist/components/text-field/base-text-field.d.ts +5 -3
- package/dist/components/text-field/text-field-props.d.ts +3 -12
- package/dist/components/text-field/text-field-type.d.ts +14 -0
- package/dist/components/text-field/text-field.d.ts +3 -16
- package/dist/components/text-field/text-field.stories.d.ts +24 -0
- package/dist/components/tooltip/base-tooltip.d.ts +13 -3
- package/dist/components/tooltip/tooltip-props.d.ts +3 -2
- package/dist/components/tooltip/tooltip-type.d.ts +17 -5
- package/dist/components/tooltip/tooltip.d.ts +4 -7
- package/dist/components/tooltip/tooltip.stories.d.ts +21 -4
- package/dist/components.css +1984 -0
- package/dist/cta-button.js +236 -0
- package/dist/data-table.js +386 -0
- package/dist/drop-down.js +433 -0
- package/dist/helpers/props/common-props.d.ts +7 -0
- package/dist/helpers/types/common-props.d.ts +8 -0
- package/dist/icon-text-badge.js +294 -0
- package/dist/icon-text-option-badge.js +270 -0
- package/dist/index.d.ts +17 -1
- package/dist/index.js +3021 -10637
- package/dist/loading.js +383 -0
- package/dist/modal-with-double-button.js +527 -0
- package/dist/option-badge.js +293 -0
- package/dist/radio.js +363 -0
- package/dist/reset.css +45 -0
- package/dist/styles.css +785 -559
- package/dist/tabs.js +421 -0
- package/dist/text-field.js +369 -0
- package/dist/text.js +233 -0
- package/dist/tokens.css +73 -0
- package/dist/tokens.js +4 -6
- package/dist/tooltip.js +360 -0
- package/package.json +91 -14
- package/dist/components/text-field/text-filed.stories.d.ts +0 -8
package/README.md
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
# design-system
|
|
1
|
+
# @nurihaus/web-design-system
|
|
2
2
|
|
|
3
|
-
## 설치와 사용 (
|
|
3
|
+
## 설치와 사용 (4.x)
|
|
4
|
+
|
|
5
|
+
`radix-ui` 는 peerDependency 다. 함께 설치한다.
|
|
4
6
|
|
|
5
7
|
```bash
|
|
6
|
-
npm i @nurihaus/web-design-system
|
|
8
|
+
npm i @nurihaus/web-design-system radix-ui
|
|
7
9
|
```
|
|
8
10
|
|
|
9
11
|
CSS 는 JS 에 들어 있지 않다. 앱에서 한 번 가져온다.
|
|
@@ -12,10 +14,58 @@ CSS 는 JS 에 들어 있지 않다. 앱에서 한 번 가져온다.
|
|
|
12
14
|
// 토큰만 (CSS Modules 로 직접 화면을 짤 때). 가져와도 화면이 바뀌지 않는다.
|
|
13
15
|
import '@nurihaus/web-design-system/tokens.css';
|
|
14
16
|
|
|
15
|
-
// 토큰 + 글꼴 + 리셋 + 컴포넌트 스타일 (디자인 시스템 컴포넌트를 쓸 때)
|
|
17
|
+
// 토큰 + 글꼴 스택 + 리셋 + 컴포넌트 스타일 (디자인 시스템 컴포넌트를 쓸 때)
|
|
16
18
|
import '@nurihaus/web-design-system/styles.css';
|
|
17
19
|
```
|
|
18
20
|
|
|
21
|
+
글꼴 파일은 앱이 불러온다. 디자인 시스템은 글꼴을 내려받지 않는다. `styles.css` 의 `.nuri-theme` 는 앱이 Pretendard 를 불러왔으면 Pretendard 를 먼저 쓰고, 없으면 시스템 글꼴로 넘어간다. 스택은 `font-family` 이름 `Pretendard` 로 찾는다. 앱이 다른 이름으로 불러오면(예: 이름을 해시로 바꾸는 도구) `.nuri-theme` 의 `font-family` 를 앱에서 덮어쓴다.
|
|
22
|
+
|
|
23
|
+
`.nuri-theme` 글꼴 스택도 필요 없으면 나눠서 가져온다. 컴포넌트 글자는 앱의 글꼴을 물려받는다.
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import '@nurihaus/web-design-system/tokens.css';
|
|
27
|
+
import '@nurihaus/web-design-system/reset.css'; // 필요할 때만
|
|
28
|
+
import '@nurihaus/web-design-system/components.css'; // 유틸리티 + 컴포넌트. 글꼴 스택 없음
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 컴포넌트별 import
|
|
32
|
+
|
|
33
|
+
컴포넌트 경로로 가져온다. 루트(`@nurihaus/web-design-system`)는 radix primitive 를 전부 참조해, 앱 번들러가 쓰지 않는 primitive 를 걷어내지 못한다. Tooltip 하나만 쓰는 Next 15 페이지의 first-load JS 를 쟀다: 루트 import 149 kB, 컴포넌트 경로 122 kB, radix Tooltip 만 직접 쓴 페이지 119 kB, 빈 페이지 102 kB (3.0.1 루트 import 는 140 kB).
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import Tooltip, { TooltipProvider } from '@nurihaus/web-design-system/tooltip';
|
|
37
|
+
import CollapsibleMenu from '@nurihaus/web-design-system/collapsible-menu';
|
|
38
|
+
import { Spinner } from '@nurihaus/web-design-system/loading'; // loading 은 이름 있는 export 3개
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
경로는 파일 이름이다: `avatar`, `cta-button`, `option-badge`, `icon-text-badge`, `icon-text-option-badge`, `data-table`, `text-field`, `radio`, `check-box`, `drop-down`, `collapsible-menu`, `text`, `tooltip`, `tabs`, `modal-with-double-button`, `loading`. `loading` 밖에는 default export 다. 루트와 컴포넌트 경로를 섞어 쓰면 같은 코드가 두 번 들어가므로 한 방식으로 통일한다. `TooltipProvider` 는 어디서 가져와도 모든 경로의 툴팁에 닿는다.
|
|
42
|
+
|
|
43
|
+
## 이 변경으로 올리기
|
|
44
|
+
|
|
45
|
+
1. `radix-ui` 를 설치한다. 이전 배포본은 번들에 넣어 배포했고 이제는 앱의 것을 쓴다.
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npm i radix-ui
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
2. 글꼴을 앱이 불러온다. 이전 `styles.css` 는 jsDelivr(Pretendard) · Google Fonts(Roboto, Material Icons) CSS 를 `@import` 했다. 이제는 아무것도 불러오지 않는다. Pretendard 를 앱에서 불러오지 않으면 시스템 글꼴로 보인다. Material Icons 글꼴에 기대던 화면이 있으면 앱에서 직접 불러온다.
|
|
52
|
+
|
|
53
|
+
3. 루트 import 를 컴포넌트별 import 로 바꾼다. 루트 import 는 그대로 동작하지만 이전 배포본보다 first-load JS 가 크다 (위 측정).
|
|
54
|
+
|
|
55
|
+
배경은 `docs/decisions/0002-fonts-out-radix-peer-per-component-entries.md`.
|
|
56
|
+
|
|
57
|
+
## 크기 이름 바꾸기
|
|
58
|
+
|
|
59
|
+
크기 이름은 모든 컴포넌트가 `xs · s · m · l · xl` 하나를 쓴다. 숫자는 `styles/token/size.css` 에 있다. 높이는 바뀌지 않는다. button `r` 만 없어졌다.
|
|
60
|
+
|
|
61
|
+
| 컴포넌트 | 바꿀 것 |
|
|
62
|
+
| --- | --- |
|
|
63
|
+
| CTAButton | `size="r"` → `size="m"` (48px → 50px) |
|
|
64
|
+
| DropDown, TextField, CollapsibleMenu | `m` → `s`, `l` → `m` |
|
|
65
|
+
| OptionBadge, IconTextBadge, IconTextOptionBadge | `l` → `xl`, `m` → `l`, `r` → `m`, `sm` → `xs` (`s` 는 그대로) |
|
|
66
|
+
|
|
67
|
+
찾아 바꾸기는 표에 적힌 순서대로 한다. 순서를 바꾸면 이미 바꾼 이름이 한 번 더 바뀐다(DropDown 에서 `l` → `m` 을 먼저 하면 그 `m` 이 다시 `s` 가 된다). 크기 prop 타입은 `import type { Size } from '@nurihaus/web-design-system'`. 배경은 `docs/decisions/0003-shared-size-scale-and-numeric-tokens.md`.
|
|
68
|
+
|
|
19
69
|
```css
|
|
20
70
|
/* CSS Modules 에서 */
|
|
21
71
|
.card {
|
|
@@ -39,6 +89,23 @@ JS 토큰이 필요하면.
|
|
|
39
89
|
import { primitive, semanticApp } from '@nurihaus/web-design-system/tokens';
|
|
40
90
|
```
|
|
41
91
|
|
|
92
|
+
## 색 prop 바꾸기
|
|
93
|
+
|
|
94
|
+
색 prop 은 Text 의 `color` 하나만 남았다. 뱃지는 `variant` 로 색을 고르고, 로딩 링은 CSS `color` 를 따른다. TypeScript 가 지운 prop 을 막는다.
|
|
95
|
+
|
|
96
|
+
| 컴포넌트 | 이전 | 지금 |
|
|
97
|
+
| --- | --- | --- |
|
|
98
|
+
| OptionBadge, IconTextBadge, IconTextOptionBadge | 색 prop 없음 (검정 글자 · 흰 배경) | `variant="neutral"` (기본값이라 생략) |
|
|
99
|
+
| | `color="purple-900" backgroundColor="purple-50"` | `variant="primary"` |
|
|
100
|
+
| | `color="accent-red-700" backgroundColor="accent-red-50"` | `variant="danger"` |
|
|
101
|
+
| | `borderColor="grey-scale-300"` | `variant="outlined"` |
|
|
102
|
+
| | 그 밖의 `color` · `backgroundColor` · `borderColor` | 가까운 `variant` 를 고르거나 `className` 으로 덮는다 |
|
|
103
|
+
| Spinner | `color="purple-900"` | `style={{ color: 'var(--color-purple-900)' }}` 또는 `color` 를 주는 `className` |
|
|
104
|
+
| InlineLoading | `indicatorColor="purple-900"` | Spinner 와 같다 |
|
|
105
|
+
| OverlayLoading | `spinnerColor="purple-900"` | `className="my-overlay"` 를 주고 `.my-overlay .base-spinner { color: var(--color-purple-900); }` |
|
|
106
|
+
|
|
107
|
+
뱃지의 variant 규칙은 `.option.variant-primary` 처럼 클래스 두 개(0-2-0)다. `className` 으로 색을 덮을 때는 선택자를 그보다 구체적으로 쓰거나 `style` 을 쓴다. 로딩의 기본 색은 우선순위 0 이라 어떤 `className` 이든 이긴다. 감싸는 요소의 `color` 는 물려받지 않는다. 배경은 `docs/decisions/0004-badge-variants-and-loading-currentcolor.md`.
|
|
108
|
+
|
|
42
109
|
## 토큰 고치기
|
|
43
110
|
|
|
44
111
|
원본은 `tokens/figma.json` 하나다. Tokens Studio 가 그 파일을 갱신하면 생성만 다시 돌린다.
|
|
@@ -47,4 +114,36 @@ import { primitive, semanticApp } from '@nurihaus/web-design-system/tokens';
|
|
|
47
114
|
npm run tokens # figma.json → tokens/generated/{tokens.css, *.ts}
|
|
48
115
|
```
|
|
49
116
|
|
|
50
|
-
`tokens/generated/`
|
|
117
|
+
`tokens/generated/` 를 손으로 고치지 않는다. 배경은 `docs/decisions/0001-tokens-in-ds-and-separate-css.md`.
|
|
118
|
+
|
|
119
|
+
새 서비스가 다른 의미 토큰 값(버튼 색 등)을 써야 하면 `tokens/figma.json` 에 `semantic_{이름}` 세트를 추가하고 `npm run tokens` 를 돌린다. `<html data-ds-theme="{이름}">` 로 고르는 테마가 생긴다. 자세한 규칙은 `docs/tokens.md`.
|
|
120
|
+
|
|
121
|
+
## AI 설명서
|
|
122
|
+
|
|
123
|
+
배포물의 `dist/ai/` 에 쓰는 쪽 AI 가 읽는 설명서가 들어 있다.
|
|
124
|
+
|
|
125
|
+
| 파일 | 내용 | 원본 |
|
|
126
|
+
| --- | --- | --- |
|
|
127
|
+
| `dist/ai/components.md` | 공통 규칙, 공개 컴포넌트마다 import · 사용법 · 예시 · props 표, 아직 없는 컴포넌트 목록 | 공통 규칙은 `components/common.md`, props 표는 타입, 사용법은 각 폴더 `usage.md`, 없는 목록은 `components/not-yet.md` |
|
|
128
|
+
| `dist/ai/tokens.md` | CSS 변수 전체와 테마별 의미 토큰, 크기·레이어·모션 토큰 | `tokens/figma.json`, `styles/token/size.css` |
|
|
129
|
+
|
|
130
|
+
쓰는 쪽에서는 `node_modules/@nurihaus/web-design-system/dist/ai/` 경로로 읽는다. `usage.md` 섹션이 없거나 예시가 타입 검사에 실패하면 `npm run build` 가 멈춘다.
|
|
131
|
+
|
|
132
|
+
## 배포
|
|
133
|
+
|
|
134
|
+
`main` 으로 가는 PR 마다 CI 가 돈다. `yarn lint` · `yarn typecheck` · `yarn test` · `yarn build` · `yarn build-storybook` 중 하나라도 실패하면 빨간불이다. Node 버전은 `.nvmrc`(20), 패키지 매니저는 Yarn 3 하나다(`corepack enable` 후 `yarn`).
|
|
135
|
+
|
|
136
|
+
배포는 GitHub 에서 한다. Actions 탭 → Release → Run workflow → `patch` · `minor` · `major` 중 하나를 고른다. 워크플로우는 아래 순서로 돈다.
|
|
137
|
+
|
|
138
|
+
1. 다음 버전 태그가 이미 origin 에 있으면 멈춘다. 반대로 지금 버전이 태그만 있고 npm 에 없으면(이전 배포가 publish 에서 실패) 버전을 올리지 않고 그 버전을 그대로 올린다.
|
|
139
|
+
2. CI 와 같은 검사(lint · typecheck · test · build)를 돌린다.
|
|
140
|
+
3. `npm version` 으로 버전 커밋(`3.1.0`)과 태그(`v3.1.0`)를 만들어 `main` 에 푸시한다.
|
|
141
|
+
4. npm 에 올리고 GitHub Release 를 만든다(변경 내역은 PR 에서 자동 생성).
|
|
142
|
+
|
|
143
|
+
검사가 실패하면 버전이 오르지 않고, 푸시가 막히면 npm 에 올리지 않는다. publish 에서 실패했으면 원인을 고치고 버튼을 다시 누르면 같은 버전이 올라간다.
|
|
144
|
+
|
|
145
|
+
처음 한 번 준비할 것:
|
|
146
|
+
|
|
147
|
+
- npmjs.com 의 `@nurihaus/web-design-system` 패키지 Settings → Trusted Publisher 에 GitHub Actions 를 등록한다. Organization `NURIHAUS-Dev`, Repository `nuri-web-design-system`, Workflow filename `release.yml`. 토큰은 쓰지 않는다.
|
|
148
|
+
- `main` 보호 규칙(ruleset)이 GitHub Actions 의 푸시를 허용해야 한다. 막혀 있으면 3단계에서 멈춘다.
|
|
149
|
+
- 스토리북 배포는 선택이다. Settings → Pages → Source 를 GitHub Actions 로 켜면 `main` 푸시마다 스토리북이 Pages 에 올라간다. 켜지 않으면 Storybook 워크플로우는 건너뛴다.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
interface MatrixProps<T> {
|
|
3
|
+
items: readonly T[];
|
|
4
|
+
label?: (value: T) => string;
|
|
5
|
+
render: (value: T) => ReactNode;
|
|
6
|
+
direction?: 'row' | 'column';
|
|
7
|
+
gap?: number;
|
|
8
|
+
}
|
|
9
|
+
/** items 하나마다 라벨과 샘플을 한 칸으로 그린다. 크기·variant 같은 축을 나란히 비교할 때 쓴다. */
|
|
10
|
+
export declare const Matrix: <T>({ items, label, render, direction, gap, }: MatrixProps<T>) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
interface FrameProps {
|
|
12
|
+
dark?: boolean;
|
|
13
|
+
width?: number | string;
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
/** 어두운 배경이나 고정 폭, 툴팁이 뜰 여백이 필요한 샘플을 감싼다. width 는 여백을 뺀 안쪽 폭이다. */
|
|
17
|
+
export declare const Frame: ({ dark, width, children }: FrameProps) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export {};
|