@nurihaus/web-design-system 3.8.0 → 3.9.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 (36) hide show
  1. package/README.md +1 -1
  2. package/dist/ai/components.md +44 -4
  3. package/dist/ai/motion.md +2 -0
  4. package/dist/ai/tokens.md +3 -0
  5. package/dist/chunk-1176.js +24 -0
  6. package/dist/chunk-910.js +15 -13
  7. package/dist/components/bottom-bar/bottom-bar.stories.d.ts +6 -6
  8. package/dist/components/empty-state/empty-state.stories.d.ts +8 -8
  9. package/dist/components/icon/icon.stories.d.ts +1 -1
  10. package/dist/components/icon-button/base-icon-button.d.ts +3 -0
  11. package/dist/components/icon-button/icon-button-props.d.ts +12 -0
  12. package/dist/components/icon-button/icon-button-type.d.ts +16 -0
  13. package/dist/components/icon-button/icon-button.d.ts +5 -0
  14. package/dist/components/icon-button/icon-button.stories.d.ts +31 -0
  15. package/dist/components/list/list-row.stories.d.ts +10 -10
  16. package/dist/components/message/message.stories.d.ts +10 -10
  17. package/dist/components/message-composer/message-composer-type.d.ts +4 -0
  18. package/dist/components/message-composer/message-composer.stories.d.ts +2 -0
  19. package/dist/components/notice/notice-type.d.ts +2 -0
  20. package/dist/components/notice/notice.stories.d.ts +7 -7
  21. package/dist/components/skeleton/skeleton.stories.d.ts +7 -7
  22. package/dist/components/toast/toast.stories.d.ts +12 -12
  23. package/dist/components.css +96 -0
  24. package/dist/cta-button.js +20 -16
  25. package/dist/helpers/utils/fillLinkChild.d.ts +6 -0
  26. package/dist/icon-button.js +338 -0
  27. package/dist/index.d.ts +2 -0
  28. package/dist/index.js +216 -26
  29. package/dist/list-row.js +19 -13
  30. package/dist/message-composer.js +5 -1
  31. package/dist/modal-with-double-button.js +8 -6
  32. package/dist/notice.js +9 -5
  33. package/dist/styles.css +83 -0
  34. package/dist/toast.js +8 -6
  35. package/dist/tokens.css +5 -0
  36. package/package.json +5 -1
package/README.md CHANGED
@@ -148,7 +148,7 @@ export default function App({ children }) {
148
148
  <CTAButton text='리포트 받기' track='report/download' trackProps={{ format: 'csv' }} />
149
149
  ```
150
150
 
151
- `track` 을 받는 컴포넌트는 CTAButton · DataTable · Tag · MessageComposer(`click`), Modal · Drawer · MediaViewer(`open` · `close`), MediaThumbnail(`open`), Tabs · DropDown · ChipGroup · Radio · Checkbox · Switch · Pagination · TextField · TextArea(`change`), BottomNav · Breadcrumb · CollapsibleMenu(`navigate`), ListRow(링크 `navigate` · 버튼 `click`), Toast · Tooltip(`show`) 다. `value` 에는 탭 id · 칩 id · 옵션 value 처럼 개발자가 정한 id 만 들어간다. TextField · TextArea 는 포커스가 빠질 때 값이 바뀌었으면 값 없이 `change` 를 한 번 보낸다. `LogProvider` 가 없거나 `track` 을 주지 않으면 아무것도 보내지 않는다.
151
+ `track` 을 받는 컴포넌트는 CTAButton · IconButton · DataTable · Tag · MessageComposer(`click`), Modal · Drawer · MediaViewer(`open` · `close`), MediaThumbnail(`open`), Tabs · DropDown · ChipGroup · Radio · Checkbox · Switch · Pagination · TextField · TextArea(`change`), BottomNav · Breadcrumb · CollapsibleMenu(`navigate`), ListRow(링크 `navigate` · 버튼 `click`), Toast · Tooltip(`show`) 다. `value` 에는 탭 id · 칩 id · 옵션 value 처럼 개발자가 정한 id 만 들어간다. TextField · TextArea 는 포커스가 빠질 때 값이 바뀌었으면 값 없이 `change` 를 한 번 보낸다. `LogProvider` 가 없거나 `track` 을 주지 않으면 아무것도 보내지 않는다.
152
152
 
153
153
  컴포넌트 밖의 로그는 `useLog` 로 남긴다.
154
154
 
@@ -22,7 +22,7 @@ import '@nurihaus/web-design-system/components.css';
22
22
 
23
23
  **size 는 전역 이름이다.** `xs · s · m · l · xl` 다섯 개뿐이고, 컴포넌트는 그중 지원하는 것만 받는다(props 표 참고). 같은 글자는 한 줄에 나란히 놓이는 컨트롤(CTAButton · DropDown · TextField)에서 같은 높이다. px 는 `tokens.md` 의 `--control-height-*` 같은 변수에 있고, 컴포넌트에 숫자로 높이를 주지 않는다.
24
24
 
25
- **색은 variant 가 정한다.** CTAButton · OptionBadge · IconTextBadge · IconTextOptionBadge 는 `variant` 로 글자·배경·테두리 색이 묶여서 정해진다. 색 prop 은 없다. 색을 받는 컴포넌트는 Text(`color`, 토큰 이름만) 하나다. Spinner · InlineLoading · OverlayLoading 은 CSS `color` 를 따라가므로 `className` 이나 `style` 의 `color` 로 바꾼다.
25
+ **색은 variant 가 정한다.** CTAButton · IconButton · OptionBadge · IconTextBadge · IconTextOptionBadge 는 `variant` 로 글자·배경·테두리 색이 묶여서 정해진다. 색 prop 은 없다. 색을 받는 컴포넌트는 Text(`color`, 토큰 이름만) 하나다. Spinner · InlineLoading · OverlayLoading 은 CSS `color` 를 따라가므로 `className` 이나 `style` 의 `color` 로 바꾼다.
26
26
 
27
27
  **커스텀은 `className` 과 `style` 로 한다.** 모든 컴포넌트가 둘을 받아 루트 요소에 붙인다(TextField 는 입력 상자, DataTable 은 `<table>`). variant 가 정한 색을 className 으로 덮으려면 `.cta-button.variant-primary` 보다 구체적인 선택자가 필요하다. 색·간격·글자 값은 `tokens.md` 의 변수만 쓴다.
28
28
 
@@ -34,7 +34,7 @@ import '@nurihaus/web-design-system/components.css';
34
34
 
35
35
  | 컴포넌트 | 보내는 때 | action | value |
36
36
  | --- | --- | --- | --- |
37
- | CTAButton | 누를 때 | `click` | 없음 |
37
+ | CTAButton · IconButton | 누를 때 | `click` | 없음 |
38
38
  | DataTable | `onClickRow` 가 있는 헤더 칸을 누를 때 | `click` | 그 칸의 `id` |
39
39
  | Modal · Drawer | 열고 닫을 때 | `open` · `close` | 없음 |
40
40
  | Tabs · DropDown · ChipGroup · Radio | 고를 때 | `change` | 탭 id · 옵션 value · 칩 id · 선택지 id |
@@ -61,6 +61,7 @@ Avatar · OptionBadge · IconTextBadge · IconTextOptionBadge · Skeleton · Tex
61
61
 
62
62
  - [Avatar](#avatar)
63
63
  - [CTAButton](#ctabutton)
64
+ - [IconButton](#iconbutton)
64
65
  - [Callout](#callout)
65
66
  - [OptionBadge](#optionbadge)
66
67
  - [IconTextBadge](#icontextbadge)
@@ -186,6 +187,43 @@ import { CTAButton } from '@nurihaus/web-design-system'; // 루트.
186
187
 
187
188
  이 밖에 React·HTML 기본 속성 275개를 받는다.
188
189
 
190
+ ## IconButton
191
+
192
+ ```ts
193
+ import { IconButton } from '@nurihaus/web-design-system/icon-button'; // 이 컴포넌트만 싣는다 (권장)
194
+ import { IconButton } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
195
+ ```
196
+
197
+ **언제 쓴다.** 글자 없이 아이콘 하나로 뜻이 통하는 버튼에 쓴다(뒤로, 알림, 첨부, 떠 있는 추가 버튼). `icon` 은 Icon 이름, `label` 은 버튼의 이름(aria-label)이라 꼭 준다. `variant` 는 `ghost`(기본, 바탕 없이 회색 아이콘, 누르는 동안 회색 원)·`secondary`(연보라)·`primary`(진보라). `size` 는 `s`(36)·`m`(44, 기본)·`l`(56)이고 보이는 크기가 작아도 누르는 자리는 44 이상이다. 다른 화면으로 옮겨 가는 버튼은 `asChild` 를 주고 링크 요소 하나를 children 으로 준다 — 그 링크가 버튼 모양이 되고 아이콘은 링크 안에 들어간다. 떠 있는 버튼의 자리·그림자는 쓰는 쪽이 `className` 으로 준다(`--shadow-floating`). `className`·`style` 은 버튼(또는 링크)에 붙는다.
198
+
199
+ **쓰지 않는다.** 글자가 있는 버튼은 CTAButton 을 쓴다. 칩의 지우기는 Tag 의 `onRemove`, 대화 보내기는 MessageComposer 를 쓴다.
200
+
201
+ ```tsx
202
+ <>
203
+ <IconButton icon="caret-left" label="뒤로" onClick={() => {}} />
204
+ <IconButton asChild icon="plus" label="새로 만들기" variant="primary" size="l">
205
+ <a href="/new" />
206
+ </IconButton>
207
+ </>
208
+ ```
209
+
210
+ **모션.** press. 토큰 값과 규칙은 `motion.md`.
211
+
212
+ ### props
213
+
214
+ | prop | 타입 | 필수 | 기본값 |
215
+ | --- | --- | --- | --- |
216
+ | `asChild` | `boolean` | | |
217
+ | `size` | `'s' \| 'm' \| 'l'` | | `defaultSize` |
218
+ | `label` | `string` | 예 | |
219
+ | `track` | `string` | | |
220
+ | `children` | `ReactNode` | | |
221
+ | `variant` | `'primary' \| 'secondary' \| 'ghost'` | | `'ghost'` |
222
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
223
+ | `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'` | 예 | |
224
+
225
+ 이 밖에 React·HTML 기본 속성 275개를 받는다.
226
+
189
227
  ## Callout
190
228
 
191
229
  ```ts
@@ -1569,7 +1607,7 @@ import { Notice } from '@nurihaus/web-design-system/notice'; // 이 컴포넌
1569
1607
  import { Notice } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
1570
1608
  ```
1571
1609
 
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`)에 붙는다.
1610
+ **언제 쓴다.** 카드·바텀시트·폼 안에 머무르며 상태나 주의를 알릴 때 쓴다(예: "검토 중입니다", "저장하지 못했습니다"). `variant`(`neutral` 기본·`success`·`warning`·`danger`)가 바탕색·글자색과 앞 아이콘(정보·체크·경고·경고)을 정한다. `danger` 는 `role="alert"` 라 화면 낭독기가 바로 읽는다. 다른 variant 에 role 이 필요하면 쓰는 쪽이 `role` 을 준다(그 값이 앞선다). `title` 은 본문 위 굵은 한 줄, `children` 이 본문이다. `action`(`{ label, onClick, loading?, track? }`)을 주면 본문 아래 작은 버튼(CTAButton xs·neutral)이 하나 붙는다. `loading` 이면 버튼이 Spinner 로 바뀌고 처리 중에는 `onClick` 을 다시 부르지 않는다. 조건에 따라 나타나는 안내만 `motion`(`weak`·`strong`)을 준다 — 나타날 때 흐려졌다 선명해진다. 사라질 때는 움직이지 않는다. `className`·`style` 은 루트(`div`)에 붙는다.
1573
1611
 
1574
1612
  **쓰지 않는다.** 행동 결과를 잠깐 알리고 스스로 사라져야 하면 Toast 를 쓴다. 입력칸 하나의 오류는 TextField 의 helper text 를 쓴다. 목록이 비었거나 화면 전체를 채우는 안내는 EmptyState 를 쓴다.
1575
1613
 
@@ -1753,7 +1791,7 @@ import { MessageComposer } from '@nurihaus/web-design-system/message-composer';
1753
1791
  import { MessageComposer } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
1754
1792
  ```
1755
1793
 
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 안에 둔다.
1794
+ **언제 쓴다.** 대화 화면 아래의 메시지 입력 줄이다. 입력 칸은 글자만큼 늘어나다가(다섯 줄쯤) 그 뒤로는 칸 안에서 스크롤한다. Enter 는 줄바꿈이고 보내기는 오른쪽 버튼으로만 한다. 값은 `value`·`defaultValue`·`onValueChange(value)` 로 다룬다. 보낼 수 있으면 버튼을 눌렀을 때 `onSend(value)` 가 불린다. **값을 스스로 비우지 않는다** — 보내기에 성공하면 쓰는 쪽이 `value` 를 비운다. 보낼 수 있는지는 기본으로 값이 공백만이 아닐 때다. 첨부만 보내는 화면은 `canSend` 를 직접 준다. 보낼 수 없거나 `disabled` 면 버튼이 회색(`aria-disabled`)이고 눌러도 보내지 않고 흔들린다. `loading` 동안은 Spinner 를 돌리고 보내지 않는다. `label`·`sendLabel` 은 입력 칸·보내기 버튼의 이름(aria-label)이다. `autoFocus` 는 사용자가 방금 입력을 연 화면(예: 다시 문의하기를 고른 뒤)에서만 준다. `maxLength` 는 입력 칸 최대 글자 수다. `leading` 은 입력 칸 왼쪽(첨부 아이콘 버튼), `attachments` 는 입력 줄 위(첨부 썸네일) 자리다. `track` 을 주면 실제로 보낼 때 `click` 을 한 번 보낸다(입력한 글은 싣지 않는다). `className`·`style`·`ref` 는 루트 `<div>` 에 붙는다. 화면 아래에 붙이려면 BottomBar 안에 둔다.
1757
1795
 
1758
1796
  **쓰지 않는다.** 폼의 여러 줄 입력은 TextArea, 한 줄 입력은 TextField 를 쓴다.
1759
1797
 
@@ -1786,6 +1824,8 @@ import { MessageComposer } from '@nurihaus/web-design-system'; //
1786
1824
  | `leading` | `ReactNode` | | |
1787
1825
  | `attachments` | `ReactNode` | | |
1788
1826
  | `disabled` | `boolean` | | |
1827
+ | `autoFocus` | `boolean` | | |
1828
+ | `maxLength` | `number` | | |
1789
1829
  | `className` | `string` | | |
1790
1830
  | `style` | `CSSProperties` | | |
1791
1831
  | `track` | `string` | | |
package/dist/ai/motion.md CHANGED
@@ -337,6 +337,7 @@
337
337
  | BottomBar | – | – | – | – | – | – | – | – | – | – | – | – |
338
338
  | MediaThumbnail | ✓ | – | – | – | – | – | – | – | – | – | – | ✓ |
339
339
  | MediaViewer | – | – | – | ✓ | ✓ | – | – | – | – | – | – | – |
340
+ | IconButton | ✓ | – | – | – | – | – | – | – | – | – | – | – |
340
341
 
341
342
  ### 판단 근거
342
343
 
@@ -389,6 +390,7 @@
389
390
  - **BottomBar** 없음. 주 행동·입력을 담는 고정 바라 스크롤로 숨기지 않는다
390
391
  - **MediaThumbnail** press: 여는 버튼은 onClick 표면이다 (KAN-9451) · busy: 올리는 중(loading) 에 Spinner 를 덮는다 (KAN-9451)
391
392
  - **MediaViewer** enter: 화면 전체 오버레이라 scale 로 들어오고 바탕은 fade 다 (KAN-9451) · exit: enter 와 같은 대상 (KAN-9451)
393
+ - **IconButton** press: onClick·링크가 있는 누르는 표면이다. ghost 는 누르는 동안 회색 원도 보인다 (KAN-9451)
392
394
 
393
395
  ### 바꿀 옛 모션
394
396
 
package/dist/ai/tokens.md CHANGED
@@ -364,6 +364,9 @@
364
364
  | `--media-invalid-border` | `2px` | 사진·영상 썸네일: media-thumbnail. 말풍선 안에서는 쓰는 쪽이 width 로 정하고 이 폭을 넘지 않는다 |
365
365
  | `--composer-send-size` | `36px` | 메시지 입력: message-composer. 보내기 원과 입력 칸 최대 높이(16/22 다섯 줄 + 위아래 안쪽) |
366
366
  | `--composer-max-height` | `132px` | 메시지 입력: message-composer. 보내기 원과 입력 칸 최대 높이(16/22 다섯 줄 + 위아래 안쪽) |
367
+ | `--icon-button-size-s` | `36px` | 메시지 입력: message-composer. 보내기 원과 입력 칸 최대 높이(16/22 다섯 줄 + 위아래 안쪽) |
368
+ | `--icon-button-size-m` | `44px` | 메시지 입력: message-composer. 보내기 원과 입력 칸 최대 높이(16/22 다섯 줄 + 위아래 안쪽) |
369
+ | `--icon-button-size-l` | `56px` | 메시지 입력: message-composer. 보내기 원과 입력 칸 최대 높이(16/22 다섯 줄 + 위아래 안쪽) |
367
370
  | `--empty-state-icon-box` | `64px` | 빈 화면: empty-state 아이콘 원 |
368
371
  | `--step-bar-height` | `4px` | 진행 단계 바 |
369
372
  | `--icon-size-xs` | `16px` | 그 밖의 치수 |
@@ -0,0 +1,24 @@
1
+ "use client";
2
+ export const __webpack_esm_id__ = 1176;
3
+ export const __webpack_esm_ids__ = [1176];
4
+ export const __webpack_esm_modules__ = {
5
+
6
+ /***/ 1176
7
+ (__unused_webpack_module, __webpack_exports__, __nuri_require__) {
8
+
9
+ /* harmony export */ __nuri_require__.d(__webpack_exports__, {
10
+ /* harmony export */ Q: () => (/* binding */ fillLinkChild)
11
+ /* harmony export */ });
12
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __nuri_require__(1041);
13
+
14
+ /**
15
+ * asChild 로 받은 요소 하나(`<a>`·라우터 Link)에 컴포넌트의 내용을 채운다.
16
+ * 요소가 아니면 null — 쓰는 쪽은 null 이면 자기 기본 요소를 그린다.
17
+ */
18
+ var fillLinkChild = function fillLinkChild(asChild, children, content) {
19
+ return asChild && /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(children) ? /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(children, undefined, content) : null;
20
+ };
21
+
22
+ /***/ }
23
+
24
+ };
package/dist/chunk-910.js CHANGED
@@ -13,11 +13,12 @@ export const __webpack_esm_modules__ = {
13
13
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __nuri_require__(1041);
14
14
  /* harmony import */ var _helpers_hooks_useTrack__WEBPACK_IMPORTED_MODULE_2__ = __nuri_require__(4560);
15
15
  /* harmony import */ var _helpers_utils_classNames__WEBPACK_IMPORTED_MODULE_3__ = __nuri_require__(3274);
16
- /* harmony import */ var _helpers_utils_getMergedProps__WEBPACK_IMPORTED_MODULE_4__ = __nuri_require__(7335);
17
- /* harmony import */ var _callout_callout__WEBPACK_IMPORTED_MODULE_5__ = __nuri_require__(1163);
18
- /* harmony import */ var _loading_spinner_spinner__WEBPACK_IMPORTED_MODULE_6__ = __nuri_require__(6302);
19
- /* harmony import */ var _base_button__WEBPACK_IMPORTED_MODULE_7__ = __nuri_require__(8933);
20
- /* harmony import */ var _button_props__WEBPACK_IMPORTED_MODULE_8__ = __nuri_require__(9976);
16
+ /* harmony import */ var _helpers_utils_fillLinkChild__WEBPACK_IMPORTED_MODULE_4__ = __nuri_require__(1176);
17
+ /* harmony import */ var _helpers_utils_getMergedProps__WEBPACK_IMPORTED_MODULE_5__ = __nuri_require__(7335);
18
+ /* harmony import */ var _callout_callout__WEBPACK_IMPORTED_MODULE_6__ = __nuri_require__(1163);
19
+ /* harmony import */ var _loading_spinner_spinner__WEBPACK_IMPORTED_MODULE_7__ = __nuri_require__(6302);
20
+ /* harmony import */ var _base_button__WEBPACK_IMPORTED_MODULE_8__ = __nuri_require__(8933);
21
+ /* harmony import */ var _button_props__WEBPACK_IMPORTED_MODULE_9__ = __nuri_require__(9976);
21
22
  var __assign = undefined && undefined.__assign || function () {
22
23
  __assign = Object.assign || function (t) {
23
24
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -45,8 +46,9 @@ var __rest = undefined && undefined.__rest || function (s, e) {
45
46
 
46
47
 
47
48
 
49
+
48
50
  var CTAButton = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_1__.forwardRef)(function (props, ref) {
49
- var _a = (0,_helpers_utils_getMergedProps__WEBPACK_IMPORTED_MODULE_4__/* .getMergedProps */ .p)(props, _button_props__WEBPACK_IMPORTED_MODULE_8__/* .ctaButtonProps */ .Lr),
51
+ var _a = (0,_helpers_utils_getMergedProps__WEBPACK_IMPORTED_MODULE_5__/* .getMergedProps */ .p)(props, _button_props__WEBPACK_IMPORTED_MODULE_9__/* .ctaButtonProps */ .Lr),
50
52
  className = _a.className,
51
53
  text = _a.text,
52
54
  leftIcon = _a.leftIcon,
@@ -64,26 +66,26 @@ var CTAButton = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_1__.forwardRef)(f
64
66
  trackProps: trackProps
65
67
  });
66
68
  var content = (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {
67
- children: [leftIcon, text, rightIcon, callout ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_callout_callout__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A, {
69
+ children: [leftIcon, text, rightIcon, callout ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_callout_callout__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, {
68
70
  className: 'cta-button-callout',
69
71
  text: callout
70
72
  }) : null]
71
73
  });
72
74
  // asChild 면 넘겨받은 링크 요소 안에 버튼 글자를 넣고, 그 요소가 버튼 클래스·핸들러를 받는다
73
- var linkChild = asChild && /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_1__.isValidElement)(children) ? children : null;
74
- return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_base_button__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A, __assign({
75
+ var link = (0,_helpers_utils_fillLinkChild__WEBPACK_IMPORTED_MODULE_4__/* .fillLinkChild */ .Q)(asChild, children, content);
76
+ return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_base_button__WEBPACK_IMPORTED_MODULE_8__/* ["default"] */ .A, __assign({
75
77
  ref: ref,
76
78
  className: (0,_helpers_utils_classNames__WEBPACK_IMPORTED_MODULE_3__/* .classNames */ .x)(className, 'cta-button', callout ? 'with-callout' : undefined),
77
- loadingComponent: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_loading_spinner_spinner__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, {}),
78
- asChild: linkChild !== null,
79
+ loadingComponent: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_loading_spinner_spinner__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A, {}),
80
+ asChild: link !== null,
79
81
  // 링크는 로딩을 그리지 않는다. 그리면 Spinner 가 링크 자리를 차지한다
80
- loading: linkChild ? undefined : loading,
82
+ loading: link ? undefined : loading,
81
83
  onClick: function onClick(event) {
82
84
  emit('click');
83
85
  _onClick === null || _onClick === void 0 ? void 0 : _onClick(event);
84
86
  }
85
87
  }, restProps, {
86
- children: linkChild ? /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_1__.cloneElement)(linkChild, undefined, content) : content
88
+ children: link !== null && link !== void 0 ? link : content
87
89
  }));
88
90
  });
89
91
  CTAButton.displayName = 'CTAButton';
@@ -6,14 +6,8 @@ declare const meta: {
6
6
  }, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
7
7
  decorators: ((Story: import("storybook/internal/csf").PartialStoryFn<import("@storybook/react-webpack5").ReactRenderer, {
8
8
  className?: string | undefined | undefined;
9
- onClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
10
- onChange?: import("react").FormEventHandler<HTMLDivElement> | undefined;
11
- id?: string | undefined | undefined;
12
9
  style?: import("react").CSSProperties | undefined;
13
10
  children?: import("react").ReactNode;
14
- slot?: string | undefined | undefined;
15
- title?: string | undefined | undefined;
16
- key?: import("react").Key | null | undefined;
17
11
  defaultChecked?: boolean | undefined | undefined;
18
12
  defaultValue?: string | number | readonly string[] | undefined;
19
13
  suppressContentEditableWarning?: boolean | undefined | undefined;
@@ -27,10 +21,13 @@ declare const meta: {
27
21
  draggable?: (boolean | "true" | "false") | undefined;
28
22
  enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
29
23
  hidden?: boolean | undefined | undefined;
24
+ id?: string | undefined | undefined;
30
25
  lang?: string | undefined | undefined;
31
26
  nonce?: string | undefined | undefined;
27
+ slot?: string | undefined | undefined;
32
28
  spellCheck?: (boolean | "true" | "false") | undefined;
33
29
  tabIndex?: number | undefined | undefined;
30
+ title?: string | undefined | undefined;
34
31
  translate?: "yes" | "no" | undefined | undefined;
35
32
  radioGroup?: string | undefined | undefined;
36
33
  role?: import("react").AriaRole | undefined;
@@ -132,6 +129,7 @@ declare const meta: {
132
129
  onFocusCapture?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
133
130
  onBlur?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
134
131
  onBlurCapture?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
132
+ onChange?: import("react").FormEventHandler<HTMLDivElement> | undefined;
135
133
  onChangeCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
136
134
  onBeforeInput?: import("react").InputEventHandler<HTMLDivElement> | undefined;
137
135
  onBeforeInputCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
@@ -199,6 +197,7 @@ declare const meta: {
199
197
  onWaitingCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
200
198
  onAuxClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
201
199
  onAuxClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
200
+ onClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
202
201
  onClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
203
202
  onContextMenu?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
204
203
  onContextMenuCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
@@ -272,6 +271,7 @@ declare const meta: {
272
271
  onAnimationIterationCapture?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
273
272
  onTransitionEnd?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
274
273
  onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
274
+ key?: import("react").Key | null | undefined;
275
275
  ref?: import("react").LegacyRef<HTMLDivElement> | undefined;
276
276
  }>) => import("react/jsx-runtime").JSX.Element)[];
277
277
  };
@@ -18,13 +18,7 @@ declare const meta: {
18
18
  };
19
19
  decorators: ((Story: import("storybook/internal/csf").PartialStoryFn<import("@storybook/react-webpack5").ReactRenderer, {
20
20
  className?: string | undefined | undefined;
21
- onClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
22
- onChange?: import("react").FormEventHandler<HTMLDivElement> | undefined;
23
- id?: string | undefined | undefined;
24
21
  style?: import("react").CSSProperties | undefined;
25
- slot?: string | undefined | undefined;
26
- title: import("react").ReactNode;
27
- key?: import("react").Key | null | undefined;
28
22
  defaultChecked?: boolean | undefined | undefined;
29
23
  defaultValue?: string | number | readonly string[] | undefined;
30
24
  suppressContentEditableWarning?: boolean | undefined | undefined;
@@ -38,10 +32,13 @@ declare const meta: {
38
32
  draggable?: (boolean | "true" | "false") | undefined;
39
33
  enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
40
34
  hidden?: boolean | undefined | undefined;
35
+ id?: string | undefined | undefined;
41
36
  lang?: string | undefined | undefined;
42
37
  nonce?: string | undefined | undefined;
38
+ slot?: string | undefined | undefined;
43
39
  spellCheck?: (boolean | "true" | "false") | undefined;
44
40
  tabIndex?: number | undefined | undefined;
41
+ title: import("react").ReactNode;
45
42
  translate?: "yes" | "no" | undefined | undefined;
46
43
  radioGroup?: string | undefined | undefined;
47
44
  role?: import("react").AriaRole | undefined;
@@ -143,6 +140,7 @@ declare const meta: {
143
140
  onFocusCapture?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
144
141
  onBlur?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
145
142
  onBlurCapture?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
143
+ onChange?: import("react").FormEventHandler<HTMLDivElement> | undefined;
146
144
  onChangeCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
147
145
  onBeforeInput?: import("react").InputEventHandler<HTMLDivElement> | undefined;
148
146
  onBeforeInputCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
@@ -210,6 +208,7 @@ declare const meta: {
210
208
  onWaitingCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
211
209
  onAuxClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
212
210
  onAuxClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
211
+ onClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
213
212
  onClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
214
213
  onContextMenu?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
215
214
  onContextMenuCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
@@ -283,10 +282,11 @@ declare const meta: {
283
282
  onAnimationIterationCapture?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
284
283
  onTransitionEnd?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
285
284
  onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
286
- description?: import("react").ReactNode;
285
+ key?: import("react").Key | null | undefined;
287
286
  variant?: (typeof variant)[number] | undefined;
288
- action?: import("react").ReactNode;
289
287
  icon: import("../..").IconName;
288
+ description?: import("react").ReactNode;
289
+ action?: import("react").ReactNode;
290
290
  ref?: import("react").LegacyRef<HTMLDivElement> | undefined;
291
291
  }>) => import("react/jsx-runtime").JSX.Element)[];
292
292
  };
@@ -7,7 +7,7 @@ declare const meta: {
7
7
  control: {
8
8
  type: "select";
9
9
  };
10
- options: ("link" | "circle" | "image" | "copy" | "x" | "warning" | "play" | "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" | "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" | "share-network" | "eye" | "sliders-horizontal" | "heart" | "star" | "globe" | "sign-out" | "caret-right" | "arrow-right" | "instagram-logo" | "tiktok-logo" | "youtube-logo")[];
10
+ options: ("link" | "circle" | "image" | "x" | "copy" | "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" | "warning" | "info" | "question" | "lock" | "pencil-simple" | "trash" | "share-network" | "eye" | "sliders-horizontal" | "heart" | "star" | "globe" | "sign-out" | "caret-right" | "arrow-right" | "instagram-logo" | "tiktok-logo" | "youtube-logo")[];
11
11
  };
12
12
  weight: {
13
13
  control: {
@@ -0,0 +1,3 @@
1
+ import { BaseIconButtonProps } from './icon-button-type';
2
+ declare const BaseIconButton: import("react").ForwardRefExoticComponent<Omit<BaseIconButtonProps, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
3
+ export default BaseIconButton;
@@ -0,0 +1,12 @@
1
+ export declare const variant: readonly ["ghost", "secondary", "primary"];
2
+ export declare const sizes: readonly ["s", "m", "l"];
3
+ export declare const defaultSize: (typeof sizes)[number];
4
+ export declare const iconButtonProps: {
5
+ variant: {
6
+ type: "className";
7
+ className: string;
8
+ values: readonly ["ghost", "secondary", "primary"];
9
+ default: "ghost";
10
+ };
11
+ size: import("../../helpers/types/propsDef").ClassNamePropsType<readonly ["s", "m", "l"]>;
12
+ };
@@ -0,0 +1,16 @@
1
+ import { ComponentPropsWithRef, ReactNode } from 'react';
2
+ import { AsChildProps } from '../../helpers/types/common-props';
3
+ import { IconName } from '../icon/icon-type';
4
+ import { TrackProps } from '../logging/logging-type';
5
+ import { sizes, variant } from './icon-button-props';
6
+ export interface BaseIconButtonProps extends ComponentPropsWithRef<'button'>, AsChildProps {
7
+ }
8
+ export interface IconButtonProps extends Omit<ComponentPropsWithRef<'button'>, 'children'>, AsChildProps, TrackProps {
9
+ icon: IconName;
10
+ /** 버튼의 이름(aria-label). 아이콘만 있어 꼭 준다 */
11
+ label: string;
12
+ variant?: (typeof variant)[number];
13
+ size?: (typeof sizes)[number];
14
+ /** asChild 일 때 링크 요소 하나(`<a>`·라우터 Link). 아이콘은 그 안에 들어간다 */
15
+ children?: ReactNode;
16
+ }
@@ -0,0 +1,5 @@
1
+ import { IconButtonProps } from './icon-button-type';
2
+ /** 아이콘 하나뿐인 버튼. 누르는 자리는 늘 터치 44 이상이다 */
3
+ declare const IconButton: import("react").ForwardRefExoticComponent<Omit<IconButtonProps, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
4
+ export default IconButton;
5
+ export type { IconButtonProps } from './icon-button-type';
@@ -0,0 +1,31 @@
1
+ import type { StoryObj } from '@storybook/react-webpack5';
2
+ declare const meta: {
3
+ title: string;
4
+ component: import("react").ForwardRefExoticComponent<Omit<import("./icon-button-type").IconButtonProps, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
5
+ args: {
6
+ icon: "caret-left";
7
+ label: string;
8
+ };
9
+ argTypes: {
10
+ variant: {
11
+ control: {
12
+ type: "select";
13
+ };
14
+ options: readonly ["ghost", "secondary", "primary"];
15
+ };
16
+ size: {
17
+ control: {
18
+ type: "select";
19
+ };
20
+ options: readonly ["s", "m", "l"];
21
+ };
22
+ };
23
+ };
24
+ export default meta;
25
+ type Story = StoryObj<typeof meta>;
26
+ export declare const Default: Story;
27
+ /** 종류 × 크기 */
28
+ export declare const Variants: Story;
29
+ export declare const Disabled: Story;
30
+ /** 다른 화면으로 가는 버튼은 링크를 감싼다 */
31
+ export declare const AsLink: Story;
@@ -6,19 +6,10 @@ declare const meta: {
6
6
  label: string;
7
7
  };
8
8
  decorators: ((Story: import("storybook/internal/csf").PartialStoryFn<import("@storybook/react-webpack5").ReactRenderer, {
9
- label: import("react").ReactNode;
9
+ asChild?: boolean | undefined;
10
10
  className?: string | undefined | undefined;
11
- onClick?: import("react").MouseEventHandler<HTMLElement> | undefined;
12
- onChange?: import("react").FormEventHandler<HTMLDivElement> | undefined;
13
- id?: string | undefined | undefined;
14
- track?: string | undefined;
15
- trackProps?: Record<string, string | number | boolean> | undefined;
16
11
  style?: import("react").CSSProperties | undefined;
17
12
  children?: import("react").ReactNode;
18
- asChild?: boolean | undefined;
19
- slot?: string | undefined | undefined;
20
- title?: string | undefined | undefined;
21
- key?: import("react").Key | null | undefined;
22
13
  defaultChecked?: boolean | undefined | undefined;
23
14
  defaultValue?: string | number | readonly string[] | undefined;
24
15
  suppressContentEditableWarning?: boolean | undefined | undefined;
@@ -32,10 +23,13 @@ declare const meta: {
32
23
  draggable?: (boolean | "true" | "false") | undefined;
33
24
  enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
34
25
  hidden?: boolean | undefined | undefined;
26
+ id?: string | undefined | undefined;
35
27
  lang?: string | undefined | undefined;
36
28
  nonce?: string | undefined | undefined;
29
+ slot?: string | undefined | undefined;
37
30
  spellCheck?: (boolean | "true" | "false") | undefined;
38
31
  tabIndex?: number | undefined | undefined;
32
+ title?: string | undefined | undefined;
39
33
  translate?: "yes" | "no" | undefined | undefined;
40
34
  radioGroup?: string | undefined | undefined;
41
35
  role?: import("react").AriaRole | undefined;
@@ -137,6 +131,7 @@ declare const meta: {
137
131
  onFocusCapture?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
138
132
  onBlur?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
139
133
  onBlurCapture?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
134
+ onChange?: import("react").FormEventHandler<HTMLDivElement> | undefined;
140
135
  onChangeCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
141
136
  onBeforeInput?: import("react").InputEventHandler<HTMLDivElement> | undefined;
142
137
  onBeforeInputCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
@@ -204,6 +199,7 @@ declare const meta: {
204
199
  onWaitingCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
205
200
  onAuxClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
206
201
  onAuxClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
202
+ onClick?: import("react").MouseEventHandler<HTMLElement> | undefined;
207
203
  onClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
208
204
  onContextMenu?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
209
205
  onContextMenuCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
@@ -277,6 +273,10 @@ declare const meta: {
277
273
  onAnimationIterationCapture?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
278
274
  onTransitionEnd?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
279
275
  onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
276
+ label: import("react").ReactNode;
277
+ track?: string | undefined;
278
+ key?: import("react").Key | null | undefined;
279
+ trackProps?: Record<string, string | number | boolean> | undefined;
280
280
  description?: import("react").ReactNode;
281
281
  chevron?: boolean | undefined;
282
282
  leading?: import("react").ReactNode;
@@ -23,17 +23,8 @@ declare const meta: {
23
23
  };
24
24
  decorators: ((Story: import("storybook/internal/csf").PartialStoryFn<import("@storybook/react-webpack5").ReactRenderer, {
25
25
  className?: string | undefined | undefined;
26
- onClick?: import("react").MouseEventHandler<HTMLLIElement> | undefined;
27
- onChange?: import("react").FormEventHandler<HTMLLIElement> | undefined;
28
- id?: string | undefined | undefined;
29
26
  style?: import("react").CSSProperties | undefined;
30
27
  children?: import("react").ReactNode;
31
- slot?: string | undefined | undefined;
32
- time?: import("react").ReactNode;
33
- title?: string | undefined | undefined;
34
- key?: import("react").Key | null | undefined;
35
- name?: import("react").ReactNode;
36
- value?: string | number | readonly string[] | undefined;
37
28
  defaultChecked?: boolean | undefined | undefined;
38
29
  defaultValue?: string | number | readonly string[] | undefined;
39
30
  suppressContentEditableWarning?: boolean | undefined | undefined;
@@ -47,10 +38,13 @@ declare const meta: {
47
38
  draggable?: (boolean | "true" | "false") | undefined;
48
39
  enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
49
40
  hidden?: boolean | undefined | undefined;
41
+ id?: string | undefined | undefined;
50
42
  lang?: string | undefined | undefined;
51
43
  nonce?: string | undefined | undefined;
44
+ slot?: string | undefined | undefined;
52
45
  spellCheck?: (boolean | "true" | "false") | undefined;
53
46
  tabIndex?: number | undefined | undefined;
47
+ title?: string | undefined | undefined;
54
48
  translate?: "yes" | "no" | undefined | undefined;
55
49
  radioGroup?: string | undefined | undefined;
56
50
  role?: import("react").AriaRole | undefined;
@@ -152,6 +146,7 @@ declare const meta: {
152
146
  onFocusCapture?: import("react").FocusEventHandler<HTMLLIElement> | undefined;
153
147
  onBlur?: import("react").FocusEventHandler<HTMLLIElement> | undefined;
154
148
  onBlurCapture?: import("react").FocusEventHandler<HTMLLIElement> | undefined;
149
+ onChange?: import("react").FormEventHandler<HTMLLIElement> | undefined;
155
150
  onChangeCapture?: import("react").FormEventHandler<HTMLLIElement> | undefined;
156
151
  onBeforeInput?: import("react").InputEventHandler<HTMLLIElement> | undefined;
157
152
  onBeforeInputCapture?: import("react").FormEventHandler<HTMLLIElement> | undefined;
@@ -219,6 +214,7 @@ declare const meta: {
219
214
  onWaitingCapture?: import("react").ReactEventHandler<HTMLLIElement> | undefined;
220
215
  onAuxClick?: import("react").MouseEventHandler<HTMLLIElement> | undefined;
221
216
  onAuxClickCapture?: import("react").MouseEventHandler<HTMLLIElement> | undefined;
217
+ onClick?: import("react").MouseEventHandler<HTMLLIElement> | undefined;
222
218
  onClickCapture?: import("react").MouseEventHandler<HTMLLIElement> | undefined;
223
219
  onContextMenu?: import("react").MouseEventHandler<HTMLLIElement> | undefined;
224
220
  onContextMenuCapture?: import("react").MouseEventHandler<HTMLLIElement> | undefined;
@@ -292,9 +288,13 @@ declare const meta: {
292
288
  onAnimationIterationCapture?: import("react").AnimationEventHandler<HTMLLIElement> | undefined;
293
289
  onTransitionEnd?: import("react").TransitionEventHandler<HTMLLIElement> | undefined;
294
290
  onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLLIElement> | undefined;
291
+ time?: import("react").ReactNode;
292
+ key?: import("react").Key | null | undefined;
293
+ name?: import("react").ReactNode;
294
+ value?: string | number | readonly string[] | undefined;
295
295
  motion?: (typeof motion)[number] | undefined;
296
- side?: (typeof side)[number] | undefined;
297
296
  media?: import("react").ReactNode;
297
+ side?: (typeof side)[number] | undefined;
298
298
  dateTime?: string | undefined;
299
299
  ref?: import("react").LegacyRef<HTMLLIElement> | undefined;
300
300
  }>) => import("react/jsx-runtime").JSX.Element)[];
@@ -24,4 +24,8 @@ export interface MessageComposerProps extends StyleProps, TrackProps {
24
24
  /** 입력 줄 위 자리. 첨부한 썸네일 등 */
25
25
  attachments?: ReactNode;
26
26
  disabled?: boolean;
27
+ /** 나타나자마자 입력 칸에 포커스한다. 사용자가 방금 입력을 열었을 때만 준다 */
28
+ autoFocus?: boolean;
29
+ /** 입력 칸 최대 글자 수(textarea maxLength) */
30
+ maxLength?: number;
27
31
  }
@@ -21,6 +21,8 @@ declare const meta: {
21
21
  leading?: import("react").ReactNode;
22
22
  attachments?: import("react").ReactNode;
23
23
  disabled?: boolean | undefined;
24
+ autoFocus?: boolean | undefined;
25
+ maxLength?: number | undefined;
24
26
  className?: string | undefined;
25
27
  style?: import("react").CSSProperties | undefined;
26
28
  track?: string | undefined;
@@ -6,6 +6,8 @@ export type BaseNoticeProps = ComponentPropsWithRef<'div'>;
6
6
  export interface NoticeAction extends TrackProps {
7
7
  label: string;
8
8
  onClick: () => void;
9
+ /** 처리 중. 버튼이 Spinner 로 바뀌고 누르지 않는다 */
10
+ loading?: boolean;
9
11
  }
10
12
  export interface NoticeProps extends Omit<ComponentPropsWithRef<'div'>, 'title'> {
11
13
  variant?: (typeof variant)[number];