@nurihaus/web-design-system 3.7.0 → 3.8.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 +15 -4
- package/dist/ai/components.md +616 -10
- package/dist/ai/motion.md +429 -0
- package/dist/ai/tokens.md +90 -4
- package/dist/avatar.js +5 -3
- package/dist/bottom-bar.js +261 -0
- package/dist/bottom-nav.js +10 -57
- package/dist/breadcrumb.js +7 -5
- package/dist/callout.js +5 -3
- package/dist/card.js +278 -0
- package/dist/check-box.js +7 -5
- package/dist/chip-group.js +6 -4
- package/dist/chunk-3274.js +71 -0
- package/dist/chunk-345.js +72 -0
- package/dist/chunk-3547.js +56 -0
- package/dist/chunk-6459.js +107 -0
- package/dist/{chunk-6364.js → chunk-7335.js} +2 -67
- package/dist/chunk-7653.js +4 -0
- package/dist/chunk-910.js +17 -6
- package/dist/chunk-9497.js +66 -0
- package/dist/collapsible-menu.js +6 -4
- package/dist/components/badge/badge-props.d.ts +4 -4
- package/dist/components/badge/badge.stories.d.ts +1 -1
- package/dist/components/bottom-bar/base-bottom-bar.d.ts +4 -0
- package/dist/components/bottom-bar/bottom-bar-props.d.ts +1 -0
- package/dist/components/bottom-bar/bottom-bar-type.d.ts +3 -0
- package/dist/components/bottom-bar/bottom-bar.d.ts +6 -0
- package/dist/components/bottom-bar/bottom-bar.stories.d.ts +282 -0
- package/dist/components/button/button-type.d.ts +3 -1
- package/dist/components/button/button.stories.d.ts +1 -0
- package/dist/components/card/base-card.d.ts +3 -0
- package/dist/components/card/card-props.d.ts +9 -0
- package/dist/components/card/card-type.d.ts +8 -0
- package/dist/components/card/card.d.ts +5 -0
- package/dist/components/card/card.stories.d.ts +24 -0
- package/dist/components/description-list/base-description-list.d.ts +4 -0
- package/dist/components/description-list/description-list-props.d.ts +1 -0
- package/dist/components/description-list/description-list-type.d.ts +13 -0
- package/dist/components/description-list/description-list.d.ts +5 -0
- package/dist/components/description-list/description-list.stories.d.ts +20 -0
- package/dist/components/empty-state/base-empty-state.d.ts +4 -0
- package/dist/components/empty-state/empty-state-props.d.ts +10 -0
- package/dist/components/empty-state/empty-state-type.d.ts +14 -0
- package/dist/components/empty-state/empty-state.d.ts +5 -0
- package/dist/components/empty-state/empty-state.stories.d.ts +300 -0
- package/dist/components/icon/icon-paths.d.ts +4 -0
- package/dist/components/icon/icon.stories.d.ts +1 -1
- package/dist/components/list/base-list.d.ts +7 -0
- package/dist/components/list/list-group.d.ts +5 -0
- package/dist/components/list/list-group.stories.d.ts +14 -0
- package/dist/components/list/list-props.d.ts +2 -0
- package/dist/components/list/list-row.d.ts +5 -0
- package/dist/components/list/list-row.stories.d.ts +304 -0
- package/dist/components/list/list-type.d.ts +25 -0
- package/dist/components/media/base-media.d.ts +16 -0
- package/dist/components/media/media-props.d.ts +5 -0
- package/dist/components/media/media-thumbnail.d.ts +4 -0
- package/dist/components/media/media-thumbnail.stories.d.ts +34 -0
- package/dist/components/media/media-type.d.ts +43 -0
- package/dist/components/media/media-viewer.d.ts +4 -0
- package/dist/components/media/media-viewer.stories.d.ts +24 -0
- package/dist/components/message/base-message.d.ts +11 -0
- package/dist/components/message/message-event.d.ts +6 -0
- package/dist/components/message/message-props.d.ts +17 -0
- package/dist/components/message/message-thread.d.ts +6 -0
- package/dist/components/message/message-type.d.ts +21 -0
- package/dist/components/message/message.d.ts +5 -0
- package/dist/components/message/message.stories.d.ts +313 -0
- package/dist/components/message-composer/base-message-composer.d.ts +11 -0
- package/dist/components/message-composer/message-composer-props.d.ts +1 -0
- package/dist/components/message-composer/message-composer-type.d.ts +27 -0
- package/dist/components/message-composer/message-composer.d.ts +5 -0
- package/dist/components/message-composer/message-composer.stories.d.ts +44 -0
- package/dist/components/motion/motion-provider.d.ts +5 -0
- package/dist/components/motion/motion-type.d.ts +6 -0
- package/dist/components/motion/motion.d.ts +2 -0
- package/dist/components/motion/motion.stories.d.ts +23 -0
- package/dist/components/notice/base-notice.d.ts +4 -0
- package/dist/components/notice/notice-props.d.ts +16 -0
- package/dist/components/notice/notice-type.d.ts +19 -0
- package/dist/components/notice/notice.d.ts +5 -0
- package/dist/components/notice/notice.stories.d.ts +304 -0
- package/dist/components/radio/base-radio.d.ts +2 -1
- package/dist/components/radio/radio-props.d.ts +9 -1
- package/dist/components/radio/radio-type.d.ts +9 -0
- package/dist/components/radio/radio.stories.d.ts +10 -0
- package/dist/components/skeleton/skeleton.stories.d.ts +7 -7
- package/dist/components/tag/base-tag.d.ts +8 -0
- package/dist/components/tag/tag-props.d.ts +1 -0
- package/dist/components/tag/tag-type.d.ts +20 -0
- package/dist/components/tag/tag.d.ts +4 -0
- package/dist/components/tag/tag.stories.d.ts +14 -0
- package/dist/components/toast/toast.stories.d.ts +12 -12
- package/dist/components.css +1234 -171
- package/dist/cta-button.js +27 -14
- package/dist/data-table.js +5 -3
- package/dist/description-list.js +274 -0
- package/dist/drawer.js +7 -5
- package/dist/drop-down.js +8 -6
- package/dist/empty-state.js +300 -0
- package/dist/icon-text-badge.js +11 -9
- package/dist/icon-text-option-badge.js +8 -6
- package/dist/icon.js +7 -4
- package/dist/index.d.ts +28 -2
- package/dist/index.js +2297 -228
- package/dist/list-group.js +253 -0
- package/dist/list-row.js +302 -0
- package/dist/loading.js +6 -4
- package/dist/media-thumbnail.js +412 -0
- package/dist/media-viewer.js +274 -0
- package/dist/message-composer.js +395 -0
- package/dist/message-event.js +216 -0
- package/dist/message-thread.js +216 -0
- package/dist/message.js +271 -0
- package/dist/modal-with-double-button.js +11 -9
- package/dist/modal.js +9 -7
- package/dist/motion.js +52 -0
- package/dist/notice.js +342 -0
- package/dist/option-badge.js +11 -9
- package/dist/pagination.js +8 -6
- package/dist/radio.js +114 -30
- package/dist/skeleton.js +4 -2
- package/dist/step-progress.js +4 -2
- package/dist/styles.css +1124 -122
- package/dist/switch.js +6 -4
- package/dist/tabs.js +5 -3
- package/dist/tag.js +311 -0
- package/dist/text-area.js +8 -6
- package/dist/text-field.js +8 -6
- package/dist/text.js +5 -3
- package/dist/toast.js +12 -10
- package/dist/tokens/generated/index.d.ts +1 -0
- package/dist/tokens/generated/motion.d.ts +153 -0
- package/dist/tokens.css +117 -2
- package/dist/tokens.js +156 -1
- package/dist/tooltip.js +6 -4
- package/package.json +63 -1
package/dist/ai/components.md
CHANGED
|
@@ -45,10 +45,15 @@ import '@nurihaus/web-design-system/components.css';
|
|
|
45
45
|
| Breadcrumb | 현재 위치가 아닌 링크를 누를 때 | `navigate` | 항목 `id` |
|
|
46
46
|
| CollapsibleMenu | 링크·버튼 항목을 고를 때. 그룹 여닫기는 보내지 않는다 | `navigate` | 항목 `key` |
|
|
47
47
|
| Toast · Tooltip | 뜰 때 | `show` | 없음 |
|
|
48
|
+
| ListRow | 링크 행·`onClick` 행을 누를 때. 보기만 하는 행은 보내지 않는다 | `navigate`(링크) · `click`(버튼) | 없음 |
|
|
49
|
+
| Tag | 지우기 버튼을 누를 때 | `click` | 없음 |
|
|
50
|
+
| MessageComposer | 보내기가 실제로 될 때. 막힌 보내기는 보내지 않는다 | `click` | 없음 |
|
|
51
|
+
| MediaThumbnail | 눌러서 보기를 열 때 | `open` | 없음 |
|
|
52
|
+
| MediaViewer | 열고 닫을 때 | `open` · `close` | 없음 |
|
|
48
53
|
|
|
49
54
|
`value` 에는 개발자가 정한 id 만 들어가고 사용자가 입력한 글자는 들어가지 않는다. TextField · TextArea 가 값을 싣지 않는 것도 그래서다. 더 붙일 값은 `trackProps` 로 준다. `LogProvider` 가 없거나 `track` 이 없으면 아무것도 보내지 않는다. 컴포넌트 밖의 로그(화면 진입 등)는 `useLog` 를 쓴다.
|
|
50
55
|
|
|
51
|
-
Avatar · OptionBadge · IconTextBadge · IconTextOptionBadge · Skeleton · Text · Icon · StepProgress · Spinner · InlineLoading · OverlayLoading
|
|
56
|
+
Avatar · OptionBadge · IconTextBadge · IconTextOptionBadge · Skeleton · Text · Icon · StepProgress · Spinner · InlineLoading · OverlayLoading · ListGroup · DescriptionList · EmptyState · MessageThread · Message · MessageEvent · BottomBar 는 상호작용 핸들러가 없어 `track` 을 받지 않는다. Card 도 받지 않는다 — 누르는 카드는 asChild 로 넘긴 링크·버튼이 로그를 맡는다. ModalWithDoubleButton 은 `left` · `right` 가 CTAButton props 라 거기에 `track` 을 준다. Notice 는 `action` 에 `track` 을 주면 그 버튼(CTAButton)이 보낸다. EmptyState 의 버튼은 넘긴 CTAButton 에 준다.
|
|
52
57
|
|
|
53
58
|
**없는 것은 지어내지 않는다.** 이 문서 끝의 "아직 없는 것" 표에 있는 컴포넌트는 없다. 없는 prop · variant · 토큰 이름도 만들지 않는다. 틀린 variant 나 size 값은 타입 오류가 난다.
|
|
54
59
|
|
|
@@ -87,7 +92,22 @@ Avatar · OptionBadge · IconTextBadge · IconTextOptionBadge · Skeleton · Tex
|
|
|
87
92
|
- [BottomNav](#bottomnav)
|
|
88
93
|
- [StepProgress](#stepprogress)
|
|
89
94
|
- [ChipGroup](#chipgroup)
|
|
95
|
+
- [Card](#card)
|
|
96
|
+
- [ListGroup](#listgroup)
|
|
97
|
+
- [ListRow](#listrow)
|
|
98
|
+
- [DescriptionList](#descriptionlist)
|
|
99
|
+
- [Notice](#notice)
|
|
100
|
+
- [EmptyState](#emptystate)
|
|
101
|
+
- [Tag](#tag)
|
|
102
|
+
- [MessageThread](#messagethread)
|
|
103
|
+
- [Message](#message)
|
|
104
|
+
- [MessageEvent](#messageevent)
|
|
105
|
+
- [MessageComposer](#messagecomposer)
|
|
106
|
+
- [BottomBar](#bottombar)
|
|
107
|
+
- [MediaThumbnail](#mediathumbnail)
|
|
108
|
+
- [MediaViewer](#mediaviewer)
|
|
90
109
|
- [LogProvider](#logprovider)
|
|
110
|
+
- [MotionProvider](#motionprovider)
|
|
91
111
|
|
|
92
112
|
## Avatar
|
|
93
113
|
|
|
@@ -104,6 +124,8 @@ import { Avatar } from '@nurihaus/web-design-system'; // 루트. 첫
|
|
|
104
124
|
<Avatar size="m" src="https://placehold.co/80x80" alt="프로필 이미지" />
|
|
105
125
|
```
|
|
106
126
|
|
|
127
|
+
**모션.** 없음. onClick 을 받지 않는 표시용 이미지다. 누를 수 있게 하려면 쓰는 쪽이 버튼으로 감싸고 그 버튼이 press 를 받는다.
|
|
128
|
+
|
|
107
129
|
### props
|
|
108
130
|
|
|
109
131
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -124,7 +146,7 @@ import { CTAButton } from '@nurihaus/web-design-system/cta-button'; // 이 컴
|
|
|
124
146
|
import { CTAButton } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
125
147
|
```
|
|
126
148
|
|
|
127
|
-
**언제 쓴다.** 저장, 확인, 다음 단계처럼 사용자가 실행하는 동작 버튼에 쓴다. `variant`로 강조 단계를 고르고, `loading`이 true면 `text` 대신 Spinner가 표시된다. Google·Apple·Facebook 로그인 버튼은 `variant="social"`(흰 바탕·검정 글자, 공급자 가이드)에 공급자 로고를 `leftIcon`으로 준다. `callout`을 주면 버튼 오른쪽 위 모서리에 말풍선(Callout)을 끼운다(예: "최근 사용") — 버튼 글자는 움직이지 않고 자리는 DS 가 잡는다. 말풍선 글자도 버튼 안이라 버튼의 접근 가능한 이름에 이어진다(스크린 리더도 "최근 사용"을 듣는다).
|
|
149
|
+
**언제 쓴다.** 저장, 확인, 다음 단계처럼 사용자가 실행하는 동작 버튼에 쓴다. `variant`로 강조 단계를 고르고, `loading`이 true면 `text` 대신 Spinner가 표시된다. Google·Apple·Facebook 로그인 버튼은 `variant="social"`(흰 바탕·검정 글자, 공급자 가이드)에 공급자 로고를 `leftIcon`으로 준다. `callout`을 주면 버튼 오른쪽 위 모서리에 말풍선(Callout)을 끼운다(예: "최근 사용") — 버튼 글자는 움직이지 않고 자리는 DS 가 잡는다. 말풍선 글자도 버튼 안이라 버튼의 접근 가능한 이름에 이어진다(스크린 리더도 "최근 사용"을 듣는다). 다른 화면으로 옮겨 가는 버튼은 `asChild` 를 주고 링크 요소(`<a>`·라우터 Link) 하나를 children 으로 준다 — 그 링크가 버튼 모양이 되고 글자·아이콘은 링크 안에 들어간다. 링크에는 `loading` 을 쓰지 않는다.
|
|
128
150
|
|
|
129
151
|
**쓰지 않는다.** 확인과 취소 두 버튼을 가진 대화상자는 버튼을 직접 배치하지 말고 ModalWithDoubleButton을 쓴다. 화면 안의 패널 전환은 Tabs, 사이드 메뉴 항목은 CollapsibleMenu를 쓴다.
|
|
130
152
|
|
|
@@ -138,16 +160,23 @@ import { CTAButton } from '@nurihaus/web-design-system'; // 루트.
|
|
|
138
160
|
leftIcon={<img src="/icons/google.svg" alt="" />}
|
|
139
161
|
callout="최근 사용"
|
|
140
162
|
/>
|
|
163
|
+
<CTAButton asChild variant="primary" size="l" text="홈으로">
|
|
164
|
+
<a href="/" />
|
|
165
|
+
</CTAButton>
|
|
141
166
|
</>
|
|
142
167
|
```
|
|
143
168
|
|
|
169
|
+
**모션.** press · reject · appear(opt) · busy(`loading`). 토큰 값과 규칙은 `motion.md`.
|
|
170
|
+
|
|
144
171
|
### props
|
|
145
172
|
|
|
146
173
|
| prop | 타입 | 필수 | 기본값 |
|
|
147
174
|
| --- | --- | --- | --- |
|
|
175
|
+
| `asChild` | `boolean` | | |
|
|
148
176
|
| `size` | `'xs' \| 's' \| 'm' \| 'l' \| 'xl'` | | `'m'` |
|
|
149
177
|
| `track` | `string` | | |
|
|
150
178
|
| `text` | `ReactNode` | 예 | |
|
|
179
|
+
| `children` | `ReactNode` | | |
|
|
151
180
|
| `variant` | `'neutral' \| 'primary' \| 'outlined' \| 'secondary' \| 'ghost' \| 'confirm' \| 'social'` | | `'primary'` |
|
|
152
181
|
| `leftIcon` | `ReactNode` | | |
|
|
153
182
|
| `rightIcon` | `ReactNode` | | |
|
|
@@ -155,7 +184,7 @@ import { CTAButton } from '@nurihaus/web-design-system'; // 루트.
|
|
|
155
184
|
| `loading` | `boolean` | | |
|
|
156
185
|
| `trackProps` | `Record<string, string \| number \| boolean>` | | |
|
|
157
186
|
|
|
158
|
-
이 밖에 React·HTML 기본 속성
|
|
187
|
+
이 밖에 React·HTML 기본 속성 275개를 받는다.
|
|
159
188
|
|
|
160
189
|
## Callout
|
|
161
190
|
|
|
@@ -176,6 +205,8 @@ import { Callout } from '@nurihaus/web-design-system'; // 루트.
|
|
|
176
205
|
</>
|
|
177
206
|
```
|
|
178
207
|
|
|
208
|
+
**모션.** enter · attention. 토큰 값과 규칙은 `motion.md`.
|
|
209
|
+
|
|
179
210
|
### props
|
|
180
211
|
|
|
181
212
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -192,7 +223,7 @@ import { OptionBadge } from '@nurihaus/web-design-system/option-badge'; // 이
|
|
|
192
223
|
import { OptionBadge } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
193
224
|
```
|
|
194
225
|
|
|
195
|
-
**언제 쓴다.** 상태값이나 분류처럼 짧은 값 하나(`option`)를 라벨로 보여줄 때 쓴다. `variant`로 색을 고른다(`neutral`·`primary`·`danger`·`outlined`). 색 prop 은 없다. `tooltip`을 주면 마우스를 올렸을 때 설명이 뜬다. 대상에 붙어 늘 떠 있는 말풍선은 Callout 을 쓴다.
|
|
226
|
+
**언제 쓴다.** 상태값이나 분류처럼 짧은 값 하나(`option`)를 라벨로 보여줄 때 쓴다. `variant`로 색을 고른다(`neutral`·`primary`·`danger`·`success`·`warning`·`outlined`). 색 prop 은 없다. `tooltip`을 주면 마우스를 올렸을 때 설명이 뜬다. 대상에 붙어 늘 떠 있는 말풍선은 Callout 을 쓴다.
|
|
196
227
|
|
|
197
228
|
**쓰지 않는다.** 아이콘이 함께 필요하면 IconTextBadge를, 아이콘과 텍스트 오른쪽에 수치 같은 부가 값까지 붙여야 하면 IconTextOptionBadge를 쓴다. 클릭 동작이 필요한 요소에는 CTAButton을 쓴다.
|
|
198
229
|
|
|
@@ -200,11 +231,13 @@ import { OptionBadge } from '@nurihaus/web-design-system'; // 루트
|
|
|
200
231
|
<OptionBadge option="진행 중" variant="primary" size="s" width="fit-content" />
|
|
201
232
|
```
|
|
202
233
|
|
|
234
|
+
**모션.** attention(opt). 토큰 값과 규칙은 `motion.md`.
|
|
235
|
+
|
|
203
236
|
### props
|
|
204
237
|
|
|
205
238
|
| prop | 타입 | 필수 | 기본값 |
|
|
206
239
|
| --- | --- | --- | --- |
|
|
207
|
-
| `variant` | `'neutral' \| 'primary' \| 'danger' \| 'outlined'` | | `'neutral'` |
|
|
240
|
+
| `variant` | `'neutral' \| 'primary' \| 'danger' \| 'success' \| 'warning' \| 'outlined'` | | `'neutral'` |
|
|
208
241
|
| `width` | `string \| number` | | `'100%'` |
|
|
209
242
|
| `size` | `'xs' \| 's' \| 'm' \| 'l' \| 'xl'` | | `'xl'` |
|
|
210
243
|
| `option` | `ReactNode` | 예 | |
|
|
@@ -236,11 +269,13 @@ import { IconTextBadge } from '@nurihaus/web-design-system'; // 루
|
|
|
236
269
|
/>
|
|
237
270
|
```
|
|
238
271
|
|
|
272
|
+
**모션.** attention(opt). 토큰 값과 규칙은 `motion.md`.
|
|
273
|
+
|
|
239
274
|
### props
|
|
240
275
|
|
|
241
276
|
| prop | 타입 | 필수 | 기본값 |
|
|
242
277
|
| --- | --- | --- | --- |
|
|
243
|
-
| `variant` | `'neutral' \| 'primary' \| 'danger' \| 'outlined'` | | `'neutral'` |
|
|
278
|
+
| `variant` | `'neutral' \| 'primary' \| 'danger' \| 'success' \| 'warning' \| 'outlined'` | | `'neutral'` |
|
|
244
279
|
| `width` | `string \| number` | | `'100%'` |
|
|
245
280
|
| `size` | `'xs' \| 's' \| 'm' \| 'l' \| 'xl'` | | `'xl'` |
|
|
246
281
|
| `icon` | `ReactNode` | 예 | |
|
|
@@ -273,11 +308,13 @@ import { IconTextOptionBadge } from '@nurihaus/web-design-system'; /
|
|
|
273
308
|
/>
|
|
274
309
|
```
|
|
275
310
|
|
|
311
|
+
**모션.** attention(opt). 토큰 값과 규칙은 `motion.md`.
|
|
312
|
+
|
|
276
313
|
### props
|
|
277
314
|
|
|
278
315
|
| prop | 타입 | 필수 | 기본값 |
|
|
279
316
|
| --- | --- | --- | --- |
|
|
280
|
-
| `variant` | `'neutral' \| 'primary' \| 'danger' \| 'outlined'` | | `'neutral'` |
|
|
317
|
+
| `variant` | `'neutral' \| 'primary' \| 'danger' \| 'success' \| 'warning' \| 'outlined'` | | `'neutral'` |
|
|
281
318
|
| `width` | `string \| number` | | `'100%'` |
|
|
282
319
|
| `size` | `'xs' \| 's' \| 'm' \| 'l' \| 'xl'` | | `'xl'` |
|
|
283
320
|
| `icon` | `ReactNode` | 예 | |
|
|
@@ -317,6 +354,8 @@ import { DataTable } from '@nurihaus/web-design-system'; // 루트.
|
|
|
317
354
|
/>
|
|
318
355
|
```
|
|
319
356
|
|
|
357
|
+
**모션.** press · attention(opt). 토큰 값과 규칙은 `motion.md`.
|
|
358
|
+
|
|
320
359
|
### props
|
|
321
360
|
|
|
322
361
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -358,6 +397,8 @@ import { TextField } from '@nurihaus/web-design-system'; // 루트.
|
|
|
358
397
|
/>
|
|
359
398
|
```
|
|
360
399
|
|
|
400
|
+
**모션.** 없음. 텍스트 입력은 press 의 avoid 대상이다. 글자가 바뀌는 것은 선택이 아니라 confirm 도 아니다..
|
|
401
|
+
|
|
361
402
|
### props
|
|
362
403
|
|
|
363
404
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -387,9 +428,11 @@ import { Radio } from '@nurihaus/web-design-system'; // 루트. 첫
|
|
|
387
428
|
|
|
388
429
|
**언제 쓴다.** 몇 개의 선택지를 모두 펼쳐 보여주고 그중 하나만 고르게 할 때 쓴다. 선택 상태는 항상 부모가 가지므로 `onChange`에서 받은 id로 `selected`를 갱신해야 선택이 바뀐다.
|
|
389
430
|
|
|
431
|
+
`variant="chip"`이면 선택지를 칩으로 가로로 늘어놓는다. 폼 안에서 짧은 선택지 몇 개를 고를 때 쓴다. 처음에는 아무것도 고르지 않은 채로 둘 수 있다. `label`은 선택지 묶음의 `aria-label`이 된다.
|
|
432
|
+
|
|
390
433
|
`track`을 주면 선택지를 누를 때 `change`와 그 선택지 `id`를 `value`에 담아 사용 로그로 보낸다.
|
|
391
434
|
|
|
392
|
-
**쓰지 않는다.** 여러 개를 동시에 고르면 Checkbox를 쓴다. 선택지가 많아 모두 펼치기 어려우면 DropDown을 쓴다.
|
|
435
|
+
**쓰지 않는다.** 여러 개를 동시에 고르면 Checkbox를 쓴다. 선택지가 많아 모두 펼치기 어려우면 DropDown을 쓴다. 목록을 거르는 필터 칩은 ChipGroup을 쓴다(늘 하나가 골라져 있다).
|
|
393
436
|
|
|
394
437
|
```tsx
|
|
395
438
|
<Radio
|
|
@@ -403,10 +446,14 @@ import { Radio } from '@nurihaus/web-design-system'; // 루트. 첫
|
|
|
403
446
|
/>
|
|
404
447
|
```
|
|
405
448
|
|
|
449
|
+
**모션.** press · confirm. 토큰 값과 규칙은 `motion.md`.
|
|
450
|
+
|
|
406
451
|
### props
|
|
407
452
|
|
|
408
453
|
| prop | 타입 | 필수 | 기본값 |
|
|
409
454
|
| --- | --- | --- | --- |
|
|
455
|
+
| `variant` | `'default' \| 'chip'` | | `'default'` |
|
|
456
|
+
| `label` | `string` | | |
|
|
410
457
|
| `options` | `{ id: string; label: ReactNode; disabled?: boolean \| undefined; }[]` | 예 | |
|
|
411
458
|
| `selected` | `string \| null` | | |
|
|
412
459
|
| `onChange` | `((id: string \| null) => void)` | | |
|
|
@@ -432,6 +479,8 @@ import { Checkbox } from '@nurihaus/web-design-system'; // 루트.
|
|
|
432
479
|
<Checkbox id="agree-terms" label="약관에 동의합니다" checked={false} onChange={() => {}} />
|
|
433
480
|
```
|
|
434
481
|
|
|
482
|
+
**모션.** press · confirm. 토큰 값과 규칙은 `motion.md`.
|
|
483
|
+
|
|
435
484
|
### props
|
|
436
485
|
|
|
437
486
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -466,6 +515,8 @@ import { Switch } from '@nurihaus/web-design-system'; // 루트. 첫
|
|
|
466
515
|
<Switch id="push-alarm" label="푸시 알림 받기" checked={true} onChange={() => {}} />
|
|
467
516
|
```
|
|
468
517
|
|
|
518
|
+
**모션.** press · confirm. 토큰 값과 규칙은 `motion.md`.
|
|
519
|
+
|
|
469
520
|
### props
|
|
470
521
|
|
|
471
522
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -500,6 +551,8 @@ import { TextArea } from '@nurihaus/web-design-system'; // 루트.
|
|
|
500
551
|
<TextArea name="memo" title="메모" placeholder="내용을 입력하세요" rows={4} />
|
|
501
552
|
```
|
|
502
553
|
|
|
554
|
+
**모션.** 없음. 텍스트 입력은 press 의 avoid 대상이다. 글자가 바뀌는 것은 선택이 아니라 confirm 도 아니다.
|
|
555
|
+
|
|
503
556
|
### props
|
|
504
557
|
|
|
505
558
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -534,6 +587,8 @@ import { Toast } from '@nurihaus/web-design-system'; // 루트. 첫
|
|
|
534
587
|
<Toast open title="저장했습니다" description="변경 사항이 반영됐습니다." variant="success" onOpenChange={() => {}} />
|
|
535
588
|
```
|
|
536
589
|
|
|
590
|
+
**모션.** enter · exit. 토큰 값과 규칙은 `motion.md`.
|
|
591
|
+
|
|
537
592
|
### props
|
|
538
593
|
|
|
539
594
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -543,7 +598,7 @@ import { Toast } from '@nurihaus/web-design-system'; // 루트. 첫
|
|
|
543
598
|
| `title` | `ReactNode` | 예 | |
|
|
544
599
|
| `track` | `string` | | |
|
|
545
600
|
| `onPause` | `(() => void)` | | |
|
|
546
|
-
| `variant` | `'
|
|
601
|
+
| `variant` | `'success' \| 'warning' \| 'secondary' \| 'default' \| 'error'` | | `'default'` |
|
|
547
602
|
| `trackProps` | `Record<string, string \| number \| boolean>` | | |
|
|
548
603
|
| `onResume` | `(() => void)` | | |
|
|
549
604
|
| `open` | `boolean` | | |
|
|
@@ -573,6 +628,8 @@ import { ToastProvider } from '@nurihaus/web-design-system'; // 루
|
|
|
573
628
|
</ToastProvider>
|
|
574
629
|
```
|
|
575
630
|
|
|
631
|
+
**모션.** 없음. 토스트 자리(viewport)만 그린다. 모션은 각 Toast 가 받는다.
|
|
632
|
+
|
|
576
633
|
### props
|
|
577
634
|
|
|
578
635
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -599,6 +656,8 @@ import { Pagination } from '@nurihaus/web-design-system'; // 루트.
|
|
|
599
656
|
<Pagination totalPages={10} page={3} onPageChange={() => {}} />
|
|
600
657
|
```
|
|
601
658
|
|
|
659
|
+
**모션.** press. 토큰 값과 규칙은 `motion.md`.
|
|
660
|
+
|
|
602
661
|
### props
|
|
603
662
|
|
|
604
663
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -638,6 +697,8 @@ import { Modal } from '@nurihaus/web-design-system'; // 루트. 첫
|
|
|
638
697
|
</Modal>
|
|
639
698
|
```
|
|
640
699
|
|
|
700
|
+
**모션.** enter · exit. 토큰 값과 규칙은 `motion.md`.
|
|
701
|
+
|
|
641
702
|
### props
|
|
642
703
|
|
|
643
704
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -676,6 +737,8 @@ import { Drawer } from '@nurihaus/web-design-system'; // 루트. 첫
|
|
|
676
737
|
</Drawer>
|
|
677
738
|
```
|
|
678
739
|
|
|
740
|
+
**모션.** enter · exit. 토큰 값과 규칙은 `motion.md`.
|
|
741
|
+
|
|
679
742
|
### props
|
|
680
743
|
|
|
681
744
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -713,6 +776,8 @@ import { Skeleton } from '@nurihaus/web-design-system'; // 루트.
|
|
|
713
776
|
<Skeleton shape="text" lines={3} />
|
|
714
777
|
```
|
|
715
778
|
|
|
779
|
+
**모션.** busy(`animated`). 토큰 값과 규칙은 `motion.md`.
|
|
780
|
+
|
|
716
781
|
### props
|
|
717
782
|
|
|
718
783
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -748,6 +813,8 @@ import { Breadcrumb } from '@nurihaus/web-design-system'; // 루트.
|
|
|
748
813
|
/>
|
|
749
814
|
```
|
|
750
815
|
|
|
816
|
+
**모션.** press. 토큰 값과 규칙은 `motion.md`.
|
|
817
|
+
|
|
751
818
|
### props
|
|
752
819
|
|
|
753
820
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -790,6 +857,8 @@ import { DropDown } from '@nurihaus/web-design-system'; // 루트.
|
|
|
790
857
|
/>
|
|
791
858
|
```
|
|
792
859
|
|
|
860
|
+
**모션.** press · enter · exit · expand. 토큰 값과 규칙은 `motion.md`.
|
|
861
|
+
|
|
793
862
|
### props
|
|
794
863
|
|
|
795
864
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -860,6 +929,8 @@ import Link from 'next/link';
|
|
|
860
929
|
/>
|
|
861
930
|
```
|
|
862
931
|
|
|
932
|
+
**모션.** press · expand. 토큰 값과 규칙은 `motion.md`.
|
|
933
|
+
|
|
863
934
|
### props
|
|
864
935
|
|
|
865
936
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -894,6 +965,8 @@ import { Text } from '@nurihaus/web-design-system'; // 루트. 첫
|
|
|
894
965
|
<Text as="h2" text="캠페인 목록" size="xl" weight="bold" color="grey-scale-900" />
|
|
895
966
|
```
|
|
896
967
|
|
|
968
|
+
**모션.** 없음. 글자만 그린다.
|
|
969
|
+
|
|
897
970
|
### props
|
|
898
971
|
|
|
899
972
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -927,6 +1000,8 @@ import { Tooltip } from '@nurihaus/web-design-system'; // 루트.
|
|
|
927
1000
|
<Tooltip trigger={<span>도움말</span>} content="최근 30일 기준입니다." direction="top" disabled={false} />
|
|
928
1001
|
```
|
|
929
1002
|
|
|
1003
|
+
**모션.** enter · exit. 토큰 값과 규칙은 `motion.md`.
|
|
1004
|
+
|
|
930
1005
|
### props
|
|
931
1006
|
|
|
932
1007
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -963,6 +1038,8 @@ import { TooltipProvider } from '@nurihaus/web-design-system'; //
|
|
|
963
1038
|
</TooltipProvider>
|
|
964
1039
|
```
|
|
965
1040
|
|
|
1041
|
+
**모션.** 없음. DOM 을 그리지 않는다. 지연 시간만 나눠 준다.
|
|
1042
|
+
|
|
966
1043
|
### props
|
|
967
1044
|
|
|
968
1045
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -994,6 +1071,8 @@ import { Tabs } from '@nurihaus/web-design-system'; // 루트. 첫
|
|
|
994
1071
|
/>
|
|
995
1072
|
```
|
|
996
1073
|
|
|
1074
|
+
**모션.** press · progress. 토큰 값과 규칙은 `motion.md`.
|
|
1075
|
+
|
|
997
1076
|
### props
|
|
998
1077
|
|
|
999
1078
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -1045,6 +1124,8 @@ import { ModalWithDoubleButton } from '@nurihaus/web-design-system';
|
|
|
1045
1124
|
/>
|
|
1046
1125
|
```
|
|
1047
1126
|
|
|
1127
|
+
**모션.** enter · exit. 토큰 값과 규칙은 `motion.md`.
|
|
1128
|
+
|
|
1048
1129
|
### ModalWithDoubleButton.Row props
|
|
1049
1130
|
|
|
1050
1131
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -1096,6 +1177,8 @@ import { Spinner } from '@nurihaus/web-design-system'; // 루트.
|
|
|
1096
1177
|
<Spinner style={{ color: 'var(--color-grey-scale-400)' }} />
|
|
1097
1178
|
```
|
|
1098
1179
|
|
|
1180
|
+
**모션.** busy. 토큰 값과 규칙은 `motion.md`.
|
|
1181
|
+
|
|
1099
1182
|
### props
|
|
1100
1183
|
|
|
1101
1184
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -1120,6 +1203,8 @@ import { InlineLoading } from '@nurihaus/web-design-system'; // 루
|
|
|
1120
1203
|
<InlineLoading size={24} justifyContent="center" />
|
|
1121
1204
|
```
|
|
1122
1205
|
|
|
1206
|
+
**모션.** busy. 토큰 값과 규칙은 `motion.md`.
|
|
1207
|
+
|
|
1123
1208
|
### props
|
|
1124
1209
|
|
|
1125
1210
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -1146,6 +1231,8 @@ import { OverlayLoading } from '@nurihaus/web-design-system'; // 루
|
|
|
1146
1231
|
<OverlayLoading open={true} message="저장 중입니다" />
|
|
1147
1232
|
```
|
|
1148
1233
|
|
|
1234
|
+
**모션.** busy · enter · exit. 토큰 값과 규칙은 `motion.md`.
|
|
1235
|
+
|
|
1149
1236
|
### props
|
|
1150
1237
|
|
|
1151
1238
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -1186,13 +1273,15 @@ import { Icon } from '@nurihaus/web-design-system'; // 루트. 첫
|
|
|
1186
1273
|
<Icon name="x" size="m" label="닫기" />
|
|
1187
1274
|
```
|
|
1188
1275
|
|
|
1276
|
+
**모션.** 없음. 장식 그림이다. 모션은 감싸는 컴포넌트가 정한다.
|
|
1277
|
+
|
|
1189
1278
|
### props
|
|
1190
1279
|
|
|
1191
1280
|
| prop | 타입 | 필수 | 기본값 |
|
|
1192
1281
|
| --- | --- | --- | --- |
|
|
1193
1282
|
| `size` | `'xs' \| 's' \| 'm' \| 'l' \| 'xl'` | | `'l'` |
|
|
1194
1283
|
| `label` | `string` | | |
|
|
1195
|
-
| `name` | `'link' \| '
|
|
1284
|
+
| `name` | `'link' \| 'circle' \| 'image' \| 'warning' \| 'x' \| 'house' \| 'megaphone-simple' \| 'chats-circle' \| 'user-circle' \| 'bell' \| 'caret-left' \| 'magnifying-glass' \| 'dots-three' \| 'gear-six' \| 'chat-circle' \| 'paper-plane-tilt' \| 'plus' \| 'camera' \| 'video-camera' \| 'play' \| 'upload-simple' \| 'calendar-blank' \| 'clock' \| 'map-pin' \| 'truck' \| 'ticket' \| 'qr-code' \| 'sparkle' \| 'gift' \| 'wallet' \| 'bank' \| 'credit-card' \| 'check-circle' \| 'check' \| 'info' \| 'question' \| 'lock' \| 'pencil-simple' \| 'trash' \| 'copy' \| 'share-network' \| 'eye' \| 'sliders-horizontal' \| 'heart' \| 'star' \| 'globe' \| 'sign-out' \| 'caret-right' \| 'arrow-right' \| 'instagram-logo' \| 'tiktok-logo' \| 'youtube-logo'` | 예 | |
|
|
1196
1285
|
| `weight` | `'fill' \| 'regular'` | | |
|
|
1197
1286
|
|
|
1198
1287
|
이 밖에 React·HTML 기본 속성 474개를 받는다.
|
|
@@ -1235,6 +1324,8 @@ import Link from 'next/link';
|
|
|
1235
1324
|
/>
|
|
1236
1325
|
```
|
|
1237
1326
|
|
|
1327
|
+
**모션.** press · progress · appear(opt) · dismiss-on-scroll(opt). 토큰 값과 규칙은 `motion.md`.
|
|
1328
|
+
|
|
1238
1329
|
### props
|
|
1239
1330
|
|
|
1240
1331
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -1270,6 +1361,8 @@ import { StepProgress } from '@nurihaus/web-design-system'; // 루
|
|
|
1270
1361
|
/>
|
|
1271
1362
|
```
|
|
1272
1363
|
|
|
1364
|
+
**모션.** progress · reveal(opt). 토큰 값과 규칙은 `motion.md`.
|
|
1365
|
+
|
|
1273
1366
|
### props
|
|
1274
1367
|
|
|
1275
1368
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -1308,6 +1401,8 @@ import { ChipGroup } from '@nurihaus/web-design-system'; // 루트.
|
|
|
1308
1401
|
/>
|
|
1309
1402
|
```
|
|
1310
1403
|
|
|
1404
|
+
**모션.** press · confirm. 토큰 값과 규칙은 `motion.md`.
|
|
1405
|
+
|
|
1311
1406
|
### props
|
|
1312
1407
|
|
|
1313
1408
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -1324,6 +1419,488 @@ import { ChipGroup } from '@nurihaus/web-design-system'; // 루트.
|
|
|
1324
1419
|
|
|
1325
1420
|
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
1326
1421
|
|
|
1422
|
+
## Card
|
|
1423
|
+
|
|
1424
|
+
```ts
|
|
1425
|
+
import { Card } from '@nurihaus/web-design-system/card'; // 이 컴포넌트만 싣는다 (권장)
|
|
1426
|
+
import { Card } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1427
|
+
```
|
|
1428
|
+
|
|
1429
|
+
**언제 쓴다.** 목록이나 홈에서 내용 한 묶음을 흰 면(`variant="default"`) 또는 연보라 면(`variant="tinted"`)에 담을 때 쓴다. 안은 세로로 쌓이고 사이 간격은 정해져 있다. 누르면 다른 화면으로 가는 카드는 `asChild` 를 주고 링크 요소(`<a>`·라우터 Link) 하나를 children 으로 준다 — 그 링크가 카드가 되고 내용은 링크의 children 으로 쓴다. 링크·버튼 카드만 누를 때 살짝 줄어든다. `className`·`style` 은 루트(asChild 면 그 링크)에 붙는다.
|
|
1430
|
+
|
|
1431
|
+
**쓰지 않는다.** 설정·메뉴처럼 줄지어 놓이는 항목은 ListGroup 과 ListRow 를 쓴다. 이름과 값을 나란히 보여 주는 요약은 DescriptionList 를 쓴다.
|
|
1432
|
+
|
|
1433
|
+
```tsx
|
|
1434
|
+
<>
|
|
1435
|
+
<Card>
|
|
1436
|
+
<strong>여름 신제품 리뷰</strong>
|
|
1437
|
+
<span>마감 3일 남음</span>
|
|
1438
|
+
</Card>
|
|
1439
|
+
<Card asChild variant="tinted">
|
|
1440
|
+
<a href="/campaigns/1">
|
|
1441
|
+
<strong>여름 신제품 리뷰</strong>
|
|
1442
|
+
<span>마감 3일 남음</span>
|
|
1443
|
+
</a>
|
|
1444
|
+
</Card>
|
|
1445
|
+
</>
|
|
1446
|
+
```
|
|
1447
|
+
|
|
1448
|
+
**모션.** press · attention(opt). 토큰 값과 규칙은 `motion.md`.
|
|
1449
|
+
|
|
1450
|
+
### props
|
|
1451
|
+
|
|
1452
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
1453
|
+
| --- | --- | --- | --- |
|
|
1454
|
+
| `asChild` | `boolean` | | |
|
|
1455
|
+
| `variant` | `'default' \| 'tinted'` | | `'default'` |
|
|
1456
|
+
|
|
1457
|
+
이 밖에 React·HTML 기본 속성 266개를 받는다.
|
|
1458
|
+
|
|
1459
|
+
## ListGroup
|
|
1460
|
+
|
|
1461
|
+
```ts
|
|
1462
|
+
import { ListGroup } from '@nurihaus/web-design-system/list-group'; // 이 컴포넌트만 싣는다 (권장)
|
|
1463
|
+
import { ListGroup } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1464
|
+
```
|
|
1465
|
+
|
|
1466
|
+
**언제 쓴다.** 설정·계정 메뉴처럼 ListRow 여러 줄을 흰 면 하나에 묶을 때 쓴다. 줄 사이에는 구분선이 자동으로 들어간다. `label` 을 주면 면 위에 작은 제목이 붙고 스크린 리더는 그 제목을 그룹 이름으로 읽는다. `className`·`style` 은 제목과 면을 감싼 루트에 붙는다.
|
|
1467
|
+
|
|
1468
|
+
**쓰지 않는다.** 내용이 자유로운 한 묶음은 Card 를 쓴다. 이름과 값만 나란히 보여 주는 요약은 DescriptionList 를 쓴다.
|
|
1469
|
+
|
|
1470
|
+
```tsx
|
|
1471
|
+
<ListGroup label="계정">
|
|
1472
|
+
<ListRow label="내 정보" onClick={() => {}} />
|
|
1473
|
+
<ListRow label="연결된 계정" trailing="2개" asChild>
|
|
1474
|
+
<a href="/accounts" />
|
|
1475
|
+
</ListRow>
|
|
1476
|
+
</ListGroup>
|
|
1477
|
+
```
|
|
1478
|
+
|
|
1479
|
+
**모션.** 없음. 면과 제목만 그린다. 눌림은 각 ListRow 가 받는다.
|
|
1480
|
+
|
|
1481
|
+
### props
|
|
1482
|
+
|
|
1483
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
1484
|
+
| --- | --- | --- | --- |
|
|
1485
|
+
| `label` | `ReactNode` | | |
|
|
1486
|
+
|
|
1487
|
+
이 밖에 React·HTML 기본 속성 266개를 받는다.
|
|
1488
|
+
|
|
1489
|
+
## ListRow
|
|
1490
|
+
|
|
1491
|
+
```ts
|
|
1492
|
+
import { ListRow } from '@nurihaus/web-design-system/list-row'; // 이 컴포넌트만 싣는다 (권장)
|
|
1493
|
+
import { ListRow } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1494
|
+
```
|
|
1495
|
+
|
|
1496
|
+
**언제 쓴다.** ListGroup 안의 한 줄에 쓴다. `label` 이 이름, `description` 이 아래 보조 글, `leading` 이 왼쪽(Icon size m 이나 Avatar), `trailing` 이 오른쪽(값 글자, OptionBadge, Switch)이다. 다른 화면으로 가는 줄은 `asChild` 를 주고 링크 요소(`<a>`·라우터 Link) 하나를 children 으로 준다 — 그 링크가 줄이 되고 내용은 링크 안에 들어간다. 그 자리에서 동작하는 줄은 `onClick` 을 주면 button 이 된다. 누르는 줄은 오른쪽 끝에 화살표가 기본으로 붙고 `chevron={false}` 로 숨긴다. 누르면 배경이 잠깐 어두워진다. `className`·`style` 은 줄(button·링크) 자체에 붙는다.
|
|
1497
|
+
|
|
1498
|
+
**쓰지 않는다.** `trailing` 에 Switch 같은 버튼을 둔 줄에는 `onClick`·`asChild` 를 주지 않는다 — 버튼 안에 버튼이 들어간다. 줄을 ListGroup 밖에 홀로 두지 않는다. 사용 로그는 넘기는 링크·핸들러에서 남긴다.
|
|
1499
|
+
|
|
1500
|
+
```tsx
|
|
1501
|
+
<ListGroup>
|
|
1502
|
+
<ListRow
|
|
1503
|
+
leading={<Icon name="user-circle" size="m" />}
|
|
1504
|
+
label="내 정보"
|
|
1505
|
+
description="이름 · 연락처"
|
|
1506
|
+
onClick={() => {}}
|
|
1507
|
+
/>
|
|
1508
|
+
<ListRow label="등급" trailing={<OptionBadge option="골드" variant="primary" size="s" />} />
|
|
1509
|
+
<ListRow label="알림 받기" trailing={<Switch id="push" aria-label="알림 받기" />} />
|
|
1510
|
+
</ListGroup>
|
|
1511
|
+
```
|
|
1512
|
+
|
|
1513
|
+
**모션.** press · attention(opt). 토큰 값과 규칙은 `motion.md`.
|
|
1514
|
+
|
|
1515
|
+
### props
|
|
1516
|
+
|
|
1517
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
1518
|
+
| --- | --- | --- | --- |
|
|
1519
|
+
| `asChild` | `boolean` | | |
|
|
1520
|
+
| `label` | `ReactNode` | 예 | |
|
|
1521
|
+
| `track` | `string` | | |
|
|
1522
|
+
| `children` | `ReactNode` | | |
|
|
1523
|
+
| `onClick` | `MouseEventHandler<HTMLElement>` | | |
|
|
1524
|
+
| `trackProps` | `Record<string, string \| number \| boolean>` | | |
|
|
1525
|
+
| `description` | `ReactNode` | | |
|
|
1526
|
+
| `chevron` | `boolean` | | |
|
|
1527
|
+
| `leading` | `ReactNode` | | |
|
|
1528
|
+
| `trailing` | `ReactNode` | | |
|
|
1529
|
+
|
|
1530
|
+
이 밖에 React·HTML 기본 속성 264개를 받는다.
|
|
1531
|
+
|
|
1532
|
+
## DescriptionList
|
|
1533
|
+
|
|
1534
|
+
```ts
|
|
1535
|
+
import { DescriptionList } from '@nurihaus/web-design-system/description-list'; // 이 컴포넌트만 싣는다 (권장)
|
|
1536
|
+
import { DescriptionList } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1537
|
+
```
|
|
1538
|
+
|
|
1539
|
+
**언제 쓴다.** 금액 내역·신청 정보처럼 이름과 값을 줄마다 나란히 보여 주는 요약에 쓴다. 이름은 왼쪽 회색, 값은 오른쪽 진한 글자다. 합계 줄은 `total: true` 를 주면 위에 구분선이 생기고 값이 크고 굵어진다. 마지막 항목에 둔다. `className`·`style` 은 `<dl>` 에 붙는다.
|
|
1540
|
+
|
|
1541
|
+
**쓰지 않는다.** 줄을 눌러 다른 화면으로 가야 하면 ListGroup 과 ListRow 를 쓴다. 열이 여러 개인 표는 DataTable 을 쓴다.
|
|
1542
|
+
|
|
1543
|
+
```tsx
|
|
1544
|
+
<DescriptionList
|
|
1545
|
+
items={[
|
|
1546
|
+
{ id: 'fee', label: '원고료', value: '300,000원' },
|
|
1547
|
+
{ id: 'tax', label: '원천징수 (3.3%)', value: '-9,900원' },
|
|
1548
|
+
{ id: 'total', label: '실 지급액', value: '290,100원', total: true },
|
|
1549
|
+
]}
|
|
1550
|
+
/>
|
|
1551
|
+
```
|
|
1552
|
+
|
|
1553
|
+
**모션.** 없음. 이름–값 글자만 그린다. 누르는 표면이 아니다.
|
|
1554
|
+
|
|
1555
|
+
### props
|
|
1556
|
+
|
|
1557
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
1558
|
+
| --- | --- | --- | --- |
|
|
1559
|
+
| `items` | `DescriptionListItem[]` | 예 | |
|
|
1560
|
+
| `className` | `string` | | |
|
|
1561
|
+
| `style` | `CSSProperties` | | |
|
|
1562
|
+
|
|
1563
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
1564
|
+
|
|
1565
|
+
## Notice
|
|
1566
|
+
|
|
1567
|
+
```ts
|
|
1568
|
+
import { Notice } from '@nurihaus/web-design-system/notice'; // 이 컴포넌트만 싣는다 (권장)
|
|
1569
|
+
import { Notice } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1570
|
+
```
|
|
1571
|
+
|
|
1572
|
+
**언제 쓴다.** 카드·바텀시트·폼 안에 머무르며 상태나 주의를 알릴 때 쓴다(예: "검토 중입니다", "저장하지 못했습니다"). `variant`(`neutral` 기본·`success`·`warning`·`danger`)가 바탕색·글자색과 앞 아이콘(정보·체크·경고·경고)을 정한다. `danger` 는 `role="alert"` 라 화면 낭독기가 바로 읽는다. 다른 variant 에 role 이 필요하면 쓰는 쪽이 `role` 을 준다(그 값이 앞선다). `title` 은 본문 위 굵은 한 줄, `children` 이 본문이다. `action`(`{ label, onClick }`)을 주면 본문 아래 작은 버튼(CTAButton xs·neutral)이 하나 붙는다. 조건에 따라 나타나는 안내만 `motion`(`weak`·`strong`)을 준다 — 나타날 때 흐려졌다 선명해진다. 사라질 때는 움직이지 않는다. `className`·`style` 은 루트(`div`)에 붙는다.
|
|
1573
|
+
|
|
1574
|
+
**쓰지 않는다.** 행동 결과를 잠깐 알리고 스스로 사라져야 하면 Toast 를 쓴다. 입력칸 하나의 오류는 TextField 의 helper text 를 쓴다. 목록이 비었거나 화면 전체를 채우는 안내는 EmptyState 를 쓴다.
|
|
1575
|
+
|
|
1576
|
+
```tsx
|
|
1577
|
+
<Notice variant="danger" title="저장하지 못했습니다" action={{ label: '다시 시도', onClick: () => {} }}>
|
|
1578
|
+
네트워크 연결을 확인해 주세요.
|
|
1579
|
+
</Notice>
|
|
1580
|
+
```
|
|
1581
|
+
|
|
1582
|
+
**모션.** enter(opt, `motion`). 토큰 값과 규칙은 `motion.md`.
|
|
1583
|
+
|
|
1584
|
+
### props
|
|
1585
|
+
|
|
1586
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
1587
|
+
| --- | --- | --- | --- |
|
|
1588
|
+
| `title` | `ReactNode` | | |
|
|
1589
|
+
| `children` | `ReactNode` | 예 | |
|
|
1590
|
+
| `variant` | `'neutral' \| 'danger' \| 'success' \| 'warning'` | | `'neutral'` |
|
|
1591
|
+
| `motion` | `'strong' \| 'weak'` | | |
|
|
1592
|
+
| `action` | `NoticeAction` | | |
|
|
1593
|
+
|
|
1594
|
+
이 밖에 React·HTML 기본 속성 264개를 받는다.
|
|
1595
|
+
|
|
1596
|
+
## EmptyState
|
|
1597
|
+
|
|
1598
|
+
```ts
|
|
1599
|
+
import { EmptyState } from '@nurihaus/web-design-system/empty-state'; // 이 컴포넌트만 싣는다 (권장)
|
|
1600
|
+
import { EmptyState } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1601
|
+
```
|
|
1602
|
+
|
|
1603
|
+
**언제 쓴다.** 목록이 비었을 때, 불러오지 못해 다시 시도를 권할 때, 찾을 수 없거나 준비 중인 화면에 쓴다. 가운데에 아이콘 원·제목·설명·버튼을 세로로 쌓는다. `icon` 은 Icon 이름, `title` 은 필수, `description` 은 한두 줄 보충 설명이다. `action` 에는 버튼(보통 CTAButton)을 넘긴다. `variant`(`default` 기본·`neutral`)는 아이콘 원 색만 바꾼다. 기본은 연보라, 오류·준비 중처럼 힘을 뺄 때는 `neutral`(회색)이다. 제목은 제목 단계를 정하지 않으려고 `p` 로 그린다. 화면 제목이 필요하면 쓰는 쪽이 따로 둔다. `className`·`style` 은 루트(`div`)에 붙는다.
|
|
1604
|
+
|
|
1605
|
+
**쓰지 않는다.** 카드 안에서 상태를 짧게 알리는 안내는 Notice 를 쓴다. 불러오는 중에는 Skeleton 이나 로딩 컴포넌트를 쓴다.
|
|
1606
|
+
|
|
1607
|
+
```tsx
|
|
1608
|
+
<EmptyState
|
|
1609
|
+
icon="warning"
|
|
1610
|
+
variant="neutral"
|
|
1611
|
+
title="불러오지 못했어요"
|
|
1612
|
+
description="잠시 뒤 다시 시도해 주세요."
|
|
1613
|
+
action={<CTAButton size="s" variant="secondary" text="다시 시도" />}
|
|
1614
|
+
/>
|
|
1615
|
+
```
|
|
1616
|
+
|
|
1617
|
+
**모션.** 없음. 누를 곳이 없는 표시용 화면이다. 버튼은 쓰는 쪽이 넘긴 CTAButton 이 press 를 받는다.
|
|
1618
|
+
|
|
1619
|
+
### props
|
|
1620
|
+
|
|
1621
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
1622
|
+
| --- | --- | --- | --- |
|
|
1623
|
+
| `title` | `ReactNode` | 예 | |
|
|
1624
|
+
| `variant` | `'neutral' \| 'default'` | | `'default'` |
|
|
1625
|
+
| `icon` | `'link' \| 'circle' \| 'image' \| 'warning' \| 'x' \| 'house' \| 'megaphone-simple' \| 'chats-circle' \| 'user-circle' \| 'bell' \| 'caret-left' \| 'magnifying-glass' \| 'dots-three' \| 'gear-six' \| 'chat-circle' \| 'paper-plane-tilt' \| 'plus' \| 'camera' \| 'video-camera' \| 'play' \| 'upload-simple' \| 'calendar-blank' \| 'clock' \| 'map-pin' \| 'truck' \| 'ticket' \| 'qr-code' \| 'sparkle' \| 'gift' \| 'wallet' \| 'bank' \| 'credit-card' \| 'check-circle' \| 'check' \| 'info' \| 'question' \| 'lock' \| 'pencil-simple' \| 'trash' \| 'copy' \| 'share-network' \| 'eye' \| 'sliders-horizontal' \| 'heart' \| 'star' \| 'globe' \| 'sign-out' \| 'caret-right' \| 'arrow-right' \| 'instagram-logo' \| 'tiktok-logo' \| 'youtube-logo'` | 예 | |
|
|
1626
|
+
| `description` | `ReactNode` | | |
|
|
1627
|
+
| `action` | `ReactNode` | | |
|
|
1628
|
+
|
|
1629
|
+
이 밖에 React·HTML 기본 속성 264개를 받는다.
|
|
1630
|
+
|
|
1631
|
+
## Tag
|
|
1632
|
+
|
|
1633
|
+
```ts
|
|
1634
|
+
import { Tag } from '@nurihaus/web-design-system/tag'; // 이 컴포넌트만 싣는다 (권장)
|
|
1635
|
+
import { Tag } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1636
|
+
```
|
|
1637
|
+
|
|
1638
|
+
**언제 쓴다.** 고른 값을 보여 주고 하나씩 지울 수 있게 할 때 쓴다(예: 여러 개 고른 나라). `text` 가 글자다. `onRemove` 를 주면 오른쪽에 X 버튼이 붙고, 누르면 `onRemove` 가 불린다. 이때 `removeLabel`(X 버튼을 읽어 줄 이름, 예: "대한민국 지우기")도 꼭 준다 — 앱 언어로 쓰는 쪽이 정한다. `onRemove` 가 없으면 지울 수 없는 표시용 태그다. `track` 을 주면 X 를 누를 때 `click` 을 보낸다. `className`·`style` 은 루트(`span`)에 붙는다. 여러 개를 늘어놓을 때 줄 바꿈·간격은 쓰는 쪽 컨테이너가 정한다.
|
|
1639
|
+
|
|
1640
|
+
**쓰지 않는다.** 목록을 걸러 낼 선택지는 ChipGroup 을 쓴다. 상태값·분류 라벨은 OptionBadge 를 쓴다.
|
|
1641
|
+
|
|
1642
|
+
```tsx
|
|
1643
|
+
<>
|
|
1644
|
+
<Tag text="대한민국" onRemove={() => {}} removeLabel="대한민국 지우기" />
|
|
1645
|
+
<Tag text="일본" />
|
|
1646
|
+
</>
|
|
1647
|
+
```
|
|
1648
|
+
|
|
1649
|
+
**모션.** press. 토큰 값과 규칙은 `motion.md`.
|
|
1650
|
+
|
|
1651
|
+
### props
|
|
1652
|
+
|
|
1653
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
1654
|
+
| --- | --- | --- | --- |
|
|
1655
|
+
| `track` | `string` | | |
|
|
1656
|
+
| `text` | `ReactNode` | 예 | |
|
|
1657
|
+
| `trackProps` | `Record<string, string \| number \| boolean>` | | |
|
|
1658
|
+
| `onRemove` | `(() => void)` | | |
|
|
1659
|
+
| `removeLabel` | `string` | | |
|
|
1660
|
+
|
|
1661
|
+
이 밖에 React·HTML 기본 속성 265개를 받는다.
|
|
1662
|
+
|
|
1663
|
+
## MessageThread
|
|
1664
|
+
|
|
1665
|
+
```ts
|
|
1666
|
+
import { MessageThread } from '@nurihaus/web-design-system/message-thread'; // 이 컴포넌트만 싣는다 (권장)
|
|
1667
|
+
import { MessageThread } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1668
|
+
```
|
|
1669
|
+
|
|
1670
|
+
**언제 쓴다.** 1:1 대화·문의 답변처럼 말풍선이 쌓이는 대화 목록에 쓴다. `<ol>` 이고 children 은 Message · MessageEvent 다. 항목 사이 간격만 정한다. 스크롤과 새 메시지로 내려가기는 쓰는 쪽이 정한다. `className`·`style`·`ref` 는 `<ol>` 에 붙는다.
|
|
1671
|
+
|
|
1672
|
+
**쓰지 않는다.** 댓글처럼 말풍선이 아닌 목록에는 쓰지 않는다.
|
|
1673
|
+
|
|
1674
|
+
```tsx
|
|
1675
|
+
<MessageThread>
|
|
1676
|
+
<MessageEvent>10월 22일</MessageEvent>
|
|
1677
|
+
<Message name="담당자" time="오후 2:10">안녕하세요!</Message>
|
|
1678
|
+
<Message side="end" time="오후 2:12">네, 확인했어요.</Message>
|
|
1679
|
+
</MessageThread>
|
|
1680
|
+
```
|
|
1681
|
+
|
|
1682
|
+
**모션.** 없음. 목록 틀이다. 등장 모션은 항목(Message)이 가진다.
|
|
1683
|
+
|
|
1684
|
+
### props
|
|
1685
|
+
|
|
1686
|
+
이 컴포넌트가 따로 정의한 prop 은 없다.
|
|
1687
|
+
|
|
1688
|
+
이 밖에 React·HTML 기본 속성 269개를 받는다.
|
|
1689
|
+
|
|
1690
|
+
## Message
|
|
1691
|
+
|
|
1692
|
+
```ts
|
|
1693
|
+
import { Message } from '@nurihaus/web-design-system/message'; // 이 컴포넌트만 싣는다 (권장)
|
|
1694
|
+
import { Message } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1695
|
+
```
|
|
1696
|
+
|
|
1697
|
+
**언제 쓴다.** MessageThread 안의 말풍선 하나다. `side="end"` 는 내가 보낸 메시지(오른쪽, 보라), 기본 `start` 는 상대 메시지(왼쪽, 회색)다. 글은 children 이고 줄바꿈을 그대로 보인다. `name` 은 말풍선 위 이름, `time` 은 옆 시각(`<time>`, 기계용 값은 `dateTime`)이다. 언제 보일지(연속 메시지에서 숨기기 등)는 쓰는 쪽이 정한다. `media` 는 글 뒤 말풍선 안에 들어가는 썸네일이다. 글 없이 `media` 만 주면 안쪽 여백이 줄어든다. `motion`(`weak`·`strong`)을 주면 나타날 때 아래에서 올라온다 — 방금 보내거나 받은 메시지에만 준다. 처음 그리는 대화에는 주지 않는다. `className`·`style`·`ref` 는 `<li>` 에 붙는다.
|
|
1698
|
+
|
|
1699
|
+
**쓰지 않는다.** 날짜·상태 안내 줄은 MessageEvent 를 쓴다.
|
|
1700
|
+
|
|
1701
|
+
```tsx
|
|
1702
|
+
<MessageThread>
|
|
1703
|
+
<Message side="end" time="오후 2:12" dateTime="2026-10-22T14:12" motion="weak">
|
|
1704
|
+
방금 보낸 메시지
|
|
1705
|
+
</Message>
|
|
1706
|
+
</MessageThread>
|
|
1707
|
+
```
|
|
1708
|
+
|
|
1709
|
+
**모션.** enter(opt, `motion`). 토큰 값과 규칙은 `motion.md`.
|
|
1710
|
+
|
|
1711
|
+
### props
|
|
1712
|
+
|
|
1713
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
1714
|
+
| --- | --- | --- | --- |
|
|
1715
|
+
| `time` | `ReactNode` | | |
|
|
1716
|
+
| `name` | `ReactNode` | | |
|
|
1717
|
+
| `motion` | `'strong' \| 'weak'` | | |
|
|
1718
|
+
| `side` | `'end' \| 'start'` | | `'start'` |
|
|
1719
|
+
| `media` | `ReactNode` | | |
|
|
1720
|
+
| `dateTime` | `string` | | |
|
|
1721
|
+
|
|
1722
|
+
이 밖에 React·HTML 기본 속성 267개를 받는다.
|
|
1723
|
+
|
|
1724
|
+
## MessageEvent
|
|
1725
|
+
|
|
1726
|
+
```ts
|
|
1727
|
+
import { MessageEvent } from '@nurihaus/web-design-system/message-event'; // 이 컴포넌트만 싣는다 (권장)
|
|
1728
|
+
import { MessageEvent } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1729
|
+
```
|
|
1730
|
+
|
|
1731
|
+
**언제 쓴다.** MessageThread 안 가운데에 놓는 날짜·상태 줄이다(예: "10월 22일", "캠페인이 확정됐어요"). 움직이지 않는다. `className`·`style`·`ref` 는 `<li>` 에 붙는다.
|
|
1732
|
+
|
|
1733
|
+
**쓰지 않는다.** 누군가 보낸 말은 Message 를 쓴다. 화면 위에 잠깐 뜨는 알림은 Toast 를 쓴다.
|
|
1734
|
+
|
|
1735
|
+
```tsx
|
|
1736
|
+
<MessageThread>
|
|
1737
|
+
<MessageEvent>캠페인이 확정됐어요</MessageEvent>
|
|
1738
|
+
</MessageThread>
|
|
1739
|
+
```
|
|
1740
|
+
|
|
1741
|
+
**모션.** 없음. 대화 가운데 날짜·상태 줄. 움직이지 않는다.
|
|
1742
|
+
|
|
1743
|
+
### props
|
|
1744
|
+
|
|
1745
|
+
이 컴포넌트가 따로 정의한 prop 은 없다.
|
|
1746
|
+
|
|
1747
|
+
이 밖에 React·HTML 기본 속성 267개를 받는다.
|
|
1748
|
+
|
|
1749
|
+
## MessageComposer
|
|
1750
|
+
|
|
1751
|
+
```ts
|
|
1752
|
+
import { MessageComposer } from '@nurihaus/web-design-system/message-composer'; // 이 컴포넌트만 싣는다 (권장)
|
|
1753
|
+
import { MessageComposer } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1754
|
+
```
|
|
1755
|
+
|
|
1756
|
+
**언제 쓴다.** 대화 화면 아래의 메시지 입력 줄이다. 입력 칸은 글자만큼 늘어나다가(다섯 줄쯤) 그 뒤로는 칸 안에서 스크롤한다. Enter 는 줄바꿈이고 보내기는 오른쪽 버튼으로만 한다. 값은 `value`·`defaultValue`·`onValueChange(value)` 로 다룬다. 보낼 수 있으면 버튼을 눌렀을 때 `onSend(value)` 가 불린다. **값을 스스로 비우지 않는다** — 보내기에 성공하면 쓰는 쪽이 `value` 를 비운다. 보낼 수 있는지는 기본으로 값이 공백만이 아닐 때다. 첨부만 보내는 화면은 `canSend` 를 직접 준다. 보낼 수 없거나 `disabled` 면 버튼이 회색(`aria-disabled`)이고 눌러도 보내지 않고 흔들린다. `loading` 동안은 Spinner 를 돌리고 보내지 않는다. `label`·`sendLabel` 은 입력 칸·보내기 버튼의 이름(aria-label)이다. `leading` 은 입력 칸 왼쪽(첨부 아이콘 버튼), `attachments` 는 입력 줄 위(첨부 썸네일) 자리다. `track` 을 주면 실제로 보낼 때 `click` 을 한 번 보낸다(입력한 글은 싣지 않는다). `className`·`style`·`ref` 는 루트 `<div>` 에 붙는다. 화면 아래에 붙이려면 BottomBar 안에 둔다.
|
|
1757
|
+
|
|
1758
|
+
**쓰지 않는다.** 폼의 여러 줄 입력은 TextArea, 한 줄 입력은 TextField 를 쓴다.
|
|
1759
|
+
|
|
1760
|
+
```tsx
|
|
1761
|
+
<BottomBar>
|
|
1762
|
+
<MessageComposer
|
|
1763
|
+
label="메시지"
|
|
1764
|
+
sendLabel="보내기"
|
|
1765
|
+
placeholder="메시지를 입력하세요"
|
|
1766
|
+
onSend={() => {}}
|
|
1767
|
+
/>
|
|
1768
|
+
</BottomBar>
|
|
1769
|
+
```
|
|
1770
|
+
|
|
1771
|
+
**모션.** press · reject · busy(`loading`). 토큰 값과 규칙은 `motion.md`.
|
|
1772
|
+
|
|
1773
|
+
### props
|
|
1774
|
+
|
|
1775
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
1776
|
+
| --- | --- | --- | --- |
|
|
1777
|
+
| `value` | `string` | | |
|
|
1778
|
+
| `defaultValue` | `string` | | |
|
|
1779
|
+
| `onValueChange` | `((value: string) => void)` | | |
|
|
1780
|
+
| `onSend` | `(value: string) => void` | 예 | |
|
|
1781
|
+
| `canSend` | `boolean` | | |
|
|
1782
|
+
| `loading` | `boolean` | | |
|
|
1783
|
+
| `placeholder` | `string` | | |
|
|
1784
|
+
| `label` | `string` | 예 | |
|
|
1785
|
+
| `sendLabel` | `string` | 예 | |
|
|
1786
|
+
| `leading` | `ReactNode` | | |
|
|
1787
|
+
| `attachments` | `ReactNode` | | |
|
|
1788
|
+
| `disabled` | `boolean` | | |
|
|
1789
|
+
| `className` | `string` | | |
|
|
1790
|
+
| `style` | `CSSProperties` | | |
|
|
1791
|
+
| `track` | `string` | | |
|
|
1792
|
+
| `trackProps` | `Record<string, string \| number \| boolean>` | | |
|
|
1793
|
+
|
|
1794
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
1795
|
+
|
|
1796
|
+
## BottomBar
|
|
1797
|
+
|
|
1798
|
+
```ts
|
|
1799
|
+
import { BottomBar } from '@nurihaus/web-design-system/bottom-bar'; // 이 컴포넌트만 싣는다 (권장)
|
|
1800
|
+
import { BottomBar } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1801
|
+
```
|
|
1802
|
+
|
|
1803
|
+
**언제 쓴다.** 화면 아래에 붙어 그 화면의 주 행동(CTAButton 하나나 둘)이나 입력 줄(MessageComposer)을 담는 바다. `position: sticky; bottom: 0` 이라 스크롤하는 조상의 마지막 자식으로 둔다. 바로 아래 자식들이 폭을 똑같이 나눠 갖는다. 기기 홈 막대(안전 영역)만큼 아래를 더 비운다. 스크롤해도 숨지 않는다. `className`·`style`·`ref` 는 루트 `<div>` 에 붙는다.
|
|
1804
|
+
|
|
1805
|
+
**쓰지 않는다.** 화면을 오가는 주 메뉴는 BottomNav 를 쓴다.
|
|
1806
|
+
|
|
1807
|
+
```tsx
|
|
1808
|
+
<BottomBar>
|
|
1809
|
+
<CTAButton variant="ghost" size="l" text="거절" />
|
|
1810
|
+
<CTAButton variant="primary" size="l" text="수락" />
|
|
1811
|
+
</BottomBar>
|
|
1812
|
+
```
|
|
1813
|
+
|
|
1814
|
+
**모션.** 없음. 주 행동·입력을 담는 고정 바라 스크롤로 숨기지 않는다.
|
|
1815
|
+
|
|
1816
|
+
### props
|
|
1817
|
+
|
|
1818
|
+
이 컴포넌트가 따로 정의한 prop 은 없다.
|
|
1819
|
+
|
|
1820
|
+
이 밖에 React·HTML 기본 속성 266개를 받는다.
|
|
1821
|
+
|
|
1822
|
+
## MediaThumbnail
|
|
1823
|
+
|
|
1824
|
+
```ts
|
|
1825
|
+
import { MediaThumbnail } from '@nurihaus/web-design-system/media-thumbnail'; // 이 컴포넌트만 싣는다 (권장)
|
|
1826
|
+
import { MediaThumbnail } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1827
|
+
```
|
|
1828
|
+
|
|
1829
|
+
**언제 쓴다.** 사진·영상을 작은 썸네일로 보여 주고 누르면 화면 안에서 크게 볼 때 쓴다. 앱 웹뷰에서 원본 주소로 이동하면 앱을 벗어나므로 링크 대신 쓴다. `type`(`image`·`video`, 기본 `image`), `size`(`s` 64·`m` 96 정사각형, `l` 폭을 채우되 240 까지 4:3 — 말풍선 안). 올리는 중이면 `loading`, 실패하면 `invalid` 를 준다. 둘 다 누르면 열리지 않는다. `onRemove`·`removeLabel` 을 주면 오른쪽 위에 지우기 버튼이 생긴다. `closeLabel` 은 뷰어 닫기 버튼 이름이라 필수다. 영상처럼 `alt` 가 없으면 `viewLabel` 이 버튼 이름이 된다. `className`·`style` 은 감싸는 div 에 붙는다.
|
|
1830
|
+
|
|
1831
|
+
**쓰지 않는다.** 누를 일 없는 사람 사진은 Avatar 를 쓴다. 썸네일 없이 버튼 하나로 크게 보이려면 MediaViewer 의 `trigger` 를 쓴다.
|
|
1832
|
+
|
|
1833
|
+
```tsx
|
|
1834
|
+
<MediaThumbnail
|
|
1835
|
+
src="https://example.com/photo.jpg"
|
|
1836
|
+
alt="제품 사진"
|
|
1837
|
+
closeLabel="닫기"
|
|
1838
|
+
size="m"
|
|
1839
|
+
onRemove={() => {}}
|
|
1840
|
+
removeLabel="삭제"
|
|
1841
|
+
/>
|
|
1842
|
+
```
|
|
1843
|
+
|
|
1844
|
+
**모션.** press · busy(`loading`). 토큰 값과 규칙은 `motion.md`.
|
|
1845
|
+
|
|
1846
|
+
### props
|
|
1847
|
+
|
|
1848
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
1849
|
+
| --- | --- | --- | --- |
|
|
1850
|
+
| `size` | `'s' \| 'm' \| 'l'` | | `'m'` |
|
|
1851
|
+
| `viewLabel` | `string` | | |
|
|
1852
|
+
| `loading` | `boolean` | | |
|
|
1853
|
+
| `invalid` | `boolean` | | |
|
|
1854
|
+
| `onRemove` | `(() => void)` | | |
|
|
1855
|
+
| `removeLabel` | `string` | | |
|
|
1856
|
+
| `src` | `string` | 예 | |
|
|
1857
|
+
| `type` | `'video' \| 'image'` | | `'image'` |
|
|
1858
|
+
| `alt` | `string` | | |
|
|
1859
|
+
| `closeLabel` | `string` | 예 | |
|
|
1860
|
+
| `className` | `string` | | |
|
|
1861
|
+
| `style` | `CSSProperties` | | |
|
|
1862
|
+
| `track` | `string` | | |
|
|
1863
|
+
| `trackProps` | `Record<string, string \| number \| boolean>` | | |
|
|
1864
|
+
|
|
1865
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
1866
|
+
|
|
1867
|
+
## MediaViewer
|
|
1868
|
+
|
|
1869
|
+
```ts
|
|
1870
|
+
import { MediaViewer } from '@nurihaus/web-design-system/media-viewer'; // 이 컴포넌트만 싣는다 (권장)
|
|
1871
|
+
import { MediaViewer } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1872
|
+
```
|
|
1873
|
+
|
|
1874
|
+
**언제 쓴다.** 사진·영상 하나를 화면 전체에 띄워 볼 때 쓴다. 검은 바탕 위에 비율을 지켜 가운데 놓고, 영상은 열린 동안만 재생한다(닫으면 멈춘다). `trigger` 에 넘긴 요소를 누르면 열리고, `open`·`defaultOpen`·`onOpenChange` 로 제어한다. `closeLabel` 은 오른쪽 위 닫기 버튼 이름이라 필수다. 접근성 이름은 `title`, 없으면 `alt` 다(화면에는 안 보인다). Escape·닫기 버튼으로 닫힌다. `className`·`style` 은 화면 전체를 덮는 dialog 에 붙는다.
|
|
1875
|
+
|
|
1876
|
+
**쓰지 않는다.** 썸네일을 누르면 여는 경우는 MediaThumbnail 이 뷰어를 같이 그린다. 사진 여러 장을 넘겨 보는 갤러리는 아직 없다.
|
|
1877
|
+
|
|
1878
|
+
```tsx
|
|
1879
|
+
<MediaViewer open src="https://example.com/photo.jpg" alt="제품 사진" closeLabel="닫기" onOpenChange={() => {}} />
|
|
1880
|
+
```
|
|
1881
|
+
|
|
1882
|
+
**모션.** enter · exit. 토큰 값과 규칙은 `motion.md`.
|
|
1883
|
+
|
|
1884
|
+
### props
|
|
1885
|
+
|
|
1886
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
1887
|
+
| --- | --- | --- | --- |
|
|
1888
|
+
| `trigger` | `ReactElement<any, string \| JSXElementConstructor<any>>` | | |
|
|
1889
|
+
| `title` | `string` | | |
|
|
1890
|
+
| `open` | `boolean` | | |
|
|
1891
|
+
| `defaultOpen` | `boolean` | | |
|
|
1892
|
+
| `onOpenChange` | `((open: boolean) => void)` | | |
|
|
1893
|
+
| `src` | `string` | 예 | |
|
|
1894
|
+
| `type` | `'video' \| 'image'` | | `'image'` |
|
|
1895
|
+
| `alt` | `string` | | |
|
|
1896
|
+
| `closeLabel` | `string` | 예 | |
|
|
1897
|
+
| `className` | `string` | | |
|
|
1898
|
+
| `style` | `CSSProperties` | | |
|
|
1899
|
+
| `track` | `string` | | |
|
|
1900
|
+
| `trackProps` | `Record<string, string \| number \| boolean>` | | |
|
|
1901
|
+
|
|
1902
|
+
이 밖에 React·HTML 기본 속성 2개를 받는다.
|
|
1903
|
+
|
|
1327
1904
|
## LogProvider
|
|
1328
1905
|
|
|
1329
1906
|
```ts
|
|
@@ -1344,6 +1921,8 @@ LogProvider 가 없거나 `track` 을 주지 않으면 아무것도 보내지
|
|
|
1344
1921
|
</LogProvider>
|
|
1345
1922
|
```
|
|
1346
1923
|
|
|
1924
|
+
**모션.** 없음. DOM 을 그리지 않는다.
|
|
1925
|
+
|
|
1347
1926
|
### props
|
|
1348
1927
|
|
|
1349
1928
|
| prop | 타입 | 필수 | 기본값 |
|
|
@@ -1351,6 +1930,33 @@ LogProvider 가 없거나 `track` 을 주지 않으면 아무것도 보내지
|
|
|
1351
1930
|
| `onEvent` | `(event: LogEvent) => void` | 예 | |
|
|
1352
1931
|
| `children` | `ReactNode` | | |
|
|
1353
1932
|
|
|
1933
|
+
## MotionProvider
|
|
1934
|
+
|
|
1935
|
+
```ts
|
|
1936
|
+
import { MotionProvider } from '@nurihaus/web-design-system/motion'; // 이 컴포넌트만 싣는다 (권장)
|
|
1937
|
+
import { MotionProvider } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
|
|
1938
|
+
```
|
|
1939
|
+
|
|
1940
|
+
**언제 쓴다.** 앱 루트에 한 번 둔다. 구현층이 `motion` 인 모션 토큰(스프링·presence, `motion.md`)을 쓰는 컴포넌트가 이 아래에서 움직인다. 안에서 motion 컴포넌트를 직접 쓸 때는 `m.div` 처럼 `motion/react` 의 `m` 을 쓴다. `motion.div` 를 쓰면 개발 빌드에서 오류가 난다. `reducedMotion` 기본값 `'user'` 는 OS 의 동작 줄이기 설정을 따른다.
|
|
1941
|
+
`motion` 은 peerDependency 이고 React 18 이상에서만 동작한다. CSS 로 움직이는 모션은 이 Provider 없이도 같은 설정을 따른다.
|
|
1942
|
+
|
|
1943
|
+
**쓰지 않는다.** 화면마다 겹쳐 두지 않는다. 겹쳐도 동작은 같지만 안쪽 `reducedMotion` 이 바깥 것을 가린다. 모션을 끄려고 Provider 를 빼지 않는다. `reducedMotion="always"` 를 준다.
|
|
1944
|
+
|
|
1945
|
+
```tsx
|
|
1946
|
+
<MotionProvider>
|
|
1947
|
+
<CTAButton text="저장" />
|
|
1948
|
+
</MotionProvider>
|
|
1949
|
+
```
|
|
1950
|
+
|
|
1951
|
+
**모션.** 없음. DOM 을 그리지 않는다. 다른 컴포넌트의 motion 층이 이 아래에서 돈다.
|
|
1952
|
+
|
|
1953
|
+
### props
|
|
1954
|
+
|
|
1955
|
+
| prop | 타입 | 필수 | 기본값 |
|
|
1956
|
+
| --- | --- | --- | --- |
|
|
1957
|
+
| `reducedMotion` | `'user' \| 'always' \| 'never'` | | `'user'` |
|
|
1958
|
+
| `children` | `ReactNode` | | |
|
|
1959
|
+
|
|
1354
1960
|
## 아직 없는 것
|
|
1355
1961
|
|
|
1356
1962
|
아래는 디자인 시스템에 없다. 비슷한 이름의 컴포넌트를 지어내 import 하지 않는다.
|