moru-krds-react 0.1.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 (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +61 -0
  3. package/dist/accordion/index.d.ts +63 -0
  4. package/dist/accordion/index.d.ts.map +1 -0
  5. package/dist/accordion/index.js +145 -0
  6. package/dist/accordion/index.js.map +1 -0
  7. package/dist/alert/index.d.ts +44 -0
  8. package/dist/alert/index.d.ts.map +1 -0
  9. package/dist/alert/index.js +66 -0
  10. package/dist/alert/index.js.map +1 -0
  11. package/dist/avatar/index.d.ts +102 -0
  12. package/dist/avatar/index.d.ts.map +1 -0
  13. package/dist/avatar/index.js +146 -0
  14. package/dist/avatar/index.js.map +1 -0
  15. package/dist/badge/index.d.ts +49 -0
  16. package/dist/badge/index.d.ts.map +1 -0
  17. package/dist/badge/index.js +41 -0
  18. package/dist/badge/index.js.map +1 -0
  19. package/dist/breadcrumb/index.d.ts +43 -0
  20. package/dist/breadcrumb/index.d.ts.map +1 -0
  21. package/dist/breadcrumb/index.js +43 -0
  22. package/dist/breadcrumb/index.js.map +1 -0
  23. package/dist/button/index.d.ts +78 -0
  24. package/dist/button/index.d.ts.map +1 -0
  25. package/dist/button/index.js +83 -0
  26. package/dist/button/index.js.map +1 -0
  27. package/dist/checkbox/index.d.ts +97 -0
  28. package/dist/checkbox/index.d.ts.map +1 -0
  29. package/dist/checkbox/index.js +110 -0
  30. package/dist/checkbox/index.js.map +1 -0
  31. package/dist/combobox/index.d.ts +135 -0
  32. package/dist/combobox/index.d.ts.map +1 -0
  33. package/dist/combobox/index.js +416 -0
  34. package/dist/combobox/index.js.map +1 -0
  35. package/dist/context-menu/index.d.ts +94 -0
  36. package/dist/context-menu/index.d.ts.map +1 -0
  37. package/dist/context-menu/index.js +399 -0
  38. package/dist/context-menu/index.js.map +1 -0
  39. package/dist/critical-alert/index.d.ts +39 -0
  40. package/dist/critical-alert/index.d.ts.map +1 -0
  41. package/dist/critical-alert/index.js +50 -0
  42. package/dist/critical-alert/index.js.map +1 -0
  43. package/dist/data-table/index.d.ts +94 -0
  44. package/dist/data-table/index.d.ts.map +1 -0
  45. package/dist/data-table/index.js +128 -0
  46. package/dist/data-table/index.js.map +1 -0
  47. package/dist/disclosure/index.d.ts +35 -0
  48. package/dist/disclosure/index.d.ts.map +1 -0
  49. package/dist/disclosure/index.js +54 -0
  50. package/dist/disclosure/index.js.map +1 -0
  51. package/dist/drawer/index.d.ts +106 -0
  52. package/dist/drawer/index.d.ts.map +1 -0
  53. package/dist/drawer/index.js +352 -0
  54. package/dist/drawer/index.js.map +1 -0
  55. package/dist/empty-state/index.d.ts +86 -0
  56. package/dist/empty-state/index.d.ts.map +1 -0
  57. package/dist/empty-state/index.js +138 -0
  58. package/dist/empty-state/index.js.map +1 -0
  59. package/dist/env.d.js +1 -0
  60. package/dist/env.d.js.map +1 -0
  61. package/dist/field/index.d.ts +149 -0
  62. package/dist/field/index.d.ts.map +1 -0
  63. package/dist/field/index.js +121 -0
  64. package/dist/field/index.js.map +1 -0
  65. package/dist/file-upload/index.d.ts +140 -0
  66. package/dist/file-upload/index.d.ts.map +1 -0
  67. package/dist/file-upload/index.js +249 -0
  68. package/dist/file-upload/index.js.map +1 -0
  69. package/dist/footer/index.d.ts +155 -0
  70. package/dist/footer/index.d.ts.map +1 -0
  71. package/dist/footer/index.js +186 -0
  72. package/dist/footer/index.js.map +1 -0
  73. package/dist/header/index.d.ts +170 -0
  74. package/dist/header/index.d.ts.map +1 -0
  75. package/dist/header/index.js +258 -0
  76. package/dist/header/index.js.map +1 -0
  77. package/dist/identifier/index.d.ts +38 -0
  78. package/dist/identifier/index.d.ts.map +1 -0
  79. package/dist/identifier/index.js +55 -0
  80. package/dist/identifier/index.js.map +1 -0
  81. package/dist/in-page-navigation/index.d.ts +71 -0
  82. package/dist/in-page-navigation/index.d.ts.map +1 -0
  83. package/dist/in-page-navigation/index.js +137 -0
  84. package/dist/in-page-navigation/index.js.map +1 -0
  85. package/dist/index.d.ts +57 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +47 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/input-group/index.d.ts +66 -0
  90. package/dist/input-group/index.d.ts.map +1 -0
  91. package/dist/input-group/index.js +85 -0
  92. package/dist/input-group/index.js.map +1 -0
  93. package/dist/lib/krds.d.ts +45 -0
  94. package/dist/lib/krds.d.ts.map +1 -0
  95. package/dist/lib/krds.js +11 -0
  96. package/dist/lib/krds.js.map +1 -0
  97. package/dist/lib/link.d.ts +34 -0
  98. package/dist/lib/link.d.ts.map +1 -0
  99. package/dist/lib/link.js +8 -0
  100. package/dist/lib/link.js.map +1 -0
  101. package/dist/main-menu/index.d.ts +123 -0
  102. package/dist/main-menu/index.d.ts.map +1 -0
  103. package/dist/main-menu/index.js +613 -0
  104. package/dist/main-menu/index.js.map +1 -0
  105. package/dist/masthead/index.d.ts +25 -0
  106. package/dist/masthead/index.d.ts.map +1 -0
  107. package/dist/masthead/index.js +21 -0
  108. package/dist/masthead/index.js.map +1 -0
  109. package/dist/modal/index.d.ts +105 -0
  110. package/dist/modal/index.d.ts.map +1 -0
  111. package/dist/modal/index.js +285 -0
  112. package/dist/modal/index.js.map +1 -0
  113. package/dist/pagination/index.d.ts +58 -0
  114. package/dist/pagination/index.d.ts.map +1 -0
  115. package/dist/pagination/index.js +82 -0
  116. package/dist/pagination/index.js.map +1 -0
  117. package/dist/progress/index.d.ts +58 -0
  118. package/dist/progress/index.d.ts.map +1 -0
  119. package/dist/progress/index.js +125 -0
  120. package/dist/progress/index.js.map +1 -0
  121. package/dist/radio/index.d.ts +111 -0
  122. package/dist/radio/index.d.ts.map +1 -0
  123. package/dist/radio/index.js +136 -0
  124. package/dist/radio/index.js.map +1 -0
  125. package/dist/resize/index.d.ts +118 -0
  126. package/dist/resize/index.d.ts.map +1 -0
  127. package/dist/resize/index.js +342 -0
  128. package/dist/resize/index.js.map +1 -0
  129. package/dist/scroll-area/index.d.ts +40 -0
  130. package/dist/scroll-area/index.d.ts.map +1 -0
  131. package/dist/scroll-area/index.js +52 -0
  132. package/dist/scroll-area/index.js.map +1 -0
  133. package/dist/select/index.d.ts +67 -0
  134. package/dist/select/index.d.ts.map +1 -0
  135. package/dist/select/index.js +61 -0
  136. package/dist/select/index.js.map +1 -0
  137. package/dist/separator/index.d.ts +47 -0
  138. package/dist/separator/index.d.ts.map +1 -0
  139. package/dist/separator/index.js +61 -0
  140. package/dist/separator/index.js.map +1 -0
  141. package/dist/side-navigation/index.d.ts +78 -0
  142. package/dist/side-navigation/index.d.ts.map +1 -0
  143. package/dist/side-navigation/index.js +188 -0
  144. package/dist/side-navigation/index.js.map +1 -0
  145. package/dist/skeleton/index.d.ts +76 -0
  146. package/dist/skeleton/index.d.ts.map +1 -0
  147. package/dist/skeleton/index.js +78 -0
  148. package/dist/skeleton/index.js.map +1 -0
  149. package/dist/skip-link/index.d.ts +46 -0
  150. package/dist/skip-link/index.d.ts.map +1 -0
  151. package/dist/skip-link/index.js +37 -0
  152. package/dist/skip-link/index.js.map +1 -0
  153. package/dist/spinner/index.d.ts +58 -0
  154. package/dist/spinner/index.d.ts.map +1 -0
  155. package/dist/spinner/index.js +36 -0
  156. package/dist/spinner/index.js.map +1 -0
  157. package/dist/step-indicator/index.d.ts +41 -0
  158. package/dist/step-indicator/index.d.ts.map +1 -0
  159. package/dist/step-indicator/index.js +63 -0
  160. package/dist/step-indicator/index.js.map +1 -0
  161. package/dist/structured-list/index.d.ts +150 -0
  162. package/dist/structured-list/index.d.ts.map +1 -0
  163. package/dist/structured-list/index.js +194 -0
  164. package/dist/structured-list/index.js.map +1 -0
  165. package/dist/tab/index.d.ts +108 -0
  166. package/dist/tab/index.d.ts.map +1 -0
  167. package/dist/tab/index.js +198 -0
  168. package/dist/tab/index.js.map +1 -0
  169. package/dist/table/index.d.ts +75 -0
  170. package/dist/table/index.d.ts.map +1 -0
  171. package/dist/table/index.js +91 -0
  172. package/dist/table/index.js.map +1 -0
  173. package/dist/tag/index.d.ts +71 -0
  174. package/dist/tag/index.d.ts.map +1 -0
  175. package/dist/tag/index.js +45 -0
  176. package/dist/tag/index.js.map +1 -0
  177. package/dist/text-input/index.d.ts +69 -0
  178. package/dist/text-input/index.d.ts.map +1 -0
  179. package/dist/text-input/index.js +70 -0
  180. package/dist/text-input/index.js.map +1 -0
  181. package/dist/text-list/index.d.ts +71 -0
  182. package/dist/text-list/index.d.ts.map +1 -0
  183. package/dist/text-list/index.js +79 -0
  184. package/dist/text-list/index.js.map +1 -0
  185. package/dist/textarea/index.d.ts +29 -0
  186. package/dist/textarea/index.d.ts.map +1 -0
  187. package/dist/textarea/index.js +69 -0
  188. package/dist/textarea/index.js.map +1 -0
  189. package/dist/toast/index.d.ts +76 -0
  190. package/dist/toast/index.d.ts.map +1 -0
  191. package/dist/toast/index.js +183 -0
  192. package/dist/toast/index.js.map +1 -0
  193. package/dist/tooltip/index.d.ts +84 -0
  194. package/dist/tooltip/index.d.ts.map +1 -0
  195. package/dist/tooltip/index.js +329 -0
  196. package/dist/tooltip/index.js.map +1 -0
  197. package/package.json +57 -0
  198. package/src/accordion/index.tsx +251 -0
  199. package/src/alert/index.tsx +111 -0
  200. package/src/avatar/index.tsx +272 -0
  201. package/src/badge/index.tsx +91 -0
  202. package/src/breadcrumb/index.tsx +125 -0
  203. package/src/button/index.tsx +190 -0
  204. package/src/checkbox/index.tsx +247 -0
  205. package/src/combobox/index.tsx +700 -0
  206. package/src/context-menu/index.tsx +623 -0
  207. package/src/critical-alert/index.tsx +102 -0
  208. package/src/data-table/index.tsx +289 -0
  209. package/src/disclosure/index.tsx +87 -0
  210. package/src/drawer/index.tsx +516 -0
  211. package/src/empty-state/index.tsx +256 -0
  212. package/src/env.d.ts +10 -0
  213. package/src/field/index.tsx +307 -0
  214. package/src/file-upload/index.tsx +492 -0
  215. package/src/footer/index.tsx +393 -0
  216. package/src/header/index.tsx +498 -0
  217. package/src/identifier/index.tsx +96 -0
  218. package/src/in-page-navigation/index.tsx +258 -0
  219. package/src/index.ts +72 -0
  220. package/src/input-group/index.tsx +197 -0
  221. package/src/lib/krds.ts +75 -0
  222. package/src/lib/link.tsx +35 -0
  223. package/src/main-menu/index.tsx +912 -0
  224. package/src/masthead/index.tsx +50 -0
  225. package/src/modal/index.tsx +457 -0
  226. package/src/pagination/index.tsx +198 -0
  227. package/src/progress/index.tsx +198 -0
  228. package/src/radio/index.tsx +283 -0
  229. package/src/resize/index.tsx +541 -0
  230. package/src/scroll-area/index.tsx +96 -0
  231. package/src/select/index.tsx +136 -0
  232. package/src/separator/index.tsx +107 -0
  233. package/src/side-navigation/index.tsx +336 -0
  234. package/src/skeleton/index.tsx +172 -0
  235. package/src/skip-link/index.tsx +89 -0
  236. package/src/spinner/index.tsx +98 -0
  237. package/src/step-indicator/index.tsx +122 -0
  238. package/src/structured-list/index.tsx +395 -0
  239. package/src/tab/index.tsx +348 -0
  240. package/src/table/index.tsx +186 -0
  241. package/src/tag/index.tsx +127 -0
  242. package/src/text-input/index.tsx +156 -0
  243. package/src/text-list/index.tsx +177 -0
  244. package/src/textarea/index.tsx +113 -0
  245. package/src/toast/index.tsx +311 -0
  246. package/src/tooltip/index.tsx +496 -0
  247. package/styles/krds-tailwind.css +335 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 mhb8436
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # moru-krds-react
2
+
3
+ React components built on the CSS of KRDS, the Korean government design system.
4
+
5
+ ```bash
6
+ npm i krds-uiux moru-krds-react
7
+ ```
8
+
9
+ ```tsx
10
+ import 'krds-uiux/resources/cdn/krds.min.css';
11
+ import { Field, TextInput, Button } from 'moru-krds-react';
12
+
13
+ <Field id="name" label="이름" required hint="공백 없이 적어 주세요">
14
+ {(a) => <TextInput {...a} value={name} onChange={onChange} />}
15
+ </Field>
16
+ <Button variant="primary">신청하기</Button>
17
+ ```
18
+
19
+ `krds-uiux` is the official kit. It declares no `@font-face`, so wire the font yourself from
20
+ `krds-uiux/resources/fonts/`. On an air-gapped network, copy `resources/` into your static
21
+ folder and use `css/component/output.css`, which references images by relative path.
22
+
23
+ ## Components
24
+
25
+ **Page frame** — masthead, header, GNB, breadcrumb, side navigation, in-page navigation,
26
+ footer, agency identifier, skip link
27
+
28
+ **Forms** — field wrapper, text input, textarea, select, checkbox, radio, file upload,
29
+ combobox, input group, button
30
+
31
+ **Data** — table, data table (sorting, sticky header, empty state), structured list,
32
+ text list, pagination
33
+
34
+ **Status** — inline alert, critical alert, toast, empty state, skeleton, spinner,
35
+ progress bar, badge, tag
36
+
37
+ **Overlays** — modal, drawer, tooltip, context menu
38
+
39
+ **Progressive disclosure** — tab, accordion, disclosure, step indicator
40
+
41
+ **Misc** — avatar, separator, scroll area, text resize
42
+
43
+ Thirteen of them have no KRDS counterpart — drawer, toast, combobox, context menu, sortable
44
+ data table and others that admin screens need. Those are drawn with KRDS tokens only.
45
+
46
+ ## Notes
47
+
48
+ 31 of the 45 render on the server, so the package keeps its file layout instead of bundling
49
+ into one file.
50
+
51
+ Framework coupling lives in `src/lib/link.tsx`. It defaults to a plain `<a>`; swap it for
52
+ `next/link` or React Router's `Link`.
53
+
54
+ With Tailwind v4, import `styles/krds-tailwind.css` to map utility names like `text-fg-subtle`
55
+ onto KRDS variables. Without it the components still work.
56
+
57
+ Each component keeps its rules and pitfalls in the source header.
58
+
59
+ ## License
60
+
61
+ MIT. The KRDS kit is not bundled; it ships separately as `krds-uiux` under ISC.
@@ -0,0 +1,63 @@
1
+ import { type ComponentPropsWithRef, type ReactNode } from 'react';
2
+ /**
3
+ * 아코디언 — KRDS `krds-accordion`.
4
+ *
5
+ * 헤더를 눌러 한 덩이씩 펼쳐 보는 목록. FAQ 는 `line`(킷 `type-line`)이 규격이다 — 표로 그리지 않는다.
6
+ * 기본은 한 번에 하나만 열리고, `multiple` 을 주면 여러 개가 함께 열린다.
7
+ * 부가 안내 한 덩이만 접었다 펴려면 `Disclosure` 를, 내용을 갈아 끼우려면 `Tab` 을 쓴다.
8
+ *
9
+ * @example
10
+ * <Accordion.Root line multiple toggleAll headingLevel={3}>
11
+ * <Accordion.Item title="신청 자격이 어떻게 되나요?">…</Accordion.Item>
12
+ * <Accordion.Item title="처리 기간은 얼마나 걸리나요?" defaultOpen>…</Accordion.Item>
13
+ * </Accordion.Root>
14
+ *
15
+ * 자세히: docs/krds/09-부품-노트.md#아코디언
16
+ */
17
+ /** 헤더 제목의 헤딩 단계. 페이지의 앞선 헤딩보다 한 단계 아래로 준다. */
18
+ export type AccordionHeadingLevel = 2 | 3 | 4 | 5 | 6;
19
+ export type AccordionRootProps = Omit<ComponentPropsWithRef<'div'>, 'onToggle'> & {
20
+ /** 여러 항목을 동시에 연다. 기본은 킷과 같은 단일 열림 — 하나를 열면 나머지가 닫힌다. */
21
+ multiple?: boolean;
22
+ /** 라인형(`type-line`). 상자 배경 없이 구분선만 남는다. FAQ 목록에 이 모양을 쓴다. */
23
+ line?: boolean;
24
+ /** 처음부터 전부 펼친다. `multiple` 일 때만 뜻이 있다. */
25
+ defaultAllOpen?: boolean;
26
+ /** 헤더 제목의 헤딩 단계. 기본 `h3`. 페이지의 앞선 헤딩보다 한 단계 아래로 준다. */
27
+ headingLevel?: AccordionHeadingLevel;
28
+ /** 목록 위 오른쪽에 「전체 열기 / 전체 닫기」 단추를 그린다. `multiple` 일 때만 그려진다. */
29
+ toggleAll?: boolean;
30
+ /** 항목을 열고 닫을 때. 뜻 있는 `id` 를 받으려면 항목마다 `id` 를 직접 준다. */
31
+ onToggle?: (id: string, open: boolean) => void;
32
+ };
33
+ export declare function AccordionRoot({ multiple, line, defaultAllOpen, headingLevel, toggleAll, onToggle, className, children, ...rest }: AccordionRootProps): import("react").JSX.Element;
34
+ export type AccordionItemProps = Omit<ComponentPropsWithRef<'div'>, 'title'> & {
35
+ /** 헤더 제목. 헤더 전체가 단추가 된다. */
36
+ title: ReactNode;
37
+ /** 처음부터 이 항목을 펼친다. 단일 열림에서는 하나에만 준다. */
38
+ defaultOpen?: boolean;
39
+ /** 이 항목만 헤딩 단계를 달리한다. 보통은 `Accordion.Root` 쪽에서 정한다. */
40
+ headingLevel?: AccordionHeadingLevel;
41
+ /** 헤더 단추(`btn-accordion`)에 붙일 클래스. */
42
+ buttonClassName?: string;
43
+ /** 내용 영역(`accordion-body`)에 붙일 클래스. */
44
+ bodyClassName?: string;
45
+ };
46
+ export declare function AccordionItem({ title, defaultOpen, headingLevel, buttonClassName, bodyClassName, id, className, children, ...rest }: AccordionItemProps): import("react").JSX.Element;
47
+ export type AccordionToggleAllProps = Omit<ComponentPropsWithRef<'button'>, 'children'> & {
48
+ expandLabel?: string;
49
+ collapseLabel?: string;
50
+ };
51
+ /**
52
+ * 전체 열기 / 전체 닫기 — 킷에 없어 `krds-btn xsmall text` 로 보충한 단추.
53
+ *
54
+ * `Accordion.Root` 에 `toggleAll` 을 주면 제자리에 알아서 그려진다. 직접 쓸 때는
55
+ * `Accordion.Root` 안에 둔다(문맥을 읽는다). 단일 열림에서는 아무것도 그리지 않는다.
56
+ */
57
+ export declare function AccordionToggleAll({ expandLabel, collapseLabel, className, onClick, ...rest }: AccordionToggleAllProps): import("react").JSX.Element | null;
58
+ export declare const Accordion: {
59
+ Root: typeof AccordionRoot;
60
+ Item: typeof AccordionItem;
61
+ ToggleAll: typeof AccordionToggleAll;
62
+ };
63
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/accordion/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,qBAAqB,EAE1B,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf;;;;;;;;;;;;;;GAcG;AAEH,8CAA8C;AAC9C,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAoCtD,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG;IAChF,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0CAA0C;IAC1C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uDAAuD;IACvD,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,+DAA+D;IAC/D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAChD,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAC5B,QAAgB,EAChB,IAAI,EACJ,cAAc,EACd,YAAgB,EAChB,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,kBAAkB,+BAkDpB;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG;IAC7E,4BAA4B;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,wCAAwC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uDAAuD;IACvD,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,WAAmB,EACnB,YAAY,EACZ,eAAe,EACf,aAAa,EACb,EAAE,EACF,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,kBAAkB,+BAkCpB;AAED,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,GAAG;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,WAAqB,EACrB,aAAuB,EACvB,SAAS,EACT,OAAO,EACP,GAAG,IAAI,EACR,EAAE,uBAAuB,sCAwBzB;AAED,eAAO,MAAM,SAAS;;;;CAIrB,CAAC"}
@@ -0,0 +1,145 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ createContext,
5
+ useContext,
6
+ useId,
7
+ useMemo,
8
+ useState
9
+ } from "react";
10
+ import { cx } from "../lib/krds.js";
11
+ const AccordionContext = createContext(null);
12
+ function useAccordionContext(who) {
13
+ const ctx = useContext(AccordionContext);
14
+ if (!ctx) throw new Error(`${who} \uC740(\uB294) <Accordion.Root> \uC548\uC5D0\uC11C\uB9CC \uC4F4\uB2E4.`);
15
+ return ctx;
16
+ }
17
+ function AccordionRoot({
18
+ multiple = false,
19
+ line,
20
+ defaultAllOpen,
21
+ headingLevel = 3,
22
+ toggleAll,
23
+ onToggle,
24
+ className,
25
+ children,
26
+ ...rest
27
+ }) {
28
+ const [state, setState] = useState(() => ({
29
+ // 단일 열림에서 「처음부터 전부 펼침」은 성립하지 않는다.
30
+ all: defaultAllOpen && multiple ? true : null,
31
+ touched: {}
32
+ }));
33
+ const value = useMemo(() => {
34
+ const isOpen = (key, defaultOpen) => key in state.touched ? state.touched[key] : state.all ?? defaultOpen;
35
+ return {
36
+ isOpen,
37
+ toggle: (key, defaultOpen) => {
38
+ const next = !isOpen(key, defaultOpen);
39
+ setState(
40
+ (prev) => multiple ? (
41
+ // 다중 열림 — 누른 항목만 뒤집는다. 나머지는 그대로 둔다.
42
+ { all: prev.all, touched: { ...prev.touched, [key]: next } }
43
+ ) : (
44
+ // 단일 열림 — 누른 항목만 남긴다. `all: false` 라서 나머지는 전부 닫힌다.
45
+ { all: false, touched: { [key]: next } }
46
+ )
47
+ );
48
+ onToggle?.(key, next);
49
+ },
50
+ expandAll: () => setState({ all: true, touched: {} }),
51
+ collapseAll: () => setState({ all: false, touched: {} }),
52
+ allOpen: state.all === true && Object.values(state.touched).every(Boolean),
53
+ multiple,
54
+ headingLevel
55
+ };
56
+ }, [state, multiple, headingLevel, onToggle]);
57
+ return /* @__PURE__ */ jsxs(AccordionContext.Provider, { value, children: [
58
+ toggleAll && multiple && // 킷에 전체 열기 단추 자리가 없다 — 목록 위 오른쪽에 Tailwind 로 둔다(mb-2 = 8px).
59
+ /* @__PURE__ */ jsx("div", { className: "mb-2 flex justify-end", children: /* @__PURE__ */ jsx(AccordionToggleAll, {}) }),
60
+ /* @__PURE__ */ jsx(
61
+ "div",
62
+ {
63
+ className: cx("krds-accordion", line && "type-line", className),
64
+ "data-type": multiple ? "multiOpen" : "singleOpen",
65
+ ...rest,
66
+ children
67
+ }
68
+ )
69
+ ] });
70
+ }
71
+ function AccordionItem({
72
+ title,
73
+ defaultOpen = false,
74
+ headingLevel,
75
+ buttonClassName,
76
+ bodyClassName,
77
+ id,
78
+ className,
79
+ children,
80
+ ...rest
81
+ }) {
82
+ const uid = useId();
83
+ const ctx = useAccordionContext("<Accordion.Item>");
84
+ const key = id ?? uid;
85
+ const headerId = `${key}-header`;
86
+ const panelId = `${key}-panel`;
87
+ const open = ctx.isOpen(key, defaultOpen);
88
+ const Heading = `h${headingLevel ?? ctx.headingLevel}`;
89
+ return /* @__PURE__ */ jsxs("div", { id, className: cx("accordion-item", open && "active", className), ...rest, children: [
90
+ /* @__PURE__ */ jsx(Heading, { className: "accordion-header", children: /* @__PURE__ */ jsx(
91
+ "button",
92
+ {
93
+ type: "button",
94
+ id: headerId,
95
+ className: cx("btn-accordion", open && "active", buttonClassName),
96
+ "aria-expanded": open,
97
+ "aria-controls": panelId,
98
+ onClick: () => ctx.toggle(key, defaultOpen),
99
+ children: title
100
+ }
101
+ ) }),
102
+ /* @__PURE__ */ jsx("div", { id: panelId, className: "accordion-collapse collapse", role: "region", "aria-labelledby": headerId, children: /* @__PURE__ */ jsx("div", { className: cx("accordion-body", bodyClassName), children }) })
103
+ ] });
104
+ }
105
+ function AccordionToggleAll({
106
+ expandLabel = "\uC804\uCCB4 \uC5F4\uAE30",
107
+ collapseLabel = "\uC804\uCCB4 \uB2EB\uAE30",
108
+ className,
109
+ onClick,
110
+ ...rest
111
+ }) {
112
+ const ctx = useAccordionContext("<Accordion.ToggleAll>");
113
+ if (!ctx.multiple) return null;
114
+ const handleClick = (event) => {
115
+ onClick?.(event);
116
+ if (event.defaultPrevented) return;
117
+ if (ctx.allOpen) ctx.collapseAll();
118
+ else ctx.expandAll();
119
+ };
120
+ return /* @__PURE__ */ jsxs(
121
+ "button",
122
+ {
123
+ type: "button",
124
+ className: cx("krds-btn xsmall text", className),
125
+ onClick: handleClick,
126
+ ...rest,
127
+ children: [
128
+ ctx.allOpen ? collapseLabel : expandLabel,
129
+ /* @__PURE__ */ jsx("i", { className: cx("svg-icon ico-angle", ctx.allOpen && "rotate-180"), "aria-hidden": "true" })
130
+ ]
131
+ }
132
+ );
133
+ }
134
+ const Accordion = {
135
+ Root: AccordionRoot,
136
+ Item: AccordionItem,
137
+ ToggleAll: AccordionToggleAll
138
+ };
139
+ export {
140
+ Accordion,
141
+ AccordionItem,
142
+ AccordionRoot,
143
+ AccordionToggleAll
144
+ };
145
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/accordion/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n createContext,\n useContext,\n useId,\n useMemo,\n useState,\n type ComponentPropsWithRef,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from 'react';\nimport { cx } from '../lib/krds';\n\n/**\n * 아코디언 — KRDS `krds-accordion`.\n *\n * 헤더를 눌러 한 덩이씩 펼쳐 보는 목록. FAQ 는 `line`(킷 `type-line`)이 규격이다 — 표로 그리지 않는다.\n * 기본은 한 번에 하나만 열리고, `multiple` 을 주면 여러 개가 함께 열린다.\n * 부가 안내 한 덩이만 접었다 펴려면 `Disclosure` 를, 내용을 갈아 끼우려면 `Tab` 을 쓴다.\n *\n * @example\n * <Accordion.Root line multiple toggleAll headingLevel={3}>\n * <Accordion.Item title=\"신청 자격이 어떻게 되나요?\">…</Accordion.Item>\n * <Accordion.Item title=\"처리 기간은 얼마나 걸리나요?\" defaultOpen>…</Accordion.Item>\n * </Accordion.Root>\n *\n * 자세히: docs/krds/09-부품-노트.md#아코디언\n */\n\n/** 헤더 제목의 헤딩 단계. 페이지의 앞선 헤딩보다 한 단계 아래로 준다. */\nexport type AccordionHeadingLevel = 2 | 3 | 4 | 5 | 6;\n\n/**\n * 열림 상태.\n *\n * 항목 목록을 부모가 모르고도(등록 절차 없이) 「전체 열기」를 지원하려고 이렇게 잡았다.\n * - `all: null` — 전체 열기/닫기를 아직 누르지 않았다 → 손대지 않은 항목은 제 `defaultOpen` 을 따른다\n * - `all: true|false` — 전체 열기/닫기를 눌렀다 → 손대지 않은 항목은 전부 그 값을 따른다\n * - `touched` — 헤더를 눌러 개별로 손댄 항목만. 언제나 `all` 보다 우선한다\n */\ntype AccordionOpenState = {\n all: boolean | null;\n touched: Record<string, boolean>;\n};\n\ntype AccordionContextValue = {\n /** 이 항목이 열려 있나. 손댄 적 없으면 항목 제 `defaultOpen` 이 산다. */\n isOpen: (key: string, defaultOpen: boolean) => boolean;\n toggle: (key: string, defaultOpen: boolean) => void;\n expandAll: () => void;\n collapseAll: () => void;\n /** 「전체 열기」를 누른 뒤 하나도 닫지 않은 상태. 전체 단추의 글자를 여기서 고른다. */\n allOpen: boolean;\n /** 다중 열림인가(킷 JS 의 `data-type=\"multiOpen\"`). */\n multiple: boolean;\n headingLevel: AccordionHeadingLevel;\n};\n\nconst AccordionContext = createContext<AccordionContextValue | null>(null);\n\nfunction useAccordionContext(who: string): AccordionContextValue {\n const ctx = useContext(AccordionContext);\n if (!ctx) throw new Error(`${who} 은(는) <Accordion.Root> 안에서만 쓴다.`);\n return ctx;\n}\n\nexport type AccordionRootProps = Omit<ComponentPropsWithRef<'div'>, 'onToggle'> & {\n /** 여러 항목을 동시에 연다. 기본은 킷과 같은 단일 열림 — 하나를 열면 나머지가 닫힌다. */\n multiple?: boolean;\n /** 라인형(`type-line`). 상자 배경 없이 구분선만 남는다. FAQ 목록에 이 모양을 쓴다. */\n line?: boolean;\n /** 처음부터 전부 펼친다. `multiple` 일 때만 뜻이 있다. */\n defaultAllOpen?: boolean;\n /** 헤더 제목의 헤딩 단계. 기본 `h3`. 페이지의 앞선 헤딩보다 한 단계 아래로 준다. */\n headingLevel?: AccordionHeadingLevel;\n /** 목록 위 오른쪽에 「전체 열기 / 전체 닫기」 단추를 그린다. `multiple` 일 때만 그려진다. */\n toggleAll?: boolean;\n /** 항목을 열고 닫을 때. 뜻 있는 `id` 를 받으려면 항목마다 `id` 를 직접 준다. */\n onToggle?: (id: string, open: boolean) => void;\n};\n\nexport function AccordionRoot({\n multiple = false,\n line,\n defaultAllOpen,\n headingLevel = 3,\n toggleAll,\n onToggle,\n className,\n children,\n ...rest\n}: AccordionRootProps) {\n const [state, setState] = useState<AccordionOpenState>(() => ({\n // 단일 열림에서 「처음부터 전부 펼침」은 성립하지 않는다.\n all: defaultAllOpen && multiple ? true : null,\n touched: {},\n }));\n\n const value = useMemo<AccordionContextValue>(() => {\n const isOpen = (key: string, defaultOpen: boolean) =>\n key in state.touched ? state.touched[key] : (state.all ?? defaultOpen);\n\n return {\n isOpen,\n toggle: (key, defaultOpen) => {\n const next = !isOpen(key, defaultOpen);\n setState((prev) =>\n multiple\n ? // 다중 열림 — 누른 항목만 뒤집는다. 나머지는 그대로 둔다.\n { all: prev.all, touched: { ...prev.touched, [key]: next } }\n : // 단일 열림 — 누른 항목만 남긴다. `all: false` 라서 나머지는 전부 닫힌다.\n { all: false, touched: { [key]: next } },\n );\n onToggle?.(key, next);\n },\n expandAll: () => setState({ all: true, touched: {} }),\n collapseAll: () => setState({ all: false, touched: {} }),\n allOpen: state.all === true && Object.values(state.touched).every(Boolean),\n multiple,\n headingLevel,\n };\n }, [state, multiple, headingLevel, onToggle]);\n\n return (\n <AccordionContext.Provider value={value}>\n {toggleAll && multiple && (\n // 킷에 전체 열기 단추 자리가 없다 — 목록 위 오른쪽에 Tailwind 로 둔다(mb-2 = 8px).\n <div className=\"mb-2 flex justify-end\">\n <AccordionToggleAll />\n </div>\n )}\n <div\n className={cx('krds-accordion', line && 'type-line', className)}\n // 킷 JS 가 읽던 값. 우리 렌더에는 필요 없지만 DOM 만 봐도 모드를 알 수 있게 남긴다.\n data-type={multiple ? 'multiOpen' : 'singleOpen'}\n {...rest}\n >\n {children}\n </div>\n </AccordionContext.Provider>\n );\n}\n\nexport type AccordionItemProps = Omit<ComponentPropsWithRef<'div'>, 'title'> & {\n /** 헤더 제목. 헤더 전체가 단추가 된다. */\n title: ReactNode;\n /** 처음부터 이 항목을 펼친다. 단일 열림에서는 하나에만 준다. */\n defaultOpen?: boolean;\n /** 이 항목만 헤딩 단계를 달리한다. 보통은 `Accordion.Root` 쪽에서 정한다. */\n headingLevel?: AccordionHeadingLevel;\n /** 헤더 단추(`btn-accordion`)에 붙일 클래스. */\n buttonClassName?: string;\n /** 내용 영역(`accordion-body`)에 붙일 클래스. */\n bodyClassName?: string;\n};\n\nexport function AccordionItem({\n title,\n defaultOpen = false,\n headingLevel,\n buttonClassName,\n bodyClassName,\n id,\n className,\n children,\n ...rest\n}: AccordionItemProps) {\n const uid = useId();\n const ctx = useAccordionContext('<Accordion.Item>');\n\n // 킷 JS 는 `accordionHeader-id-*` / `accordionCollapse-id-*` 를 난수로 만든다.\n // React 는 `useId()` 가 서버·클라이언트에서 같은 값을 주므로 그것을 쓴다.\n const key = id ?? uid;\n const headerId = `${key}-header`;\n const panelId = `${key}-panel`;\n\n const open = ctx.isOpen(key, defaultOpen);\n const Heading = `h${headingLevel ?? ctx.headingLevel}` as 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\n return (\n <div id={id} className={cx('accordion-item', open && 'active', className)} {...rest}>\n <Heading className=\"accordion-header\">\n <button\n type=\"button\"\n id={headerId}\n className={cx('btn-accordion', open && 'active', buttonClassName)}\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => ctx.toggle(key, defaultOpen)}\n >\n {title}\n </button>\n </Heading>\n {/* `collapse` 는 킷 CSS 에 규칙이 없다. 킷 마크업과 맞추려고 그대로 둔다.\n 닫힘/열림은 `.accordion-item.active` 가 이 요소의 max-height·visibility 를 바꿔 만든다. */}\n <div id={panelId} className=\"accordion-collapse collapse\" role=\"region\" aria-labelledby={headerId}>\n <div className={cx('accordion-body', bodyClassName)}>{children}</div>\n </div>\n </div>\n );\n}\n\nexport type AccordionToggleAllProps = Omit<ComponentPropsWithRef<'button'>, 'children'> & {\n expandLabel?: string;\n collapseLabel?: string;\n};\n\n/**\n * 전체 열기 / 전체 닫기 — 킷에 없어 `krds-btn xsmall text` 로 보충한 단추.\n *\n * `Accordion.Root` 에 `toggleAll` 을 주면 제자리에 알아서 그려진다. 직접 쓸 때는\n * `Accordion.Root` 안에 둔다(문맥을 읽는다). 단일 열림에서는 아무것도 그리지 않는다.\n */\nexport function AccordionToggleAll({\n expandLabel = '전체 열기',\n collapseLabel = '전체 닫기',\n className,\n onClick,\n ...rest\n}: AccordionToggleAllProps) {\n const ctx = useAccordionContext('<Accordion.ToggleAll>');\n\n // 단일 열림에서는 「전체 열기」가 성립하지 않는다.\n if (!ctx.multiple) return null;\n\n const handleClick = (event: ReactMouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n if (ctx.allOpen) ctx.collapseAll();\n else ctx.expandAll();\n };\n\n return (\n <button\n type=\"button\"\n className={cx('krds-btn xsmall text', className)}\n onClick={handleClick}\n {...rest}\n >\n {ctx.allOpen ? collapseLabel : expandLabel}\n <i className={cx('svg-icon ico-angle', ctx.allOpen && 'rotate-180')} aria-hidden=\"true\" />\n </button>\n );\n}\n\nexport const Accordion = {\n Root: AccordionRoot,\n Item: AccordionItem,\n ToggleAll: AccordionToggleAll,\n};\n"],"mappings":";AA6HI,SAIM,KAJN;AA3HJ;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP,SAAS,UAAU;AA+CnB,MAAM,mBAAmB,cAA4C,IAAI;AAEzE,SAAS,oBAAoB,KAAoC;AAC/D,QAAM,MAAM,WAAW,gBAAgB;AACvC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,GAAG,GAAG,yEAAiC;AACjE,SAAO;AACT;AAiBO,SAAS,cAAc;AAAA,EAC5B,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAuB;AACrB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA6B,OAAO;AAAA;AAAA,IAE5D,KAAK,kBAAkB,WAAW,OAAO;AAAA,IACzC,SAAS,CAAC;AAAA,EACZ,EAAE;AAEF,QAAM,QAAQ,QAA+B,MAAM;AACjD,UAAM,SAAS,CAAC,KAAa,gBAC3B,OAAO,MAAM,UAAU,MAAM,QAAQ,GAAG,IAAK,MAAM,OAAO;AAE5D,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,CAAC,KAAK,gBAAgB;AAC5B,cAAM,OAAO,CAAC,OAAO,KAAK,WAAW;AACrC;AAAA,UAAS,CAAC,SACR;AAAA;AAAA,YAEI,EAAE,KAAK,KAAK,KAAK,SAAS,EAAE,GAAG,KAAK,SAAS,CAAC,GAAG,GAAG,KAAK,EAAE;AAAA;AAAA;AAAA,YAE3D,EAAE,KAAK,OAAO,SAAS,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE;AAAA;AAAA,QAC7C;AACA,mBAAW,KAAK,IAAI;AAAA,MACtB;AAAA,MACA,WAAW,MAAM,SAAS,EAAE,KAAK,MAAM,SAAS,CAAC,EAAE,CAAC;AAAA,MACpD,aAAa,MAAM,SAAS,EAAE,KAAK,OAAO,SAAS,CAAC,EAAE,CAAC;AAAA,MACvD,SAAS,MAAM,QAAQ,QAAQ,OAAO,OAAO,MAAM,OAAO,EAAE,MAAM,OAAO;AAAA,MACzE;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,UAAU,cAAc,QAAQ,CAAC;AAE5C,SACE,qBAAC,iBAAiB,UAAjB,EAA0B,OACxB;AAAA,iBAAa;AAAA,IAEZ,oBAAC,SAAI,WAAU,yBACb,8BAAC,sBAAmB,GACtB;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,kBAAkB,QAAQ,aAAa,SAAS;AAAA,QAE9D,aAAW,WAAW,cAAc;AAAA,QACnC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;AAeO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAuB;AACrB,QAAM,MAAM,MAAM;AAClB,QAAM,MAAM,oBAAoB,kBAAkB;AAIlD,QAAM,MAAM,MAAM;AAClB,QAAM,WAAW,GAAG,GAAG;AACvB,QAAM,UAAU,GAAG,GAAG;AAEtB,QAAM,OAAO,IAAI,OAAO,KAAK,WAAW;AACxC,QAAM,UAAU,IAAI,gBAAgB,IAAI,YAAY;AAEpD,SACE,qBAAC,SAAI,IAAQ,WAAW,GAAG,kBAAkB,QAAQ,UAAU,SAAS,GAAI,GAAG,MAC7E;AAAA,wBAAC,WAAQ,WAAU,oBACjB;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,IAAI;AAAA,QACJ,WAAW,GAAG,iBAAiB,QAAQ,UAAU,eAAe;AAAA,QAChE,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,SAAS,MAAM,IAAI,OAAO,KAAK,WAAW;AAAA,QAEzC;AAAA;AAAA,IACH,GACF;AAAA,IAGA,oBAAC,SAAI,IAAI,SAAS,WAAU,+BAA8B,MAAK,UAAS,mBAAiB,UACvF,8BAAC,SAAI,WAAW,GAAG,kBAAkB,aAAa,GAAI,UAAS,GACjE;AAAA,KACF;AAEJ;AAaO,SAAS,mBAAmB;AAAA,EACjC,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4B;AAC1B,QAAM,MAAM,oBAAoB,uBAAuB;AAGvD,MAAI,CAAC,IAAI,SAAU,QAAO;AAE1B,QAAM,cAAc,CAAC,UAA8C;AACjE,cAAU,KAAK;AACf,QAAI,MAAM,iBAAkB;AAC5B,QAAI,IAAI,QAAS,KAAI,YAAY;AAAA,QAC5B,KAAI,UAAU;AAAA,EACrB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW,GAAG,wBAAwB,SAAS;AAAA,MAC/C,SAAS;AAAA,MACR,GAAG;AAAA,MAEH;AAAA,YAAI,UAAU,gBAAgB;AAAA,QAC/B,oBAAC,OAAE,WAAW,GAAG,sBAAsB,IAAI,WAAW,YAAY,GAAG,eAAY,QAAO;AAAA;AAAA;AAAA,EAC1F;AAEJ;AAEO,MAAM,YAAY;AAAA,EACvB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AACb;","names":[]}
@@ -0,0 +1,44 @@
1
+ import type { ComponentPropsWithRef, ReactNode } from 'react';
2
+ import { type KrdsIcon, type KrdsTone } from '../lib/krds';
3
+ /**
4
+ * 인라인 안내 상자 — KRDS 에 없다. shadcn `Alert` 형태에 KRDS 토큰을 입힌 보충 부품이다.
5
+ *
6
+ * 본문 흐름 안에서 「이 화면을 쓰기 전에 알아야 할 것」을 한 덩이로 알린다.
7
+ * 떴다 사라지는 알림은 `Toast`, 폼 필드 하나에 붙는 문구는 `Field` 의 `hint`·`message`,
8
+ * 재난·장애 배너는 `CriticalAlert` 다 — 그쪽에 이 상자를 갖다 쓰지 마라(규격이 금지한다).
9
+ * `AlertTitle` · `AlertDescription` 말고 다른 것을 바로 넣지 않는다.
10
+ *
11
+ * @example
12
+ * <Alert tone="information">
13
+ * <AlertTitle>열람 신청 전에 확인하세요.</AlertTitle>
14
+ * <AlertDescription>비공개 기록물은 소속 기관 승인 뒤에 열립니다.</AlertDescription>
15
+ * </Alert>
16
+ * <Alert tone="danger" announce="assertive">
17
+ * <AlertTitle>저장하지 못했습니다.</AlertTitle>
18
+ * </Alert>
19
+ *
20
+ * 자세히: docs/krds/09-부품-노트.md#안내상자
21
+ */
22
+ /** 색조. `KrdsTone` 에서 이 상자가 쓰는 다섯만 좁힌 것이다. */
23
+ export type AlertTone = Extract<KrdsTone, 'information' | 'warning' | 'danger' | 'success' | 'gray'>;
24
+ /**
25
+ * 낭독 방식. 생략하면 role 이 없다(늘 떠 있는 안내의 기본값).
26
+ * `polite` = `role="status"`(새로 나타나는 안내) · `assertive` = `role="alert"`(긴급한 것에만).
27
+ */
28
+ export type AlertAnnounce = 'polite' | 'assertive';
29
+ export type AlertProps = Omit<ComponentPropsWithRef<'div'>, 'title'> & {
30
+ /** 기본 `information`. 선·면·글자색과 기본 아이콘이 여기서 정해진다. */
31
+ tone?: AlertTone;
32
+ /** 킷 아이콘 이름(`ico-` 뺀 것). 색조 기본값을 덮는다. `null` 이면 그리지 않는다. */
33
+ icon?: KrdsIcon | null;
34
+ /** 낭독 방식. 기본은 role 없음. `assertive`(=`role="alert"`)는 긴급한 것에만. */
35
+ announce?: AlertAnnounce;
36
+ /** `AlertTitle` · `AlertDescription` 을 넣는다. */
37
+ children?: ReactNode;
38
+ };
39
+ export declare function Alert({ tone, icon, announce, className, children, ...rest }: AlertProps): import("react").JSX.Element;
40
+ /** 안내 제목 한 줄. 둘째 칸에 놓인다. 색은 상자에서 물려받는다. */
41
+ export declare function AlertTitle({ className, ...rest }: ComponentPropsWithRef<'div'>): import("react").JSX.Element;
42
+ /** 안내 본문. 여러 줄·목록을 넣어도 `gap-1` 로 벌어진다. 색은 상자에서 물려받는다. */
43
+ export declare function AlertDescription({ className, ...rest }: ComponentPropsWithRef<'div'>): import("react").JSX.Element;
44
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/alert/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAM,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE/D;;;;;;;;;;;;;;;;;;GAkBG;AAEH,6CAA6C;AAC7C,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC;AAErG;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,WAAW,CAAC;AAwBnD,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG;IACrE,mDAAmD;IACnD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAgB,KAAK,CAAC,EAAE,IAAoB,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,UAAU,+BAmCvG;AAED,2CAA2C;AAC3C,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,qBAAqB,CAAC,KAAK,CAAC,+BAE9E;AAED,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,qBAAqB,CAAC,KAAK,CAAC,+BAEpF"}
@@ -0,0 +1,66 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { cx } from "../lib/krds.js";
3
+ const ROLE = {
4
+ polite: "status",
5
+ assertive: "alert"
6
+ };
7
+ const TONE = {
8
+ information: {
9
+ box: "border-information-line bg-information-surface text-information",
10
+ tint: "bg-information",
11
+ icon: "information-fill"
12
+ },
13
+ // 경고 아이콘은 킷에 없다 — 위 「경고에 아이콘이 없는 것은 일부러다」 참고.
14
+ warning: { box: "border-warning-line bg-warning-surface text-warning", tint: "bg-warning", icon: null },
15
+ danger: { box: "border-danger-line bg-danger-surface text-danger", tint: "bg-danger", icon: "error-fill" },
16
+ success: { box: "border-success-line bg-success-surface text-success", tint: "bg-success", icon: "success-fill" },
17
+ gray: { box: "border-line bg-surface-subtler text-fg", tint: "bg-fg", icon: null }
18
+ };
19
+ function Alert({ tone = "information", icon, announce, className, children, ...rest }) {
20
+ const t = TONE[tone];
21
+ const iconName = icon === void 0 ? t.icon : icon;
22
+ const iconNode = iconName ? /* @__PURE__ */ jsx(
23
+ "i",
24
+ {
25
+ className: cx(
26
+ "svg-icon",
27
+ `ico-${iconName}`,
28
+ // shadcn 이 자식 svg 에 거는 16px + 아래로 2px 자리. 킷 `.svg-icon` 기본이 large 라 줄여야 한다.
29
+ "col-start-1 row-start-1 size-4 translate-y-0.5",
30
+ // `-fill` 은 background-image 라 색을 못 바꾼다(함정 1).
31
+ !iconName.endsWith("-fill") && t.tint
32
+ ),
33
+ "aria-hidden": "true"
34
+ }
35
+ ) : null;
36
+ return /* @__PURE__ */ jsxs(
37
+ "div",
38
+ {
39
+ role: announce ? ROLE[announce] : void 0,
40
+ className: cx(
41
+ "relative grid w-full items-start gap-y-0.5 rounded-lg border border-solid px-4 py-3 text-sm",
42
+ // 아이콘이 있을 때만 첫 칸이 열린다 — shadcn 의 `has-[>svg]:` 분기를 코드로 옮긴 것.
43
+ iconNode ? "grid-cols-[calc(var(--spacing)*4)_1fr] gap-x-3" : "grid-cols-[0_1fr]",
44
+ t.box,
45
+ className
46
+ ),
47
+ ...rest,
48
+ children: [
49
+ iconNode,
50
+ children
51
+ ]
52
+ }
53
+ );
54
+ }
55
+ function AlertTitle({ className, ...rest }) {
56
+ return /* @__PURE__ */ jsx("div", { className: cx("col-start-2 min-h-4 font-bold", className), ...rest });
57
+ }
58
+ function AlertDescription({ className, ...rest }) {
59
+ return /* @__PURE__ */ jsx("div", { className: cx("col-start-2 grid justify-items-start gap-1 text-sm", className), ...rest });
60
+ }
61
+ export {
62
+ Alert,
63
+ AlertDescription,
64
+ AlertTitle
65
+ };
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/alert/index.tsx"],"sourcesContent":["import type { ComponentPropsWithRef, ReactNode } from 'react';\nimport { cx, type KrdsIcon, type KrdsTone } from '../lib/krds';\n\n/**\n * 인라인 안내 상자 — KRDS 에 없다. shadcn `Alert` 형태에 KRDS 토큰을 입힌 보충 부품이다.\n *\n * 본문 흐름 안에서 「이 화면을 쓰기 전에 알아야 할 것」을 한 덩이로 알린다.\n * 떴다 사라지는 알림은 `Toast`, 폼 필드 하나에 붙는 문구는 `Field` 의 `hint`·`message`,\n * 재난·장애 배너는 `CriticalAlert` 다 — 그쪽에 이 상자를 갖다 쓰지 마라(규격이 금지한다).\n * `AlertTitle` · `AlertDescription` 말고 다른 것을 바로 넣지 않는다.\n *\n * @example\n * <Alert tone=\"information\">\n * <AlertTitle>열람 신청 전에 확인하세요.</AlertTitle>\n * <AlertDescription>비공개 기록물은 소속 기관 승인 뒤에 열립니다.</AlertDescription>\n * </Alert>\n * <Alert tone=\"danger\" announce=\"assertive\">\n * <AlertTitle>저장하지 못했습니다.</AlertTitle>\n * </Alert>\n *\n * 자세히: docs/krds/09-부품-노트.md#안내상자\n */\n\n/** 색조. `KrdsTone` 에서 이 상자가 쓰는 다섯만 좁힌 것이다. */\nexport type AlertTone = Extract<KrdsTone, 'information' | 'warning' | 'danger' | 'success' | 'gray'>;\n\n/**\n * 낭독 방식. 생략하면 role 이 없다(늘 떠 있는 안내의 기본값).\n * `polite` = `role=\"status\"`(새로 나타나는 안내) · `assertive` = `role=\"alert\"`(긴급한 것에만).\n */\nexport type AlertAnnounce = 'polite' | 'assertive';\n\nconst ROLE: Record<AlertAnnounce, 'status' | 'alert'> = {\n polite: 'status',\n assertive: 'alert',\n};\n\n/**\n * 색조별 유틸리티. 선 `border-*-line` · 면 `bg-*-surface` · 글자 `text-*` · mask 아이콘 색 `tint`.\n * 완성된 문자열로 적는다(Tailwind 는 글자 그대로 적힌 클래스만 만든다).\n */\nconst TONE: Record<AlertTone, { box: string; tint: string; icon: KrdsIcon | null }> = {\n information: {\n box: 'border-information-line bg-information-surface text-information',\n tint: 'bg-information',\n icon: 'information-fill',\n },\n // 경고 아이콘은 킷에 없다 — 위 「경고에 아이콘이 없는 것은 일부러다」 참고.\n warning: { box: 'border-warning-line bg-warning-surface text-warning', tint: 'bg-warning', icon: null },\n danger: { box: 'border-danger-line bg-danger-surface text-danger', tint: 'bg-danger', icon: 'error-fill' },\n success: { box: 'border-success-line bg-success-surface text-success', tint: 'bg-success', icon: 'success-fill' },\n gray: { box: 'border-line bg-surface-subtler text-fg', tint: 'bg-fg', icon: null },\n};\n\nexport type AlertProps = Omit<ComponentPropsWithRef<'div'>, 'title'> & {\n /** 기본 `information`. 선·면·글자색과 기본 아이콘이 여기서 정해진다. */\n tone?: AlertTone;\n /** 킷 아이콘 이름(`ico-` 뺀 것). 색조 기본값을 덮는다. `null` 이면 그리지 않는다. */\n icon?: KrdsIcon | null;\n /** 낭독 방식. 기본은 role 없음. `assertive`(=`role=\"alert\"`)는 긴급한 것에만. */\n announce?: AlertAnnounce;\n /** `AlertTitle` · `AlertDescription` 을 넣는다. */\n children?: ReactNode;\n};\n\nexport function Alert({ tone = 'information', icon, announce, className, children, ...rest }: AlertProps) {\n const t = TONE[tone];\n // `undefined` 는 「색조 기본값을 쓴다」, `null` 은 「그리지 않는다」. 둘을 구분해야 한다.\n const iconName = icon === undefined ? t.icon : icon;\n\n const iconNode = iconName ? (\n <i\n className={cx(\n 'svg-icon',\n `ico-${iconName}`,\n // shadcn 이 자식 svg 에 거는 16px + 아래로 2px 자리. 킷 `.svg-icon` 기본이 large 라 줄여야 한다.\n 'col-start-1 row-start-1 size-4 translate-y-0.5',\n // `-fill` 은 background-image 라 색을 못 바꾼다(함정 1).\n !iconName.endsWith('-fill') && t.tint,\n )}\n aria-hidden=\"true\"\n />\n ) : null;\n\n return (\n <div\n role={announce ? ROLE[announce] : undefined}\n className={cx(\n 'relative grid w-full items-start gap-y-0.5 rounded-lg border border-solid px-4 py-3 text-sm',\n // 아이콘이 있을 때만 첫 칸이 열린다 — shadcn 의 `has-[>svg]:` 분기를 코드로 옮긴 것.\n iconNode ? 'grid-cols-[calc(var(--spacing)*4)_1fr] gap-x-3' : 'grid-cols-[0_1fr]',\n t.box,\n className,\n )}\n {...rest}\n >\n {iconNode}\n {children}\n </div>\n );\n}\n\n/** 안내 제목 한 줄. 둘째 칸에 놓인다. 색은 상자에서 물려받는다. */\nexport function AlertTitle({ className, ...rest }: ComponentPropsWithRef<'div'>) {\n return <div className={cx('col-start-2 min-h-4 font-bold', className)} {...rest} />;\n}\n\n/** 안내 본문. 여러 줄·목록을 넣어도 `gap-1` 로 벌어진다. 색은 상자에서 물려받는다. */\nexport function AlertDescription({ className, ...rest }: ComponentPropsWithRef<'div'>) {\n return <div className={cx('col-start-2 grid justify-items-start gap-1 text-sm', className)} {...rest} />;\n}\n"],"mappings":"AAuEI,cAcA,YAdA;AAtEJ,SAAS,UAAwC;AA+BjD,MAAM,OAAkD;AAAA,EACtD,QAAQ;AAAA,EACR,WAAW;AACb;AAMA,MAAM,OAAgF;AAAA,EACpF,aAAa;AAAA,IACX,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA;AAAA,EAEA,SAAS,EAAE,KAAK,uDAAuD,MAAM,cAAc,MAAM,KAAK;AAAA,EACtG,QAAQ,EAAE,KAAK,oDAAoD,MAAM,aAAa,MAAM,aAAa;AAAA,EACzG,SAAS,EAAE,KAAK,uDAAuD,MAAM,cAAc,MAAM,eAAe;AAAA,EAChH,MAAM,EAAE,KAAK,0CAA0C,MAAM,SAAS,MAAM,KAAK;AACnF;AAaO,SAAS,MAAM,EAAE,OAAO,eAAe,MAAM,UAAU,WAAW,UAAU,GAAG,KAAK,GAAe;AACxG,QAAM,IAAI,KAAK,IAAI;AAEnB,QAAM,WAAW,SAAS,SAAY,EAAE,OAAO;AAE/C,QAAM,WAAW,WACf;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,OAAO,QAAQ;AAAA;AAAA,QAEf;AAAA;AAAA,QAEA,CAAC,SAAS,SAAS,OAAO,KAAK,EAAE;AAAA,MACnC;AAAA,MACA,eAAY;AAAA;AAAA,EACd,IACE;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,WAAW,KAAK,QAAQ,IAAI;AAAA,MAClC,WAAW;AAAA,QACT;AAAA;AAAA,QAEA,WAAW,mDAAmD;AAAA,QAC9D,EAAE;AAAA,QACF;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACA;AAAA;AAAA;AAAA,EACH;AAEJ;AAGO,SAAS,WAAW,EAAE,WAAW,GAAG,KAAK,GAAiC;AAC/E,SAAO,oBAAC,SAAI,WAAW,GAAG,iCAAiC,SAAS,GAAI,GAAG,MAAM;AACnF;AAGO,SAAS,iBAAiB,EAAE,WAAW,GAAG,KAAK,GAAiC;AACrF,SAAO,oBAAC,SAAI,WAAW,GAAG,sDAAsD,SAAS,GAAI,GAAG,MAAM;AACxG;","names":[]}
@@ -0,0 +1,102 @@
1
+ import type { ComponentPropsWithRef } from 'react';
2
+ import { type KrdsSize, type KrdsTone } from '../lib/krds';
3
+ /**
4
+ * 아바타(사용자 표식) — KRDS 킷에 없다. KRDS 토큰을 입힌 보충 부품이다.
5
+ *
6
+ * 사람 이름 옆에 놓아 목록에서 행을 구분한다. 스스로 누를 수 없는 `<span>` 이다 —
7
+ * 누르는 일은 감싸는 `<Link>`·`<button>` 이 한다.
8
+ * 이름이 곁에 이미 적혀 있으면 `decorative` 를 켠다(안 켜면 이름이 두 번 읽힌다).
9
+ * 여러 사람을 겹쳐 늘어놓을 때는 `AvatarGroup` 을 쓴다.
10
+ *
11
+ * @example
12
+ * <Avatar name="홍길동" />
13
+ * <Avatar name="홍길동" src="/files/1.jpg" size="small" />
14
+ * <span className="flex items-center gap-2">
15
+ * <Avatar name={p.author} size="xsmall" decorative /> {p.author}
16
+ * </span>
17
+ * <AvatarGroup label="참여자" items={members} max={4} />
18
+ *
19
+ * 자세히: docs/krds/09-부품-노트.md#아바타
20
+ */
21
+ /** 채움 방식. 킷 배지의 `bg-light-*` · `bg-*` 짝을 유틸리티로 옮긴 것이다. */
22
+ export type AvatarFill = 'light' | 'solid';
23
+ /**
24
+ * 이름에서 이니셜을 뽑는다. 한글은 성 한 글자, 서양식 이름은 첫 두 낱말의 머리글자다.
25
+ *
26
+ * @example
27
+ * avatarInitials('홍길동') // '홍'
28
+ * avatarInitials('남궁 민수') // '남'
29
+ * avatarInitials('Hong Gildong') // 'HG'
30
+ * avatarInitials('gildong') // 'G'
31
+ */
32
+ export declare function avatarInitials(name: string): string;
33
+ type AvatarBase = {
34
+ /** 기본 medium(48px). 같은 줄의 버튼·입력칸과 **같은 값**을 준다. */
35
+ size?: KrdsSize;
36
+ /** 기본 gray. 뜻이 있을 때만 다른 색을 준다 — 이름 해시로 색을 흩뿌리지 않는다. */
37
+ tone?: KrdsTone;
38
+ fill?: AvatarFill;
39
+ /** 프로필 사진 주소. 불러오기에 실패하면 밑의 이니셜이 드러난다. */
40
+ src?: string;
41
+ /** 이니셜을 직접 준다. 생략하면 `name` 에서 뽑는다. */
42
+ initials?: string;
43
+ /** 겹쳐 놓을 때 서로 떨어져 보이도록 바탕색 테두리를 두른다. `AvatarGroup` 이 켜 준다. */
44
+ bordered?: boolean;
45
+ className?: string;
46
+ };
47
+ /** 아바타 하나가 사람을 대신하는 자리. 보조기술이 이름을 읽는다. */
48
+ export type AvatarProps = Omit<ComponentPropsWithRef<'span'>, 'children'> & AvatarBase & {
49
+ decorative?: false;
50
+ /** 사람 이름. 이니셜과 보조기술 이름이 여기서 나온다. */
51
+ name: string;
52
+ /** 읽을 문구를 이름과 다르게 하고 싶을 때(예: `홍길동 (관리자)`). */
53
+ label?: string;
54
+ };
55
+ /** 곁에 이름이 이미 적혀 있는 자리. 보조기술에서 감춘다(이름이 두 번 읽히지 않게). */
56
+ export type DecorativeAvatarProps = Omit<ComponentPropsWithRef<'span'>, 'children'> & AvatarBase & {
57
+ decorative: true;
58
+ /** 이니셜을 뽑는 데만 쓴다. 읽히지는 않는다. */
59
+ name?: string;
60
+ };
61
+ /**
62
+ * 사용자 표식 하나. 이니셜을 깔고 `src` 가 있으면 그 위에 사진을 덮는다.
63
+ * 이름도 이미지도 없으면 킷 아이콘 `ico-my` 를 그린다(비회원 글 등).
64
+ *
65
+ * @example
66
+ * <Avatar name="홍길동" size="small" src={user.photo} />
67
+ */
68
+ export declare function Avatar(props: AvatarProps | DecorativeAvatarProps): import("react").JSX.Element;
69
+ /** 묶음에 넣을 한 사람. */
70
+ export type AvatarGroupItem = {
71
+ name: string;
72
+ src?: string;
73
+ tone?: KrdsTone;
74
+ /** 읽을 문구를 이름과 다르게 할 때. */
75
+ label?: string;
76
+ };
77
+ export type AvatarGroupProps = Omit<ComponentPropsWithRef<'ul'>, 'children'> & {
78
+ items: AvatarGroupItem[];
79
+ /** 몇 칸까지 보일지. 나머지는 `+N` 한 칸으로 접는다. 기본 4. */
80
+ max?: number;
81
+ /** 기본 small(40px) — 목록 안에 들어가는 일이 많아 하나짜리보다 작다. */
82
+ size?: KrdsSize;
83
+ fill?: AvatarFill;
84
+ /** 모든 칸의 기본 색. 항목이 `tone` 을 주면 그것이 이긴다. */
85
+ tone?: KrdsTone;
86
+ /** 겹치지 않고 나란히 놓는다. */
87
+ spaced?: boolean;
88
+ /** 묶음 전체의 이름(`<ul>` 의 aria-label). 예: 「참여자」 */
89
+ label?: string;
90
+ };
91
+ /**
92
+ * 아바타 묶음 — 담당자·참여자를 겹쳐 늘어놓는다.
93
+ *
94
+ * `children` 이 아니라 `items` 를 받는다. 겹침 간격·테두리·`+N` 칸을 묶음이 정해야 하기 때문이다.
95
+ * `<ul>/<li>` 라 스크린리더가 개수를 세어 준다 — 각 칸의 이름도 그대로 읽힌다.
96
+ *
97
+ * @example
98
+ * <AvatarGroup label="참여자" items={members} max={4} />
99
+ */
100
+ export declare function AvatarGroup({ items, max, size, fill, tone, spaced, label, className, ...rest }: AvatarGroupProps): import("react").JSX.Element;
101
+ export {};
102
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/avatar/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAM,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE/D;;;;;;;;;;;;;;;;;GAiBG;AAEH,0DAA0D;AAC1D,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AA+C3C;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED,KAAK,UAAU,GAAG;IAChB,mDAAmD;IACnD,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,uDAAuD;IACvD,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,0CAA0C;AAC1C,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,GACvE,UAAU,GAAG;IACX,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEJ,sDAAsD;AACtD,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,GACjF,UAAU,GAAG;IACX,UAAU,EAAE,IAAI,CAAC;IACjB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAMJ;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,qBAAqB,+BAwDhE;AAED,mBAAmB;AACnB,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,GAAG;IAC7E,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,sBAAsB;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,GAAO,EACP,IAAc,EACd,IAAc,EACd,IAAa,EACb,MAAM,EACN,KAAK,EACL,SAAS,EACT,GAAG,IAAI,EACR,EAAE,gBAAgB,+BAsClB"}