@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.
Files changed (137) hide show
  1. package/README.md +15 -4
  2. package/dist/ai/components.md +616 -10
  3. package/dist/ai/motion.md +429 -0
  4. package/dist/ai/tokens.md +90 -4
  5. package/dist/avatar.js +5 -3
  6. package/dist/bottom-bar.js +261 -0
  7. package/dist/bottom-nav.js +10 -57
  8. package/dist/breadcrumb.js +7 -5
  9. package/dist/callout.js +5 -3
  10. package/dist/card.js +278 -0
  11. package/dist/check-box.js +7 -5
  12. package/dist/chip-group.js +6 -4
  13. package/dist/chunk-3274.js +71 -0
  14. package/dist/chunk-345.js +72 -0
  15. package/dist/chunk-3547.js +56 -0
  16. package/dist/chunk-6459.js +107 -0
  17. package/dist/{chunk-6364.js → chunk-7335.js} +2 -67
  18. package/dist/chunk-7653.js +4 -0
  19. package/dist/chunk-910.js +17 -6
  20. package/dist/chunk-9497.js +66 -0
  21. package/dist/collapsible-menu.js +6 -4
  22. package/dist/components/badge/badge-props.d.ts +4 -4
  23. package/dist/components/badge/badge.stories.d.ts +1 -1
  24. package/dist/components/bottom-bar/base-bottom-bar.d.ts +4 -0
  25. package/dist/components/bottom-bar/bottom-bar-props.d.ts +1 -0
  26. package/dist/components/bottom-bar/bottom-bar-type.d.ts +3 -0
  27. package/dist/components/bottom-bar/bottom-bar.d.ts +6 -0
  28. package/dist/components/bottom-bar/bottom-bar.stories.d.ts +282 -0
  29. package/dist/components/button/button-type.d.ts +3 -1
  30. package/dist/components/button/button.stories.d.ts +1 -0
  31. package/dist/components/card/base-card.d.ts +3 -0
  32. package/dist/components/card/card-props.d.ts +9 -0
  33. package/dist/components/card/card-type.d.ts +8 -0
  34. package/dist/components/card/card.d.ts +5 -0
  35. package/dist/components/card/card.stories.d.ts +24 -0
  36. package/dist/components/description-list/base-description-list.d.ts +4 -0
  37. package/dist/components/description-list/description-list-props.d.ts +1 -0
  38. package/dist/components/description-list/description-list-type.d.ts +13 -0
  39. package/dist/components/description-list/description-list.d.ts +5 -0
  40. package/dist/components/description-list/description-list.stories.d.ts +20 -0
  41. package/dist/components/empty-state/base-empty-state.d.ts +4 -0
  42. package/dist/components/empty-state/empty-state-props.d.ts +10 -0
  43. package/dist/components/empty-state/empty-state-type.d.ts +14 -0
  44. package/dist/components/empty-state/empty-state.d.ts +5 -0
  45. package/dist/components/empty-state/empty-state.stories.d.ts +300 -0
  46. package/dist/components/icon/icon-paths.d.ts +4 -0
  47. package/dist/components/icon/icon.stories.d.ts +1 -1
  48. package/dist/components/list/base-list.d.ts +7 -0
  49. package/dist/components/list/list-group.d.ts +5 -0
  50. package/dist/components/list/list-group.stories.d.ts +14 -0
  51. package/dist/components/list/list-props.d.ts +2 -0
  52. package/dist/components/list/list-row.d.ts +5 -0
  53. package/dist/components/list/list-row.stories.d.ts +304 -0
  54. package/dist/components/list/list-type.d.ts +25 -0
  55. package/dist/components/media/base-media.d.ts +16 -0
  56. package/dist/components/media/media-props.d.ts +5 -0
  57. package/dist/components/media/media-thumbnail.d.ts +4 -0
  58. package/dist/components/media/media-thumbnail.stories.d.ts +34 -0
  59. package/dist/components/media/media-type.d.ts +43 -0
  60. package/dist/components/media/media-viewer.d.ts +4 -0
  61. package/dist/components/media/media-viewer.stories.d.ts +24 -0
  62. package/dist/components/message/base-message.d.ts +11 -0
  63. package/dist/components/message/message-event.d.ts +6 -0
  64. package/dist/components/message/message-props.d.ts +17 -0
  65. package/dist/components/message/message-thread.d.ts +6 -0
  66. package/dist/components/message/message-type.d.ts +21 -0
  67. package/dist/components/message/message.d.ts +5 -0
  68. package/dist/components/message/message.stories.d.ts +313 -0
  69. package/dist/components/message-composer/base-message-composer.d.ts +11 -0
  70. package/dist/components/message-composer/message-composer-props.d.ts +1 -0
  71. package/dist/components/message-composer/message-composer-type.d.ts +27 -0
  72. package/dist/components/message-composer/message-composer.d.ts +5 -0
  73. package/dist/components/message-composer/message-composer.stories.d.ts +44 -0
  74. package/dist/components/motion/motion-provider.d.ts +5 -0
  75. package/dist/components/motion/motion-type.d.ts +6 -0
  76. package/dist/components/motion/motion.d.ts +2 -0
  77. package/dist/components/motion/motion.stories.d.ts +23 -0
  78. package/dist/components/notice/base-notice.d.ts +4 -0
  79. package/dist/components/notice/notice-props.d.ts +16 -0
  80. package/dist/components/notice/notice-type.d.ts +19 -0
  81. package/dist/components/notice/notice.d.ts +5 -0
  82. package/dist/components/notice/notice.stories.d.ts +304 -0
  83. package/dist/components/radio/base-radio.d.ts +2 -1
  84. package/dist/components/radio/radio-props.d.ts +9 -1
  85. package/dist/components/radio/radio-type.d.ts +9 -0
  86. package/dist/components/radio/radio.stories.d.ts +10 -0
  87. package/dist/components/skeleton/skeleton.stories.d.ts +7 -7
  88. package/dist/components/tag/base-tag.d.ts +8 -0
  89. package/dist/components/tag/tag-props.d.ts +1 -0
  90. package/dist/components/tag/tag-type.d.ts +20 -0
  91. package/dist/components/tag/tag.d.ts +4 -0
  92. package/dist/components/tag/tag.stories.d.ts +14 -0
  93. package/dist/components/toast/toast.stories.d.ts +12 -12
  94. package/dist/components.css +1234 -171
  95. package/dist/cta-button.js +27 -14
  96. package/dist/data-table.js +5 -3
  97. package/dist/description-list.js +274 -0
  98. package/dist/drawer.js +7 -5
  99. package/dist/drop-down.js +8 -6
  100. package/dist/empty-state.js +300 -0
  101. package/dist/icon-text-badge.js +11 -9
  102. package/dist/icon-text-option-badge.js +8 -6
  103. package/dist/icon.js +7 -4
  104. package/dist/index.d.ts +28 -2
  105. package/dist/index.js +2297 -228
  106. package/dist/list-group.js +253 -0
  107. package/dist/list-row.js +302 -0
  108. package/dist/loading.js +6 -4
  109. package/dist/media-thumbnail.js +412 -0
  110. package/dist/media-viewer.js +274 -0
  111. package/dist/message-composer.js +395 -0
  112. package/dist/message-event.js +216 -0
  113. package/dist/message-thread.js +216 -0
  114. package/dist/message.js +271 -0
  115. package/dist/modal-with-double-button.js +11 -9
  116. package/dist/modal.js +9 -7
  117. package/dist/motion.js +52 -0
  118. package/dist/notice.js +342 -0
  119. package/dist/option-badge.js +11 -9
  120. package/dist/pagination.js +8 -6
  121. package/dist/radio.js +114 -30
  122. package/dist/skeleton.js +4 -2
  123. package/dist/step-progress.js +4 -2
  124. package/dist/styles.css +1124 -122
  125. package/dist/switch.js +6 -4
  126. package/dist/tabs.js +5 -3
  127. package/dist/tag.js +311 -0
  128. package/dist/text-area.js +8 -6
  129. package/dist/text-field.js +8 -6
  130. package/dist/text.js +5 -3
  131. package/dist/toast.js +12 -10
  132. package/dist/tokens/generated/index.d.ts +1 -0
  133. package/dist/tokens/generated/motion.d.ts +153 -0
  134. package/dist/tokens.css +117 -2
  135. package/dist/tokens.js +156 -1
  136. package/dist/tooltip.js +6 -4
  137. package/package.json +63 -1
@@ -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 은 상호작용 핸들러가 없어 `track` 을 받지 않는다. ModalWithDoubleButton 은 `left` · `right` 가 CTAButton props 라 거기에 `track` 을 준다.
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 기본 속성 276개를 받는다.
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` | `'secondary' \| 'default' \| 'success' \| 'warning' \| 'error'` | | `'default'` |
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' \| 'image' \| 'x' \| 'warning' \| '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'` | 예 | |
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 하지 않는다.