@nurihaus/web-design-system 3.3.0 → 3.5.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 (93) hide show
  1. package/README.md +36 -0
  2. package/dist/ai/components.md +148 -5
  3. package/dist/avatar.js +5 -5
  4. package/dist/bottom-nav.js +22 -8
  5. package/dist/breadcrumb.js +25 -10
  6. package/dist/callout.js +220 -0
  7. package/dist/check-box.js +24 -8
  8. package/dist/chip-group.js +21 -7
  9. package/dist/{chunk-563.js → chunk-1563.js} +26 -13
  10. package/dist/{chunk-657.js → chunk-1657.js} +2 -2
  11. package/dist/chunk-2496.js +70 -0
  12. package/dist/{chunk-777.js → chunk-2777.js} +2 -2
  13. package/dist/{chunk-558.js → chunk-4558.js} +2 -2
  14. package/dist/chunk-4560.js +77 -0
  15. package/dist/{chunk-917.js → chunk-4917.js} +2 -2
  16. package/dist/{chunk-77.js → chunk-5077.js} +2 -2
  17. package/dist/chunk-5226.js +79 -0
  18. package/dist/{chunk-149.js → chunk-6149.js} +2 -2
  19. package/dist/{chunk-302.js → chunk-6302.js} +2 -2
  20. package/dist/{chunk-364.js → chunk-6364.js} +2 -2
  21. package/dist/{chunk-713.js → chunk-6713.js} +2 -2
  22. package/dist/{chunk-298.js → chunk-7298.js} +2 -2
  23. package/dist/{chunk-653.js → chunk-7653.js} +2 -2
  24. package/dist/{chunk-739.js → chunk-7739.js} +2 -2
  25. package/dist/{chunk-309.js → chunk-8690.js} +2 -2
  26. package/dist/{chunk-933.js → chunk-8933.js} +2 -2
  27. package/dist/chunk-910.js +30 -11
  28. package/dist/{chunk-387.js → chunk-9387.js} +2 -2
  29. package/dist/{chunk-436.js → chunk-9436.js} +2 -2
  30. package/dist/collapsible-menu.js +25 -12
  31. package/dist/components/bottom-nav/bottom-nav-type.d.ts +5 -2
  32. package/dist/components/breadcrumb/breadcrumb-type.d.ts +2 -1
  33. package/dist/components/button/button-props.d.ts +2 -2
  34. package/dist/components/button/button-type.d.ts +4 -1
  35. package/dist/components/button/button.stories.d.ts +1 -1
  36. package/dist/components/callout/base-callout.d.ts +4 -0
  37. package/dist/components/callout/callout-props.d.ts +10 -0
  38. package/dist/components/callout/callout-type.d.ts +7 -0
  39. package/dist/components/callout/callout.d.ts +5 -0
  40. package/dist/components/callout/callout.stories.d.ts +22 -0
  41. package/dist/components/check-box/check-box-type.d.ts +2 -1
  42. package/dist/components/chip-group/chip-group-type.d.ts +2 -1
  43. package/dist/components/collapsible-menu/collapsible-menu-type.d.ts +2 -1
  44. package/dist/components/drawer/drawer-type.d.ts +2 -1
  45. package/dist/components/drop-down/drop-down-type.d.ts +2 -1
  46. package/dist/components/logging/log-context.d.ts +9 -0
  47. package/dist/components/logging/logging-type.d.ts +25 -0
  48. package/dist/components/logging/logging.d.ts +5 -0
  49. package/dist/components/logging/logging.stories.d.ts +18 -0
  50. package/dist/components/modal/modal-type.d.ts +2 -1
  51. package/dist/components/pagination/pagination-type.d.ts +2 -1
  52. package/dist/components/radio/radio-type.d.ts +3 -1
  53. package/dist/components/radio/radio.d.ts +2 -1
  54. package/dist/components/radio/radio.stories.d.ts +1 -1
  55. package/dist/components/skeleton/skeleton.stories.d.ts +5 -5
  56. package/dist/components/switch/switch-type.d.ts +2 -1
  57. package/dist/components/table/table-type.d.ts +2 -1
  58. package/dist/components/tabs/tabs-type.d.ts +2 -1
  59. package/dist/components/text-area/text-area-type.d.ts +2 -1
  60. package/dist/components/text-field/text-field-type.d.ts +2 -1
  61. package/dist/components/toast/toast-type.d.ts +2 -1
  62. package/dist/components/toast/toast.stories.d.ts +7 -5
  63. package/dist/components/tooltip/tooltip-type.d.ts +2 -1
  64. package/dist/components.css +79 -0
  65. package/dist/cta-button.js +44 -21
  66. package/dist/data-table.js +19 -7
  67. package/dist/drawer.js +23 -9
  68. package/dist/drop-down.js +25 -9
  69. package/dist/helpers/hooks/useTrack.d.ts +3 -0
  70. package/dist/icon-text-badge.js +11 -9
  71. package/dist/icon-text-option-badge.js +5 -5
  72. package/dist/icon.js +5 -5
  73. package/dist/index.d.ts +4 -0
  74. package/dist/index.js +557 -80
  75. package/dist/loading.js +6 -6
  76. package/dist/logging.js +147 -0
  77. package/dist/modal-with-double-button.js +16 -12
  78. package/dist/modal.js +39 -26
  79. package/dist/option-badge.js +11 -9
  80. package/dist/pagination.js +23 -9
  81. package/dist/radio.js +24 -10
  82. package/dist/skeleton.js +4 -4
  83. package/dist/step-progress.js +3 -3
  84. package/dist/styles.css +66 -0
  85. package/dist/switch.js +24 -8
  86. package/dist/tabs.js +22 -6
  87. package/dist/text-area.js +30 -8
  88. package/dist/text-field.js +31 -9
  89. package/dist/text.js +5 -5
  90. package/dist/toast.js +34 -15
  91. package/dist/tooltip.js +33 -18
  92. package/package.json +9 -1
  93. package/dist/chunk-976.js +0 -29
package/README.md CHANGED
@@ -118,6 +118,42 @@ npm run tokens # figma.json → tokens/generated/{tokens.css, *.ts}
118
118
 
119
119
  새 서비스가 다른 의미 토큰 값(버튼 색 등)을 써야 하면 `tokens/figma.json` 에 `semantic_{이름}` 세트를 추가하고 `npm run tokens` 를 돌린다. `<html data-ds-theme="{이름}">` 로 고르는 테마가 생긴다. 자세한 규칙은 `docs/tokens.md`.
120
120
 
121
+ ## 사용 로그
122
+
123
+ 컴포넌트가 사용자 상호작용을 이벤트로 내보내고, 어디로 보낼지는 앱이 정한다. 디자인시스템은 로그 수집기를 모른다.
124
+
125
+ 앱 루트에 `LogProvider` 를 한 번 둔다. `onEvent` 가 받은 이벤트를 앱의 로그 수집기로 보낸다.
126
+
127
+ ```tsx
128
+ import { LogProvider } from '@nurihaus/web-design-system/logging';
129
+
130
+ export default function App({ children }) {
131
+ return <LogProvider onEvent={(event) => console.log(event)}>{children}</LogProvider>;
132
+ }
133
+ ```
134
+
135
+ 컴포넌트에 `track` 을 준다. 누르면 `{ component: 'CTAButton', action: 'click', track: 'report/download', props: { format: 'csv' }, timestamp }` 가 `onEvent` 로 간다.
136
+
137
+ ```tsx
138
+ <CTAButton text='리포트 받기' track='report/download' trackProps={{ format: 'csv' }} />
139
+ ```
140
+
141
+ `track` 을 받는 컴포넌트는 CTAButton · DataTable(`click`), Modal · Drawer(`open` · `close`), Tabs · DropDown · ChipGroup · Radio · Checkbox · Switch · Pagination · TextField · TextArea(`change`), BottomNav · Breadcrumb · CollapsibleMenu(`navigate`), Toast · Tooltip(`show`) 다. `value` 에는 탭 id · 칩 id · 옵션 value 처럼 개발자가 정한 id 만 들어간다. TextField · TextArea 는 포커스가 빠질 때 값이 바뀌었으면 값 없이 `change` 를 한 번 보낸다. `LogProvider` 가 없거나 `track` 을 주지 않으면 아무것도 보내지 않는다.
142
+
143
+ 컴포넌트 밖의 로그는 `useLog` 로 남긴다.
144
+
145
+ ```tsx
146
+ import { useEffect } from 'react';
147
+
148
+ import { useLog } from '@nurihaus/web-design-system/logging';
149
+
150
+ const ReportPage = () => {
151
+ const log = useLog();
152
+ useEffect(() => log({ component: 'ReportPage', action: 'view', track: 'report/view' }), [log]);
153
+ // …
154
+ };
155
+ ```
156
+
121
157
  ## AI 설명서
122
158
 
123
159
  배포물의 `dist/ai/` 에 쓰는 쪽 AI 가 읽는 설명서가 들어 있다.
@@ -30,12 +30,33 @@ import '@nurihaus/web-design-system/components.css';
30
30
 
31
31
  **Tooltip 이 여러 개면 `TooltipProvider` 로 감싼다.** 앱 루트에 한 번 두면 된다. 조건이 맞을 때만 띄우려면 `open` 을 제어하지 말고 `disabled` 를 쓴다.
32
32
 
33
+ **사용 로그는 `track` 으로 남긴다.** 앱 루트에 `LogProvider` 를 한 번 두고 `onEvent` 에서 로그 수집기로 보낸다. 컴포넌트에 `track="report/download"` 처럼 개발자가 정한 이름을 주면 아래 상호작용이 이벤트로 나간다. `component` 는 컴포넌트의 displayName 이다(Checkbox 는 `'CheckBox'`).
34
+
35
+ | 컴포넌트 | 보내는 때 | action | value |
36
+ | --- | --- | --- | --- |
37
+ | CTAButton | 누를 때 | `click` | 없음 |
38
+ | DataTable | `onClickRow` 가 있는 헤더 칸을 누를 때 | `click` | 그 칸의 `id` |
39
+ | Modal · Drawer | 열고 닫을 때 | `open` · `close` | 없음 |
40
+ | Tabs · DropDown · ChipGroup · Radio | 고를 때 | `change` | 탭 id · 옵션 value · 칩 id · 선택지 id |
41
+ | Checkbox · Switch | 켜고 끌 때 | `change` | `'on'` · `'off'` |
42
+ | Pagination | 페이지가 바뀔 때 | `change` | 페이지 번호(문자열) |
43
+ | TextField · TextArea | 포커스가 빠질 때, 포커스를 받을 때와 값이 다르면 한 번 | `change` | 없음 |
44
+ | BottomNav | 탭을 누를 때 | `navigate` | 탭 id |
45
+ | Breadcrumb | 현재 위치가 아닌 링크를 누를 때 | `navigate` | 항목 `id` |
46
+ | CollapsibleMenu | 링크·버튼 항목을 고를 때. 그룹 여닫기는 보내지 않는다 | `navigate` | 항목 `key` |
47
+ | Toast · Tooltip | 뜰 때 | `show` | 없음 |
48
+
49
+ `value` 에는 개발자가 정한 id 만 들어가고 사용자가 입력한 글자는 들어가지 않는다. TextField · TextArea 가 값을 싣지 않는 것도 그래서다. 더 붙일 값은 `trackProps` 로 준다. `LogProvider` 가 없거나 `track` 이 없으면 아무것도 보내지 않는다. 컴포넌트 밖의 로그(화면 진입 등)는 `useLog` 를 쓴다.
50
+
51
+ Avatar · OptionBadge · IconTextBadge · IconTextOptionBadge · Skeleton · Text · Icon · StepProgress · Spinner · InlineLoading · OverlayLoading 은 상호작용 핸들러가 없어 `track` 을 받지 않는다. ModalWithDoubleButton 은 `left` · `right` 가 CTAButton props 라 거기에 `track` 을 준다.
52
+
33
53
  **없는 것은 지어내지 않는다.** 이 문서 끝의 "아직 없는 것" 표에 있는 컴포넌트는 없다. 없는 prop · variant · 토큰 이름도 만들지 않는다. 틀린 variant 나 size 값은 타입 오류가 난다.
34
54
 
35
55
  ## 목록
36
56
 
37
57
  - [Avatar](#avatar)
38
58
  - [CTAButton](#ctabutton)
59
+ - [Callout](#callout)
39
60
  - [OptionBadge](#optionbadge)
40
61
  - [IconTextBadge](#icontextbadge)
41
62
  - [IconTextOptionBadge](#icontextoptionbadge)
@@ -66,6 +87,7 @@ import '@nurihaus/web-design-system/components.css';
66
87
  - [BottomNav](#bottomnav)
67
88
  - [StepProgress](#stepprogress)
68
89
  - [ChipGroup](#chipgroup)
90
+ - [LogProvider](#logprovider)
69
91
 
70
92
  ## Avatar
71
93
 
@@ -102,12 +124,21 @@ import { CTAButton } from '@nurihaus/web-design-system/cta-button'; // 이 컴
102
124
  import { CTAButton } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
103
125
  ```
104
126
 
105
- **언제 쓴다.** 저장, 확인, 다음 단계처럼 사용자가 실행하는 동작 버튼에 쓴다. `variant`로 강조 단계를 고르고, `loading`이 true면 `text` 대신 Spinner가 표시된다.
127
+ **언제 쓴다.** 저장, 확인, 다음 단계처럼 사용자가 실행하는 동작 버튼에 쓴다. `variant`로 강조 단계를 고르고, `loading`이 true면 `text` 대신 Spinner가 표시된다. Google·Apple·Facebook 로그인 버튼은 `variant="social"`(흰 바탕·검정 글자, 공급자 가이드)에 공급자 로고를 `leftIcon`으로 준다. `callout`을 주면 버튼 오른쪽 위 모서리에 말풍선(Callout)을 끼운다(예: "최근 사용") — 버튼 글자는 움직이지 않고 자리는 DS 가 잡는다. 말풍선 글자도 버튼 안이라 버튼의 접근 가능한 이름에 이어진다(스크린 리더도 "최근 사용"을 듣는다).
106
128
 
107
129
  **쓰지 않는다.** 확인과 취소 두 버튼을 가진 대화상자는 버튼을 직접 배치하지 말고 ModalWithDoubleButton을 쓴다. 화면 안의 패널 전환은 Tabs, 사이드 메뉴 항목은 CollapsibleMenu를 쓴다.
108
130
 
109
131
  ```tsx
110
- <CTAButton variant="primary" size="m" text="저장" onClick={() => {}} />
132
+ <>
133
+ <CTAButton variant="primary" size="m" text="저장" onClick={() => {}} />
134
+ <CTAButton
135
+ variant="social"
136
+ size="l"
137
+ text="Google로 계속하기"
138
+ leftIcon={<img src="/icons/google.svg" alt="" />}
139
+ callout="최근 사용"
140
+ />
141
+ </>
111
142
  ```
112
143
 
113
144
  ### props
@@ -115,14 +146,45 @@ import { CTAButton } from '@nurihaus/web-design-system'; // 루트.
115
146
  | prop | 타입 | 필수 | 기본값 |
116
147
  | --- | --- | --- | --- |
117
148
  | `size` | `'xs' \| 's' \| 'm' \| 'l' \| 'xl'` | | `'m'` |
149
+ | `track` | `string` | | |
118
150
  | `text` | `ReactNode` | 예 | |
119
- | `variant` | `'neutral' \| 'primary' \| 'outlined' \| 'secondary' \| 'ghost' \| 'confirm'` | | `'primary'` |
151
+ | `variant` | `'neutral' \| 'primary' \| 'outlined' \| 'secondary' \| 'ghost' \| 'confirm' \| 'social'` | | `'primary'` |
120
152
  | `leftIcon` | `ReactNode` | | |
121
153
  | `rightIcon` | `ReactNode` | | |
154
+ | `callout` | `ReactNode` | | |
122
155
  | `loading` | `boolean` | | |
156
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
123
157
 
124
158
  이 밖에 React·HTML 기본 속성 276개를 받는다.
125
159
 
160
+ ## Callout
161
+
162
+ ```ts
163
+ import { Callout } from '@nurihaus/web-design-system/callout'; // 이 컴포넌트만 싣는다 (권장)
164
+ import { Callout } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
165
+ ```
166
+
167
+ **언제 쓴다.** 버튼 같은 대상에 붙어 늘 떠 있는 짧은 라벨 말풍선에 쓴다(예: 로그인 버튼의 "최근 사용"). 꼬리 자리는 `tail`(`bottom-start` 기본·`bottom-end`·`top-start`·`top-end`)로 고른다. 버튼에 붙일 때는 Callout 을 직접 놓지 말고 CTAButton 의 `callout` prop 을 쓴다 — 모서리 자리를 DS 가 잡는다. 그 밖의 대상에 놓을 때는 자리(`position: absolute`·위치)를 쓰는 쪽이 `className` 으로 정한다. `.base-callout` 이 꼬리 기준으로 `position: relative` 를 가지므로 한 단계 구체적인 선택자(`.slot > .x`)로 덮는다.
168
+
169
+ **쓰지 않는다.** 마우스를 올리거나 포커스했을 때만 설명을 보여 주려면 Tooltip 을 쓴다. 상태값·분류 라벨은 OptionBadge 를 쓴다.
170
+
171
+ ```tsx
172
+ <>
173
+ <Callout text="최근 사용" />
174
+ <Callout text="새 기능" tail="top-end" />
175
+ <CTAButton variant="social" size="l" text="Google로 계속하기" callout="최근 사용" />
176
+ </>
177
+ ```
178
+
179
+ ### props
180
+
181
+ | prop | 타입 | 필수 | 기본값 |
182
+ | --- | --- | --- | --- |
183
+ | `text` | `ReactNode` | 예 | |
184
+ | `tail` | `'bottom-start' \| 'bottom-end' \| 'top-start' \| 'top-end'` | | `'bottom-start'` |
185
+
186
+ 이 밖에 React·HTML 기본 속성 265개를 받는다.
187
+
126
188
  ## OptionBadge
127
189
 
128
190
  ```ts
@@ -130,7 +192,7 @@ import { OptionBadge } from '@nurihaus/web-design-system/option-badge'; // 이
130
192
  import { OptionBadge } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
131
193
  ```
132
194
 
133
- **언제 쓴다.** 상태값이나 분류처럼 짧은 값 하나(`option`)를 라벨로 보여줄 때 쓴다. `variant`로 색을 고른다(`neutral`·`primary`·`danger`·`outlined`). 색 prop 은 없다. `tooltip`을 주면 마우스를 올렸을 때 설명이 뜬다.
195
+ **언제 쓴다.** 상태값이나 분류처럼 짧은 값 하나(`option`)를 라벨로 보여줄 때 쓴다. `variant`로 색을 고른다(`neutral`·`primary`·`danger`·`outlined`). 색 prop 은 없다. `tooltip`을 주면 마우스를 올렸을 때 설명이 뜬다. 대상에 붙어 늘 떠 있는 말풍선은 Callout 을 쓴다.
134
196
 
135
197
  **쓰지 않는다.** 아이콘이 함께 필요하면 IconTextBadge를, 아이콘과 텍스트 오른쪽에 수치 같은 부가 값까지 붙여야 하면 IconTextOptionBadge를 쓴다. 클릭 동작이 필요한 요소에는 CTAButton을 쓴다.
136
198
 
@@ -235,6 +297,8 @@ import { DataTable } from '@nurihaus/web-design-system'; // 루트.
235
297
 
236
298
  **언제 쓴다.** 여러 레코드를 열 단위로 나열하는 목록 화면에 쓴다. 이름과 달리 `rows`는 헤더 열 정의(`id`, 헤더 내용)이고 `columns`는 데이터 행 배열이며, 각 데이터 행은 `rows`의 모든 `id`를 키로 가진다. 열 너비는 셀 내용의 너비를 따르므로 같은 열의 헤더와 셀 내용에 같은 너비를 준다.
237
299
 
300
+ `track`을 주면 `onClickRow`가 있는 `rows` 항목(헤더 칸)을 누를 때 `click`과 그 `id`를 `value`에 담아 사용 로그로 보낸다. `onClickRow`가 없는 칸과 본문 셀은 보내지 않는다.
301
+
238
302
  **쓰지 않는다.** 정렬, 페이지네이션, 행 선택, 빈 상태 표시는 내장되어 있지 않으므로 데이터를 바깥에서 가공해 넘기고 빈 목록은 따로 그린다. 헤더는 위에 고정되고 `fixedRowsIndex`로 왼쪽 열을 고정할 수 있지만, 그 외의 표 동작이 필요하면 직접 만든다.
239
303
 
240
304
  ```tsx
@@ -264,6 +328,8 @@ import { DataTable } from '@nurihaus/web-design-system'; // 루트.
264
328
  | `rowHeight` | `number` | | `60` |
265
329
  | `cellHeight` | `number` | | |
266
330
  | `className` | `string` | | |
331
+ | `track` | `string` | | |
332
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
267
333
 
268
334
  이 밖에 React·HTML 기본 속성 2개를 받는다.
269
335
 
@@ -276,6 +342,8 @@ import { TextField } from '@nurihaus/web-design-system'; // 루트.
276
342
 
277
343
  **언제 쓴다.** 한 줄 텍스트를 입력받을 때 쓴다. 위 라벨(`title`), 아래 안내 문구(`helperText`), 좌우 아이콘을 함께 붙일 수 있고, `isError`가 true면 `helperText`가 오류 스타일로 바뀐다.
278
344
 
345
+ `track`을 주면 포커스가 빠질 때 값이 포커스를 받을 때와 다르면 `change`를 한 번 사용 로그로 보낸다. 값은 싣지 않는다. 사용자가 입력한 글자는 로그에 들어가지 않는다.
346
+
279
347
  **쓰지 않는다.** 여러 줄 입력은 지원하지 않는다(`<input>`만 렌더한다). 정해진 값 중에서 고르는 입력은 DropDown이나 Radio를 쓴다.
280
348
 
281
349
  ```tsx
@@ -297,11 +365,13 @@ import { TextField } from '@nurihaus/web-design-system'; // 루트.
297
365
  | `className` | `string` | | |
298
366
  | `size` | `'xs' \| 's' \| 'm' \| 'l' \| 'xl'` | 예 | `'s'` |
299
367
  | `title` | `ReactNode` | | |
368
+ | `track` | `string` | | |
300
369
  | `name` | `string` | 예 | |
301
370
  | `value` | `string` | | |
302
371
  | `defaultValue` | `string` | | |
303
372
  | `leftIcon` | `ReactNode` | | |
304
373
  | `rightIcon` | `ReactNode` | | |
374
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
305
375
  | `width` | `string \| number` | 예 | `'100%'` |
306
376
  | `helperText` | `ReactNode` | | |
307
377
  | `isError` | `boolean` | | |
@@ -317,6 +387,8 @@ import { Radio } from '@nurihaus/web-design-system'; // 루트. 첫
317
387
 
318
388
  **언제 쓴다.** 몇 개의 선택지를 모두 펼쳐 보여주고 그중 하나만 고르게 할 때 쓴다. 선택 상태는 항상 부모가 가지므로 `onChange`에서 받은 id로 `selected`를 갱신해야 선택이 바뀐다.
319
389
 
390
+ `track`을 주면 선택지를 누를 때 `change`와 그 선택지 `id`를 `value`에 담아 사용 로그로 보낸다.
391
+
320
392
  **쓰지 않는다.** 여러 개를 동시에 고르면 Checkbox를 쓴다. 선택지가 많아 모두 펼치기 어려우면 DropDown을 쓴다.
321
393
 
322
394
  ```tsx
@@ -338,6 +410,8 @@ import { Radio } from '@nurihaus/web-design-system'; // 루트. 첫
338
410
  | `options` | `{ id: string; label: ReactNode; disabled?: boolean \| undefined; }[]` | 예 | |
339
411
  | `selected` | `string \| null` | | |
340
412
  | `onChange` | `((id: string \| null) => void)` | | |
413
+ | `track` | `string` | | |
414
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
341
415
 
342
416
  이 밖에 React·HTML 기본 속성 2개를 받는다.
343
417
 
@@ -350,6 +424,8 @@ import { Checkbox } from '@nurihaus/web-design-system'; // 루트.
350
424
 
351
425
  **언제 쓴다.** 동의 여부처럼 켜고 끄는 값 하나를 받거나, 목록의 항목을 각각 독립적으로 선택할 때 쓴다. `onChange`는 바뀐 체크 상태(boolean)를 받는다.
352
426
 
427
+ `track`을 주면 체크 상태가 바뀔 때마다 `change`와 `'on'`·`'off'`를 `value`에 담아 사용 로그로 보낸다. 이벤트의 `component`는 displayName 인 `'CheckBox'`다.
428
+
353
429
  **쓰지 않는다.** 여러 선택지 중 하나만 골라야 하면 Radio를, 목록에서 값 하나를 고르면 DropDown을 쓴다.
354
430
 
355
431
  ```tsx
@@ -368,6 +444,8 @@ import { Checkbox } from '@nurihaus/web-design-system'; // 루트.
368
444
  | `onChange` | `((checked: boolean) => void)` | | |
369
445
  | `id` | `string` | 예 | |
370
446
  | `disabled` | `boolean` | | |
447
+ | `track` | `string` | | |
448
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
371
449
 
372
450
  이 밖에 React·HTML 기본 속성 2개를 받는다.
373
451
 
@@ -380,6 +458,8 @@ import { Switch } from '@nurihaus/web-design-system'; // 루트. 첫
380
458
 
381
459
  **언제 쓴다.** 알림 켜기처럼 켜고 끄는 설정 하나를 바로 반영할 때 쓴다. `onChange`는 바뀐 켜짐 상태(boolean)를 받는다. `className`·`style`은 루트 버튼에 붙는다. `label`을 주지 않으면 `aria-label`로 이름을 준다.
382
460
 
461
+ `track`을 주면 켜짐 상태가 바뀔 때마다 `change`와 `'on'`·`'off'`를 `value`에 담아 사용 로그로 보낸다.
462
+
383
463
  **쓰지 않는다.** 제출 버튼을 눌러야 반영되는 폼 항목이나 동의 여부는 Checkbox를, 여러 선택지 중 하나는 Radio를 쓴다.
384
464
 
385
465
  ```tsx
@@ -393,10 +473,12 @@ import { Switch } from '@nurihaus/web-design-system'; // 루트. 첫
393
473
  | `className` | `string` | | |
394
474
  | `size` | `'s' \| 'm' \| 'l'` | | `'m'` |
395
475
  | `label` | `ReactNode` | | |
476
+ | `track` | `string` | | |
396
477
  | `disabled` | `boolean` | | |
397
478
  | `defaultChecked` | `boolean` | | |
398
479
  | `id` | `string` | 예 | |
399
480
  | `onChange` | `((checked: boolean) => void)` | | |
481
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
400
482
  | `checked` | `boolean` | | |
401
483
 
402
484
  이 밖에 React·HTML 기본 속성 270개를 받는다.
@@ -410,6 +492,8 @@ import { TextArea } from '@nurihaus/web-design-system'; // 루트.
410
492
 
411
493
  **언제 쓴다.** 메모·설명처럼 여러 줄 텍스트를 입력받을 때 쓴다. 위 라벨(`title`), 아래 안내 문구(`helperText`)를 함께 붙일 수 있고, `isError`가 true면 `helperText`가 오류 스타일로 바뀐다. 높이는 `rows`가 정하고 `size`는 글자 크기와 안쪽 여백만 바꾼다. `resize`는 `'vertical'`(기본)·`'none'` 중 고른다. `className`·`style`은 textarea를 감싸는 테두리 요소에 붙고, `ref`는 textarea 요소를 가리킨다.
412
494
 
495
+ `track`을 주면 포커스가 빠질 때 값이 포커스를 받을 때와 다르면 `change`를 한 번 사용 로그로 보낸다. 값은 싣지 않는다. 사용자가 입력한 글자는 로그에 들어가지 않는다.
496
+
413
497
  **쓰지 않는다.** 한 줄 입력은 TextField를 쓴다. 정해진 값 중에서 고르는 입력은 DropDown이나 Radio를 쓴다.
414
498
 
415
499
  ```tsx
@@ -423,9 +507,11 @@ import { TextArea } from '@nurihaus/web-design-system'; // 루트.
423
507
  | `className` | `string` | | |
424
508
  | `size` | `'s' \| 'm'` | | `'s'` |
425
509
  | `title` | `ReactNode` | | |
510
+ | `track` | `string` | | |
426
511
  | `name` | `string` | 예 | |
427
512
  | `value` | `string` | | |
428
513
  | `defaultValue` | `string` | | |
514
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
429
515
  | `width` | `string \| number` | | `'100%'` |
430
516
  | `resize` | `'none' \| 'vertical'` | | `'vertical'` |
431
517
  | `helperText` | `ReactNode` | | |
@@ -455,8 +541,10 @@ import { Toast } from '@nurihaus/web-design-system'; // 루트. 첫
455
541
  | `className` | `string` | | |
456
542
  | `style` | `CSSProperties` | | |
457
543
  | `title` | `ReactNode` | 예 | |
544
+ | `track` | `string` | | |
458
545
  | `onPause` | `(() => void)` | | |
459
546
  | `variant` | `'secondary' \| 'default' \| 'success' \| 'warning' \| 'error'` | | `'default'` |
547
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
460
548
  | `onResume` | `(() => void)` | | |
461
549
  | `open` | `boolean` | | |
462
550
  | `defaultOpen` | `boolean` | | |
@@ -503,6 +591,8 @@ import { Pagination } from '@nurihaus/web-design-system'; // 루트.
503
591
 
504
592
  **언제 쓴다.** 목록이나 검색 결과가 여러 페이지로 나뉘어 있고 사용자가 번호로 페이지를 고를 때 쓴다. `totalPages`는 필수다. 현재 페이지는 `page`(controlled)·`defaultPage`(uncontrolled)로 주고, `onPageChange`는 새 페이지 번호(1부터)를 받는다. 1과 마지막 페이지는 항상 보이고, 현재 페이지 양옆 `siblingCount`(기본 1)개를 보이며 사이가 벌어지면 `…`를 넣는다. `className`·`style`은 루트 `nav`에 붙는다. `aria-label`을 주면 nav 이름을 바꾼다(기본 "페이지 탐색").
505
593
 
594
+ `track`을 주면 페이지가 바뀔 때 `change`와 새 페이지 번호(문자열)를 `value`에 담아 사용 로그로 보낸다. 현재 페이지를 다시 누르면 보내지 않는다.
595
+
506
596
  **쓰지 않는다.** 스크롤로 계속 불러오는 목록이나 "더 보기" 버튼으로 이어 붙이는 목록에는 쓰지 않는다. 화면 안의 내용 영역을 바꾸는 탭 전환은 Tabs를 쓴다.
507
597
 
508
598
  ```tsx
@@ -514,7 +604,9 @@ import { Pagination } from '@nurihaus/web-design-system'; // 루트.
514
604
  | prop | 타입 | 필수 | 기본값 |
515
605
  | --- | --- | --- | --- |
516
606
  | `size` | `'s' \| 'm'` | | `'m'` |
607
+ | `track` | `string` | | |
517
608
  | `disabled` | `boolean` | | |
609
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
518
610
  | `page` | `number` | | |
519
611
  | `totalPages` | `number` | 예 | |
520
612
  | `defaultPage` | `number` | | |
@@ -562,6 +654,8 @@ import { Modal } from '@nurihaus/web-design-system'; // 루트. 첫
562
654
  | `onOpenChange` | `((open: boolean) => void)` | | |
563
655
  | `className` | `string` | | |
564
656
  | `style` | `CSSProperties` | | |
657
+ | `track` | `string` | | |
658
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
565
659
 
566
660
  이 밖에 React·HTML 기본 속성 2개를 받는다.
567
661
 
@@ -599,6 +693,8 @@ import { Drawer } from '@nurihaus/web-design-system'; // 루트. 첫
599
693
  | `onOpenChange` | `((open: boolean) => void)` | | |
600
694
  | `className` | `string` | | |
601
695
  | `style` | `CSSProperties` | | |
696
+ | `track` | `string` | | |
697
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
602
698
 
603
699
  이 밖에 React·HTML 기본 속성 2개를 받는다.
604
700
 
@@ -638,6 +734,8 @@ import { Breadcrumb } from '@nurihaus/web-design-system'; // 루트.
638
734
 
639
735
  **언제 쓴다.** 계층이 있는 화면에서 현재 위치와 상위 경로를 한 줄로 보여 줄 때 쓴다. `items`의 마지막 항목이 현재 위치라 링크가 아니고 `aria-current="page"`가 붙는다. `href`가 있는 항목은 `<a>` 링크로, `onItemClick`은 클릭한 항목의 `id`를 받는다. Next.js 나 React Router 안에서는 `linkComponent={Link}`를 넘겨 라우터 링크로 그린다. 넘기지 않으면 일반 `<a>`라 페이지가 새로 고쳐진다. `className`·`style`은 `nav` 루트에 붙는다.
640
736
 
737
+ `track`을 주면 링크 항목을 누를 때 `navigate`와 그 항목의 `id`를 `value`에 담아 사용 로그로 보낸다. 마지막(현재 위치) 항목은 링크가 아니라 보내지 않는다.
738
+
641
739
  **쓰지 않는다.** 같은 깊이의 화면을 오가는 데는 Tabs를, 사이드바 메뉴에는 CollapsibleMenu를 쓴다. 계층이 한 단계뿐이면 쓰지 않는다.
642
740
 
643
741
  ```tsx
@@ -661,6 +759,8 @@ import { Breadcrumb } from '@nurihaus/web-design-system'; // 루트.
661
759
  | `linkComponent` | `ElementType` | | |
662
760
  | `className` | `string` | | |
663
761
  | `style` | `CSSProperties` | | |
762
+ | `track` | `string` | | |
763
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
664
764
 
665
765
  이 밖에 React·HTML 기본 속성 2개를 받는다.
666
766
 
@@ -714,6 +814,8 @@ import { DropDown } from '@nurihaus/web-design-system'; // 루트.
714
814
  | `position` | `'popper' \| 'item-aligned'` | | |
715
815
  | `className` | `string` | | |
716
816
  | `style` | `CSSProperties` | | |
817
+ | `track` | `string` | | |
818
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
717
819
 
718
820
  이 밖에 React·HTML 기본 속성 2개를 받는다.
719
821
 
@@ -726,6 +828,8 @@ import { CollapsibleMenu } from '@nurihaus/web-design-system'; //
726
828
 
727
829
  **언제 쓴다.** 사이드바 같은 세로 내비게이션 메뉴에 쓴다. `children`이 있는 항목은 펼치고 접는 그룹이 되고, 없는 항목은 `href`가 있으면 링크, 없으면 버튼으로 렌더되며, `activeKey` 항목과 그 상위 그룹이 강조된다. 링크는 기본으로 `<a>`다. 라우터의 링크로 바꾸려면 `linkComponent`에 넘긴다. 받는 props는 `href`·`className`·`children`·`onClick`·`aria-current`·`aria-disabled`이고, 그대로 링크에 전달하면 된다.
728
830
 
831
+ `track`을 주면 링크·버튼 항목을 고를 때 `navigate`와 그 항목의 `key`를 `value`에 담아 사용 로그로 보낸다. 그룹을 펼치고 접는 것은 보내지 않는다.
832
+
729
833
  **쓰지 않는다.** 같은 화면 안에서 패널을 바꾸는 용도는 Tabs를 쓴다. 본문 콘텐츠를 접고 펼치는 아코디언 용도로는 쓰지 않는다(`<nav>`로 렌더된다). 값을 고르는 폼 입력은 DropDown을 쓴다.
730
834
 
731
835
  Next.js 에서는 `next/link` 의 `Link` 를 그대로 넘긴다.
@@ -770,6 +874,8 @@ import Link from 'next/link';
770
874
  | `linkComponent` | `ComponentType<CollapsibleMenuLinkProps>` | | |
771
875
  | `className` | `string` | | |
772
876
  | `style` | `CSSProperties` | | |
877
+ | `track` | `string` | | |
878
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
773
879
 
774
880
  이 밖에 React·HTML 기본 속성 2개를 받는다.
775
881
 
@@ -813,6 +919,8 @@ import { Tooltip } from '@nurihaus/web-design-system'; // 루트.
813
919
 
814
920
  **언제 쓴다.** 아이콘이나 짧은 라벨에 마우스를 올렸을 때 짧은 설명을 띄울 때 쓴다. `trigger`에는 DOM 요소 하나(예: `<span>`)를 넘기고 `direction`으로 뜨는 방향을 고른다. 조건이 맞을 때만 띄우려면 `open`을 제어하지 말고 `disabled`를 쓴다(예: 사이드바가 접혔을 때만 `disabled={!collapsed}`). `disabled`이면 `trigger`만 그려 툴팁이 열린 채 남지 않는다.
815
921
 
922
+ `track`을 주면 툴팁이 열릴 때 `show`를 사용 로그로 보낸다. 닫힐 때와 `disabled`일 때는 보내지 않는다.
923
+
816
924
  **쓰지 않는다.** 툴팁 안에 링크나 버튼처럼 클릭할 내용을 넣지 않는다. 툴팁 위로 마우스를 옮기면 닫힌다. 배지에 설명을 붙일 때는 OptionBadge, IconTextBadge의 `tooltip` prop을 쓴다.
817
925
 
818
926
  ```tsx
@@ -832,6 +940,8 @@ import { Tooltip } from '@nurihaus/web-design-system'; // 루트.
832
940
  | `onOpenChange` | `((open: boolean) => void)` | | |
833
941
  | `delayDuration` | `number` | | |
834
942
  | `disableHoverableContent` | `boolean` | | |
943
+ | `track` | `string` | | |
944
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
835
945
 
836
946
  이 밖에 React·HTML 기본 속성 2개를 받는다.
837
947
 
@@ -895,6 +1005,8 @@ import { Tabs } from '@nurihaus/web-design-system'; // 루트. 첫
895
1005
  | `onValueChange` | `((id: TabsValue) => void)` | | |
896
1006
  | `className` | `string` | | |
897
1007
  | `style` | `CSSProperties` | | |
1008
+ | `track` | `string` | | |
1009
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
898
1010
 
899
1011
  이 밖에 React·HTML 기본 속성 2개를 받는다.
900
1012
 
@@ -1077,7 +1189,7 @@ import { BottomNav } from '@nurihaus/web-design-system'; // 루트.
1077
1189
 
1078
1190
  화면 아래에 고정(`position: fixed`)되고 내용 위에 떠 있다. 화면 본문은 아래를 `calc(var(--bottom-nav-space) + env(safe-area-inset-bottom))` 만큼 비워 마지막 내용이 가려지지 않게 한다. `className`·`style` 은 `<nav>` 에 붙는다.
1079
1191
 
1080
- 링크는 기본으로 `<a>` 다. 라우터의 링크로 바꾸려면 `linkComponent` 에 넘긴다. 받는 props 는 `href`·`className`·`children`·`aria-current` 이고, 그대로 링크에 전달하면 된다.
1192
+ 링크는 기본으로 `<a>` 다. 라우터의 링크로 바꾸려면 `linkComponent` 에 넘긴다. 받는 props 는 `href`·`className`·`children`·`aria-current`·`onClick` 이고, 그대로 링크에 전달하면 된다. `onClick` 을 빠뜨리면 `track` 로그가 나가지 않는다.
1081
1193
 
1082
1194
  배지는 `badge` 로 단다. `count` 가 없으면 점, 있으면 숫자(99 넘으면 99+)다. `label` 은 화면 낭독기가 읽는 말이다.
1083
1195
 
@@ -1114,6 +1226,8 @@ import Link from 'next/link';
1114
1226
  | `linkComponent` | `ComponentType<BottomNavLinkProps>` | | |
1115
1227
  | `className` | `string` | | |
1116
1228
  | `style` | `CSSProperties` | | |
1229
+ | `track` | `string` | | |
1230
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
1117
1231
 
1118
1232
  이 밖에 React·HTML 기본 속성 2개를 받는다.
1119
1233
 
@@ -1186,9 +1300,38 @@ import { ChipGroup } from '@nurihaus/web-design-system'; // 루트.
1186
1300
  | `label` | `string` | 예 | |
1187
1301
  | `className` | `string` | | |
1188
1302
  | `style` | `CSSProperties` | | |
1303
+ | `track` | `string` | | |
1304
+ | `trackProps` | `Record<string, string \| number \| boolean>` | | |
1189
1305
 
1190
1306
  이 밖에 React·HTML 기본 속성 2개를 받는다.
1191
1307
 
1308
+ ## LogProvider
1309
+
1310
+ ```ts
1311
+ import { LogProvider } from '@nurihaus/web-design-system/logging'; // 이 컴포넌트만 싣는다 (권장)
1312
+ import { LogProvider } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
1313
+ ```
1314
+
1315
+ **언제 쓴다.** 앱 루트에 한 번 두고 사용 로그를 받는다. 디자인시스템 컴포넌트에 `track` 을 주면 그 컴포넌트의 상호작용이 이벤트 하나(`LogEvent`)로 `onEvent` 에 온다. 이벤트를 어느 로그 수집기로 보낼지는 `onEvent` 안에서 앱이 정한다. `onEvent` 가 던져도 화면 동작은 멈추지 않는다.
1316
+ `track` 에는 `'report/download'` 처럼 개발자가 정한 이름을 쓴다. 이벤트의 `value` 에는 탭 id·칩 id·옵션 value 처럼 개발자가 정한 id 만 들어가고 사용자가 입력한 글자는 들어가지 않는다. 더 붙일 값은 `trackProps` 로 명시한다.
1317
+ LogProvider 가 없거나 `track` 을 주지 않으면 아무것도 보내지 않는다.
1318
+ 컴포넌트 밖의 로그(화면 진입, 직접 만든 요소)는 `useLog()` 가 돌려주는 함수에 `{ component, action, track }` 을 넘긴다. `timestamp` 는 자동으로 붙는다.
1319
+
1320
+ **쓰지 않는다.** 에러 보고에 쓰지 않는다. 에러는 앱의 에러 처리에서 따로 남긴다. 화면마다 LogProvider 를 겹쳐 두지 않는다. 안쪽 Provider 가 바깥 것을 가린다.
1321
+
1322
+ ```tsx
1323
+ <LogProvider onEvent={(event) => console.log(event)}>
1324
+ <CTAButton text="리포트 받기" track="report/download" trackProps={{ format: "csv" }} />
1325
+ </LogProvider>
1326
+ ```
1327
+
1328
+ ### props
1329
+
1330
+ | prop | 타입 | 필수 | 기본값 |
1331
+ | --- | --- | --- | --- |
1332
+ | `onEvent` | `(event: LogEvent) => void` | 예 | |
1333
+ | `children` | `ReactNode` | | |
1334
+
1192
1335
  ## 아직 없는 것
1193
1336
 
1194
1337
  아래는 디자인 시스템에 없다. 비슷한 이름의 컴포넌트를 지어내 import 하지 않는다.
package/dist/avatar.js CHANGED
@@ -280,7 +280,7 @@ module.exports = x({ ["jsx"]: () => (__WEBPACK_EXTERNAL_MODULE_react_jsx_runtime
280
280
  /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
281
281
  /******/ // [resolve, Promise] = chunk loading, 0 = chunk loaded
282
282
  /******/ var installedChunks = {
283
- /******/ 716: 0
283
+ /******/ 8716: 0
284
284
  /******/ };
285
285
  /******/
286
286
  /******/ var installChunk = (data) => {
@@ -320,17 +320,17 @@ module.exports = x({ ["jsx"]: () => (__WEBPACK_EXTERNAL_MODULE_react_jsx_runtime
320
320
  /******/
321
321
  /************************************************************************/
322
322
  /******/
323
- /******/ import * as __webpack_chunk_1__ from "./chunk-364.js";
323
+ /******/ import * as __webpack_chunk_1__ from "./chunk-6364.js";
324
324
  /******/ __nuri_require__.C(__webpack_chunk_1__);
325
- /******/ import * as __webpack_chunk_2__ from "./chunk-777.js";
325
+ /******/ import * as __webpack_chunk_2__ from "./chunk-2777.js";
326
326
  /******/ __nuri_require__.C(__webpack_chunk_2__);
327
- /******/ import * as __webpack_chunk_3__ from "./chunk-298.js";
327
+ /******/ import * as __webpack_chunk_3__ from "./chunk-7298.js";
328
328
  /******/ __nuri_require__.C(__webpack_chunk_3__);
329
329
  /******/
330
330
  /******/ // startup
331
331
  /******/ // Load entry module and return exports
332
332
  /******/ // This entry module depends on other loaded chunks and execution need to be delayed
333
- /******/ var __webpack_exports__ = __nuri_require__.O(undefined, [364,777,298], () => (__nuri_require__(5468)))
333
+ /******/ var __webpack_exports__ = __nuri_require__.O(undefined, [6364,2777,7298], () => (__nuri_require__(5468)))
334
334
  /******/ __webpack_exports__ = __nuri_require__.O(__webpack_exports__);
335
335
  /******/ const __webpack_exports__default = __webpack_exports__.A;
336
336
  /******/ export { __webpack_exports__default as default };
@@ -17,6 +17,8 @@ __nuri_require__.d(__webpack_exports__, {
17
17
  var jsx_runtime_ = __nuri_require__(612);
18
18
  // EXTERNAL MODULE: external {"root":"React","commonjs2":"react","commonjs":"react","amd":"react","module":"react"}
19
19
  var external_root_React_commonjs2_react_commonjs_react_amd_react_module_react_ = __nuri_require__(1041);
20
+ // EXTERNAL MODULE: ./helpers/hooks/useTrack.ts
21
+ var useTrack = __nuri_require__(4560);
20
22
  // EXTERNAL MODULE: ./helpers/utils/classNames.js
21
23
  var classNames = __nuri_require__(3274);
22
24
  // EXTERNAL MODULE: ./helpers/utils/getMergedProps.ts
@@ -118,6 +120,7 @@ var bottom_nav_assign = undefined && undefined.__assign || function () {
118
120
 
119
121
 
120
122
 
123
+
121
124
  var Anchor = function Anchor(props) {
122
125
  return (0,jsx_runtime_.jsx)("a", bottom_nav_assign({}, props));
123
126
  };
@@ -130,7 +133,13 @@ var BottomNav = /*#__PURE__*/(0,external_root_React_commonjs2_react_commonjs_rea
130
133
  items = _a.items,
131
134
  value = _a.value,
132
135
  label = _a.label,
133
- linkComponent = _a.linkComponent;
136
+ linkComponent = _a.linkComponent,
137
+ track = _a.track,
138
+ trackProps = _a.trackProps;
139
+ var emit = (0,useTrack/* useTrack */.n)('BottomNav', {
140
+ track: track,
141
+ trackProps: trackProps
142
+ });
134
143
  var Link = linkComponent !== null && linkComponent !== void 0 ? linkComponent : Anchor;
135
144
  var activeIndex = items.findIndex(function (item) {
136
145
  return item.id === value;
@@ -153,6 +162,9 @@ var BottomNav = /*#__PURE__*/(0,external_root_React_commonjs2_react_commonjs_rea
153
162
  className: itemClassName,
154
163
  href: item.href,
155
164
  "aria-current": isActive ? 'page' : undefined,
165
+ onClick: function onClick() {
166
+ return emit('navigate', item.id);
167
+ },
156
168
  children: [(0,jsx_runtime_.jsx)("span", {
157
169
  className: 'bottom-nav-label',
158
170
  children: item.label
@@ -244,7 +256,7 @@ var x = (y) => {
244
256
  var x = {}; __nuri_require__.d(x, y); return x
245
257
  }
246
258
  var y = (x) => (() => (x))
247
- module.exports = x({ ["forwardRef"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.forwardRef) });
259
+ module.exports = x({ ["createContext"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.createContext), ["forwardRef"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.forwardRef), ["useCallback"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useCallback), ["useContext"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useContext), ["useRef"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useRef) });
248
260
 
249
261
  /***/ },
250
262
 
@@ -349,8 +361,8 @@ module.exports = x({ ["jsx"]: () => (__WEBPACK_EXTERNAL_MODULE_react_jsx_runtime
349
361
  /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
350
362
  /******/ // [resolve, Promise] = chunk loading, 0 = chunk loaded
351
363
  /******/ var installedChunks = {
352
- /******/ 480: 0,
353
- /******/ 918: 0
364
+ /******/ 918: 0,
365
+ /******/ 6480: 0
354
366
  /******/ };
355
367
  /******/
356
368
  /******/ var installChunk = (data) => {
@@ -390,17 +402,19 @@ module.exports = x({ ["jsx"]: () => (__WEBPACK_EXTERNAL_MODULE_react_jsx_runtime
390
402
  /******/
391
403
  /************************************************************************/
392
404
  /******/
393
- /******/ import * as __webpack_chunk_1__ from "./chunk-364.js";
405
+ /******/ import * as __webpack_chunk_1__ from "./chunk-6364.js";
394
406
  /******/ __nuri_require__.C(__webpack_chunk_1__);
395
- /******/ import * as __webpack_chunk_2__ from "./chunk-298.js";
407
+ /******/ import * as __webpack_chunk_2__ from "./chunk-4560.js";
396
408
  /******/ __nuri_require__.C(__webpack_chunk_2__);
397
- /******/ import * as __webpack_chunk_3__ from "./chunk-653.js";
409
+ /******/ import * as __webpack_chunk_3__ from "./chunk-7298.js";
398
410
  /******/ __nuri_require__.C(__webpack_chunk_3__);
411
+ /******/ import * as __webpack_chunk_4__ from "./chunk-7653.js";
412
+ /******/ __nuri_require__.C(__webpack_chunk_4__);
399
413
  /******/
400
414
  /******/ // startup
401
415
  /******/ // Load entry module and return exports
402
416
  /******/ // This entry module depends on other loaded chunks and execution need to be delayed
403
- /******/ var __webpack_exports__ = __nuri_require__.O(undefined, [364,298,653], () => (__nuri_require__(1768)))
417
+ /******/ var __webpack_exports__ = __nuri_require__.O(undefined, [6364,4560,7298,7653], () => (__nuri_require__(1768)))
404
418
  /******/ __webpack_exports__ = __nuri_require__.O(__webpack_exports__);
405
419
  /******/ const __webpack_exports__default = __webpack_exports__.A;
406
420
  /******/ export { __webpack_exports__default as default };