@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
|
@@ -0,0 +1,742 @@
|
|
|
1
|
+
<!-- scripts/build-ai-docs.mjs 가 만든다. props 표는 타입에서, 설명은 각 컴포넌트 폴더의 usage.md 에서 온다. -->
|
|
2
|
+
|
|
3
|
+
# @nurihaus/web-design-system 컴포넌트
|
|
4
|
+
|
|
5
|
+
화면을 만들 때 아래 컴포넌트가 있으면 직접 만들지 말고 이것을 쓴다. 색·간격·글자는 같은 폴더의 `tokens.md` 변수만 쓴다.
|
|
6
|
+
|
|
7
|
+
## CSS 가져오기
|
|
8
|
+
|
|
9
|
+
앱에서 한 번만 가져온다. 둘 중 하나를 고른다.
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import '@nurihaus/web-design-system/styles.css'; // 토큰 + 글꼴 스택 + 리셋 + 컴포넌트. 글꼴 파일은 앱이 불러온다
|
|
13
|
+
|
|
14
|
+
import '@nurihaus/web-design-system/tokens.css'; // .nuri-theme 글꼴 스택 없이 쓸 때
|
|
15
|
+
import '@nurihaus/web-design-system/reset.css';
|
|
16
|
+
import '@nurihaus/web-design-system/components.css';
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 공통 규칙
|
|
20
|
+
|
|
21
|
+
모든 컴포넌트에 같이 적용된다. 컴포넌트 설명보다 먼저 읽는다.
|
|
22
|
+
|
|
23
|
+
**size 는 전역 이름이다.** `xs · s · m · l · xl` 다섯 개뿐이고, 컴포넌트는 그중 지원하는 것만 받는다(props 표 참고). 같은 글자는 한 줄에 나란히 놓이는 컨트롤(CTAButton · DropDown · TextField)에서 같은 높이다. px 는 `tokens.md` 의 `--control-height-*` 같은 변수에 있고, 컴포넌트에 숫자로 높이를 주지 않는다.
|
|
24
|
+
|
|
25
|
+
**색은 variant 가 정한다.** CTAButton · OptionBadge · IconTextBadge · IconTextOptionBadge 는 `variant` 로 글자·배경·테두리 색이 묶여서 정해진다. 색 prop 은 없다. 색을 받는 컴포넌트는 Text(`color`, 토큰 이름만) 하나다. Spinner · InlineLoading · OverlayLoading 은 CSS `color` 를 따라가므로 `className` 이나 `style` 의 `color` 로 바꾼다.
|
|
26
|
+
|
|
27
|
+
**커스텀은 `className` 과 `style` 로 한다.** 모든 컴포넌트가 둘을 받아 루트 요소에 붙인다(TextField 는 입력 상자, DataTable 은 `<table>`). variant 가 정한 색을 className 으로 덮으려면 `.cta-button.variant-primary` 보다 구체적인 선택자가 필요하다. 색·간격·글자 값은 `tokens.md` 의 변수만 쓴다.
|
|
28
|
+
|
|
29
|
+
**상태는 prop 으로 넘긴다.** `disabled`, `loading`, `isError`, `open`, `checked` 처럼 컴포넌트가 받는 상태 prop 을 쓰고, 클래스를 직접 붙여 상태를 흉내 내지 않는다. 값이 있는 컴포넌트는 `value`/`onValueChange`(제어) 또는 `defaultValue`(비제어) 둘 중 하나로 쓴다.
|
|
30
|
+
|
|
31
|
+
**Tooltip 이 여러 개면 `TooltipProvider` 로 감싼다.** 앱 루트에 한 번 두면 된다. 조건이 맞을 때만 띄우려면 `open` 을 제어하지 말고 `disabled` 를 쓴다.
|
|
32
|
+
|
|
33
|
+
**없는 것은 지어내지 않는다.** 이 문서 끝의 "아직 없는 것" 표에 있는 컴포넌트는 없다. 없는 prop · variant · 토큰 이름도 만들지 않는다. 틀린 variant 나 size 값은 타입 오류가 난다.
|
|
34
|
+
|
|
35
|
+
## 목록
|
|
36
|
+
|
|
37
|
+
- [Avatar](#avatar)
|
|
38
|
+
- [CTAButton](#ctabutton)
|
|
39
|
+
- [OptionBadge](#optionbadge)
|
|
40
|
+
- [IconTextBadge](#icontextbadge)
|
|
41
|
+
- [IconTextOptionBadge](#icontextoptionbadge)
|
|
42
|
+
- [DataTable](#datatable)
|
|
43
|
+
- [TextField](#textfield)
|
|
44
|
+
- [Radio](#radio)
|
|
45
|
+
- [Checkbox](#checkbox)
|
|
46
|
+
- [DropDown](#dropdown)
|
|
47
|
+
- [CollapsibleMenu](#collapsiblemenu)
|
|
48
|
+
- [Text](#text)
|
|
49
|
+
- [Tooltip](#tooltip)
|
|
50
|
+
- [TooltipProvider](#tooltipprovider)
|
|
51
|
+
- [Tabs](#tabs)
|
|
52
|
+
- [ModalWithDoubleButton](#modalwithdoublebutton)
|
|
53
|
+
- [Spinner](#spinner)
|
|
54
|
+
- [InlineLoading](#inlineloading)
|
|
55
|
+
- [OverlayLoading](#overlayloading)
|
|
56
|
+
|
|
57
|
+
## Avatar
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import { Avatar } from '@nurihaus/web-design-system/avatar'; // 이 컴포넌트만 싣는다 (권장)
|
|
61
|
+
import { Avatar } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**언제 쓴다.** 사용자 프로필 이미지를 원형으로 보여줄 때 쓴다. `src`가 없거나 이미지를 불러오지 못하면 기본 아바타 아이콘이 나오고, `badgeOption`에 넣은 요소는 오른쪽 아래에 겹쳐 표시된다.
|
|
65
|
+
|
|
66
|
+
**쓰지 않는다.** 프로필이 아닌 일반 이미지나 사각형 썸네일에는 쓰지 않는다. 아이콘과 이름을 한 줄로 묶은 라벨이 필요하면 IconTextBadge를 쓴다.
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
<Avatar size="m" src="https://placehold.co/80x80" alt="프로필 이미지" />
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### props
|
|
73
|
+
|
|
74
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
75
|
+
| --- | --- | --- | --- |
|
|
76
|
+
| `size` | `'s' \| 'm' \| 'l' \| 'xl'` | 예 | `'m'` |
|
|
77
|
+
| `badgeOption` | `ReactNode` | | |
|
|
78
|
+
| `src` | `string` | | |
|
|
79
|
+
| `alt` | `string` | | |
|
|
80
|
+
| `className` | `string` | | |
|
|
81
|
+
| `style` | `CSSProperties` | | |
|
|
82
|
+
|
|
83
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
84
|
+
|
|
85
|
+
## CTAButton
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
import { CTAButton } from '@nurihaus/web-design-system/cta-button'; // 이 컴포넌트만 싣는다 (권장)
|
|
89
|
+
import { CTAButton } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**언제 쓴다.** 저장, 확인, 다음 단계처럼 사용자가 실행하는 동작 버튼에 쓴다. `variant`로 강조 단계를 고르고, `loading`이 true면 `text` 대신 Spinner가 표시된다.
|
|
93
|
+
|
|
94
|
+
**쓰지 않는다.** 확인과 취소 두 버튼을 가진 대화상자는 버튼을 직접 배치하지 말고 ModalWithDoubleButton을 쓴다. 화면 안의 패널 전환은 Tabs, 사이드 메뉴 항목은 CollapsibleMenu를 쓴다.
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
<CTAButton variant="primary" size="m" text="저장" onClick={() => {}} />
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### props
|
|
101
|
+
|
|
102
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
103
|
+
| --- | --- | --- | --- |
|
|
104
|
+
| `size` | `'xs' \| 's' \| 'm' \| 'l' \| 'xl'` | | `'m'` |
|
|
105
|
+
| `text` | `ReactNode` | 예 | |
|
|
106
|
+
| `variant` | `'neutral' \| 'primary' \| 'outlined' \| 'secondary' \| 'ghost' \| 'confirm'` | | `'primary'` |
|
|
107
|
+
| `leftIcon` | `ReactNode` | | |
|
|
108
|
+
| `rightIcon` | `ReactNode` | | |
|
|
109
|
+
| `loading` | `boolean` | | |
|
|
110
|
+
|
|
111
|
+
이 밖에 React·HTML 기본 속성 276개를 받는다.
|
|
112
|
+
|
|
113
|
+
## OptionBadge
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
import { OptionBadge } from '@nurihaus/web-design-system/option-badge'; // 이 컴포넌트만 싣는다 (권장)
|
|
117
|
+
import { OptionBadge } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**언제 쓴다.** 상태값이나 분류처럼 짧은 값 하나(`option`)를 라벨로 보여줄 때 쓴다. `variant`로 색을 고른다(`neutral`·`primary`·`danger`·`outlined`). 색 prop 은 없다. `tooltip`을 주면 마우스를 올렸을 때 설명이 뜬다.
|
|
121
|
+
|
|
122
|
+
**쓰지 않는다.** 아이콘이 함께 필요하면 IconTextBadge를, 아이콘과 텍스트 오른쪽에 수치 같은 부가 값까지 붙여야 하면 IconTextOptionBadge를 쓴다. 클릭 동작이 필요한 요소에는 CTAButton을 쓴다.
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
<OptionBadge option="진행 중" variant="primary" size="s" width="fit-content" />
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### props
|
|
129
|
+
|
|
130
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
131
|
+
| --- | --- | --- | --- |
|
|
132
|
+
| `variant` | `'neutral' \| 'primary' \| 'danger' \| 'outlined'` | | `'neutral'` |
|
|
133
|
+
| `width` | `string \| number` | | `'100%'` |
|
|
134
|
+
| `size` | `'xs' \| 's' \| 'm' \| 'l' \| 'xl'` | | `'xl'` |
|
|
135
|
+
| `option` | `ReactNode` | 예 | |
|
|
136
|
+
| `style` | `CSSProperties` | | |
|
|
137
|
+
| `tooltip` | `{ content: ReactNode; position?: 'bottom' \| 'left' \| 'right' \| 'top' \| undefined; delayDuration?: number \| undefined; }` | | |
|
|
138
|
+
| `asChild` | `boolean` | | |
|
|
139
|
+
| `className` | `string` | | |
|
|
140
|
+
|
|
141
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
142
|
+
|
|
143
|
+
## IconTextBadge
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
import { IconTextBadge } from '@nurihaus/web-design-system/icon-text-badge'; // 이 컴포넌트만 싣는다 (권장)
|
|
147
|
+
import { IconTextBadge } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**언제 쓴다.** 아이콘과 텍스트를 한 줄로 묶어 보여줄 때 쓴다. SNS 채널처럼 아이콘으로 구분되는 값에 맞고, `tooltip`을 주면 마우스를 올렸을 때 설명이 뜬다.
|
|
151
|
+
|
|
152
|
+
**쓰지 않는다.** 아이콘 없이 텍스트만 있으면 OptionBadge를 쓴다. 오른쪽에 부가 값을 붙여야 하면 IconTextOptionBadge를 쓴다.
|
|
153
|
+
|
|
154
|
+
```tsx
|
|
155
|
+
<IconTextBadge
|
|
156
|
+
icon={<img src="https://placehold.co/18x18" alt="" />}
|
|
157
|
+
text="Instagram"
|
|
158
|
+
size="s"
|
|
159
|
+
width="fit-content"
|
|
160
|
+
tooltip={{ content: '연결된 채널', position: 'top' }}
|
|
161
|
+
/>
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### props
|
|
165
|
+
|
|
166
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
167
|
+
| --- | --- | --- | --- |
|
|
168
|
+
| `variant` | `'neutral' \| 'primary' \| 'danger' \| 'outlined'` | | `'neutral'` |
|
|
169
|
+
| `width` | `string \| number` | | `'100%'` |
|
|
170
|
+
| `size` | `'xs' \| 's' \| 'm' \| 'l' \| 'xl'` | | `'xl'` |
|
|
171
|
+
| `icon` | `ReactNode` | 예 | |
|
|
172
|
+
| `text` | `ReactNode` | 예 | |
|
|
173
|
+
| `style` | `CSSProperties` | | |
|
|
174
|
+
| `tooltip` | `{ content: ReactNode; position?: 'bottom' \| 'left' \| 'right' \| 'top' \| undefined; delayDuration?: number \| undefined; }` | | |
|
|
175
|
+
| `asChild` | `boolean` | | |
|
|
176
|
+
| `className` | `string` | | |
|
|
177
|
+
|
|
178
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
179
|
+
|
|
180
|
+
## IconTextOptionBadge
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
import { IconTextOptionBadge } from '@nurihaus/web-design-system/icon-text-option-badge'; // 이 컴포넌트만 싣는다 (권장)
|
|
184
|
+
import { IconTextOptionBadge } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**언제 쓴다.** 왼쪽에 아이콘과 텍스트, 오른쪽에 부가 값(`option`)을 함께 보여줄 때 쓴다. 채널 이름과 팔로워 수를 한 배지에 담는 경우가 이에 해당한다.
|
|
188
|
+
|
|
189
|
+
**쓰지 않는다.** 이 배지는 `tooltip`을 받지 않으므로 툴팁이 필요하면 IconTextBadge를 쓴다. 부가 값이 없으면 IconTextBadge나 OptionBadge를 쓴다.
|
|
190
|
+
|
|
191
|
+
```tsx
|
|
192
|
+
<IconTextOptionBadge
|
|
193
|
+
icon={<img src="https://placehold.co/18x18" alt="" />}
|
|
194
|
+
text="Instagram"
|
|
195
|
+
option="2.4K"
|
|
196
|
+
size="s"
|
|
197
|
+
width="fit-content"
|
|
198
|
+
/>
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### props
|
|
202
|
+
|
|
203
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
204
|
+
| --- | --- | --- | --- |
|
|
205
|
+
| `variant` | `'neutral' \| 'primary' \| 'danger' \| 'outlined'` | | `'neutral'` |
|
|
206
|
+
| `width` | `string \| number` | | `'100%'` |
|
|
207
|
+
| `size` | `'xs' \| 's' \| 'm' \| 'l' \| 'xl'` | | `'xl'` |
|
|
208
|
+
| `icon` | `ReactNode` | 예 | |
|
|
209
|
+
| `text` | `ReactNode` | 예 | |
|
|
210
|
+
| `option` | `ReactNode` | 예 | |
|
|
211
|
+
| `style` | `CSSProperties` | | |
|
|
212
|
+
| `className` | `string` | | |
|
|
213
|
+
|
|
214
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
215
|
+
|
|
216
|
+
## DataTable
|
|
217
|
+
|
|
218
|
+
```ts
|
|
219
|
+
import { DataTable } from '@nurihaus/web-design-system/data-table'; // 이 컴포넌트만 싣는다 (권장)
|
|
220
|
+
import { DataTable } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**언제 쓴다.** 여러 레코드를 열 단위로 나열하는 목록 화면에 쓴다. 이름과 달리 `rows`는 헤더 열 정의(`id`, 헤더 내용)이고 `columns`는 데이터 행 배열이며, 각 데이터 행은 `rows`의 모든 `id`를 키로 가진다. 열 너비는 셀 내용의 너비를 따르므로 같은 열의 헤더와 셀 내용에 같은 너비를 준다.
|
|
224
|
+
|
|
225
|
+
**쓰지 않는다.** 정렬, 페이지네이션, 행 선택, 빈 상태 표시는 내장되어 있지 않으므로 데이터를 바깥에서 가공해 넘기고 빈 목록은 따로 그린다. 헤더는 위에 고정되고 `fixedRowsIndex`로 왼쪽 열을 고정할 수 있지만, 그 외의 표 동작이 필요하면 직접 만든다.
|
|
226
|
+
|
|
227
|
+
```tsx
|
|
228
|
+
<DataTable
|
|
229
|
+
rows={[
|
|
230
|
+
{ id: 'name', value: <div style={{ width: '160px' }}>이름</div> },
|
|
231
|
+
{ id: 'status', value: <div style={{ width: '120px' }}>상태</div> },
|
|
232
|
+
] as const}
|
|
233
|
+
columns={[
|
|
234
|
+
{
|
|
235
|
+
name: { value: <div style={{ width: '160px' }}>홍길동</div> },
|
|
236
|
+
status: { value: <div style={{ width: '120px' }}>대기</div>, onClickCell: () => {} },
|
|
237
|
+
},
|
|
238
|
+
]}
|
|
239
|
+
fixedRowsIndex={1}
|
|
240
|
+
/>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### props
|
|
244
|
+
|
|
245
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
246
|
+
| --- | --- | --- | --- |
|
|
247
|
+
| `rows` | `T` | 예 | |
|
|
248
|
+
| `columns` | `ColumnsType<T>` | 예 | |
|
|
249
|
+
| `fixedRowsIndex` | `number` | | `0` |
|
|
250
|
+
| `headerHeight` | `number` | | `85` |
|
|
251
|
+
| `rowHeight` | `number` | | `60` |
|
|
252
|
+
| `cellHeight` | `number` | | |
|
|
253
|
+
| `className` | `string` | | |
|
|
254
|
+
|
|
255
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
256
|
+
|
|
257
|
+
## TextField
|
|
258
|
+
|
|
259
|
+
```ts
|
|
260
|
+
import { TextField } from '@nurihaus/web-design-system/text-field'; // 이 컴포넌트만 싣는다 (권장)
|
|
261
|
+
import { TextField } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**언제 쓴다.** 한 줄 텍스트를 입력받을 때 쓴다. 위 라벨(`title`), 아래 안내 문구(`helperText`), 좌우 아이콘을 함께 붙일 수 있고, `isError`가 true면 `helperText`가 오류 스타일로 바뀐다.
|
|
265
|
+
|
|
266
|
+
**쓰지 않는다.** 여러 줄 입력은 지원하지 않는다(`<input>`만 렌더한다). 정해진 값 중에서 고르는 입력은 DropDown이나 Radio를 쓴다.
|
|
267
|
+
|
|
268
|
+
```tsx
|
|
269
|
+
<TextField
|
|
270
|
+
size="s"
|
|
271
|
+
width="320px"
|
|
272
|
+
name="title"
|
|
273
|
+
title="제목"
|
|
274
|
+
placeholder="제목을 입력하세요"
|
|
275
|
+
helperText="50자 이내로 입력하세요"
|
|
276
|
+
onChange={() => {}}
|
|
277
|
+
/>
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### props
|
|
281
|
+
|
|
282
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
283
|
+
| --- | --- | --- | --- |
|
|
284
|
+
| `className` | `string` | | |
|
|
285
|
+
| `size` | `'s' \| 'm'` | 예 | `'s'` |
|
|
286
|
+
| `title` | `ReactNode` | | |
|
|
287
|
+
| `name` | `string` | 예 | |
|
|
288
|
+
| `value` | `string` | | |
|
|
289
|
+
| `defaultValue` | `string` | | |
|
|
290
|
+
| `leftIcon` | `ReactNode` | | |
|
|
291
|
+
| `rightIcon` | `ReactNode` | | |
|
|
292
|
+
| `width` | `string \| number` | 예 | `'100%'` |
|
|
293
|
+
| `helperText` | `ReactNode` | | |
|
|
294
|
+
| `isError` | `boolean` | | |
|
|
295
|
+
|
|
296
|
+
이 밖에 React·HTML 기본 속성 289개를 받는다.
|
|
297
|
+
|
|
298
|
+
## Radio
|
|
299
|
+
|
|
300
|
+
```ts
|
|
301
|
+
import { Radio } from '@nurihaus/web-design-system/radio'; // 이 컴포넌트만 싣는다 (권장)
|
|
302
|
+
import { Radio } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
**언제 쓴다.** 몇 개의 선택지를 모두 펼쳐 보여주고 그중 하나만 고르게 할 때 쓴다. 선택 상태는 항상 부모가 가지므로 `onChange`에서 받은 id로 `selected`를 갱신해야 선택이 바뀐다.
|
|
306
|
+
|
|
307
|
+
**쓰지 않는다.** 여러 개를 동시에 고르면 Checkbox를 쓴다. 선택지가 많아 모두 펼치기 어려우면 DropDown을 쓴다.
|
|
308
|
+
|
|
309
|
+
```tsx
|
|
310
|
+
<Radio
|
|
311
|
+
options={[
|
|
312
|
+
{ id: 'all', label: '전체' },
|
|
313
|
+
{ id: 'active', label: '활성' },
|
|
314
|
+
{ id: 'inactive', label: '비활성', disabled: true },
|
|
315
|
+
]}
|
|
316
|
+
selected="all"
|
|
317
|
+
onChange={() => {}}
|
|
318
|
+
/>
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### props
|
|
322
|
+
|
|
323
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
324
|
+
| --- | --- | --- | --- |
|
|
325
|
+
| `options` | `{ id: string; label: ReactNode; disabled?: boolean \| undefined; }[]` | 예 | |
|
|
326
|
+
| `selected` | `string \| null` | | |
|
|
327
|
+
| `onChange` | `((id: string \| null) => void)` | | |
|
|
328
|
+
|
|
329
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
330
|
+
|
|
331
|
+
## Checkbox
|
|
332
|
+
|
|
333
|
+
```ts
|
|
334
|
+
import { Checkbox } from '@nurihaus/web-design-system/check-box'; // 이 컴포넌트만 싣는다 (권장)
|
|
335
|
+
import { Checkbox } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**언제 쓴다.** 동의 여부처럼 켜고 끄는 값 하나를 받거나, 목록의 항목을 각각 독립적으로 선택할 때 쓴다. `onChange`는 바뀐 체크 상태(boolean)를 받는다.
|
|
339
|
+
|
|
340
|
+
**쓰지 않는다.** 여러 선택지 중 하나만 골라야 하면 Radio를, 목록에서 값 하나를 고르면 DropDown을 쓴다.
|
|
341
|
+
|
|
342
|
+
```tsx
|
|
343
|
+
<Checkbox id="agree-terms" label="약관에 동의합니다" checked={false} onChange={() => {}} />
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### props
|
|
347
|
+
|
|
348
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
349
|
+
| --- | --- | --- | --- |
|
|
350
|
+
| `label` | `ReactNode` | 예 | |
|
|
351
|
+
| `size` | `'s' \| 'm' \| 'l'` | | `'m'` |
|
|
352
|
+
| `className` | `string` | | |
|
|
353
|
+
| `onClick` | `((checked: boolean) => void)` | | |
|
|
354
|
+
| `checked` | `boolean` | | |
|
|
355
|
+
| `onChange` | `((checked: boolean) => void)` | | |
|
|
356
|
+
| `id` | `string` | 예 | |
|
|
357
|
+
| `disabled` | `boolean` | | |
|
|
358
|
+
|
|
359
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
360
|
+
|
|
361
|
+
## DropDown
|
|
362
|
+
|
|
363
|
+
```ts
|
|
364
|
+
import { DropDown } from '@nurihaus/web-design-system/drop-down'; // 이 컴포넌트만 싣는다 (권장)
|
|
365
|
+
import { DropDown } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
**언제 쓴다.** 펼쳐지는 목록에서 값 하나를 고를 때 쓴다. 보통 `options`를 넘기고, 목록 영역을 직접 그려야 하면 `renderOption`을 쓰되 이때는 항목 선택 처리와 닫기(`close`)를 직접 해야 한다.
|
|
369
|
+
|
|
370
|
+
**쓰지 않는다.** 여러 값을 동시에 고르는 다중 선택은 지원하지 않는다. 선택지가 적어 모두 펼쳐 보여주는 편이 나으면 Radio를, 페이지 이동 메뉴는 CollapsibleMenu를 쓴다.
|
|
371
|
+
|
|
372
|
+
```tsx
|
|
373
|
+
<DropDown
|
|
374
|
+
size="s"
|
|
375
|
+
width="240px"
|
|
376
|
+
placeholder="상태 선택"
|
|
377
|
+
options={[
|
|
378
|
+
{ label: '전체', value: 'all' },
|
|
379
|
+
{ label: '활성', value: 'active' },
|
|
380
|
+
{ label: '비활성', value: 'inactive' },
|
|
381
|
+
]}
|
|
382
|
+
value="all"
|
|
383
|
+
onValueChange={() => {}}
|
|
384
|
+
/>
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### props
|
|
388
|
+
|
|
389
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
390
|
+
| --- | --- | --- | --- |
|
|
391
|
+
| `size` | `'s' \| 'm'` | | `'s'` |
|
|
392
|
+
| `defaultValue` | `string` | | |
|
|
393
|
+
| `value` | `string` | | |
|
|
394
|
+
| `onValueChange` | `((value: string) => void)` | | |
|
|
395
|
+
| `renderValue` | `((value?: string \| undefined) => ReactNode)` | | |
|
|
396
|
+
| `options` | `{ label: ReactNode; value: string; disabled?: boolean \| undefined; }[]` | | |
|
|
397
|
+
| `renderOption` | `((props: { isOpen: boolean; close: () => void; }) => ReactNode)` | | |
|
|
398
|
+
| `placeholder` | `ReactNode` | | |
|
|
399
|
+
| `disabled` | `boolean` | | |
|
|
400
|
+
| `defaultOpen` | `boolean` | | |
|
|
401
|
+
| `open` | `boolean` | | |
|
|
402
|
+
| `onOpenChange` | `((open: boolean) => void)` | | |
|
|
403
|
+
| `leftIcon` | `ReactNode` | | |
|
|
404
|
+
| `rightIcon` | `ReactNode` | | |
|
|
405
|
+
| `width` | `string \| number` | | `'fit-content'` |
|
|
406
|
+
| `side` | `'bottom' \| 'left' \| 'right' \| 'top'` | | |
|
|
407
|
+
| `align` | `'center' \| 'start' \| 'end'` | | |
|
|
408
|
+
| `position` | `'popper' \| 'item-aligned'` | | |
|
|
409
|
+
| `className` | `string` | | |
|
|
410
|
+
| `style` | `CSSProperties` | | |
|
|
411
|
+
|
|
412
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
413
|
+
|
|
414
|
+
## CollapsibleMenu
|
|
415
|
+
|
|
416
|
+
```ts
|
|
417
|
+
import { CollapsibleMenu } from '@nurihaus/web-design-system/collapsible-menu'; // 이 컴포넌트만 싣는다 (권장)
|
|
418
|
+
import { CollapsibleMenu } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
**언제 쓴다.** 사이드바 같은 세로 내비게이션 메뉴에 쓴다. `children`이 있는 항목은 펼치고 접는 그룹이 되고, 없는 항목은 `href`가 있으면 링크, 없으면 버튼으로 렌더되며, `activeKey` 항목과 그 상위 그룹이 강조된다. 링크는 기본으로 `<a>`다. 라우터의 링크로 바꾸려면 `linkComponent`에 넘긴다. 받는 props는 `href`·`className`·`children`·`onClick`·`aria-current`·`aria-disabled`이고, 그대로 링크에 전달하면 된다.
|
|
422
|
+
|
|
423
|
+
**쓰지 않는다.** 같은 화면 안에서 패널을 바꾸는 용도는 Tabs를 쓴다. 본문 콘텐츠를 접고 펼치는 아코디언 용도로는 쓰지 않는다(`<nav>`로 렌더된다). 값을 고르는 폼 입력은 DropDown을 쓴다.
|
|
424
|
+
|
|
425
|
+
Next.js 에서는 `next/link` 의 `Link` 를 그대로 넘긴다.
|
|
426
|
+
|
|
427
|
+
```ts
|
|
428
|
+
import Link from 'next/link';
|
|
429
|
+
|
|
430
|
+
// <CollapsibleMenu linkComponent={Link} items={…} />
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
```tsx
|
|
434
|
+
<CollapsibleMenu
|
|
435
|
+
activeKey="user.search"
|
|
436
|
+
onActiveKeyChange={() => {}}
|
|
437
|
+
linkComponent={(props) => <a {...props} />}
|
|
438
|
+
items={[
|
|
439
|
+
{ key: 'dashboard', item: <span>대시보드</span>, href: '/dashboard' },
|
|
440
|
+
{
|
|
441
|
+
key: 'users',
|
|
442
|
+
item: <span>사용자</span>,
|
|
443
|
+
defaultOpen: true,
|
|
444
|
+
children: [
|
|
445
|
+
{ key: 'user.search', item: <span>사용자 검색</span> },
|
|
446
|
+
{ key: 'user.list', item: <span>사용자 목록</span> },
|
|
447
|
+
],
|
|
448
|
+
},
|
|
449
|
+
]}
|
|
450
|
+
/>
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
### props
|
|
454
|
+
|
|
455
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
456
|
+
| --- | --- | --- | --- |
|
|
457
|
+
| `size` | `'s' \| 'm'` | | `'s'` |
|
|
458
|
+
| `items` | `CollapsibleMenuItem[]` | 예 | |
|
|
459
|
+
| `activeKey` | `string` | | |
|
|
460
|
+
| `onActiveKeyChange` | `((key: string) => void)` | | |
|
|
461
|
+
| `indent` | `number` | | `12` |
|
|
462
|
+
| `chevron` | `ReactNode` | | |
|
|
463
|
+
| `width` | `string \| number` | | `'240px'` |
|
|
464
|
+
| `linkComponent` | `ComponentType<CollapsibleMenuLinkProps>` | | |
|
|
465
|
+
| `className` | `string` | | |
|
|
466
|
+
| `style` | `CSSProperties` | | |
|
|
467
|
+
|
|
468
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
469
|
+
|
|
470
|
+
## Text
|
|
471
|
+
|
|
472
|
+
```ts
|
|
473
|
+
import { Text } from '@nurihaus/web-design-system/text'; // 이 컴포넌트만 싣는다 (권장)
|
|
474
|
+
import { Text } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
**언제 쓴다.** 제목, 본문, 설명처럼 화면에 글자를 표시할 때 쓴다. `size`와 `weight`로 타이포그래피 토큰을, `color`로 색상 토큰을 적용하고, `as`로 태그를 고른다(기본값 `p`).
|
|
478
|
+
|
|
479
|
+
**쓰지 않는다.** 클릭 가능한 텍스트에는 쓰지 않는다. `onClick`, `id` 같은 HTML 속성은 타입상 받지만 요소에 전달되지 않고 `className`과 `style`만 전달된다. 버튼 문구는 CTAButton의 `text`에 문자열로 넘긴다.
|
|
480
|
+
|
|
481
|
+
```tsx
|
|
482
|
+
<Text as="h2" text="캠페인 목록" size="xl" weight="bold" color="grey-scale-900" />
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
### props
|
|
486
|
+
|
|
487
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
488
|
+
| --- | --- | --- | --- |
|
|
489
|
+
| `text` | `ReactNode` | 예 | |
|
|
490
|
+
| `size` | `'base' \| 'xl' \| 'xsm' \| 'sm' \| 'lg' \| '2xl' \| '3xl' \| '4xl' \| '5xl' \| '6xl'` | 예 | |
|
|
491
|
+
| `weight` | `'regular' \| 'medium' \| 'semibold' \| 'bold' \| 'extrabold'` | 예 | |
|
|
492
|
+
| `color` | `'transparent' \| 'purple-50' \| 'purple-100' \| 'purple-200' \| 'purple-300' \| 'purple-400' \| 'purple-500' \| 'purple-600' \| 'purple-700' \| 'purple-800' \| 'purple-900' \| 'grey-scale-50' \| 'grey-scale-100' \| 'grey-scale-200' \| 'grey-scale-300' \| 'grey-scale-400' \| 'grey-scale-500' \| 'grey-scale-600' \| 'grey-scale-700' \| 'grey-scale-800' \| 'grey-scale-900' \| 'accent-red-50' \| 'accent-red-100' \| 'accent-red-200' \| 'accent-red-300' \| 'accent-red-400' \| 'accent-red-500' \| 'accent-red-600' \| 'accent-red-700' \| 'accent-red-800' \| 'accent-red-900' \| 'accent-pink-50' \| 'accent-pink-100' \| 'accent-pink-200' \| 'accent-pink-300' \| 'accent-pink-400' \| 'accent-pink-500' \| 'accent-pink-600' \| 'accent-pink-700' \| 'accent-pink-800' \| 'accent-pink-900' \| 'accent-magenta-50' \| 'accent-magenta-100' \| 'accent-magenta-200' \| 'accent-magenta-300' \| 'accent-magenta-400' \| 'accent-magenta-500' \| 'accent-magenta-600' \| 'accent-magenta-700' \| 'accent-magenta-800' \| 'accent-magenta-900' \| 'accent-blue-50' \| 'accent-blue-100' \| 'accent-blue-200' \| 'accent-blue-300' \| 'accent-blue-400' \| 'accent-blue-500' \| 'accent-blue-600' \| 'accent-blue-700' \| 'accent-blue-800' \| 'accent-blue-900' \| 'accent-mint-50' \| 'accent-mint-100' \| 'accent-mint-200' \| 'accent-mint-300' \| 'accent-mint-400' \| 'accent-mint-500' \| 'accent-mint-600' \| 'accent-mint-700' \| 'accent-mint-800' \| 'accent-mint-900' \| 'accent-green-50' \| 'accent-green-100' \| 'accent-green-200' \| 'accent-green-300' \| 'accent-green-400' \| 'accent-green-500' \| 'accent-green-600' \| 'accent-green-700' \| 'accent-green-800' \| 'accent-green-900' \| 'accent-yellow-50' \| 'accent-yellow-100' \| 'accent-yellow-200' \| 'accent-yellow-300' \| 'accent-yellow-400' \| 'accent-yellow-500' \| 'accent-yellow-600' \| 'accent-yellow-700' \| 'accent-yellow-800' \| 'accent-yellow-900' \| 'accent-orange-50' \| 'accent-orange-100' \| 'accent-orange-200' \| 'accent-orange-300' \| 'accent-orange-400' \| 'accent-orange-500' \| 'accent-orange-600' \| 'accent-orange-700' \| 'accent-orange-800' \| 'accent-orange-900' \| 'black' \| 'white'` | | |
|
|
493
|
+
| `textDecoration` | `TextDecoration<string \| number>` | | |
|
|
494
|
+
| `textAlign` | `TextAlign` | | |
|
|
495
|
+
| `wordBreak` | `WordBreak` | | |
|
|
496
|
+
| `whiteSpace` | `WhiteSpace` | | |
|
|
497
|
+
| `as` | `'h1' \| 'h2' \| 'h3' \| 'h4' \| 'h5' \| 'h6' \| 'p' \| 'span' \| 'strong'` | | |
|
|
498
|
+
|
|
499
|
+
이 밖에 React·HTML 기본 속성 265개를 받는다.
|
|
500
|
+
|
|
501
|
+
## Tooltip
|
|
502
|
+
|
|
503
|
+
```ts
|
|
504
|
+
import { Tooltip } from '@nurihaus/web-design-system/tooltip'; // 이 컴포넌트만 싣는다 (권장)
|
|
505
|
+
import { Tooltip } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
**언제 쓴다.** 아이콘이나 짧은 라벨에 마우스를 올렸을 때 짧은 설명을 띄울 때 쓴다. `trigger`에는 DOM 요소 하나(예: `<span>`)를 넘기고 `direction`으로 뜨는 방향을 고른다. 조건이 맞을 때만 띄우려면 `open`을 제어하지 말고 `disabled`를 쓴다(예: 사이드바가 접혔을 때만 `disabled={!collapsed}`). `disabled`이면 `trigger`만 그려 툴팁이 열린 채 남지 않는다.
|
|
509
|
+
|
|
510
|
+
**쓰지 않는다.** 툴팁 안에 링크나 버튼처럼 클릭할 내용을 넣지 않는다. 툴팁 위로 마우스를 옮기면 닫힌다. 배지에 설명을 붙일 때는 OptionBadge, IconTextBadge의 `tooltip` prop을 쓴다.
|
|
511
|
+
|
|
512
|
+
```tsx
|
|
513
|
+
<Tooltip trigger={<span>도움말</span>} content="최근 30일 기준입니다." direction="top" disabled={false} />
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
### props
|
|
517
|
+
|
|
518
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
519
|
+
| --- | --- | --- | --- |
|
|
520
|
+
| `trigger` | `ReactNode` | 예 | |
|
|
521
|
+
| `content` | `ReactNode` | 예 | |
|
|
522
|
+
| `direction` | `'bottom' \| 'left' \| 'right' \| 'top'` | | `'bottom'` |
|
|
523
|
+
| `disabled` | `boolean` | | `false` |
|
|
524
|
+
| `defaultOpen` | `boolean` | | |
|
|
525
|
+
| `open` | `boolean` | | |
|
|
526
|
+
| `onOpenChange` | `((open: boolean) => void)` | | |
|
|
527
|
+
| `delayDuration` | `number` | | |
|
|
528
|
+
| `disableHoverableContent` | `boolean` | | |
|
|
529
|
+
|
|
530
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
531
|
+
|
|
532
|
+
## TooltipProvider
|
|
533
|
+
|
|
534
|
+
```ts
|
|
535
|
+
import { TooltipProvider } from '@nurihaus/web-design-system/tooltip'; // 이 컴포넌트만 싣는다 (권장)
|
|
536
|
+
import { TooltipProvider } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
**언제 쓴다.** 툴팁이 여러 개 모인 영역(사이드바, 툴바)을 감싼다. 하나를 보고 옆으로 옮기면 `skipDelayDuration` 동안은 지연 없이 바로 뜬다. 앱 루트에 한 번 두어도 된다. 안에 있는 Tooltip과 배지 툴팁은 이 Provider를 같이 쓴다. `delayDuration` 기본값은 100ms다.
|
|
540
|
+
|
|
541
|
+
**쓰지 않는다.** 툴팁이 하나뿐이면 감싸지 않는다. Tooltip은 Provider 없이도 동작한다.
|
|
542
|
+
|
|
543
|
+
```tsx
|
|
544
|
+
<TooltipProvider skipDelayDuration={300}>
|
|
545
|
+
<Tooltip trigger={<span>대시보드</span>} content="대시보드" direction="right" />
|
|
546
|
+
<Tooltip trigger={<span>사용자</span>} content="사용자" direction="right" />
|
|
547
|
+
</TooltipProvider>
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
### props
|
|
551
|
+
|
|
552
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
553
|
+
| --- | --- | --- | --- |
|
|
554
|
+
| `children` | `ReactNode` | 예 | |
|
|
555
|
+
| `delayDuration` | `number` | | `100` |
|
|
556
|
+
| `skipDelayDuration` | `number` | | |
|
|
557
|
+
| `disableHoverableContent` | `boolean` | | |
|
|
558
|
+
|
|
559
|
+
## Tabs
|
|
560
|
+
|
|
561
|
+
```ts
|
|
562
|
+
import { Tabs } from '@nurihaus/web-design-system/tabs'; // 이 컴포넌트만 싣는다 (권장)
|
|
563
|
+
import { Tabs } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
**언제 쓴다.** 같은 화면 안에서 여러 패널 중 하나를 골라 보여줄 때 쓴다. `items`의 각 항목이 탭 라벨과 패널 내용을 함께 가지며, `defaultValue`나 `value`를 주지 않으면 처음에 어떤 탭도 선택되지 않는다.
|
|
567
|
+
|
|
568
|
+
**쓰지 않는다.** 다른 페이지로 이동하는 내비게이션은 CollapsibleMenu를 쓴다. 폼에서 값 하나를 고르는 입력은 Radio를 쓴다.
|
|
569
|
+
|
|
570
|
+
```tsx
|
|
571
|
+
<Tabs
|
|
572
|
+
variant="underline"
|
|
573
|
+
defaultValue="info"
|
|
574
|
+
items={[
|
|
575
|
+
{ id: 'info', label: '기본 정보', content: <div>기본 정보 패널</div> },
|
|
576
|
+
{ id: 'history', label: '변경 이력', content: <div>변경 이력 패널</div> },
|
|
577
|
+
]}
|
|
578
|
+
/>
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
### props
|
|
582
|
+
|
|
583
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
584
|
+
| --- | --- | --- | --- |
|
|
585
|
+
| `items` | `TabsItem[]` | 예 | |
|
|
586
|
+
| `variant` | `'underline' \| 'filled'` | | `'underline'` |
|
|
587
|
+
| `value` | `TabsValue` | | |
|
|
588
|
+
| `defaultValue` | `TabsValue` | | |
|
|
589
|
+
| `onValueChange` | `((id: TabsValue) => void)` | | |
|
|
590
|
+
| `className` | `string` | | |
|
|
591
|
+
| `style` | `CSSProperties` | | |
|
|
592
|
+
|
|
593
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
594
|
+
|
|
595
|
+
## ModalWithDoubleButton
|
|
596
|
+
|
|
597
|
+
```ts
|
|
598
|
+
import { ModalWithDoubleButton } from '@nurihaus/web-design-system/modal-with-double-button'; // 이 컴포넌트만 싣는다 (권장)
|
|
599
|
+
import { ModalWithDoubleButton } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
**언제 쓴다.** 삭제 확인처럼 제목, 설명, 버튼 두 개로 된 확인 대화상자에 쓴다. `ModalWithDoubleButton.Row`는 버튼을 가로로, `ModalWithDoubleButton.Column`은 세로로 배치하며, `left`와 `right`는 CTAButton props를 그대로 받는다.
|
|
603
|
+
|
|
604
|
+
**쓰지 않는다.** `open` prop이 없고 렌더되는 동안 항상 보이므로, 표시 여부는 부모가 조건부 렌더링으로 정하고 버튼 `onClick`에서 언마운트한다. `showCloseIcon`의 X 아이콘은 클릭해도 동작이 없으므로 닫기 수단으로 쓰지 않는다. 버튼이 하나이거나 세 개 이상인 모달은 이 라이브러리에 없다.
|
|
605
|
+
|
|
606
|
+
```tsx
|
|
607
|
+
<ModalWithDoubleButton.Row
|
|
608
|
+
title="항목을 삭제할까요?"
|
|
609
|
+
subTitle="삭제하면 되돌릴 수 없습니다."
|
|
610
|
+
left={{ text: '취소', onClick: () => {} }}
|
|
611
|
+
right={{ text: '삭제', variant: 'primary', onClick: () => {} }}
|
|
612
|
+
/>
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
### ModalWithDoubleButton.Row props
|
|
616
|
+
|
|
617
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
618
|
+
| --- | --- | --- | --- |
|
|
619
|
+
| `title` | `string` | | |
|
|
620
|
+
| `subTitle` | `ReactNode` | | |
|
|
621
|
+
| `titleIcon` | `ReactNode` | | |
|
|
622
|
+
| `content` | `ReactNode` | | |
|
|
623
|
+
| `showCloseIcon` | `boolean` | | |
|
|
624
|
+
| `showTitleLine` | `boolean` | | |
|
|
625
|
+
| `left` | `CTAButtonProps` | 예 | |
|
|
626
|
+
| `right` | `CTAButtonProps` | 예 | |
|
|
627
|
+
| `size` | `'s' \| 'm' \| 'l'` | | `'m'` |
|
|
628
|
+
|
|
629
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
630
|
+
|
|
631
|
+
### ModalWithDoubleButton.Column props
|
|
632
|
+
|
|
633
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
634
|
+
| --- | --- | --- | --- |
|
|
635
|
+
| `title` | `string` | | |
|
|
636
|
+
| `subTitle` | `ReactNode` | | |
|
|
637
|
+
| `titleIcon` | `ReactNode` | | |
|
|
638
|
+
| `content` | `ReactNode` | | |
|
|
639
|
+
| `showCloseIcon` | `boolean` | | |
|
|
640
|
+
| `showTitleLine` | `boolean` | | |
|
|
641
|
+
| `left` | `CTAButtonProps` | 예 | |
|
|
642
|
+
| `right` | `CTAButtonProps` | 예 | |
|
|
643
|
+
| `size` | `'s' \| 'm' \| 'l'` | | `'m'` |
|
|
644
|
+
|
|
645
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
646
|
+
|
|
647
|
+
## Spinner
|
|
648
|
+
|
|
649
|
+
```ts
|
|
650
|
+
import { Spinner } from '@nurihaus/web-design-system/loading'; // 이 컴포넌트만 싣는다 (권장)
|
|
651
|
+
import { Spinner } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
**언제 쓴다.** 20px 고정 크기의 회전 표시만 필요할 때 쓴다. 작은 영역이나 다른 요소 옆에 붙인다. 링 색은 CSS `color` 를 따르고 기본은 `grey-scale-200` 이다. 색 prop 은 없다. 다른 색은 `className` 이나 `style` 로 `color` 를 준다(감싸는 요소의 color 는 물려받지 않는다).
|
|
655
|
+
|
|
656
|
+
**쓰지 않는다.** 버튼 로딩은 CTAButton의 `loading`을 쓴다(내부에서 Spinner를 그린다). 크기나 가로 정렬을 정해야 하면 InlineLoading을, 화면 전체를 막아야 하면 OverlayLoading을 쓴다.
|
|
657
|
+
|
|
658
|
+
```tsx
|
|
659
|
+
<Spinner style={{ color: 'var(--color-grey-scale-400)' }} />
|
|
660
|
+
```
|
|
661
|
+
|
|
662
|
+
### props
|
|
663
|
+
|
|
664
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
665
|
+
| --- | --- | --- | --- |
|
|
666
|
+
| `className` | `string` | | |
|
|
667
|
+
| `style` | `CSSProperties` | | |
|
|
668
|
+
|
|
669
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
670
|
+
|
|
671
|
+
## InlineLoading
|
|
672
|
+
|
|
673
|
+
```ts
|
|
674
|
+
import { InlineLoading } from '@nurihaus/web-design-system/loading'; // 이 컴포넌트만 싣는다 (권장)
|
|
675
|
+
import { InlineLoading } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
676
|
+
```
|
|
677
|
+
|
|
678
|
+
**언제 쓴다.** 목록이나 카드 영역 안에서 데이터를 불러오는 동안 그 자리에 표시할 때 쓴다. `size`(px)로 크기를, `justifyContent`로 가로 정렬을 정한다. 링 색은 Spinner 와 같이 `className`·`style` 의 `color` 로 바꾼다.
|
|
679
|
+
|
|
680
|
+
**쓰지 않는다.** 로딩 중 다른 조작을 막아야 하면 OverlayLoading을 쓴다. 버튼 안 로딩은 CTAButton의 `loading`을 쓴다.
|
|
681
|
+
|
|
682
|
+
```tsx
|
|
683
|
+
<InlineLoading size={24} justifyContent="center" />
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
### props
|
|
687
|
+
|
|
688
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
689
|
+
| --- | --- | --- | --- |
|
|
690
|
+
| `size` | `number` | 예 | |
|
|
691
|
+
| `justifyContent` | `'center' \| 'flex-start' \| 'flex-end' \| 'space-between'` | | `'flex-start'` |
|
|
692
|
+
| `className` | `string` | | |
|
|
693
|
+
| `style` | `CSSProperties` | | |
|
|
694
|
+
|
|
695
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
696
|
+
|
|
697
|
+
## OverlayLoading
|
|
698
|
+
|
|
699
|
+
```ts
|
|
700
|
+
import { OverlayLoading } from '@nurihaus/web-design-system/loading'; // 이 컴포넌트만 싣는다 (권장)
|
|
701
|
+
import { OverlayLoading } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
702
|
+
```
|
|
703
|
+
|
|
704
|
+
**언제 쓴다.** 저장이나 업로드처럼 끝날 때까지 화면 전체 조작을 막아야 할 때 쓴다. 화면 전체를 반투명 배경으로 덮고 가운데에 스피너와 `message`를 표시하며, `open`이 false면 아무것도 렌더하지 않는다. 스피너 색은 `className` 을 주고 `.my-overlay .base-spinner { color: … }` 처럼 바꾼다.
|
|
705
|
+
|
|
706
|
+
**쓰지 않는다.** 화면 일부만 로딩 중이면 InlineLoading을, 버튼 하나만 로딩 중이면 CTAButton의 `loading`을 쓴다.
|
|
707
|
+
|
|
708
|
+
```tsx
|
|
709
|
+
<OverlayLoading open={true} message="저장 중입니다" />
|
|
710
|
+
```
|
|
711
|
+
|
|
712
|
+
### props
|
|
713
|
+
|
|
714
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
715
|
+
| --- | --- | --- | --- |
|
|
716
|
+
| `open` | `boolean` | | `true` |
|
|
717
|
+
| `message` | `string` | | |
|
|
718
|
+
| `backdropOpacity` | `number` | | `0.6` |
|
|
719
|
+
| `zIndex` | `number` | | `1200` |
|
|
720
|
+
| `className` | `string` | | |
|
|
721
|
+
| `style` | `CSSProperties` | | |
|
|
722
|
+
|
|
723
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
724
|
+
|
|
725
|
+
## 아직 없는 것
|
|
726
|
+
|
|
727
|
+
아래는 디자인 시스템에 없다. 비슷한 이름의 컴포넌트를 지어내 import 하지 않는다.
|
|
728
|
+
|
|
729
|
+
| 필요한 것 | 지금 있는 것 |
|
|
730
|
+
| --- | --- |
|
|
731
|
+
| 페이지네이션 | 없음 |
|
|
732
|
+
| 토스트·스낵바 | 없음 |
|
|
733
|
+
| 스위치(토글) | 없음. 켜고 끄는 값은 Checkbox |
|
|
734
|
+
| 여러 줄 입력(textarea) | 없음. TextField 는 한 줄 `<input>` 이다 |
|
|
735
|
+
| 날짜 선택 | 없음 |
|
|
736
|
+
| 드로어·사이드 패널 | 없음 |
|
|
737
|
+
| 스켈레톤 | 없음. 불러오는 중에는 InlineLoading |
|
|
738
|
+
| 브레드크럼 | 없음 |
|
|
739
|
+
| 아이콘 세트 | 없음. 패키지 안 아이콘은 컴포넌트 내부용이라 내보내지 않는다 |
|
|
740
|
+
| 확인용이 아닌 일반 모달 | 없음. 버튼 두 개짜리 확인 모달 ModalWithDoubleButton 만 있다 |
|
|
741
|
+
|
|
742
|
+
없는 것이 필요하면 쓰는 쪽 저장소에서 `tokens.md` 의 변수로 만든다. 그리고 디자인 시스템에 추가할 후보라고 알린다.
|