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
@@ -0,0 +1,97 @@
1
+ import type { ComponentPropsWithRef, ReactNode } from 'react';
2
+ import { type KrdsSize } from '../lib/krds';
3
+ /**
4
+ * 체크박스 — KRDS `krds-form-check` · `krds-check-area` · `krds-form-chip`.
5
+ *
6
+ * `id` 가 필수다 — 킷이 `input ~ label` 형제 선택자로 네모를 그려서 `<label for>` 로만 이을 수 있다.
7
+ * **`<label>` 안에 `<input>` 을 넣으면 네모가 아예 안 그려진다.**
8
+ * 여러 개는 `CheckArea`(배치만) 나 `CheckboxGroup`(fieldset + legend + 도움말)으로 묶는다.
9
+ * 한 값만 고르는 자리는 `ui/radio`, 검색 필터처럼 알약 꼴이 필요하면 `CheckboxChip` 이다.
10
+ *
11
+ * @example
12
+ * <CheckboxGroup legend="수신 동의" hint="언제든 해지할 수 있습니다.">
13
+ * <Checkbox id="agree-sms" name="agree" value="sms" label="문자" />
14
+ * <Checkbox id="agree-mail" name="agree" value="mail" label="이메일" description="주 1회 발송" />
15
+ * </CheckboxGroup>
16
+ * <Checkbox id="agree-all" label="전체 선택" indeterminate={some} />
17
+ *
18
+ * 자세히: docs/krds/09-부품-노트.md#체크박스
19
+ */
20
+ /** 체크박스 크기. 킷에 있는 둘뿐이다 — 네모 20px / 24px, 글자 17px / 19px. */
21
+ export type CheckboxSize = Extract<KrdsSize, 'medium' | 'large'>;
22
+ /** 칩 크기. 킷에 있는 셋. 높이가 버튼·입력칸과 같은 눈금이다. */
23
+ export type CheckboxChipSize = Extract<KrdsSize, 'small' | 'medium' | 'large'>;
24
+ type CheckboxBaseProps = {
25
+ /** `<label for>` 로 이을 id. 필수다. 목록에서는 값에서 만든다(`agree-${item.code}`). */
26
+ id: string;
27
+ /** 레이블. `for`/`id` 로 이어져 레이블 클릭으로도 토글된다. */
28
+ label: ReactNode;
29
+ /** `.krds-form-check` 감싸개에 붙는다. `...rest` 는 `<input>` 으로 흘린다. */
30
+ className?: string;
31
+ };
32
+ export type CheckboxProps = Omit<ComponentPropsWithRef<'input'>, 'type' | 'size' | 'children' | 'className' | 'id'> & CheckboxBaseProps & {
33
+ size?: CheckboxSize;
34
+ /** 부가 설명. 레이블 바로 다음에 놓여 들여쓰기가 걸린다. */
35
+ description?: ReactNode;
36
+ /** 중간 상태. 「전체 선택」에서 하위 일부만 선택되었을 때 켠다. */
37
+ indeterminate?: boolean;
38
+ };
39
+ export declare function Checkbox({ id, label, description, size, indeterminate, className, ref, ...rest }: CheckboxProps): import("react").JSX.Element;
40
+ /**
41
+ * 칩 꼴 체크박스 — 킷 `krds-form-chip`. 네모 대신 테두리 알약을 눌러 고른다.
42
+ *
43
+ * 검색 필터처럼 여러 값을 한 줄에 늘어놓을 때 쓴다. 높이가 버튼·입력칸과 같은 눈금이다.
44
+ *
45
+ * @example
46
+ * <CheckArea layout="inline">
47
+ * <CheckboxChip id="f-open" label="공개" />
48
+ * <CheckboxChip id="f-closed" label="비공개" />
49
+ * </CheckArea>
50
+ */
51
+ export type CheckboxChipProps = Omit<ComponentPropsWithRef<'input'>, 'type' | 'size' | 'children' | 'className' | 'id'> & CheckboxBaseProps & {
52
+ size?: CheckboxChipSize;
53
+ };
54
+ export declare function CheckboxChip({ id, label, size, className, ...rest }: CheckboxChipProps): import("react").JSX.Element;
55
+ /**
56
+ * 배치. `column` 세로(20px) · `row` 가로(20px) · `inline` 가로 좁은 간격(12px).
57
+ * `inline` 은 칩처럼 폭이 넓은 항목을 한 줄에 여럿 놓을 때만 쓴다.
58
+ */
59
+ export type CheckAreaLayout = 'column' | 'row' | 'inline';
60
+ export type CheckAreaProps = ComponentPropsWithRef<'div'> & {
61
+ /** 배치. 기본 `column` — 규격이 수직 배치를 요구한다. */
62
+ layout?: CheckAreaLayout;
63
+ };
64
+ /**
65
+ * 체크박스 묶음 영역 — 킷 `krds-check-area`. 배치만 맡는다.
66
+ *
67
+ * 기본이 세로다(규격). 가로가 필요하면 `layout="row"` 를 명시한다.
68
+ * 그룹 이름·도움말·오류까지 필요하면 `CheckboxGroup` 을 쓴다.
69
+ */
70
+ export declare function CheckArea({ layout, className, children, ...rest }: CheckAreaProps): import("react").JSX.Element;
71
+ export type CheckboxGroupProps = Omit<ComponentPropsWithRef<'fieldset'>, 'children' | 'title'> & {
72
+ /** 묶음의 접근 가능한 이름(`<legend>`). 킷이 화면에서 감추고 스크린리더에만 남긴다. */
73
+ legend: string;
74
+ /** 보이는 제목. 생략하면 `legend` 를 쓰고, `null` 을 주면 그리지 않는다. */
75
+ title?: ReactNode | null;
76
+ /** 도움말. 킷이 회색 정보 아이콘을 앞에 붙인다. */
77
+ hint?: ReactNode;
78
+ /** 오류 메시지. 붉은 글자 + 오류 아이콘. 색만으로 알리지 말고 반드시 문구를 넣는다. */
79
+ error?: ReactNode;
80
+ /** 배치. 기본 `column`. */
81
+ layout?: CheckAreaLayout;
82
+ children?: ReactNode;
83
+ };
84
+ /**
85
+ * 체크박스 묶음 — `<fieldset class="form-group">` + `krds-check-area`.
86
+ *
87
+ * 그룹 이름(`legend`) · 보이는 소제목 · 도움말 · 오류 메시지를 한 골격으로 묶는다.
88
+ * `id` 를 주면 도움말·오류가 `aria-describedby` 로 이어진다.
89
+ *
90
+ * @example
91
+ * <CheckboxGroup id="agree" legend="수신 동의" hint="언제든 해지할 수 있습니다.">
92
+ * <Checkbox id="agree-sms" label="문자" />
93
+ * </CheckboxGroup>
94
+ */
95
+ export declare function CheckboxGroup({ legend, title, hint, error, layout, id, className, children, ...rest }: CheckboxGroupProps): import("react").JSX.Element;
96
+ export {};
97
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checkbox/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAO,MAAM,OAAO,CAAC;AACnE,OAAO,EAAM,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;;;;;;;;;;GAgBG;AAEH,4DAA4D;AAC5D,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC;AAEjE,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC;AA6B/E,KAAK,iBAAiB,GAAG;IACvB,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,KAAK,EAAE,SAAS,CAAC;IACjB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,qBAAqB,CAAC,OAAO,CAAC,EAC9B,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,CAClD,GACC,iBAAiB,GAAG;IAClB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,sCAAsC;IACtC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,0CAA0C;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEJ,wBAAgB,QAAQ,CAAC,EACvB,EAAE,EACF,KAAK,EACL,WAAW,EACX,IAAe,EACf,aAAa,EACb,SAAS,EACT,GAAG,EACH,GAAG,IAAI,EACR,EAAE,aAAa,+BAqBf;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAClC,qBAAqB,CAAC,OAAO,CAAC,EAC9B,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,CAClD,GACC,iBAAiB,GAAG;IAClB,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB,CAAC;AAEJ,wBAAgB,YAAY,CAAC,EAC3B,EAAE,EACF,KAAK,EACL,IAAe,EACf,SAAS,EACT,GAAG,IAAI,EACR,EAAE,iBAAiB,+BASnB;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE1D,MAAM,MAAM,cAAc,GAAG,qBAAqB,CAAC,KAAK,CAAC,GAAG;IAC1D,yCAAyC;IACzC,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,+BAc5F;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG;IAC/F,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,iCAAiC;IACjC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,uDAAuD;IACvD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,uBAAuB;IACvB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,KAAK,EACL,IAAI,EACJ,KAAK,EACL,MAAiB,EACjB,EAAE,EACF,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,kBAAkB,+BAmCpB"}
@@ -0,0 +1,110 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { cx } from "../lib/krds.js";
3
+ const INDETERMINATE_MARK = "[&>input:indeterminate~label]:before:bg-primary-solid [&>input:indeterminate~label]:before:border-primary-line";
4
+ function indeterminateRef(ref) {
5
+ return (node) => {
6
+ if (node) node.indeterminate = true;
7
+ const inner = typeof ref === "function" ? ref(node) : void 0;
8
+ if (ref && typeof ref !== "function") ref.current = node;
9
+ return () => {
10
+ if (node) node.indeterminate = false;
11
+ if (typeof inner === "function") inner();
12
+ else if (typeof ref === "function") ref(null);
13
+ else if (ref) ref.current = null;
14
+ };
15
+ };
16
+ }
17
+ function Checkbox({
18
+ id,
19
+ label,
20
+ description,
21
+ size = "medium",
22
+ indeterminate,
23
+ className,
24
+ ref,
25
+ ...rest
26
+ }) {
27
+ const mixed = indeterminate === true;
28
+ return /* @__PURE__ */ jsxs("div", { className: cx("krds-form-check", size, mixed && INDETERMINATE_MARK, className), children: [
29
+ /* @__PURE__ */ jsx(
30
+ "input",
31
+ {
32
+ type: "checkbox",
33
+ id,
34
+ ref: mixed ? indeterminateRef(ref) : ref,
35
+ ...rest
36
+ }
37
+ ),
38
+ /* @__PURE__ */ jsx("label", { htmlFor: id, children: label }),
39
+ description != null && // 킷 규칙이 `label + .krds-form-check-cnt` 라 레이블 바로 뒤에 붙어야 한다.
40
+ /* @__PURE__ */ jsx("div", { className: "krds-form-check-cnt", children: /* @__PURE__ */ jsx("p", { className: "krds-form-check-p", children: description }) })
41
+ ] });
42
+ }
43
+ function CheckboxChip({
44
+ id,
45
+ label,
46
+ size = "medium",
47
+ className,
48
+ ...rest
49
+ }) {
50
+ return /* @__PURE__ */ jsxs("div", { className: cx("krds-form-chip", size, className), children: [
51
+ /* @__PURE__ */ jsx("input", { type: "checkbox", className: "checkbox", id, ...rest }),
52
+ /* @__PURE__ */ jsx("label", { className: "krds-form-chip-outline", htmlFor: id, children: label })
53
+ ] });
54
+ }
55
+ function CheckArea({ layout = "column", className, children, ...rest }) {
56
+ return /* @__PURE__ */ jsx(
57
+ "div",
58
+ {
59
+ className: cx(
60
+ "krds-check-area",
61
+ layout === "column" && "chk-column",
62
+ layout === "inline" && "krds-form-checks-inline",
63
+ className
64
+ ),
65
+ ...rest,
66
+ children
67
+ }
68
+ );
69
+ }
70
+ function CheckboxGroup({
71
+ legend,
72
+ title,
73
+ hint,
74
+ error,
75
+ layout = "column",
76
+ id,
77
+ className,
78
+ children,
79
+ ...rest
80
+ }) {
81
+ const hintId = id && hint != null ? `${id}-hint` : void 0;
82
+ const errorId = id && error != null ? `${id}-error` : void 0;
83
+ const describedBy = cx(hintId, errorId) || void 0;
84
+ const visibleTitle = title === void 0 ? legend : title;
85
+ return /* @__PURE__ */ jsxs(
86
+ "fieldset",
87
+ {
88
+ id,
89
+ className: cx("form-group", className),
90
+ "aria-describedby": describedBy,
91
+ ...rest,
92
+ children: [
93
+ /* @__PURE__ */ jsx("legend", { children: legend }),
94
+ /* @__PURE__ */ jsxs("div", { className: "form-conts", children: [
95
+ visibleTitle != null && /* @__PURE__ */ jsx("p", { className: "form-label", "aria-hidden": "true", children: visibleTitle }),
96
+ /* @__PURE__ */ jsx(CheckArea, { layout, children })
97
+ ] }),
98
+ hint != null && /* @__PURE__ */ jsx("p", { id: hintId, className: "form-hint", children: hint }),
99
+ error != null && /* @__PURE__ */ jsx("p", { id: errorId, className: "form-hint-invalid", children: error })
100
+ ]
101
+ }
102
+ );
103
+ }
104
+ export {
105
+ CheckArea,
106
+ Checkbox,
107
+ CheckboxChip,
108
+ CheckboxGroup
109
+ };
110
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/checkbox/index.tsx"],"sourcesContent":["import type { ComponentPropsWithRef, ReactNode, Ref } from 'react';\nimport { cx, type KrdsSize } from '../lib/krds';\n\n/**\n * 체크박스 — KRDS `krds-form-check` · `krds-check-area` · `krds-form-chip`.\n *\n * `id` 가 필수다 — 킷이 `input ~ label` 형제 선택자로 네모를 그려서 `<label for>` 로만 이을 수 있다.\n * **`<label>` 안에 `<input>` 을 넣으면 네모가 아예 안 그려진다.**\n * 여러 개는 `CheckArea`(배치만) 나 `CheckboxGroup`(fieldset + legend + 도움말)으로 묶는다.\n * 한 값만 고르는 자리는 `ui/radio`, 검색 필터처럼 알약 꼴이 필요하면 `CheckboxChip` 이다.\n *\n * @example\n * <CheckboxGroup legend=\"수신 동의\" hint=\"언제든 해지할 수 있습니다.\">\n * <Checkbox id=\"agree-sms\" name=\"agree\" value=\"sms\" label=\"문자\" />\n * <Checkbox id=\"agree-mail\" name=\"agree\" value=\"mail\" label=\"이메일\" description=\"주 1회 발송\" />\n * </CheckboxGroup>\n * <Checkbox id=\"agree-all\" label=\"전체 선택\" indeterminate={some} />\n *\n * 자세히: docs/krds/09-부품-노트.md#체크박스\n */\n\n/** 체크박스 크기. 킷에 있는 둘뿐이다 — 네모 20px / 24px, 글자 17px / 19px. */\nexport type CheckboxSize = Extract<KrdsSize, 'medium' | 'large'>;\n\n/** 칩 크기. 킷에 있는 셋. 높이가 버튼·입력칸과 같은 눈금이다. */\nexport type CheckboxChipSize = Extract<KrdsSize, 'small' | 'medium' | 'large'>;\n\n/**\n * 중간 상태 표시 — 킷에 `:indeterminate` 규칙이 없어 보충했다. 네모만 primary 로 채운다.\n * 「일부 선택됨」은 화면 쪽에서 글로도 알려야 규격을 채운다.\n */\nconst INDETERMINATE_MARK =\n '[&>input:indeterminate~label]:before:bg-primary-solid ' +\n '[&>input:indeterminate~label]:before:border-primary-line';\n\n/**\n * `indeterminate` 는 속성이 아니라 DOM 프로퍼티라 ref 콜백에서 넣는다.\n * `true` 일 때만 만들고(서버 컴포넌트가 함수를 실어 보내지 않게), 떼어낼 때 프로퍼티를 되돌린다.\n */\nfunction indeterminateRef(ref: Ref<HTMLInputElement> | undefined): Ref<HTMLInputElement> {\n return (node: HTMLInputElement | null) => {\n if (node) node.indeterminate = true;\n const inner = typeof ref === 'function' ? ref(node) : undefined;\n if (ref && typeof ref !== 'function') ref.current = node;\n\n return () => {\n if (node) node.indeterminate = false;\n if (typeof inner === 'function') inner();\n else if (typeof ref === 'function') ref(null);\n else if (ref) ref.current = null;\n };\n };\n}\n\ntype CheckboxBaseProps = {\n /** `<label for>` 로 이을 id. 필수다. 목록에서는 값에서 만든다(`agree-${item.code}`). */\n id: string;\n /** 레이블. `for`/`id` 로 이어져 레이블 클릭으로도 토글된다. */\n label: ReactNode;\n /** `.krds-form-check` 감싸개에 붙는다. `...rest` 는 `<input>` 으로 흘린다. */\n className?: string;\n};\n\nexport type CheckboxProps = Omit<\n ComponentPropsWithRef<'input'>,\n 'type' | 'size' | 'children' | 'className' | 'id'\n> &\n CheckboxBaseProps & {\n size?: CheckboxSize;\n /** 부가 설명. 레이블 바로 다음에 놓여 들여쓰기가 걸린다. */\n description?: ReactNode;\n /** 중간 상태. 「전체 선택」에서 하위 일부만 선택되었을 때 켠다. */\n indeterminate?: boolean;\n };\n\nexport function Checkbox({\n id,\n label,\n description,\n size = 'medium',\n indeterminate,\n className,\n ref,\n ...rest\n}: CheckboxProps) {\n // 참일 때만 표시도 ref 도 만든다 — `indeterminate={false}` 는 그냥 보통 체크박스다.\n const mixed = indeterminate === true;\n\n return (\n <div className={cx('krds-form-check', size, mixed && INDETERMINATE_MARK, className)}>\n <input\n type=\"checkbox\"\n id={id}\n ref={mixed ? indeterminateRef(ref) : ref}\n {...rest}\n />\n <label htmlFor={id}>{label}</label>\n {description != null && (\n // 킷 규칙이 `label + .krds-form-check-cnt` 라 레이블 바로 뒤에 붙어야 한다.\n <div className=\"krds-form-check-cnt\">\n <p className=\"krds-form-check-p\">{description}</p>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * 칩 꼴 체크박스 — 킷 `krds-form-chip`. 네모 대신 테두리 알약을 눌러 고른다.\n *\n * 검색 필터처럼 여러 값을 한 줄에 늘어놓을 때 쓴다. 높이가 버튼·입력칸과 같은 눈금이다.\n *\n * @example\n * <CheckArea layout=\"inline\">\n * <CheckboxChip id=\"f-open\" label=\"공개\" />\n * <CheckboxChip id=\"f-closed\" label=\"비공개\" />\n * </CheckArea>\n */\nexport type CheckboxChipProps = Omit<\n ComponentPropsWithRef<'input'>,\n 'type' | 'size' | 'children' | 'className' | 'id'\n> &\n CheckboxBaseProps & {\n size?: CheckboxChipSize;\n };\n\nexport function CheckboxChip({\n id,\n label,\n size = 'medium',\n className,\n ...rest\n}: CheckboxChipProps) {\n return (\n <div className={cx('krds-form-chip', size, className)}>\n <input type=\"checkbox\" className=\"checkbox\" id={id} {...rest} />\n <label className=\"krds-form-chip-outline\" htmlFor={id}>\n {label}\n </label>\n </div>\n );\n}\n\n/**\n * 배치. `column` 세로(20px) · `row` 가로(20px) · `inline` 가로 좁은 간격(12px).\n * `inline` 은 칩처럼 폭이 넓은 항목을 한 줄에 여럿 놓을 때만 쓴다.\n */\nexport type CheckAreaLayout = 'column' | 'row' | 'inline';\n\nexport type CheckAreaProps = ComponentPropsWithRef<'div'> & {\n /** 배치. 기본 `column` — 규격이 수직 배치를 요구한다. */\n layout?: CheckAreaLayout;\n};\n\n/**\n * 체크박스 묶음 영역 — 킷 `krds-check-area`. 배치만 맡는다.\n *\n * 기본이 세로다(규격). 가로가 필요하면 `layout=\"row\"` 를 명시한다.\n * 그룹 이름·도움말·오류까지 필요하면 `CheckboxGroup` 을 쓴다.\n */\nexport function CheckArea({ layout = 'column', className, children, ...rest }: CheckAreaProps) {\n return (\n <div\n className={cx(\n 'krds-check-area',\n layout === 'column' && 'chk-column',\n layout === 'inline' && 'krds-form-checks-inline',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\nexport type CheckboxGroupProps = Omit<ComponentPropsWithRef<'fieldset'>, 'children' | 'title'> & {\n /** 묶음의 접근 가능한 이름(`<legend>`). 킷이 화면에서 감추고 스크린리더에만 남긴다. */\n legend: string;\n /** 보이는 제목. 생략하면 `legend` 를 쓰고, `null` 을 주면 그리지 않는다. */\n title?: ReactNode | null;\n /** 도움말. 킷이 회색 정보 아이콘을 앞에 붙인다. */\n hint?: ReactNode;\n /** 오류 메시지. 붉은 글자 + 오류 아이콘. 색만으로 알리지 말고 반드시 문구를 넣는다. */\n error?: ReactNode;\n /** 배치. 기본 `column`. */\n layout?: CheckAreaLayout;\n children?: ReactNode;\n};\n\n/**\n * 체크박스 묶음 — `<fieldset class=\"form-group\">` + `krds-check-area`.\n *\n * 그룹 이름(`legend`) · 보이는 소제목 · 도움말 · 오류 메시지를 한 골격으로 묶는다.\n * `id` 를 주면 도움말·오류가 `aria-describedby` 로 이어진다.\n *\n * @example\n * <CheckboxGroup id=\"agree\" legend=\"수신 동의\" hint=\"언제든 해지할 수 있습니다.\">\n * <Checkbox id=\"agree-sms\" label=\"문자\" />\n * </CheckboxGroup>\n */\nexport function CheckboxGroup({\n legend,\n title,\n hint,\n error,\n layout = 'column',\n id,\n className,\n children,\n ...rest\n}: CheckboxGroupProps) {\n const hintId = id && hint != null ? `${id}-hint` : undefined;\n const errorId = id && error != null ? `${id}-error` : undefined;\n const describedBy = cx(hintId, errorId) || undefined;\n const visibleTitle = title === undefined ? legend : title;\n\n return (\n <fieldset\n id={id}\n className={cx('form-group', className)}\n aria-describedby={describedBy}\n {...rest}\n >\n {/* legend 는 fieldset 의 첫 자식이어야 한다. 킷이 화면에서 감추지만 이름은 그대로 읽힌다. */}\n <legend>{legend}</legend>\n <div className=\"form-conts\">\n {visibleTitle != null && (\n <p className=\"form-label\" aria-hidden=\"true\">\n {visibleTitle}\n </p>\n )}\n <CheckArea layout={layout}>{children}</CheckArea>\n </div>\n {hint != null && (\n <p id={hintId} className=\"form-hint\">\n {hint}\n </p>\n )}\n {error != null && (\n <p id={errorId} className=\"form-hint-invalid\">\n {error}\n </p>\n )}\n </fieldset>\n );\n}\n"],"mappings":"AAyFI,SACE,KADF;AAxFJ,SAAS,UAAyB;AA8BlC,MAAM,qBACJ;AAOF,SAAS,iBAAiB,KAA+D;AACvF,SAAO,CAAC,SAAkC;AACxC,QAAI,KAAM,MAAK,gBAAgB;AAC/B,UAAM,QAAQ,OAAO,QAAQ,aAAa,IAAI,IAAI,IAAI;AACtD,QAAI,OAAO,OAAO,QAAQ,WAAY,KAAI,UAAU;AAEpD,WAAO,MAAM;AACX,UAAI,KAAM,MAAK,gBAAgB;AAC/B,UAAI,OAAO,UAAU,WAAY,OAAM;AAAA,eAC9B,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,eACnC,IAAK,KAAI,UAAU;AAAA,IAC9B;AAAA,EACF;AACF;AAuBO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkB;AAEhB,QAAM,QAAQ,kBAAkB;AAEhC,SACE,qBAAC,SAAI,WAAW,GAAG,mBAAmB,MAAM,SAAS,oBAAoB,SAAS,GAChF;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL;AAAA,QACA,KAAK,QAAQ,iBAAiB,GAAG,IAAI;AAAA,QACpC,GAAG;AAAA;AAAA,IACN;AAAA,IACA,oBAAC,WAAM,SAAS,IAAK,iBAAM;AAAA,IAC1B,eAAe;AAAA,IAEd,oBAAC,SAAI,WAAU,uBACb,8BAAC,OAAE,WAAU,qBAAqB,uBAAY,GAChD;AAAA,KAEJ;AAEJ;AAqBO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,GAAG;AACL,GAAsB;AACpB,SACE,qBAAC,SAAI,WAAW,GAAG,kBAAkB,MAAM,SAAS,GAClD;AAAA,wBAAC,WAAM,MAAK,YAAW,WAAU,YAAW,IAAS,GAAG,MAAM;AAAA,IAC9D,oBAAC,WAAM,WAAU,0BAAyB,SAAS,IAChD,iBACH;AAAA,KACF;AAEJ;AAmBO,SAAS,UAAU,EAAE,SAAS,UAAU,WAAW,UAAU,GAAG,KAAK,GAAmB;AAC7F,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,WAAW,YAAY;AAAA,QACvB,WAAW,YAAY;AAAA,QACvB;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AA2BO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAuB;AACrB,QAAM,SAAS,MAAM,QAAQ,OAAO,GAAG,EAAE,UAAU;AACnD,QAAM,UAAU,MAAM,SAAS,OAAO,GAAG,EAAE,WAAW;AACtD,QAAM,cAAc,GAAG,QAAQ,OAAO,KAAK;AAC3C,QAAM,eAAe,UAAU,SAAY,SAAS;AAEpD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,cAAc,SAAS;AAAA,MACrC,oBAAkB;AAAA,MACjB,GAAG;AAAA,MAGJ;AAAA,4BAAC,YAAQ,kBAAO;AAAA,QAChB,qBAAC,SAAI,WAAU,cACZ;AAAA,0BAAgB,QACf,oBAAC,OAAE,WAAU,cAAa,eAAY,QACnC,wBACH;AAAA,UAEF,oBAAC,aAAU,QAAiB,UAAS;AAAA,WACvC;AAAA,QACC,QAAQ,QACP,oBAAC,OAAE,IAAI,QAAQ,WAAU,aACtB,gBACH;AAAA,QAED,SAAS,QACR,oBAAC,OAAE,IAAI,SAAS,WAAU,qBACvB,iBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
@@ -0,0 +1,135 @@
1
+ import { type ComponentPropsWithRef, type ReactNode } from "react";
2
+ import { type KrdsFieldSize, type KrdsIcon } from "../lib/krds";
3
+ /**
4
+ * 콤보박스 — 입력하면 목록이 좁혀지는 자동완성. KRDS 킷에 없는 보충 부품이다.
5
+ *
6
+ * 껍데기는 킷 드롭다운(`krds-drop-wrap`), 동작은 WAI-ARIA 1.2 콤보박스 패턴이다.
7
+ * ↓↑ 는 양 끝에서 순환하고 Esc 는 닫기만 하며 값은 건드리지 않는다.
8
+ * 검색칸(돋보기 · 검색어 삭제 · 실행 버튼)이 필요하면 {@link SearchCombobox} 를 쓴다.
9
+ * 최근·인기·제안처럼 종류가 갈리면 `options` 대신 `groups` 로 계층화한다(규격 요구).
10
+ *
11
+ * @example
12
+ * <Combobox label="기관명" options={hits} onSelect={(o) => setOrg(o.value)} />
13
+ * <SearchCombobox
14
+ * groups={[
15
+ * { label: '최근 검색어', options: recent },
16
+ * { label: '인기 검색어', options: popular },
17
+ * ]}
18
+ * emptyMessage="일치하는 검색어가 없습니다."
19
+ * onSearch={run}
20
+ * />
21
+ *
22
+ * 자세히: docs/krds/09-부품-노트.md#콤보박스
23
+ */
24
+ /** 제안 항목 하나. */
25
+ export type ComboboxOption = {
26
+ /** 고르면 입력칸에 들어갈 글자. */
27
+ value: string;
28
+ /** 화면에 보일 것. 없으면 `value` 를 그대로 쓴다(일치 글자 강조를 넣을 자리). */
29
+ label?: ReactNode;
30
+ /** 오른쪽 끝 보조 설명(분류·결과 수 등). */
31
+ description?: ReactNode;
32
+ /** 앞 아이콘 이름(`ico-` 뺀 것). 최근 검색어에 `log`, 인기 검색어에 `like` 같은 식. */
33
+ icon?: KrdsIcon;
34
+ /** 보이되 고를 수 없다. ↑↓ 순회에서도 건너뛴다. */
35
+ disabled?: boolean;
36
+ };
37
+ /** 제안 묶음. 규격이 요구하는 계층화의 단위다 — 최근 / 인기 / 제안이 각각 한 묶음이다. */
38
+ export type ComboboxGroup = {
39
+ /** 묶음 제목. `<h3>` 으로 그리고 `role="group"` 의 이름으로도 쓴다. */
40
+ label: string;
41
+ options: readonly ComboboxOption[];
42
+ };
43
+ type ComboboxOwnProps = {
44
+ /** 입력칸의 접근 가능한 이름. 보이는 `<label>` 이 있으면 `labelledBy` 를 대신 준다. */
45
+ label?: string;
46
+ /** 보이는 `<label>` 의 id. `label` 과 함께 줄 수 없다. */
47
+ labelledBy?: string;
48
+ /** `<input>` 의 id. 생략하면 `useId()` 로 만든다. */
49
+ id?: string;
50
+ /** 기본 medium(48px). 같은 줄의 버튼과 같은 값을 준다. */
51
+ size?: KrdsFieldSize;
52
+ /** 한 덩어리 목록. `groups` 를 함께 주면 `groups` 만 그린다. */
53
+ options?: readonly ComboboxOption[];
54
+ /** 제목이 붙은 묶음 목록(계층화). */
55
+ groups?: readonly ComboboxGroup[];
56
+ /** 제어 입력값. 주면 제어 부품이 된다. */
57
+ value?: string;
58
+ /** 비제어 초기값. */
59
+ defaultValue?: string;
60
+ /** 입력값이 바뀔 때(사람이 치거나 항목을 골랐을 때 모두). */
61
+ onValueChange?: (value: string) => void;
62
+ /** 항목을 골랐을 때. 입력값을 `option.value` 로 바꾼 **뒤** 부른다. */
63
+ onSelect?: (option: ComboboxOption) => void;
64
+ /** 초점이 들어오면 값이 비어 있어도 목록을 연다. 기본 true(규격의 Focusin 동작). */
65
+ openOnFocus?: boolean;
66
+ /** 처음부터 펼친 채로 그린다. 비제어 초깃값이라 사람이 닫으면 다시 열리지 않는다(문서·시각 시험용). */
67
+ defaultOpen?: boolean;
68
+ /** 열 때 첫 항목을 미리 활성으로 둔다. 기본 false — 치던 글자가 Enter 로 바뀌는 사고를 막는다. */
69
+ autoHighlight?: boolean;
70
+ /** 결과가 없을 때 보일 글. **글자를 한 자 이상 친 뒤에만** 뜬다. 주지 않으면 목록이 열리지 않는다. */
71
+ emptyMessage?: ReactNode;
72
+ /** 목록 위 고정 영역(킷 `.drop-top`). 「검색 도움말」 같은 것. */
73
+ header?: ReactNode;
74
+ /** 목록 아래 고정 영역(킷 `.drop-bottom`). 「검색 기록 전체 삭제」 같은 것. */
75
+ footer?: ReactNode;
76
+ /** 목록의 접근 가능한 이름. 기본 「제안 목록」. */
77
+ listLabel?: string;
78
+ /** 입력칸 오른쪽에 놓일 것(검색 버튼 등). 목록보다 뒤에 그려진다(규격의 읽기 순서). */
79
+ action?: ReactNode;
80
+ /** 입력칸 줄을 킷 `.sch-input`(돋보기 겹침 규칙)으로 감싼다. {@link SearchCombobox} 가 켠다. */
81
+ searchLayout?: boolean;
82
+ /** `.krds-drop-wrap` 감싸개에 붙는다. 바깥 여백·너비는 여기서 조절한다. */
83
+ className?: string;
84
+ /** `<input>` 에 붙는다. */
85
+ inputClassName?: string;
86
+ /** `.drop-menu` 에 붙는다. */
87
+ menuClassName?: string;
88
+ };
89
+ /** `<input>` 에서 부품이 직접 다루는 것은 뺀다. `onSelect` 는 DOM 이벤트와 이름이 겹쳐 막았다. */
90
+ type ComboboxInputProps = Omit<ComponentPropsWithRef<"input">, "size" | "value" | "defaultValue" | "onSelect" | "role" | "children" | "list" | "type">;
91
+ type ComboboxBaseProps = ComboboxInputProps & ComboboxOwnProps;
92
+ /** 이름 없는 콤보박스를 만들 수 없게 타입으로 막는다 — `label` 이나 `labelledBy` 중 하나는 필수다. */
93
+ export type ComboboxProps = ComboboxBaseProps & ({
94
+ label: string;
95
+ labelledBy?: never;
96
+ } | {
97
+ label?: never;
98
+ labelledBy: string;
99
+ });
100
+ export declare function Combobox(props: ComboboxProps): import("react").JSX.Element;
101
+ /**
102
+ * 검색어 자동완성 — {@link Combobox} + 킷 `sch-input`(돋보기 겹침) + 검색어 삭제 버튼.
103
+ *
104
+ * KRDS 검색 규격의 구성 요소 5(검색어 삭제)·7(실시간 제안)을 한 부품으로 채운다.
105
+ * 규격이 정한 이름 셋이 기본값이다 — 입력 「검색어」·삭제 「검색어 전체 삭제」·실행 「검색」.
106
+ * `buttonType` 기본이 `submit` 이라 `<form action>` 안에 두면 JS 없이도 검색이 된다.
107
+ *
108
+ * @example
109
+ * <form action="/search">
110
+ * <SearchCombobox name="q" groups={suggestions} onSearch={run} />
111
+ * </form>
112
+ */
113
+ export type SearchComboboxProps = Omit<ComboboxBaseProps, "action" | "searchLayout" | "label" | "labelledBy"> & {
114
+ /** 입력칸의 접근 가능한 이름. 규격이 정한 기본값 「검색어」. */
115
+ label?: string;
116
+ /** 실행 버튼의 이름(`sr-only`). 규격이 정한 기본값 「검색」. */
117
+ buttonLabel?: string;
118
+ /** 삭제 버튼의 이름(`sr-only`). 규격이 정한 기본값 「검색어 전체 삭제」. */
119
+ clearLabel?: string;
120
+ /** 검색어 삭제 버튼을 둔다. 기본 true — 규격 구성 요소 5는 선택이 아니다. */
121
+ clearable?: boolean;
122
+ /** 삭제 버튼을 누른 뒤. 입력값은 부품이 이미 비운 뒤 부른다. */
123
+ onClear?: () => void;
124
+ /**
125
+ * 검색 실행. Enter(활성 항목이 없을 때)·돋보기 클릭·제안 선택 세 곳에서 부른다.
126
+ * `preventDefault` 를 하지 않으므로 `<form>` 안이면 폼 제출도 함께 일어난다.
127
+ */
128
+ onSearch?: (query: string) => void;
129
+ /** 기본 submit — `<form action>` 안에 두면 JS 없이도 검색이 된다. */
130
+ buttonType?: "submit" | "button";
131
+ buttonProps?: Omit<ComponentPropsWithRef<"button">, "type" | "className" | "children">;
132
+ };
133
+ export declare function SearchCombobox({ label, buttonLabel, clearLabel, clearable, onClear, onSearch, buttonType, buttonProps, value, defaultValue, onValueChange, onSelect, onKeyDown, inputClassName, ref, ...rest }: SearchComboboxProps): import("react").JSX.Element;
134
+ export {};
135
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/combobox/index.tsx"],"names":[],"mappings":"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"}