@exem-ui/react 0.1.0 → 0.2.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 (264) hide show
  1. package/LICENSE +190 -0
  2. package/README.en.md +142 -0
  3. package/README.md +156 -18
  4. package/dist/index.d.mts +1166 -37
  5. package/dist/index.d.ts +1166 -37
  6. package/dist/index.js +3055 -130
  7. package/dist/index.js.map +1 -1
  8. package/dist/index.mjs +3016 -27
  9. package/dist/index.mjs.map +1 -1
  10. package/package.json +24 -143
  11. package/dist/Button-CMenVfb7.d.mts +0 -35
  12. package/dist/Button-CMenVfb7.d.ts +0 -35
  13. package/dist/Select-DMvWV_rF.d.mts +0 -94
  14. package/dist/Select-DMvWV_rF.d.ts +0 -94
  15. package/dist/avatar/index.d.mts +0 -37
  16. package/dist/avatar/index.d.ts +0 -37
  17. package/dist/avatar/index.js +0 -13
  18. package/dist/avatar/index.js.map +0 -1
  19. package/dist/avatar/index.mjs +0 -4
  20. package/dist/avatar/index.mjs.map +0 -1
  21. package/dist/badge/index.d.mts +0 -29
  22. package/dist/badge/index.d.ts +0 -29
  23. package/dist/badge/index.js +0 -12
  24. package/dist/badge/index.js.map +0 -1
  25. package/dist/badge/index.mjs +0 -3
  26. package/dist/badge/index.mjs.map +0 -1
  27. package/dist/breadcrumb/index.d.mts +0 -43
  28. package/dist/breadcrumb/index.d.ts +0 -43
  29. package/dist/breadcrumb/index.js +0 -13
  30. package/dist/breadcrumb/index.js.map +0 -1
  31. package/dist/breadcrumb/index.mjs +0 -4
  32. package/dist/breadcrumb/index.mjs.map +0 -1
  33. package/dist/button/index.d.mts +0 -9
  34. package/dist/button/index.d.ts +0 -9
  35. package/dist/button/index.js +0 -29
  36. package/dist/button/index.js.map +0 -1
  37. package/dist/button/index.mjs +0 -12
  38. package/dist/button/index.mjs.map +0 -1
  39. package/dist/checkbox/index.d.mts +0 -54
  40. package/dist/checkbox/index.d.ts +0 -54
  41. package/dist/checkbox/index.js +0 -13
  42. package/dist/checkbox/index.js.map +0 -1
  43. package/dist/checkbox/index.mjs +0 -4
  44. package/dist/checkbox/index.mjs.map +0 -1
  45. package/dist/chunk-34QIGWCT.mjs +0 -10
  46. package/dist/chunk-34QIGWCT.mjs.map +0 -1
  47. package/dist/chunk-3FPMWAQT.js +0 -30
  48. package/dist/chunk-3FPMWAQT.js.map +0 -1
  49. package/dist/chunk-3HMT3DQV.js +0 -104
  50. package/dist/chunk-3HMT3DQV.js.map +0 -1
  51. package/dist/chunk-4WAO7CUT.mjs +0 -95
  52. package/dist/chunk-4WAO7CUT.mjs.map +0 -1
  53. package/dist/chunk-5QX4TO4F.js +0 -61
  54. package/dist/chunk-5QX4TO4F.js.map +0 -1
  55. package/dist/chunk-5TEFN2CW.js +0 -97
  56. package/dist/chunk-5TEFN2CW.js.map +0 -1
  57. package/dist/chunk-5TES5PG6.js +0 -41
  58. package/dist/chunk-5TES5PG6.js.map +0 -1
  59. package/dist/chunk-5TVMECVF.js +0 -148
  60. package/dist/chunk-5TVMECVF.js.map +0 -1
  61. package/dist/chunk-5WGNZX7Z.mjs +0 -27
  62. package/dist/chunk-5WGNZX7Z.mjs.map +0 -1
  63. package/dist/chunk-AQ3OIM2T.js +0 -103
  64. package/dist/chunk-AQ3OIM2T.js.map +0 -1
  65. package/dist/chunk-AU5NTBK3.js +0 -361
  66. package/dist/chunk-AU5NTBK3.js.map +0 -1
  67. package/dist/chunk-DJHGCJR4.mjs +0 -224
  68. package/dist/chunk-DJHGCJR4.mjs.map +0 -1
  69. package/dist/chunk-DPUTW5KD.mjs +0 -74
  70. package/dist/chunk-DPUTW5KD.mjs.map +0 -1
  71. package/dist/chunk-E53FHDVN.mjs +0 -336
  72. package/dist/chunk-E53FHDVN.mjs.map +0 -1
  73. package/dist/chunk-ECRQD7UU.js +0 -82
  74. package/dist/chunk-ECRQD7UU.js.map +0 -1
  75. package/dist/chunk-FB4ESGOX.mjs +0 -59
  76. package/dist/chunk-FB4ESGOX.mjs.map +0 -1
  77. package/dist/chunk-FDX4IQK5.js +0 -76
  78. package/dist/chunk-FDX4IQK5.js.map +0 -1
  79. package/dist/chunk-FOMIUDRM.js +0 -96
  80. package/dist/chunk-FOMIUDRM.js.map +0 -1
  81. package/dist/chunk-FR5F3VTU.js +0 -139
  82. package/dist/chunk-FR5F3VTU.js.map +0 -1
  83. package/dist/chunk-GW53LH3I.mjs +0 -81
  84. package/dist/chunk-GW53LH3I.mjs.map +0 -1
  85. package/dist/chunk-GXMRIT5E.mjs +0 -94
  86. package/dist/chunk-GXMRIT5E.mjs.map +0 -1
  87. package/dist/chunk-IANSI7F7.mjs +0 -393
  88. package/dist/chunk-IANSI7F7.mjs.map +0 -1
  89. package/dist/chunk-IDM6MZHF.js +0 -415
  90. package/dist/chunk-IDM6MZHF.js.map +0 -1
  91. package/dist/chunk-J5ZYQ3TP.js +0 -104
  92. package/dist/chunk-J5ZYQ3TP.js.map +0 -1
  93. package/dist/chunk-KPAUBWZA.mjs +0 -39
  94. package/dist/chunk-KPAUBWZA.mjs.map +0 -1
  95. package/dist/chunk-L7P2NDST.mjs +0 -124
  96. package/dist/chunk-L7P2NDST.mjs.map +0 -1
  97. package/dist/chunk-M6OWN7QH.js +0 -118
  98. package/dist/chunk-M6OWN7QH.js.map +0 -1
  99. package/dist/chunk-MQVHREEI.js +0 -448
  100. package/dist/chunk-MQVHREEI.js.map +0 -1
  101. package/dist/chunk-MT47ECUN.js +0 -127
  102. package/dist/chunk-MT47ECUN.js.map +0 -1
  103. package/dist/chunk-N6U54JI4.mjs +0 -126
  104. package/dist/chunk-N6U54JI4.mjs.map +0 -1
  105. package/dist/chunk-NDG4LR3Q.js +0 -139
  106. package/dist/chunk-NDG4LR3Q.js.map +0 -1
  107. package/dist/chunk-PPD4BU4W.mjs +0 -80
  108. package/dist/chunk-PPD4BU4W.mjs.map +0 -1
  109. package/dist/chunk-PU5NO5EZ.js +0 -4
  110. package/dist/chunk-PU5NO5EZ.js.map +0 -1
  111. package/dist/chunk-Q442ZDTI.mjs +0 -117
  112. package/dist/chunk-Q442ZDTI.mjs.map +0 -1
  113. package/dist/chunk-QH23RO3C.mjs +0 -137
  114. package/dist/chunk-QH23RO3C.mjs.map +0 -1
  115. package/dist/chunk-REBHUF4L.js +0 -226
  116. package/dist/chunk-REBHUF4L.js.map +0 -1
  117. package/dist/chunk-RGB3QLQT.js +0 -275
  118. package/dist/chunk-RGB3QLQT.js.map +0 -1
  119. package/dist/chunk-T7U2QRLC.js +0 -94
  120. package/dist/chunk-T7U2QRLC.js.map +0 -1
  121. package/dist/chunk-TEHHJ3CS.mjs +0 -73
  122. package/dist/chunk-TEHHJ3CS.mjs.map +0 -1
  123. package/dist/chunk-TJY4MIBC.js +0 -117
  124. package/dist/chunk-TJY4MIBC.js.map +0 -1
  125. package/dist/chunk-VCMZQOQM.mjs +0 -102
  126. package/dist/chunk-VCMZQOQM.mjs.map +0 -1
  127. package/dist/chunk-VKN4H4WI.mjs +0 -3
  128. package/dist/chunk-VKN4H4WI.mjs.map +0 -1
  129. package/dist/chunk-VSB25XTY.js +0 -12
  130. package/dist/chunk-VSB25XTY.js.map +0 -1
  131. package/dist/chunk-VWTE74UT.mjs +0 -96
  132. package/dist/chunk-VWTE74UT.mjs.map +0 -1
  133. package/dist/chunk-WBTL7PBV.js +0 -105
  134. package/dist/chunk-WBTL7PBV.js.map +0 -1
  135. package/dist/chunk-WOK3EP3O.js +0 -83
  136. package/dist/chunk-WOK3EP3O.js.map +0 -1
  137. package/dist/chunk-WWT73GGM.mjs +0 -83
  138. package/dist/chunk-WWT73GGM.mjs.map +0 -1
  139. package/dist/chunk-XBDXTRK3.mjs +0 -102
  140. package/dist/chunk-XBDXTRK3.mjs.map +0 -1
  141. package/dist/chunk-YGBEKZWU.mjs +0 -81
  142. package/dist/chunk-YGBEKZWU.mjs.map +0 -1
  143. package/dist/chunk-YVFLRPFV.mjs +0 -72
  144. package/dist/chunk-YVFLRPFV.mjs.map +0 -1
  145. package/dist/chunk-ZMVBIQ2Z.mjs +0 -253
  146. package/dist/chunk-ZMVBIQ2Z.mjs.map +0 -1
  147. package/dist/chunk-ZWCMSHDP.mjs +0 -425
  148. package/dist/chunk-ZWCMSHDP.mjs.map +0 -1
  149. package/dist/flat/index.d.mts +0 -13
  150. package/dist/flat/index.d.ts +0 -13
  151. package/dist/flat/index.js +0 -31
  152. package/dist/flat/index.js.map +0 -1
  153. package/dist/flat/index.mjs +0 -10
  154. package/dist/flat/index.mjs.map +0 -1
  155. package/dist/flat/segment.d.mts +0 -39
  156. package/dist/flat/segment.d.ts +0 -39
  157. package/dist/flat/segment.js +0 -13
  158. package/dist/flat/segment.js.map +0 -1
  159. package/dist/flat/segment.mjs +0 -4
  160. package/dist/flat/segment.mjs.map +0 -1
  161. package/dist/flat/select.d.mts +0 -58
  162. package/dist/flat/select.d.ts +0 -58
  163. package/dist/flat/select.js +0 -14
  164. package/dist/flat/select.js.map +0 -1
  165. package/dist/flat/select.mjs +0 -5
  166. package/dist/flat/select.mjs.map +0 -1
  167. package/dist/flat/tooltip.d.mts +0 -98
  168. package/dist/flat/tooltip.d.ts +0 -98
  169. package/dist/flat/tooltip.js +0 -17
  170. package/dist/flat/tooltip.js.map +0 -1
  171. package/dist/flat/tooltip.mjs +0 -4
  172. package/dist/flat/tooltip.mjs.map +0 -1
  173. package/dist/index-CXip5Wb1.d.mts +0 -62
  174. package/dist/index-Drz3P-6Y.d.ts +0 -62
  175. package/dist/input/index.d.mts +0 -82
  176. package/dist/input/index.d.ts +0 -82
  177. package/dist/input/index.js +0 -22
  178. package/dist/input/index.js.map +0 -1
  179. package/dist/input/index.mjs +0 -5
  180. package/dist/input/index.mjs.map +0 -1
  181. package/dist/loading/index.d.mts +0 -54
  182. package/dist/loading/index.d.ts +0 -54
  183. package/dist/loading/index.js +0 -12
  184. package/dist/loading/index.js.map +0 -1
  185. package/dist/loading/index.mjs +0 -3
  186. package/dist/loading/index.mjs.map +0 -1
  187. package/dist/messageBox/index.d.mts +0 -33
  188. package/dist/messageBox/index.d.ts +0 -33
  189. package/dist/messageBox/index.js +0 -13
  190. package/dist/messageBox/index.js.map +0 -1
  191. package/dist/messageBox/index.mjs +0 -4
  192. package/dist/messageBox/index.mjs.map +0 -1
  193. package/dist/modal/index.d.mts +0 -97
  194. package/dist/modal/index.d.ts +0 -97
  195. package/dist/modal/index.js +0 -15
  196. package/dist/modal/index.js.map +0 -1
  197. package/dist/modal/index.mjs +0 -6
  198. package/dist/modal/index.mjs.map +0 -1
  199. package/dist/picker/index.d.mts +0 -12
  200. package/dist/picker/index.d.ts +0 -12
  201. package/dist/picker/index.js +0 -13
  202. package/dist/picker/index.js.map +0 -1
  203. package/dist/picker/index.mjs +0 -4
  204. package/dist/picker/index.mjs.map +0 -1
  205. package/dist/progress/index.d.mts +0 -36
  206. package/dist/progress/index.d.ts +0 -36
  207. package/dist/progress/index.js +0 -12
  208. package/dist/progress/index.js.map +0 -1
  209. package/dist/progress/index.mjs +0 -3
  210. package/dist/progress/index.mjs.map +0 -1
  211. package/dist/radio/index.d.mts +0 -39
  212. package/dist/radio/index.d.ts +0 -39
  213. package/dist/radio/index.js +0 -12
  214. package/dist/radio/index.js.map +0 -1
  215. package/dist/radio/index.mjs +0 -3
  216. package/dist/radio/index.mjs.map +0 -1
  217. package/dist/scrollArea/index.d.mts +0 -31
  218. package/dist/scrollArea/index.d.ts +0 -31
  219. package/dist/scrollArea/index.js +0 -16
  220. package/dist/scrollArea/index.js.map +0 -1
  221. package/dist/scrollArea/index.mjs +0 -3
  222. package/dist/scrollArea/index.mjs.map +0 -1
  223. package/dist/segment/index.d.mts +0 -46
  224. package/dist/segment/index.d.ts +0 -46
  225. package/dist/segment/index.js +0 -12
  226. package/dist/segment/index.js.map +0 -1
  227. package/dist/segment/index.mjs +0 -3
  228. package/dist/segment/index.mjs.map +0 -1
  229. package/dist/star/index.d.mts +0 -30
  230. package/dist/star/index.d.ts +0 -30
  231. package/dist/star/index.js +0 -12
  232. package/dist/star/index.js.map +0 -1
  233. package/dist/star/index.mjs +0 -3
  234. package/dist/star/index.mjs.map +0 -1
  235. package/dist/switch/index.d.mts +0 -32
  236. package/dist/switch/index.d.ts +0 -32
  237. package/dist/switch/index.js +0 -12
  238. package/dist/switch/index.js.map +0 -1
  239. package/dist/switch/index.mjs +0 -3
  240. package/dist/switch/index.mjs.map +0 -1
  241. package/dist/tabs/index.d.mts +0 -52
  242. package/dist/tabs/index.d.ts +0 -52
  243. package/dist/tabs/index.js +0 -12
  244. package/dist/tabs/index.js.map +0 -1
  245. package/dist/tabs/index.mjs +0 -3
  246. package/dist/tabs/index.mjs.map +0 -1
  247. package/dist/tag/index.d.mts +0 -68
  248. package/dist/tag/index.d.ts +0 -68
  249. package/dist/tag/index.js +0 -17
  250. package/dist/tag/index.js.map +0 -1
  251. package/dist/tag/index.mjs +0 -4
  252. package/dist/tag/index.mjs.map +0 -1
  253. package/dist/toast/index.d.mts +0 -175
  254. package/dist/toast/index.d.ts +0 -175
  255. package/dist/toast/index.js +0 -25
  256. package/dist/toast/index.js.map +0 -1
  257. package/dist/toast/index.mjs +0 -4
  258. package/dist/toast/index.mjs.map +0 -1
  259. package/dist/tooltip/index.d.mts +0 -26
  260. package/dist/tooltip/index.d.ts +0 -26
  261. package/dist/tooltip/index.js +0 -12
  262. package/dist/tooltip/index.js.map +0 -1
  263. package/dist/tooltip/index.mjs +0 -3
  264. package/dist/tooltip/index.mjs.map +0 -1
package/dist/index.mjs CHANGED
@@ -1,29 +1,3018 @@
1
- export { DatePicker } from './chunk-QH23RO3C.mjs';
2
- export { Progress } from './chunk-FB4ESGOX.mjs';
3
- export { Star } from './chunk-YGBEKZWU.mjs';
4
- export { Switch } from './chunk-VWTE74UT.mjs';
5
- export { Tabs } from './chunk-4WAO7CUT.mjs';
6
- export { DoubleTag, Tag } from './chunk-L7P2NDST.mjs';
7
- export { ToastProvider, Toaster, toast, useToast } from './chunk-E53FHDVN.mjs';
8
- export { TextArea, TextField } from './chunk-IANSI7F7.mjs';
9
- export { Loading } from './chunk-XBDXTRK3.mjs';
10
- export { MessageBox } from './chunk-GW53LH3I.mjs';
11
- export { Modal } from './chunk-ZMVBIQ2Z.mjs';
12
- export { ScrollArea, ScrollBar } from './chunk-TEHHJ3CS.mjs';
13
- export { Radio } from './chunk-WWT73GGM.mjs';
14
- export { Avatar } from './chunk-VCMZQOQM.mjs';
15
- export { Badge } from './chunk-KPAUBWZA.mjs';
16
- export { Breadcrumb } from './chunk-PPD4BU4W.mjs';
17
- export { ButtonGroup, IconButton } from './chunk-GXMRIT5E.mjs';
18
- export { Button } from './chunk-DJHGCJR4.mjs';
19
- export { Checkbox } from './chunk-N6U54JI4.mjs';
20
- import './chunk-VKN4H4WI.mjs';
21
- import './chunk-34QIGWCT.mjs';
22
- export { Segment } from './chunk-Q442ZDTI.mjs';
23
- import './chunk-5WGNZX7Z.mjs';
24
- export { Tooltip } from './chunk-YVFLRPFV.mjs';
25
- import './chunk-DPUTW5KD.mjs';
26
- export { Select } from './chunk-ZWCMSHDP.mjs';
27
- import './chunk-LZWKMQJL.mjs';
1
+ import { X, MoreHorizontal, ChevronDown, Minus, Check, Person, Warning, Info, Error as Error$1, ChevronLeft, ChevronRight } from './chunk-LZWKMQJL.mjs';
2
+ import { cva, cn } from '@exem-ui/core/utils';
3
+ import * as React2 from 'react';
4
+ import { forwardRef, Fragment, createContext, cloneElement, useId, useContext, useState } from 'react';
5
+ import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
6
+ import { Slot } from '@radix-ui/react-slot';
7
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
8
+ import * as SelectPrimitive from '@radix-ui/react-select';
9
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
10
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
11
+ import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
12
+ import * as SwitchPrimitives from '@radix-ui/react-switch';
13
+ import { getDefaultClassNames, DayPicker } from 'react-day-picker';
14
+ import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
15
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
16
+ import { toast as toast$1, Toaster as Toaster$1 } from 'sonner';
17
+
18
+ var SIZE_CONFIG = {
19
+ xsmall: {
20
+ container: "size-[16px] text-body-3",
21
+ initialPadding: "px-[2.5px] leading-none tracking-tight",
22
+ imagePadding: "p-[2px]",
23
+ iconSize: "size-[12px]"
24
+ },
25
+ small: {
26
+ container: "size-[20px] text-body-2",
27
+ initialPadding: "px-[3.5px]",
28
+ imagePadding: "p-[3px]",
29
+ iconSize: "size-[14px]"
30
+ },
31
+ medium: {
32
+ container: "size-[24px] text-body-2",
33
+ initialPadding: "px-[5.5px] py-[2px]",
34
+ imagePadding: "p-[4px]",
35
+ iconSize: "size-[16px]"
36
+ },
37
+ large: {
38
+ container: "size-[32px] text-title-2",
39
+ initialPadding: "px-[8px] py-[3.5px]",
40
+ imagePadding: "p-[6px]",
41
+ iconSize: "size-[20px]"
42
+ }
43
+ };
44
+ var avatarVariants = cva(
45
+ "flex items-center justify-center rounded-[28px] text-center font-semibold",
46
+ {
47
+ variants: {
48
+ size: {
49
+ xsmall: SIZE_CONFIG.xsmall.container,
50
+ small: SIZE_CONFIG.small.container,
51
+ medium: SIZE_CONFIG.medium.container,
52
+ large: SIZE_CONFIG.large.container
53
+ },
54
+ type: {
55
+ initial: "bg-elevation-elevation-5 text-elevation-elevation-0",
56
+ image: "bg-elevation-elevation-4 text-elevation-elevation-0"
57
+ }
58
+ },
59
+ compoundVariants: [
60
+ // Initial type variants
61
+ { type: "initial", size: "xsmall", class: SIZE_CONFIG.xsmall.initialPadding },
62
+ { type: "initial", size: "small", class: SIZE_CONFIG.small.initialPadding },
63
+ { type: "initial", size: "medium", class: SIZE_CONFIG.medium.initialPadding },
64
+ { type: "initial", size: "large", class: SIZE_CONFIG.large.initialPadding }
65
+ ],
66
+ defaultVariants: {
67
+ size: "medium",
68
+ type: "initial"
69
+ }
70
+ }
71
+ );
72
+ var getInitial = (name) => {
73
+ return name ? name.charAt(0).toUpperCase() : "";
74
+ };
75
+ var renderInitialContent = (name) => {
76
+ return /* @__PURE__ */ jsx("span", { children: getInitial(name) });
77
+ };
78
+ var renderImageContent = (src, alt, name) => {
79
+ return /* @__PURE__ */ jsx("img", { src, alt: alt || name || "Avatar", className: "size-full rounded-full object-cover" });
80
+ };
81
+ var renderIconContent = (size = "medium") => {
82
+ const iconSize = SIZE_CONFIG[size].iconSize;
83
+ return /* @__PURE__ */ jsx(Person, { className: cn("shrink-0", iconSize) });
84
+ };
85
+ var Avatar = forwardRef(
86
+ ({ className, size = "medium", type = "initial", name, src, alt, ...props }, ref) => {
87
+ const resolvedSize = size || "medium";
88
+ const isFallback = type === "image" && !src;
89
+ const fallbackPadding = isFallback ? SIZE_CONFIG[resolvedSize].imagePadding : void 0;
90
+ const renderContent = () => {
91
+ if (type === "initial") {
92
+ return renderInitialContent(name);
93
+ }
94
+ if (type === "image") {
95
+ return src ? renderImageContent(src, alt, name) : renderIconContent(resolvedSize);
96
+ }
97
+ return null;
98
+ };
99
+ return /* @__PURE__ */ jsx(
100
+ "div",
101
+ {
102
+ ref,
103
+ className: cn(avatarVariants({ size, type }), fallbackPadding, className),
104
+ ...props,
105
+ children: renderContent()
106
+ }
107
+ );
108
+ }
109
+ );
110
+ Avatar.displayName = "Avatar";
111
+ var badgeVariants = cva(
112
+ "inline-flex items-center rounded-strong border px-[4px] text-body-3 font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
113
+ {
114
+ variants: {
115
+ variant: {
116
+ accent: "border-transparent bg-solid-accent-default text-text-static-light",
117
+ "accent-disabled": "border-transparent bg-solid-accent-disabled text-text-inverse-disabled",
118
+ default: "border-transparent bg-elevation-elevation-3 text-text-secondary",
119
+ "default-disabled": "border-transparent bg-elevation-elevation-2 text-text-disabled"
120
+ }
121
+ },
122
+ defaultVariants: {
123
+ variant: "default"
124
+ }
125
+ }
126
+ );
127
+ var Badge = forwardRef(
128
+ ({ className, variant = "default", disabled = false, ...props }, ref) => {
129
+ const finalVariant = disabled ? `${variant}-disabled` : variant;
130
+ return /* @__PURE__ */ jsx(
131
+ "div",
132
+ {
133
+ ref,
134
+ className: cn(badgeVariants({ variant: finalVariant }), className),
135
+ ...props
136
+ }
137
+ );
138
+ }
139
+ );
140
+ Badge.displayName = "Badge";
141
+ var StarRoundedEmpty = (props) => /* @__PURE__ */ jsx(
142
+ "svg",
143
+ {
144
+ xmlns: "http://www.w3.org/2000/svg",
145
+ fill: "none",
146
+ viewBox: "0 0 20 20",
147
+ width: "1em",
148
+ height: "1em",
149
+ "aria-hidden": "true",
150
+ ...props,
151
+ children: /* @__PURE__ */ jsx(
152
+ "path",
153
+ {
154
+ stroke: "#cfcfcf",
155
+ strokeLinecap: "round",
156
+ strokeLinejoin: "round",
157
+ d: "m10 14.773 4.275 2.628a.656.656 0 0 0 .978-.716l-1.162-4.905 3.804-3.282a.66.66 0 0 0-.374-1.154l-4.993-.407-1.923-4.656a.653.653 0 0 0-1.21 0L7.473 6.937l-4.993.407a.661.661 0 0 0-.374 1.158l3.805 3.281-1.163 4.902a.656.656 0 0 0 .978.716z"
158
+ }
159
+ )
160
+ }
161
+ );
162
+ var StarRoundedFilled = (props) => /* @__PURE__ */ jsx(
163
+ "svg",
164
+ {
165
+ xmlns: "http://www.w3.org/2000/svg",
166
+ fill: "none",
167
+ viewBox: "0 0 20 20",
168
+ width: "1em",
169
+ height: "1em",
170
+ "aria-hidden": "true",
171
+ ...props,
172
+ children: /* @__PURE__ */ jsx(
173
+ "path",
174
+ {
175
+ fill: "#FE9A00",
176
+ d: "m18.304 8.973-3.516 3.033 1.071 4.537a1.281 1.281 0 0 1-1.914 1.392L10 15.507l-3.948 2.428a1.28 1.28 0 0 1-1.911-1.392l1.075-4.537L1.7 8.973a1.286 1.286 0 0 1 .728-2.254l4.61-.372 1.778-4.303a1.278 1.278 0 0 1 2.364 0l1.778 4.303 4.61.372a1.286 1.286 0 0 1 .731 2.255z"
177
+ }
178
+ )
179
+ }
180
+ );
181
+ var Star = forwardRef(
182
+ ({ size = "medium", selected = false, className, onClick, ...props }, ref) => {
183
+ const sizeConfig = {
184
+ small: { width: 16, height: 16 },
185
+ medium: { width: 20, height: 20 },
186
+ large: { width: 24, height: 24 }
187
+ };
188
+ const config = sizeConfig[size];
189
+ return selected ? /* @__PURE__ */ jsx(
190
+ StarRoundedFilled,
191
+ {
192
+ ref,
193
+ width: config.width,
194
+ height: config.height,
195
+ className: cn("cursor-pointer transition-colors", className),
196
+ onClick,
197
+ ...props
198
+ }
199
+ ) : /* @__PURE__ */ jsx(
200
+ StarRoundedEmpty,
201
+ {
202
+ ref,
203
+ width: config.width,
204
+ height: config.height,
205
+ className: cn("cursor-pointer transition-colors", className),
206
+ onClick,
207
+ ...props
208
+ }
209
+ );
210
+ }
211
+ );
212
+ Star.displayName = "Star";
213
+ var tagVariants = cva(
214
+ "inline-flex h-5 items-center gap-0.5 rounded-medium px-1 text-body-3 font-medium",
215
+ {
216
+ variants: {
217
+ color: {
218
+ mono: "text-tint-foreground-mono",
219
+ sky: "text-tint-foreground-sky",
220
+ red: "text-tint-foreground-red",
221
+ amber: "text-tint-foreground-amber",
222
+ green: "text-tint-foreground-green",
223
+ orange: "text-tint-foreground-orange",
224
+ cyan: "text-tint-foreground-cyan",
225
+ violet: "text-tint-foreground-violet",
226
+ pink: "text-tint-foreground-pink",
227
+ yellow: "text-tint-foreground-yellow",
228
+ lime: "text-tint-foreground-lime",
229
+ emerald: "text-tint-foreground-emerald",
230
+ teal: "text-tint-foreground-teal",
231
+ blue: "text-tint-foreground-blue",
232
+ indigo: "text-tint-foreground-indigo",
233
+ purple: "text-tint-foreground-purple",
234
+ fuchsia: "text-tint-foreground-fuchsia",
235
+ rose: "text-tint-foreground-rose"
236
+ },
237
+ type: {
238
+ fill: "",
239
+ line: "bg-component-tag border border-border-secondary"
240
+ }
241
+ },
242
+ compoundVariants: [
243
+ { color: "mono", type: "fill", className: "bg-tint-background-mono" },
244
+ { color: "sky", type: "fill", className: "bg-tint-background-sky" },
245
+ { color: "red", type: "fill", className: "bg-tint-background-red" },
246
+ { color: "amber", type: "fill", className: "bg-tint-background-amber" },
247
+ { color: "green", type: "fill", className: "bg-tint-background-green" },
248
+ { color: "orange", type: "fill", className: "bg-tint-background-orange" },
249
+ { color: "cyan", type: "fill", className: "bg-tint-background-cyan" },
250
+ { color: "violet", type: "fill", className: "bg-tint-background-violet" },
251
+ { color: "pink", type: "fill", className: "bg-tint-background-pink" },
252
+ { color: "yellow", type: "fill", className: "bg-tint-background-yellow" },
253
+ { color: "lime", type: "fill", className: "bg-tint-background-lime" },
254
+ { color: "emerald", type: "fill", className: "bg-tint-background-emerald" },
255
+ { color: "teal", type: "fill", className: "bg-tint-background-teal" },
256
+ { color: "blue", type: "fill", className: "bg-tint-background-blue" },
257
+ { color: "indigo", type: "fill", className: "bg-tint-background-indigo" },
258
+ { color: "purple", type: "fill", className: "bg-tint-background-purple" },
259
+ { color: "fuchsia", type: "fill", className: "bg-tint-background-fuchsia" },
260
+ { color: "rose", type: "fill", className: "bg-tint-background-rose" }
261
+ ],
262
+ defaultVariants: {
263
+ color: "mono",
264
+ type: "fill"
265
+ }
266
+ }
267
+ );
268
+ var Tag = forwardRef(
269
+ ({
270
+ className,
271
+ color,
272
+ type = "fill",
273
+ leftIcon,
274
+ canDelete,
275
+ onDelete,
276
+ rightSlot,
277
+ children,
278
+ ...props
279
+ }, ref) => {
280
+ return /* @__PURE__ */ jsxs(
281
+ "div",
282
+ {
283
+ "data-slot": "tag",
284
+ className: cn(tagVariants({ color, type, className })),
285
+ ref,
286
+ ...props,
287
+ children: [
288
+ leftIcon && /* @__PURE__ */ jsx("span", { className: "flex shrink-0 size-3 items-center justify-center [&>svg]:size-3", children: leftIcon }),
289
+ /* @__PURE__ */ jsx("span", { className: "px-0.5 text-body-3 font-medium", children }),
290
+ canDelete && /* @__PURE__ */ jsx(
291
+ "button",
292
+ {
293
+ type: "button",
294
+ onClick: (e) => {
295
+ e.stopPropagation();
296
+ onDelete?.();
297
+ },
298
+ children: /* @__PURE__ */ jsx(X, { type: "regular", className: "size-3 [&>*]:stroke-current [&>path]:fill-current" })
299
+ }
300
+ ),
301
+ rightSlot && /* @__PURE__ */ jsx("div", { className: "ml-auto", children: rightSlot })
302
+ ]
303
+ }
304
+ );
305
+ }
306
+ );
307
+ Tag.displayName = "Tag";
308
+ var DoubleTag = forwardRef(
309
+ ({ className, items, ...props }, ref) => {
310
+ return /* @__PURE__ */ jsx(
311
+ "div",
312
+ {
313
+ className: cn(
314
+ "flex w-fit overflow-hidden rounded-medium border border-border-secondary",
315
+ className
316
+ ),
317
+ ref,
318
+ ...props,
319
+ children: items.map((item, index) => /* @__PURE__ */ jsxs(Fragment, { children: [
320
+ /* @__PURE__ */ jsx(Tag, { color: item.color, type: "line", className: "rounded-none border-none", children: item.content }),
321
+ index < items.length - 1 && /* @__PURE__ */ jsx("div", { className: "min-h-[20px] w-px border-none bg-border-secondary" })
322
+ ] }, index))
323
+ }
324
+ );
325
+ }
326
+ );
327
+ DoubleTag.displayName = "DoubleTag";
328
+ var Breadcrumb = forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsx("nav", { ref, "aria-label": "breadcrumb", ...props }));
329
+ Breadcrumb.List = forwardRef(
330
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
331
+ "ol",
332
+ {
333
+ ref,
334
+ className: cn(
335
+ "flex flex-wrap items-center gap-[4px] break-words text-body-2 text-text-tertiary",
336
+ className
337
+ ),
338
+ ...props
339
+ }
340
+ )
341
+ );
342
+ Breadcrumb.Item = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("li", { ref, className: cn("inline-flex items-center", className), ...props }));
343
+ Breadcrumb.Link = forwardRef(
344
+ ({ asChild, className, ...props }, ref) => {
345
+ const Comp = asChild ? Slot : "a";
346
+ return /* @__PURE__ */ jsx(Comp, { ref, className: cn("text-text-link", className), ...props });
347
+ }
348
+ );
349
+ Breadcrumb.Page = forwardRef(
350
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
351
+ "span",
352
+ {
353
+ ref,
354
+ role: "link",
355
+ "aria-disabled": "true",
356
+ "aria-current": "page",
357
+ className: cn("text-text-primary", className),
358
+ ...props
359
+ }
360
+ )
361
+ );
362
+ Breadcrumb.Separator = forwardRef(
363
+ ({ children, className, ...props }, ref) => /* @__PURE__ */ jsx(
364
+ "li",
365
+ {
366
+ ref,
367
+ role: "presentation",
368
+ "aria-hidden": "true",
369
+ className: cn("[&>svg]:size-3.5", className),
370
+ ...props,
371
+ children: children ?? "/"
372
+ }
373
+ )
374
+ );
375
+ Breadcrumb.Ellipsis = forwardRef(
376
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxs(
377
+ "span",
378
+ {
379
+ ref,
380
+ role: "presentation",
381
+ "aria-hidden": "true",
382
+ className: cn("flex h-9 w-9 items-center justify-center", className),
383
+ ...props,
384
+ children: [
385
+ /* @__PURE__ */ jsx(MoreHorizontal, { type: "regular", className: "size-4" }),
386
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "More" })
387
+ ]
388
+ }
389
+ )
390
+ );
391
+ Breadcrumb.displayName = "Breadcrumb";
392
+ Breadcrumb.List.displayName = "Breadcrumb.List";
393
+ Breadcrumb.Item.displayName = "Breadcrumb.Item";
394
+ Breadcrumb.Link.displayName = "Breadcrumb.Link";
395
+ Breadcrumb.Page.displayName = "Breadcrumb.Page";
396
+ Breadcrumb.Separator.displayName = "Breadcrumb.Separator";
397
+ Breadcrumb.Ellipsis.displayName = "Breadcrumb.Ellipsis";
398
+ var TabsContext = createContext({ type: "primary" });
399
+ var useTabsContext = () => {
400
+ const context = useContext(TabsContext);
401
+ if (!context) {
402
+ throw new Error("useTabsContext must be used within a TabsProvider");
403
+ }
404
+ return context;
405
+ };
406
+ var tabsListVariants = cva("inline-flex items-center", {
407
+ variants: {
408
+ type: {
409
+ primary: "h-9 gap-5 border-b border-border-primary",
410
+ secondary: "h-8 gap-1"
411
+ }
412
+ },
413
+ defaultVariants: {
414
+ type: "primary"
415
+ }
416
+ });
417
+ var tabsTriggerVariants = cva(
418
+ "group inline-flex items-center justify-center gap-1.5 whitespace-nowrap font-pretendard font-semibold text-body-2 leading-[140%] transition-all disabled:pointer-events-none disabled:opacity-50",
419
+ {
420
+ variants: {
421
+ type: {
422
+ primary: [
423
+ "h-9 border-b-2 border-transparent p-0 text-text-tertiary",
424
+ "hover:text-text-primary",
425
+ "data-[state=active]:border-border-focused data-[state=active]:text-text-primary"
426
+ ],
427
+ secondary: [
428
+ "h-8 rounded-strong px-2 text-text-tertiary",
429
+ "hover:text-text-primary",
430
+ "data-[state=active]:rounded-medium data-[state=active]:bg-elevation-elevation-2 data-[state=active]:text-text-primary"
431
+ ]
432
+ }
433
+ },
434
+ defaultVariants: {
435
+ type: "primary"
436
+ }
437
+ }
438
+ );
439
+ var Tabs = forwardRef(
440
+ ({ type = "primary", children, ...props }, ref) => /* @__PURE__ */ jsx(TabsContext.Provider, { value: { type }, children: /* @__PURE__ */ jsx(TabsPrimitive.Root, { ref, ...props, children }) })
441
+ );
442
+ Tabs.List = forwardRef(
443
+ ({ className, ...props }, ref) => {
444
+ const { type } = useTabsContext();
445
+ return /* @__PURE__ */ jsx(
446
+ TabsPrimitive.List,
447
+ {
448
+ ref,
449
+ className: cn(tabsListVariants({ type }), className),
450
+ ...props
451
+ }
452
+ );
453
+ }
454
+ );
455
+ Tabs.Trigger = forwardRef(
456
+ ({ className, leftIcon, rightIcon, badge, children, ...props }, ref) => {
457
+ const { type } = useTabsContext();
458
+ return /* @__PURE__ */ jsxs(
459
+ TabsPrimitive.Trigger,
460
+ {
461
+ ref,
462
+ className: cn(tabsTriggerVariants({ type }), className),
463
+ ...props,
464
+ children: [
465
+ leftIcon && /* @__PURE__ */ jsx("span", { className: "size-4", children: leftIcon }),
466
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
467
+ children,
468
+ badge && /* @__PURE__ */ jsx("span", { className: "text-text-tertiary group-data-[state=active]:text-text-accent", children: badge })
469
+ ] }),
470
+ rightIcon && /* @__PURE__ */ jsx("span", { className: "size-4", children: rightIcon })
471
+ ]
472
+ }
473
+ );
474
+ }
475
+ );
476
+ Tabs.Content = forwardRef(
477
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(TabsPrimitive.Content, { ref, className: cn(className), ...props })
478
+ );
479
+ Tabs.displayName = "Tabs";
480
+ Tabs.List.displayName = "Tabs.List";
481
+ Tabs.Trigger.displayName = "Tabs.Trigger";
482
+ Tabs.Content.displayName = "Tabs.Content";
483
+ var colorStyles = {
484
+ accent: {
485
+ contained: {
486
+ button: "bg-solid-accent-default hover:bg-solid-accent-hovered disabled:bg-solid-accent-disabled",
487
+ icon: "text-icon-static-light group-disabled/button:text-icon-inverse-disabled",
488
+ text: "text-text-static-light group-disabled/button:text-text-inverse-disabled"
489
+ },
490
+ outlined: {
491
+ button: "border border-border-accent hover:bg-elevation-accent disabled:border-border-accent-disabled",
492
+ icon: "text-text-accent group-disabled/button:text-text-accent-disabled",
493
+ text: "text-text-accent group-disabled/button:text-text-accent-disabled"
494
+ },
495
+ invisible: {
496
+ button: "hover:bg-elevation-accent",
497
+ icon: "text-text-accent group-disabled/button:text-text-accent-disabled",
498
+ text: "text-text-accent group-disabled/button:text-text-accent-disabled"
499
+ }
500
+ },
501
+ assistive: {
502
+ contained: {
503
+ button: "bg-elevation-elevation-2 hover:bg-elevation-elevation-3 disabled:bg-elevation-elevation-2",
504
+ icon: "text-icon-secondary group-disabled/button:text-icon-disabled",
505
+ text: "text-text-secondary group-disabled/button:text-text-disabled"
506
+ }
507
+ },
508
+ critical: {
509
+ contained: {
510
+ button: "bg-solid-critical-default hover:bg-solid-critical-hovered disabled:bg-solid-critical-disabled",
511
+ icon: "text-icon-static-light group-disabled/button:text-icon-inverse-disabled",
512
+ text: "text-text-static-light group-disabled/button:text-text-inverse-disabled"
513
+ },
514
+ outlined: {
515
+ button: "border border-border-critical hover:bg-elevation-critical disabled:border-border-critical-disabled",
516
+ icon: "text-text-critical group-disabled/button:text-text-critical-disabled",
517
+ text: "text-text-critical group-disabled/button:text-text-critical-disabled"
518
+ },
519
+ invisible: {
520
+ button: "hover:bg-elevation-critical",
521
+ icon: "text-text-critical group-disabled/button:text-text-critical-disabled",
522
+ text: "text-text-critical group-disabled/button:text-text-critical-disabled"
523
+ }
524
+ },
525
+ inverse: {
526
+ contained: {
527
+ button: "bg-elevation-elevation-0 hover:bg-elevation-elevation-2 disabled:bg-elevation-elevation-2",
528
+ icon: "text-icon-secondary group-disabled/button:text-icon-disabled",
529
+ text: "text-text-secondary group-disabled/button:text-text-disabled"
530
+ }
531
+ },
532
+ primary: {
533
+ contained: {
534
+ button: "bg-solid-primary-default hover:bg-solid-primary-hovered disabled:bg-solid-primary-disabled",
535
+ icon: "text-icon-inverse group-disabled/button:text-icon-inverse",
536
+ text: "text-text-inverse group-disabled/button:text-text-inverse"
537
+ },
538
+ outlined: {
539
+ button: "border border-border-secondary hover:bg-elevation-elevation-2 disabled:border-border-secondary",
540
+ icon: "text-icon-secondary group-disabled/button:text-icon-disabled",
541
+ text: "text-text-secondary group-disabled/button:text-text-disabled"
542
+ },
543
+ invisible: {
544
+ button: "hover:bg-elevation-elevation-2",
545
+ icon: "text-icon-secondary group-disabled/button:text-icon-disabled",
546
+ text: "text-text-secondary group-disabled/button:text-text-disabled"
547
+ }
548
+ }
549
+ };
550
+ var buttonVariants = cva(
551
+ "inline-flex w-fit shrink-0 cursor-pointer flex-row items-center justify-center rounded-medium transition-colors focus-visible:outline-none disabled:pointer-events-none disabled:cursor-not-allowed",
552
+ {
553
+ compoundVariants: [
554
+ // Primary 색상 조합
555
+ {
556
+ className: colorStyles.primary.contained.button,
557
+ color: "primary",
558
+ variant: "contained"
559
+ },
560
+ {
561
+ className: colorStyles.primary.outlined.button,
562
+ color: "primary",
563
+ variant: "outlined"
564
+ },
565
+ {
566
+ className: colorStyles.primary.invisible.button,
567
+ color: "primary",
568
+ variant: "invisible"
569
+ },
570
+ // Accent 색상 조합
571
+ {
572
+ className: colorStyles.accent.contained.button,
573
+ color: "accent",
574
+ variant: "contained"
575
+ },
576
+ {
577
+ className: colorStyles.accent.outlined.button,
578
+ color: "accent",
579
+ variant: "outlined"
580
+ },
581
+ {
582
+ className: colorStyles.accent.invisible.button,
583
+ color: "accent",
584
+ variant: "invisible"
585
+ },
586
+ // Critical 색상 조합
587
+ {
588
+ className: colorStyles.critical.contained.button,
589
+ color: "critical",
590
+ variant: "contained"
591
+ },
592
+ {
593
+ className: colorStyles.critical.outlined.button,
594
+ color: "critical",
595
+ variant: "outlined"
596
+ },
597
+ {
598
+ className: colorStyles.critical.invisible.button,
599
+ color: "critical",
600
+ variant: "invisible"
601
+ },
602
+ // Assistive 색상 조합 (contained만 지원)
603
+ {
604
+ className: colorStyles.assistive.contained.button,
605
+ color: "assistive",
606
+ variant: "contained"
607
+ },
608
+ // Inverse 색상 조합 (contained만 지원)
609
+ {
610
+ className: colorStyles.inverse.contained.button,
611
+ color: "inverse",
612
+ variant: "contained"
613
+ }
614
+ ],
615
+ defaultVariants: {
616
+ color: "primary",
617
+ size: "medium",
618
+ variant: "contained"
619
+ },
620
+ variants: {
621
+ color: {
622
+ accent: "",
623
+ assistive: "",
624
+ critical: "",
625
+ inverse: "",
626
+ primary: ""
627
+ },
628
+ size: {
629
+ xsmall: "h-6 gap-0 px-1 text-body-3 font-medium",
630
+ small: "h-7 gap-0.5 px-1.5 text-body-2 font-medium",
631
+ medium: "h-8 gap-0.5 px-2 text-body-2 font-medium",
632
+ large: "h-10 gap-1 px-2.5 text-body-1 font-medium",
633
+ xlarge: "h-12 gap-1 px-3 text-title-2 font-medium"
634
+ },
635
+ variant: {
636
+ contained: "",
637
+ outlined: "bg-transparent",
638
+ invisible: "bg-transparent"
639
+ }
640
+ }
641
+ }
642
+ );
643
+ var IconSize = {
644
+ xsmall: "h-4 w-4",
645
+ small: "h-4 w-4",
646
+ medium: "h-4 w-4",
647
+ large: "h-5 w-5",
648
+ xlarge: "h-6 w-6"
649
+ };
650
+ var Button = forwardRef(
651
+ ({
652
+ className,
653
+ variant = "contained",
654
+ color = "primary",
655
+ size = "medium",
656
+ icon,
657
+ children,
658
+ ...props
659
+ }, ref) => {
660
+ const validColorStyle = color === "assistive" || color === "inverse" ? colorStyles[color].contained : colorStyles[color][variant];
661
+ const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [
662
+ icon && cloneElement(icon, {
663
+ className: cn(
664
+ "shrink-0 [&>path]:fill-current",
665
+ validColorStyle.icon,
666
+ icon.props.className,
667
+ IconSize[size ?? "medium"]
668
+ )
669
+ }),
670
+ typeof children === "string" ? /* @__PURE__ */ jsx(
671
+ "span",
672
+ {
673
+ className: cn("truncate", size === "xlarge" ? "px-1" : "px-0.5", validColorStyle.text),
674
+ children
675
+ }
676
+ ) : children
677
+ ] });
678
+ return /* @__PURE__ */ jsx(
679
+ "button",
680
+ {
681
+ className: cn(
682
+ buttonVariants({
683
+ className,
684
+ color,
685
+ size,
686
+ variant
687
+ }),
688
+ "group/button"
689
+ ),
690
+ ref,
691
+ ...props,
692
+ children: content
693
+ }
694
+ );
695
+ }
696
+ );
697
+ Button.displayName = "Button";
698
+ var segmentListVariants = cva(
699
+ "inline-flex items-center overflow-hidden rounded-medium bg-elevation-elevation-2",
700
+ {
701
+ variants: {
702
+ size: {
703
+ small: "h-7 gap-0 p-0.5",
704
+ medium: "h-8 gap-0 p-0.5",
705
+ large: "h-10 gap-0 p-0.5"
706
+ }
707
+ },
708
+ defaultVariants: {
709
+ size: "medium"
710
+ }
711
+ }
712
+ );
713
+ var segmentItemVariants = cva(
714
+ [
715
+ "flex flex-1 items-center justify-center rounded-weak",
716
+ "focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-ring",
717
+ "disabled:cursor-not-allowed",
718
+ "data-[state=active]:bg-component-segmentedOption data-[state=active]:text-text-primary data-[state=active]:shadow-weak",
719
+ "data-[state=inactive]:text-text-tertiary data-[state=inactive]:disabled:text-text-disabled",
720
+ "transition-colors duration-200 ease-in-out"
721
+ ],
722
+ {
723
+ variants: {
724
+ size: {
725
+ small: "h-6 gap-0.5 text-body-3 font-medium",
726
+ medium: "h-7 gap-1 text-body-2 font-medium",
727
+ large: "h-9 gap-1.5 text-body-2 font-medium"
728
+ }
729
+ },
730
+ defaultVariants: {
731
+ size: "medium"
732
+ }
733
+ }
734
+ );
735
+ var segmentIconVariants = cva("flex items-center justify-center", {
736
+ variants: {
737
+ size: {
738
+ small: "size-4",
739
+ medium: "size-4",
740
+ large: "size-5"
741
+ }
742
+ },
743
+ defaultVariants: {
744
+ size: "medium"
745
+ }
746
+ });
747
+ var SegmentContext = createContext(void 0);
748
+ var useSegmentContext = () => {
749
+ const context = useContext(SegmentContext);
750
+ if (!context) {
751
+ throw new Error("Segment components must be used within a Segment");
752
+ }
753
+ return context;
754
+ };
755
+ var Segment = forwardRef(
756
+ ({ size = "medium", children, ...props }, ref) => /* @__PURE__ */ jsx(SegmentContext.Provider, { value: { size }, children: /* @__PURE__ */ jsx(TabsPrimitive.Root, { ref, ...props, children }) })
757
+ );
758
+ Segment.List = forwardRef(
759
+ ({ className, ...props }, ref) => {
760
+ const { size } = useSegmentContext();
761
+ return /* @__PURE__ */ jsx(
762
+ TabsPrimitive.List,
763
+ {
764
+ ref,
765
+ className: cn(segmentListVariants({ size }), className),
766
+ ...props
767
+ }
768
+ );
769
+ }
770
+ );
771
+ Segment.Item = forwardRef(
772
+ ({ className, leftIcon, children, ...props }, ref) => {
773
+ const { size } = useSegmentContext();
774
+ return /* @__PURE__ */ jsxs(
775
+ TabsPrimitive.Trigger,
776
+ {
777
+ ref,
778
+ className: cn(segmentItemVariants({ size }), className),
779
+ ...props,
780
+ children: [
781
+ leftIcon && /* @__PURE__ */ jsx("span", { className: cn(segmentIconVariants({ size })), children: leftIcon }),
782
+ /* @__PURE__ */ jsx("span", { className: "flex items-center", children })
783
+ ]
784
+ }
785
+ );
786
+ }
787
+ );
788
+ Segment.Content = forwardRef(
789
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
790
+ TabsPrimitive.Content,
791
+ {
792
+ ref,
793
+ className: cn(
794
+ "ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
795
+ className
796
+ ),
797
+ ...props
798
+ }
799
+ )
800
+ );
801
+ Segment.displayName = "Segment";
802
+ Segment.List.displayName = "Segment.List";
803
+ Segment.Content.displayName = "Segment.Content";
804
+ Segment.Item.displayName = "Segment.Item";
805
+ var commonInputVariants = {
806
+ // Container variants - 전체 컴포넌트 래퍼
807
+ container: cva("flex flex-col"),
808
+ // Label variants - 라벨 텍스트
809
+ label: cva("inline-block font-regular text-text-primary", {
810
+ variants: {
811
+ size: {
812
+ xsmall: "mb-[2px] text-body-3",
813
+ small: "mb-[4px] text-body-2",
814
+ medium: "mb-[4px] text-body-2",
815
+ large: "mb-[6px] text-body-1"
816
+ },
817
+ disabled: {
818
+ true: "text-text-disabled"
819
+ },
820
+ required: {
821
+ true: 'after:ml-0.5 after:text-text-critical after:content-["*"]'
822
+ }
823
+ },
824
+ compoundVariants: [
825
+ {
826
+ required: true,
827
+ disabled: true,
828
+ className: "after:text-text-disabled"
829
+ }
830
+ ],
831
+ defaultVariants: { size: "medium" }
832
+ }),
833
+ // Description variants - 설명 텍스트
834
+ description: cva("mt-0.5 inline-block text-text-tertiary", {
835
+ variants: {
836
+ size: {
837
+ xsmall: "text-caption",
838
+ small: "text-body-3",
839
+ medium: "text-body-3",
840
+ large: "text-body-2"
841
+ },
842
+ error: {
843
+ true: "text-text-critical"
844
+ },
845
+ disabled: {
846
+ true: "text-text-disabled"
847
+ }
848
+ },
849
+ compoundVariants: [
850
+ {
851
+ error: true,
852
+ disabled: true,
853
+ className: "text-text-disabled"
854
+ // disabled 우선 적용
855
+ }
856
+ ],
857
+ defaultVariants: { size: "medium" }
858
+ }),
859
+ // Icon variants - 아이콘 크기
860
+ icon: cva("shrink-0", {
861
+ variants: {
862
+ size: {
863
+ xsmall: "size-4",
864
+ small: "size-4",
865
+ medium: "size-4",
866
+ large: "size-5"
867
+ }
868
+ },
869
+ defaultVariants: { size: "medium" }
870
+ })
871
+ };
872
+
873
+ // src/input/selectVariants.ts
874
+ var selectVariants = {
875
+ container: commonInputVariants.container,
876
+ content: cn(
877
+ "relative border border-border-primary z-50 min-w-[8rem] overflow-hidden rounded-medium bg-background-overlay shadow-weak",
878
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
879
+ "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1"
880
+ ),
881
+ description: commonInputVariants.description,
882
+ iconSize: commonInputVariants.icon,
883
+ item: cva(
884
+ "relative flex w-full cursor-pointer select-none items-center rounded-weak px-2 text-body-2 text-text-primary outline-none hover:bg-elevation-elevation-2 data-[disabled]:pointer-events-none data-[state=checked]:bg-elevation-accent data-[disabled]:text-text-disabled",
885
+ {
886
+ defaultVariants: { size: "medium" },
887
+ variants: {
888
+ size: {
889
+ xsmall: "h-6",
890
+ small: "h-7",
891
+ medium: "h-8",
892
+ large: "h-10"
893
+ }
894
+ }
895
+ }
896
+ ),
897
+ itemText: cva("truncate flex items-center flex-1 min-w-0", {
898
+ defaultVariants: { size: "medium" },
899
+ variants: {
900
+ size: {
901
+ xsmall: "h-6",
902
+ small: "h-7",
903
+ medium: "h-8",
904
+ large: "h-10"
905
+ }
906
+ }
907
+ }),
908
+ label: commonInputVariants.label,
909
+ trigger: cva(
910
+ "group flex w-full items-center justify-between rounded-medium outline-none disabled:cursor-not-allowed disabled:bg-elevation-elevation-2 disabled:text-text-disabled data-[state=open]:border data-[state=open]:border-border-focused [&>span]:line-clamp-1 [&[data-placeholder]]:text-text-tertiary [&_svg]:text-icon-primary",
911
+ {
912
+ compoundVariants: [
913
+ {
914
+ className: "border-border-accent text-tint-foreground-sky bg-elevation-accent [&[data-placeholder]]:text-tint-foreground-sky [&_svg]:text-tint-foreground-sky",
915
+ focus: true,
916
+ variant: "line"
917
+ },
918
+ // active + fill: 배경만 accent로 변경
919
+ {
920
+ className: "bg-elevation-accent text-tint-foreground-sky [&[data-placeholder]]:text-tint-foreground-sky [&_svg]:text-tint-foreground-sky",
921
+ active: true,
922
+ variant: "fill"
923
+ },
924
+ // active + line: 배경 accent + 테두리 accent
925
+ {
926
+ className: "bg-elevation-accent border-border-accent text-tint-foreground-sky [&[data-placeholder]]:text-tint-foreground-sky [&_svg]:text-tint-foreground-sky",
927
+ active: true,
928
+ variant: "line"
929
+ }
930
+ ],
931
+ defaultVariants: {
932
+ active: false,
933
+ error: false,
934
+ focus: false,
935
+ size: "medium",
936
+ variant: "fill"
937
+ },
938
+ variants: {
939
+ active: {
940
+ false: "",
941
+ true: ""
942
+ },
943
+ error: {
944
+ false: "",
945
+ true: "border !border-border-critical"
946
+ },
947
+ focus: {
948
+ false: "",
949
+ // 현재는 line 타입만 focus 가능
950
+ true: ""
951
+ },
952
+ size: {
953
+ xsmall: "h-6 px-[4px] text-body-3",
954
+ small: "h-7 px-[6px] text-body-2",
955
+ medium: "h-8 px-[8px] text-body-2",
956
+ large: "h-10 px-[10px] text-body-1"
957
+ },
958
+ variant: {
959
+ fill: "bg-elevation-elevation-2",
960
+ line: "border-border-primary border"
961
+ }
962
+ }
963
+ }
964
+ ),
965
+ triggerInner: cva("flex w-full items-center", {
966
+ defaultVariants: { size: "medium" },
967
+ variants: {
968
+ size: {
969
+ xsmall: "gap-0",
970
+ small: "gap-[2px]",
971
+ medium: "gap-[2px]",
972
+ large: "gap-[4px]"
973
+ }
974
+ }
975
+ }),
976
+ viewport: cn("flex flex-col gap-0.5 p-1")
977
+ };
978
+ var SelectContext = createContext(null);
979
+ var useSelectContext = () => {
980
+ const context = useContext(SelectContext);
981
+ if (!context) {
982
+ throw new Error("Select components must be used within a Select");
983
+ }
984
+ return context;
985
+ };
986
+ var SelectGroupContext = createContext(null);
987
+ var useSelectGroupContext = () => {
988
+ return useContext(SelectGroupContext);
989
+ };
990
+ var Select = forwardRef(
991
+ ({
992
+ children,
993
+ size = "medium",
994
+ variant = "fill",
995
+ error = false,
996
+ disabled = false,
997
+ focus = false,
998
+ active = false,
999
+ className,
1000
+ ...selectProps
1001
+ }, ref) => {
1002
+ const uniqueId = useId();
1003
+ const id = `select-${uniqueId}`;
1004
+ return /* @__PURE__ */ jsx(SelectContext.Provider, { value: { active, disabled, error, focus, id, size, variant }, children: /* @__PURE__ */ jsx("div", { ref, className: cn(selectVariants.container(), className), children: /* @__PURE__ */ jsx(SelectPrimitive.Root, { disabled, ...selectProps, children }) }) });
1005
+ }
1006
+ );
1007
+ Select.Value = forwardRef(({ className, children, ...props }, ref) => {
1008
+ return /* @__PURE__ */ jsx(SelectPrimitive.Value, { ref, className, ...props, children });
1009
+ });
1010
+ Select.Trigger = forwardRef(
1011
+ ({ className, children, leftIcon, ...props }, ref) => {
1012
+ const { size, error, id, variant, focus, active } = useSelectContext();
1013
+ const groupContext = useSelectGroupContext();
1014
+ const groupClasses = groupContext ? cn("rounded-none border-0", {
1015
+ "rounded-l-medium": groupContext.isFirstChild,
1016
+ "rounded-r-medium": groupContext.isLastChild,
1017
+ // line variant: group이 외곽 border를 제공하므로, open 시 border 대신 inset ring 사용
1018
+ "data-[state=open]:border-0 data-[state=open]:ring-1 data-[state=open]:ring-inset data-[state=open]:ring-border-focused": variant === "line"
1019
+ }) : void 0;
1020
+ return /* @__PURE__ */ jsx(
1021
+ SelectPrimitive.Trigger,
1022
+ {
1023
+ ref,
1024
+ id,
1025
+ "data-slot": "select-trigger",
1026
+ className: cn(
1027
+ selectVariants.trigger({ active, error, focus, size, variant }),
1028
+ groupClasses,
1029
+ className
1030
+ ),
1031
+ ...props,
1032
+ children: /* @__PURE__ */ jsxs("div", { className: cn(selectVariants.triggerInner({ size })), children: [
1033
+ leftIcon && /* @__PURE__ */ jsx(
1034
+ "span",
1035
+ {
1036
+ className: cn(
1037
+ selectVariants.iconSize({ size }),
1038
+ "flex items-center justify-center group-disabled:text-icon-disabled"
1039
+ ),
1040
+ children: leftIcon
1041
+ }
1042
+ ),
1043
+ /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1 truncate text-left", children }),
1044
+ /* @__PURE__ */ jsx(
1045
+ ChevronDown,
1046
+ {
1047
+ type: "regular",
1048
+ className: cn(
1049
+ selectVariants.iconSize({ size }),
1050
+ "transition-transform duration-200 group-data-[state=open]:rotate-180",
1051
+ "group-disabled:text-icon-disabled"
1052
+ )
1053
+ }
1054
+ )
1055
+ ] })
1056
+ }
1057
+ );
1058
+ }
1059
+ );
1060
+ Select.Box = forwardRef(
1061
+ ({ placeholder, leftIcon, className, ...props }, ref) => {
1062
+ return /* @__PURE__ */ jsx(Select.Trigger, { ref, leftIcon, className, ...props, children: /* @__PURE__ */ jsx(Select.Value, { placeholder }) });
1063
+ }
1064
+ );
1065
+ Select.List = forwardRef(
1066
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsx(
1067
+ SelectPrimitive.Content,
1068
+ {
1069
+ ref,
1070
+ "data-slot": "select-content",
1071
+ className: cn(selectVariants.content, "max-h-60 ", className),
1072
+ position: "popper",
1073
+ ...props,
1074
+ children: /* @__PURE__ */ jsx(
1075
+ SelectPrimitive.Viewport,
1076
+ {
1077
+ "data-slot": "select-viewport",
1078
+ className: cn(
1079
+ selectVariants.viewport,
1080
+ "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"
1081
+ ),
1082
+ children
1083
+ }
1084
+ )
1085
+ }
1086
+ ) })
1087
+ );
1088
+ Select.Label = forwardRef(
1089
+ ({ children, required = false, size: sizeProp, className }, ref) => {
1090
+ const { size: contextSize, disabled, id } = useSelectContext();
1091
+ const groupContext = useSelectGroupContext();
1092
+ const size = sizeProp ?? groupContext?.size ?? contextSize;
1093
+ return /* @__PURE__ */ jsx(
1094
+ "label",
1095
+ {
1096
+ ref,
1097
+ htmlFor: id,
1098
+ className: cn(selectVariants.label({ disabled, required, size }), className),
1099
+ children
1100
+ }
1101
+ );
1102
+ }
1103
+ );
1104
+ Select.Item = forwardRef(
1105
+ ({
1106
+ className,
1107
+ children,
1108
+ leftIcon,
1109
+ rightIcon,
1110
+ leftIconSize,
1111
+ rightIconSize,
1112
+ size: sizeProp,
1113
+ ...props
1114
+ }, ref) => {
1115
+ const { size: contextSize } = useSelectContext();
1116
+ const groupContext = useSelectGroupContext();
1117
+ const size = sizeProp ?? groupContext?.size ?? contextSize;
1118
+ return /* @__PURE__ */ jsx(
1119
+ SelectPrimitive.Item,
1120
+ {
1121
+ "data-slot": "select-item",
1122
+ ref,
1123
+ className: cn(selectVariants.item({ size }), className),
1124
+ ...props,
1125
+ children: /* @__PURE__ */ jsxs("div", { className: "flex w-full items-center justify-between", children: [
1126
+ /* @__PURE__ */ jsxs("div", { className: "flex w-full items-center gap-0.5", children: [
1127
+ leftIcon && /* @__PURE__ */ jsx(
1128
+ "span",
1129
+ {
1130
+ className: cn(
1131
+ selectVariants.iconSize({ size: leftIconSize ?? size }),
1132
+ "flex items-center justify-center text-icon-primary"
1133
+ ),
1134
+ children: leftIcon
1135
+ }
1136
+ ),
1137
+ /* @__PURE__ */ jsx(SelectPrimitive.ItemText, { asChild: true, children: /* @__PURE__ */ jsx("div", { className: cn(selectVariants.itemText({ size })), children }) })
1138
+ ] }),
1139
+ rightIcon && /* @__PURE__ */ jsx(
1140
+ "span",
1141
+ {
1142
+ className: cn(
1143
+ selectVariants.iconSize({ size: rightIconSize ?? size }),
1144
+ "flex items-center justify-center text-icon-primary"
1145
+ ),
1146
+ children: rightIcon
1147
+ }
1148
+ )
1149
+ ] })
1150
+ }
1151
+ );
1152
+ }
1153
+ );
1154
+ Select.Empty = forwardRef(
1155
+ ({ children = "No data", className }, ref) => {
1156
+ return /* @__PURE__ */ jsx("div", { ref, className: cn("flex min-h-8 items-center justify-center p-2", className), children: /* @__PURE__ */ jsx("p", { className: "text-body-2 text-text-disabled", children }) });
1157
+ }
1158
+ );
1159
+ Select.Description = forwardRef(
1160
+ ({ children, size: sizeProp, className }, ref) => {
1161
+ const { size: contextSize, error, disabled } = useSelectContext();
1162
+ const groupContext = useSelectGroupContext();
1163
+ const size = sizeProp ?? groupContext?.size ?? contextSize;
1164
+ if (!children) {
1165
+ return null;
1166
+ }
1167
+ return /* @__PURE__ */ jsx(
1168
+ "div",
1169
+ {
1170
+ ref,
1171
+ "data-slot": "select-description",
1172
+ className: cn(selectVariants.description({ disabled, error, size }), className),
1173
+ children: /* @__PURE__ */ jsx("p", { children })
1174
+ }
1175
+ );
1176
+ }
1177
+ );
1178
+ Select.Group = forwardRef(
1179
+ ({ children, size = "medium", variant = "fill", hasBackground = false, className }, ref) => {
1180
+ const childArray = React2.Children.toArray(children);
1181
+ return /* @__PURE__ */ jsx(
1182
+ "div",
1183
+ {
1184
+ ref,
1185
+ className: cn(
1186
+ "flex w-fit flex-row items-stretch overflow-clip rounded-medium",
1187
+ variant === "line" && "border border-border-primary",
1188
+ hasBackground && "bg-elevation-elevation-0",
1189
+ className
1190
+ ),
1191
+ children: childArray.map((child, index) => {
1192
+ const isFirst = index === 0;
1193
+ const isLast = index === childArray.length - 1;
1194
+ return /* @__PURE__ */ jsxs(React2.Fragment, { children: [
1195
+ /* @__PURE__ */ jsx(
1196
+ SelectGroupContext.Provider,
1197
+ {
1198
+ value: { isFirstChild: isFirst, isLastChild: isLast, size, variant },
1199
+ children: child
1200
+ }
1201
+ ),
1202
+ !isLast && /* @__PURE__ */ jsx("div", { className: "w-px self-stretch bg-border-primary" })
1203
+ ] }, index);
1204
+ })
1205
+ }
1206
+ );
1207
+ }
1208
+ );
1209
+ Select.displayName = "Select";
1210
+ Select.Label.displayName = "Select.Label";
1211
+ Select.Trigger.displayName = "Select.Trigger";
1212
+ Select.Box.displayName = "Select.Box";
1213
+ Select.Value.displayName = "Select.Value";
1214
+ Select.List.displayName = "Select.List";
1215
+ Select.Item.displayName = "Select.Item";
1216
+ Select.Empty.displayName = "Select.Empty";
1217
+ Select.Description.displayName = "Select.Description";
1218
+ Select.Group.displayName = "Select.Group";
1219
+ var tooltipContentVariants = cva(
1220
+ [
1221
+ // Base layout
1222
+ "z-50 flex flex-col items-start overflow-hidden",
1223
+ "rounded-medium",
1224
+ "text-text-static-light",
1225
+ "bg-component-tooltip border border-border-primary",
1226
+ "shadow-medium",
1227
+ "animate-in fade-in-0 zoom-in-95",
1228
+ "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
1229
+ "data-[side=bottom]:slide-in-from-top-2",
1230
+ "data-[side=left]:slide-in-from-right-2",
1231
+ "data-[side=right]:slide-in-from-left-2",
1232
+ "data-[side=top]:slide-in-from-bottom-2"
1233
+ ],
1234
+ {
1235
+ variants: {
1236
+ size: {
1237
+ tiny: "px-2 py-1 text-body-3",
1238
+ small: "w-[160px] gap-[8px] px-[12px] py-[10px]",
1239
+ medium: "w-[240px] gap-[8px] px-[12px] py-[10px]",
1240
+ large: "w-[320px] gap-[8px] px-[12px] py-[10px]",
1241
+ xlarge: "w-[400px] gap-[8px] px-[12px] py-[10px]"
1242
+ }
1243
+ },
1244
+ defaultVariants: { size: "small" }
1245
+ }
1246
+ );
1247
+ var tooltipTitleVariants = cva([
1248
+ "text-body-1 font-semibold text-text-static-light",
1249
+ "group-data-[size=tiny]/tooltip-content:text-body-3"
1250
+ ]);
1251
+ var tooltipTextVariants = cva([
1252
+ "text-body-2 font-regular text-text-static-light",
1253
+ "group-data-[size=tiny]/tooltip-content:text-body-3"
1254
+ ]);
1255
+ var Tooltip = TooltipPrimitive.Root;
1256
+ Tooltip.Provider = TooltipPrimitive.Provider;
1257
+ Tooltip.Trigger = TooltipPrimitive.Trigger;
1258
+ Tooltip.Content = forwardRef(({ className, sideOffset = 4, size, children, portalContainer, ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
1259
+ TooltipPrimitive.Content,
1260
+ {
1261
+ ref,
1262
+ sideOffset,
1263
+ "data-size": size,
1264
+ className: cn("group/tooltip-content", tooltipContentVariants({ size }), className),
1265
+ ...props,
1266
+ children
1267
+ }
1268
+ ) }));
1269
+ Tooltip.Title = forwardRef(
1270
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn(tooltipTitleVariants(), className), ...props, children })
1271
+ );
1272
+ Tooltip.Description = forwardRef(
1273
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn(tooltipTextVariants(), className), ...props, children })
1274
+ );
1275
+ Tooltip.displayName = "Tooltip";
1276
+ Tooltip.Content.displayName = "Tooltip.Content";
1277
+ Tooltip.Title.displayName = "Tooltip.Title";
1278
+ Tooltip.Description.displayName = "Tooltip.Description";
1279
+ Tooltip.Trigger.displayName = "Tooltip.Trigger";
1280
+ Tooltip.Provider.displayName = "Tooltip.Provider";
1281
+ var FlatTooltip = ({ children, title, size, description, ...props }) => {
1282
+ return /* @__PURE__ */ jsx(Tooltip.Provider, { delayDuration: 0, skipDelayDuration: 0, children: /* @__PURE__ */ jsxs(Tooltip, { children: [
1283
+ /* @__PURE__ */ jsx(Tooltip.Trigger, { asChild: true, children }),
1284
+ /* @__PURE__ */ jsxs(Tooltip.Content, { size, ...props, children: [
1285
+ title && /* @__PURE__ */ jsx(Tooltip.Title, { children: title }),
1286
+ description && /* @__PURE__ */ jsx(Tooltip.Description, { children: description })
1287
+ ] })
1288
+ ] }) });
1289
+ };
1290
+ function ConditionalTooltip({ children, tooltip }) {
1291
+ if (typeof tooltip === "string") {
1292
+ return /* @__PURE__ */ jsx(FlatTooltip, { size: "tiny", description: tooltip, children });
1293
+ }
1294
+ if (tooltip && typeof tooltip === "object" && "description" in tooltip && tooltip.use !== false) {
1295
+ return /* @__PURE__ */ jsx(FlatTooltip, { size: tooltip.size || "tiny", ...tooltip, children });
1296
+ }
1297
+ return children;
1298
+ }
1299
+ FlatTooltip.displayName = "FlatTooltip";
1300
+ ConditionalTooltip.displayName = "ConditionalTooltip";
1301
+ var iconButtonSizeClasses = {
1302
+ xsmall: "size-6",
1303
+ small: "size-7",
1304
+ medium: "size-8",
1305
+ large: "size-10",
1306
+ xlarge: "size-12"
1307
+ };
1308
+ var IconButton = forwardRef(
1309
+ ({
1310
+ className,
1311
+ tooltip,
1312
+ variant = "contained",
1313
+ icon,
1314
+ size = "medium",
1315
+ color = "primary",
1316
+ ...props
1317
+ }, ref) => {
1318
+ const buttonProps = {
1319
+ className: cn(iconButtonSizeClasses[size], "px-0", className),
1320
+ color,
1321
+ icon,
1322
+ size,
1323
+ variant,
1324
+ ...props
1325
+ };
1326
+ return /* @__PURE__ */ jsx(ConditionalTooltip, { tooltip, children: /* @__PURE__ */ jsx(Button, { ref, ...buttonProps }) });
1327
+ }
1328
+ );
1329
+ IconButton.displayName = "IconButton";
1330
+ var ButtonGroup = forwardRef(
1331
+ ({
1332
+ variant = "contained",
1333
+ iconOnly = false,
1334
+ hasBackground = false,
1335
+ size = "medium",
1336
+ items,
1337
+ className
1338
+ }, ref) => {
1339
+ if (items.length === 0) {
1340
+ return null;
1341
+ }
1342
+ const isOutlined = variant === "outlined";
1343
+ return /* @__PURE__ */ jsx(
1344
+ "div",
1345
+ {
1346
+ ref,
1347
+ className: cn(
1348
+ "inline-flex items-center overflow-hidden rounded-medium",
1349
+ hasBackground && "bg-elevation-elevation-0",
1350
+ className
1351
+ ),
1352
+ role: "group",
1353
+ children: items.map((item, index) => {
1354
+ const isFirst = index === 0;
1355
+ const isLast = index === items.length - 1;
1356
+ const roundedClasses = cn("rounded-none", {
1357
+ "rounded-l-medium": isFirst,
1358
+ "rounded-r-medium": isLast
1359
+ });
1360
+ const dividerClasses = !isOutlined && !isLast ? "border-r border-border-primary" : "";
1361
+ const mergeClasses = isOutlined && !isFirst ? "-ml-px" : "";
1362
+ const hoverClasses = isOutlined ? "relative hover:z-10" : "";
1363
+ if (iconOnly) {
1364
+ const iconBaseProps = {
1365
+ className: cn(roundedClasses, dividerClasses, mergeClasses, hoverClasses),
1366
+ icon: item.icon,
1367
+ onClick: item.onClick,
1368
+ size
1369
+ };
1370
+ return /* @__PURE__ */ jsx(ConditionalTooltip, { tooltip: item.tooltip, children: variant === "contained" ? /* @__PURE__ */ jsx(IconButton, { ...iconBaseProps, color: "assistive", variant: "contained" }) : /* @__PURE__ */ jsx(IconButton, { ...iconBaseProps, color: "primary", variant: "outlined" }) }, item.id);
1371
+ }
1372
+ const buttonBaseProps = {
1373
+ className: cn(roundedClasses, dividerClasses, mergeClasses, hoverClasses),
1374
+ icon: item.icon,
1375
+ onClick: item.onClick,
1376
+ size
1377
+ };
1378
+ return /* @__PURE__ */ jsx(ConditionalTooltip, { tooltip: item.tooltip, children: variant === "contained" ? /* @__PURE__ */ jsx(Button, { ...buttonBaseProps, color: "assistive", variant: "contained", children: item.label }) : /* @__PURE__ */ jsx(Button, { ...buttonBaseProps, color: "primary", variant: "outlined", children: item.label }) }, item.id);
1379
+ })
1380
+ }
1381
+ );
1382
+ }
1383
+ );
1384
+ ButtonGroup.displayName = "ButtonGroup";
1385
+ var containerVariants = cva("inline-flex items-center", {
1386
+ variants: {
1387
+ size: {
1388
+ small: "gap-1",
1389
+ medium: "gap-1.5",
1390
+ large: "gap-2"
1391
+ },
1392
+ labelPosition: {
1393
+ right: "flex-row",
1394
+ left: "flex-row-reverse"
1395
+ }
1396
+ },
1397
+ defaultVariants: {
1398
+ size: "medium",
1399
+ labelPosition: "right"
1400
+ }
1401
+ });
1402
+ var boxVariants = cva(
1403
+ "peer shrink-0 cursor-pointer rounded-weak border border-border-secondary ring-offset-background transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed enabled:data-[state=unchecked]:hover:bg-elevation-elevation-2 disabled:data-[state=unchecked]:bg-elevation-elevation-3 bg-background-primary",
1404
+ {
1405
+ variants: {
1406
+ size: {
1407
+ small: "size-4",
1408
+ medium: "size-5",
1409
+ large: "size-6"
1410
+ }
1411
+ },
1412
+ defaultVariants: {
1413
+ size: "medium"
1414
+ }
1415
+ }
1416
+ );
1417
+ var labelVariants = cva(
1418
+ "cursor-pointer select-none text-text-primary peer-disabled:cursor-not-allowed peer-disabled:text-text-disabled",
1419
+ {
1420
+ variants: {
1421
+ size: {
1422
+ small: "text-body-3",
1423
+ medium: "text-body-2",
1424
+ large: "text-body-1"
1425
+ }
1426
+ },
1427
+ defaultVariants: {
1428
+ size: "medium"
1429
+ }
1430
+ }
1431
+ );
1432
+ var iconVariants = cva("text-icon-static-light", {
1433
+ variants: {
1434
+ size: {
1435
+ small: "size-4",
1436
+ medium: "size-5",
1437
+ large: "size-6"
1438
+ },
1439
+ disabled: {
1440
+ true: "text-icon-inverse-disabled"
1441
+ }
1442
+ },
1443
+ defaultVariants: {
1444
+ size: "medium"
1445
+ }
1446
+ });
1447
+ var stateClasses = [
1448
+ "data-[state=checked]:bg-solid-accent-default data-[state=checked]:border-transparent",
1449
+ "data-[state=indeterminate]:bg-solid-accent-default data-[state=indeterminate]:border-transparent",
1450
+ "enabled:data-[state=checked]:hover:bg-solid-accent-hovered enabled:data-[state=indeterminate]:hover:bg-solid-accent-hovered",
1451
+ "enabled:data-[state=checked]:hover:border-transparent enabled:data-[state=indeterminate]:hover:border-transparent",
1452
+ "disabled:data-[state=checked]:bg-solid-accent-disabled disabled:data-[state=indeterminate]:bg-solid-accent-disabled",
1453
+ "disabled:data-[state=checked]:border-transparent disabled:data-[state=indeterminate]:border-transparent"
1454
+ ];
1455
+ var Checkbox = forwardRef(
1456
+ ({
1457
+ className,
1458
+ label,
1459
+ id,
1460
+ size = "medium",
1461
+ labelPosition = "right",
1462
+ checked,
1463
+ onCheckedChange,
1464
+ disabled = false,
1465
+ defaultChecked,
1466
+ ...props
1467
+ }, ref) => {
1468
+ const uniqueId = useId();
1469
+ const checkboxId = id || uniqueId;
1470
+ const checkboxState = checked === "indeterminate" ? "indeterminate" : checked ? "checked" : "unchecked";
1471
+ const checkboxProps = {
1472
+ ...props,
1473
+ ref,
1474
+ id: checkboxId,
1475
+ className: cn(boxVariants({ size }), stateClasses, className),
1476
+ onCheckedChange: (state) => {
1477
+ onCheckedChange?.(state === "indeterminate" ? true : !!state);
1478
+ },
1479
+ "data-state": checkboxState,
1480
+ disabled
1481
+ };
1482
+ if (checked !== void 0) {
1483
+ checkboxProps.checked = checked;
1484
+ }
1485
+ if (defaultChecked !== void 0) {
1486
+ checkboxProps.defaultChecked = defaultChecked;
1487
+ }
1488
+ return /* @__PURE__ */ jsxs("div", { className: cn(containerVariants({ size, labelPosition })), children: [
1489
+ /* @__PURE__ */ jsx(
1490
+ CheckboxPrimitive.Root,
1491
+ {
1492
+ ...checkboxProps,
1493
+ children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, { className: "flex items-center justify-center", children: checkboxState === "indeterminate" ? /* @__PURE__ */ jsx(Minus, { type: "regular", className: cn(iconVariants({ size, disabled })) }) : checkboxState === "checked" ? /* @__PURE__ */ jsx(Check, { type: "regular", className: cn(iconVariants({ size, disabled })) }) : null })
1494
+ }
1495
+ ),
1496
+ label && /* @__PURE__ */ jsx("label", { htmlFor: checkboxId, className: cn(labelVariants({ size })), children: label })
1497
+ ] });
1498
+ }
1499
+ );
1500
+ Checkbox.displayName = CheckboxPrimitive.Root.displayName;
1501
+ var containerVariants2 = cva("inline-flex items-center", {
1502
+ variants: {
1503
+ size: { small: "gap-1", medium: "gap-1.5", large: "gap-2" },
1504
+ labelPosition: { right: "flex-row", left: "flex-row-reverse" }
1505
+ },
1506
+ defaultVariants: { size: "medium", labelPosition: "right" }
1507
+ });
1508
+ var radioVariants = cva(
1509
+ "peer relative shrink-0 rounded-full border border-border-secondary ring-offset-background transition-colors hover:bg-elevation-elevation-2 bg-background-primary",
1510
+ {
1511
+ variants: { size: { small: "size-4", medium: "size-5", large: "size-6" } },
1512
+ defaultVariants: { size: "medium" }
1513
+ }
1514
+ );
1515
+ var stateClasses2 = [
1516
+ "disabled:cursor-not-allowed",
1517
+ "disabled:data-[state=unchecked]:bg-elevation-elevation-3"
1518
+ ];
1519
+ var checkedStateClasses = [
1520
+ "data-[state=checked]:border-border-accent",
1521
+ "disabled:data-[state=checked]:border-border-accent-disabled"
1522
+ ];
1523
+ var indicatorVariants = cva(
1524
+ "pointer-events-none block rounded-full bg-icon-accent data-[disabled]:bg-icon-accent-disabled",
1525
+ {
1526
+ variants: {
1527
+ size: { small: "size-2.5", medium: "size-3", large: "size-3.5" }
1528
+ },
1529
+ defaultVariants: { size: "medium" }
1530
+ }
1531
+ );
1532
+ var labelVariants2 = cva(
1533
+ "cursor-pointer select-none text-text-primary peer-disabled:cursor-not-allowed peer-disabled:text-text-disabled",
1534
+ {
1535
+ variants: { size: { small: "text-body-3", medium: "text-body-2", large: "text-body-1" } },
1536
+ defaultVariants: { size: "medium" }
1537
+ }
1538
+ );
1539
+ var Radio = forwardRef(
1540
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(RadioGroupPrimitive.Root, { ref, className: cn("grid gap-2", className), ...props })
1541
+ );
1542
+ Radio.Item = forwardRef(
1543
+ ({ className, size = "medium", label, labelPosition = "right", id, disabled, ...props }, ref) => {
1544
+ const uniqueId = useId();
1545
+ const radioId = id || uniqueId;
1546
+ const control = /* @__PURE__ */ jsx(
1547
+ RadioGroupPrimitive.Item,
1548
+ {
1549
+ ref,
1550
+ id: radioId,
1551
+ disabled,
1552
+ className: cn(radioVariants({ size }), stateClasses2, checkedStateClasses, className),
1553
+ ...props,
1554
+ children: /* @__PURE__ */ jsx(RadioGroupPrimitive.Indicator, { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx(
1555
+ "span",
1556
+ {
1557
+ className: cn("block", indicatorVariants({ size })),
1558
+ "data-disabled": disabled ? "" : void 0
1559
+ }
1560
+ ) })
1561
+ }
1562
+ );
1563
+ if (!label) {
1564
+ return control;
1565
+ }
1566
+ return /* @__PURE__ */ jsxs("div", { className: cn(containerVariants2({ size, labelPosition })), children: [
1567
+ control,
1568
+ /* @__PURE__ */ jsx("label", { htmlFor: radioId, className: cn(labelVariants2({ size })), children: label })
1569
+ ] });
1570
+ }
1571
+ );
1572
+ Radio.displayName = "Radio";
1573
+ Radio.Item.displayName = "Radio.Item";
1574
+ var switchVariants = cva(
1575
+ "peer relative inline-flex shrink-0 cursor-pointer items-center rounded-full disabled:cursor-not-allowed data-[state=checked]:bg-solid-accent-default data-[state=unchecked]:bg-elevation-elevation-4 hover:data-[state=checked]:bg-solid-accent-hovered hover:data-[state=unchecked]:bg-elevation-elevation-5 disabled:data-[state=checked]:bg-solid-accent-disabled disabled:data-[state=unchecked]:bg-elevation-elevation-3 disabled:hover:data-[state=checked]:bg-solid-accent-disabled disabled:hover:data-[state=unchecked]:bg-elevation-elevation-3",
1576
+ {
1577
+ variants: {
1578
+ size: {
1579
+ small: "h-[16px] w-[28px]",
1580
+ medium: "h-[20px] w-[36px]",
1581
+ large: "h-[24px] w-[44px]"
1582
+ }
1583
+ },
1584
+ defaultVariants: {
1585
+ size: "medium"
1586
+ }
1587
+ }
1588
+ );
1589
+ var switchThumbVariants = cva(
1590
+ "pointer-events-none absolute bg-icon-static-light left-[2px] top-[2px] rounded-full ring-0 data-[state=unchecked]:translate-x-0 data-[disabled]:bg-icon-inverse-disabled",
1591
+ {
1592
+ variants: {
1593
+ size: {
1594
+ small: "size-[12px] data-[state=checked]:translate-x-[12px]",
1595
+ medium: "size-[16px] data-[state=checked]:translate-x-[16px]",
1596
+ large: "size-[20px] data-[state=checked]:translate-x-[20px]"
1597
+ }
1598
+ },
1599
+ defaultVariants: {
1600
+ size: "medium"
1601
+ }
1602
+ }
1603
+ );
1604
+ var containerVariants3 = cva("inline-flex items-center", {
1605
+ variants: {
1606
+ size: {
1607
+ small: "gap-1",
1608
+ medium: "gap-1.5",
1609
+ large: "gap-2"
1610
+ },
1611
+ labelPosition: {
1612
+ right: "flex-row",
1613
+ left: "flex-row-reverse"
1614
+ }
1615
+ },
1616
+ defaultVariants: {
1617
+ size: "medium",
1618
+ labelPosition: "right"
1619
+ }
1620
+ });
1621
+ var switchLabelVariants = cva(
1622
+ "cursor-pointer select-none font-regular text-text-primary peer-disabled:cursor-not-allowed peer-disabled:text-text-disabled",
1623
+ {
1624
+ variants: {
1625
+ size: {
1626
+ small: "text-body-3",
1627
+ medium: "text-body-2",
1628
+ large: "text-body-1"
1629
+ }
1630
+ },
1631
+ defaultVariants: {
1632
+ size: "medium"
1633
+ }
1634
+ }
1635
+ );
1636
+ var Switch = forwardRef(
1637
+ ({ className, size = "medium", label, labelPosition = "right", id, ...props }, ref) => {
1638
+ const switchId = useId();
1639
+ const finalId = id || switchId;
1640
+ const switchElement = /* @__PURE__ */ jsx(
1641
+ SwitchPrimitives.Root,
1642
+ {
1643
+ id: finalId,
1644
+ className: cn(switchVariants({ size }), className),
1645
+ ...props,
1646
+ ref,
1647
+ children: /* @__PURE__ */ jsx(SwitchPrimitives.Thumb, { className: cn(switchThumbVariants({ size })) })
1648
+ }
1649
+ );
1650
+ if (!label) {
1651
+ return switchElement;
1652
+ }
1653
+ return /* @__PURE__ */ jsxs("div", { className: cn(containerVariants3({ size, labelPosition })), children: [
1654
+ switchElement,
1655
+ /* @__PURE__ */ jsx("label", { htmlFor: finalId, className: cn(switchLabelVariants({ size })), children: label })
1656
+ ] });
1657
+ }
1658
+ );
1659
+ Switch.displayName = SwitchPrimitives.Root.displayName;
1660
+ function DatePickerChevron({ orientation }) {
1661
+ if (orientation === "left") {
1662
+ return /* @__PURE__ */ jsx(ChevronLeft, { type: "regular", className: "size-5" });
1663
+ }
1664
+ return /* @__PURE__ */ jsx(ChevronRight, { type: "regular", className: "size-5" });
1665
+ }
1666
+ function DatePickerDayButton({
1667
+ day,
1668
+ modifiers,
1669
+ children,
1670
+ className,
1671
+ ...buttonProps
1672
+ }) {
1673
+ return /* @__PURE__ */ jsxs("button", { className: cn(className, "relative"), ...buttonProps, children: [
1674
+ children,
1675
+ modifiers.today && /* @__PURE__ */ jsx(
1676
+ "span",
1677
+ {
1678
+ className: cn(
1679
+ "absolute bottom-[3px] left-1/2 size-1 -translate-x-1/2 rounded-full",
1680
+ modifiers.selected ? "bg-text-inverse" : "bg-icon-critical"
1681
+ )
1682
+ }
1683
+ )
1684
+ ] });
1685
+ }
1686
+ function DatePicker({ type = "single", showOutsideDays = true, ...rest }) {
1687
+ const dayPickerProps = { ...rest, mode: type };
1688
+ const defaultClassNames = getDefaultClassNames();
1689
+ const [month, setMonth] = useState(
1690
+ dayPickerProps.month ?? dayPickerProps.defaultMonth ?? /* @__PURE__ */ new Date()
1691
+ );
1692
+ const rangeSelected = type === "range" ? rest.selected : void 0;
1693
+ const isRangeComplete = rangeSelected?.from != null && rangeSelected?.to != null;
1694
+ const handleMonthChange = (newMonth) => {
1695
+ setMonth(newMonth);
1696
+ dayPickerProps.onMonthChange?.(newMonth);
1697
+ };
1698
+ const handleDayClick = (day, modifiers, e) => {
1699
+ if (modifiers.outside) {
1700
+ setMonth(new Date(day.getFullYear(), day.getMonth()));
1701
+ }
1702
+ dayPickerProps.onDayClick?.(day, modifiers, e);
1703
+ };
1704
+ return /* @__PURE__ */ jsx(
1705
+ DayPicker,
1706
+ {
1707
+ ...dayPickerProps,
1708
+ month,
1709
+ onMonthChange: handleMonthChange,
1710
+ onDayClick: handleDayClick,
1711
+ showOutsideDays,
1712
+ formatters: {
1713
+ formatCaption: (date) => {
1714
+ const year = date.getFullYear();
1715
+ const month2 = String(date.getMonth() + 1).padStart(2, "0");
1716
+ return `${year}\uB144 ${month2}\uC6D4`;
1717
+ },
1718
+ formatWeekdayName: (date) => date.toLocaleDateString("en-US", { weekday: "short" }),
1719
+ ...dayPickerProps.formatters
1720
+ },
1721
+ components: {
1722
+ Chevron: DatePickerChevron,
1723
+ DayButton: DatePickerDayButton,
1724
+ ...dayPickerProps.components
1725
+ },
1726
+ classNames: {
1727
+ root: cn(
1728
+ defaultClassNames.root,
1729
+ "rounded-medium border border-border-primary bg-background-overlay p-4 shadow-medium"
1730
+ ),
1731
+ months: cn(defaultClassNames.months, "relative"),
1732
+ month: cn(defaultClassNames.month, "flex flex-col gap-2"),
1733
+ month_caption: cn(defaultClassNames.month_caption, "flex h-7 items-center px-0.5"),
1734
+ caption_label: "text-body-2 font-semibold text-text-primary",
1735
+ nav: cn(defaultClassNames.nav, "absolute right-0 top-0 flex h-7 items-center gap-2"),
1736
+ button_previous: cn(
1737
+ defaultClassNames.button_previous,
1738
+ "flex size-7 items-center justify-center rounded-medium hover:bg-elevation-elevation-2"
1739
+ ),
1740
+ button_next: cn(
1741
+ defaultClassNames.button_next,
1742
+ "flex size-7 items-center justify-center rounded-medium hover:bg-elevation-elevation-2"
1743
+ ),
1744
+ weekday: cn(
1745
+ defaultClassNames.weekday,
1746
+ "size-8 text-body-3 font-regular text-text-tertiary"
1747
+ ),
1748
+ month_grid: cn(
1749
+ defaultClassNames.month_grid,
1750
+ "border-separate border-spacing-x-0 border-spacing-y-1"
1751
+ ),
1752
+ week: cn(defaultClassNames.week, "overflow-hidden rounded-medium"),
1753
+ day: cn(defaultClassNames.day, "size-8 text-body-2 font-medium text-text-secondary"),
1754
+ day_button: cn(
1755
+ defaultClassNames.day_button,
1756
+ "size-8 cursor-pointer rounded-full hover:border hover:border-border-focused"
1757
+ ),
1758
+ outside: "!text-text-disabled",
1759
+ selected: cn(
1760
+ "[&>button]:bg-solid-primary-default",
1761
+ "[&>button]:text-text-inverse",
1762
+ "[&>button]:border-0",
1763
+ "[&>button]:hover:border-0"
1764
+ ),
1765
+ range_start: cn(
1766
+ "rounded-none",
1767
+ isRangeComplete && "[background:linear-gradient(to_right,transparent_50%,var(--color-elevation-elevation-2)_50%)]"
1768
+ ),
1769
+ range_end: cn(
1770
+ "rounded-none",
1771
+ isRangeComplete && "[background:linear-gradient(to_left,transparent_50%,var(--color-elevation-elevation-2)_50%)]"
1772
+ ),
1773
+ range_middle: cn(
1774
+ "bg-elevation-elevation-2 rounded-none",
1775
+ "[&>button]:!bg-transparent",
1776
+ "[&>button]:!text-text-secondary"
1777
+ ),
1778
+ ...dayPickerProps.classNames
1779
+ },
1780
+ modifiersClassNames: {
1781
+ today: "rdp-calendar-today",
1782
+ ...dayPickerProps.modifiersClassNames
1783
+ }
1784
+ }
1785
+ );
1786
+ }
1787
+ var TextAreaContext = createContext(null);
1788
+ var useTextAreaContext = () => {
1789
+ const context = useContext(TextAreaContext);
1790
+ if (!context) {
1791
+ throw new Error("TextArea components must be used within a TextArea");
1792
+ }
1793
+ return context;
1794
+ };
1795
+ var textAreaVariants = {
1796
+ container: commonInputVariants.container,
1797
+ label: commonInputVariants.label,
1798
+ field: cva(
1799
+ "scrollbar-overlay block w-full resize-none rounded-medium border transition-colors focus:outline-none",
1800
+ {
1801
+ variants: {
1802
+ variant: {
1803
+ fill: "border-transparent bg-elevation-elevation-2",
1804
+ line: "border-border-primary"
1805
+ },
1806
+ size: {
1807
+ xsmall: "min-h-[60px] px-1.5 py-[3.5px] text-body-3",
1808
+ small: "min-h-[80px] px-2 py-1 text-body-2",
1809
+ medium: "min-h-[100px] px-2.5 py-1.5 text-body-2",
1810
+ large: "min-h-[120px] px-3 py-[9px] text-body-1"
1811
+ },
1812
+ state: {
1813
+ default: "text-text-primary placeholder:text-text-tertiary",
1814
+ focused: "text-text-primary placeholder:text-text-tertiary",
1815
+ error: "text-text-primary placeholder:text-text-tertiary",
1816
+ disabled: "cursor-not-allowed text-text-disabled placeholder:text-text-disabled"
1817
+ }
1818
+ },
1819
+ compoundVariants: [
1820
+ { variant: "fill", state: "focused", class: "border-border-focused" },
1821
+ { variant: "fill", state: "error", class: "border-border-critical" },
1822
+ {
1823
+ variant: "fill",
1824
+ state: "disabled",
1825
+ class: "bg-elevation-elevation-2 border-transparent"
1826
+ },
1827
+ { variant: "line", state: "focused", class: "border-border-focused" },
1828
+ { variant: "line", state: "error", class: "border-border-critical" },
1829
+ { variant: "line", state: "disabled", class: "border-border-primary" }
1830
+ ],
1831
+ defaultVariants: { variant: "fill", size: "medium", state: "default" }
1832
+ }
1833
+ ),
1834
+ descriptionContainer: cva("flex flex-row items-center justify-between", {
1835
+ variants: {
1836
+ size: {
1837
+ xsmall: "gap-0.5 text-caption",
1838
+ small: "gap-1 text-body-3",
1839
+ medium: "gap-1 text-body-3",
1840
+ large: "gap-1 text-body-2"
1841
+ }
1842
+ },
1843
+ defaultVariants: { size: "medium" }
1844
+ }),
1845
+ description: commonInputVariants.description,
1846
+ counter: cva("text-nowrap font-regular", {
1847
+ variants: {
1848
+ disabled: {
1849
+ true: "text-gray-04",
1850
+ false: "text-text-tertiary"
1851
+ }
1852
+ },
1853
+ defaultVariants: { disabled: false }
1854
+ })
1855
+ };
1856
+ var TextArea = React2.forwardRef(
1857
+ ({
1858
+ children,
1859
+ variant = "fill",
1860
+ size = "medium",
1861
+ error = false,
1862
+ disabled = false,
1863
+ value = "",
1864
+ maxLength,
1865
+ className,
1866
+ ...textAreaProps
1867
+ }, ref) => {
1868
+ const uniqueId = useId();
1869
+ const id = `text-area-${uniqueId}`;
1870
+ const { onChange, ...restTextAreaProps } = textAreaProps;
1871
+ return /* @__PURE__ */ jsx(
1872
+ TextAreaContext.Provider,
1873
+ {
1874
+ value: { variant, size, error, disabled, id, value, maxLength, onChange },
1875
+ children: /* @__PURE__ */ jsx("div", { ref, className: cn(textAreaVariants.container, className), children: children || /* @__PURE__ */ jsx(TextArea.Field, { ...restTextAreaProps }) })
1876
+ }
1877
+ );
1878
+ }
1879
+ );
1880
+ TextArea.Label = React2.forwardRef(
1881
+ ({ children, required = false, className }, ref) => {
1882
+ const { size, disabled, id } = useTextAreaContext();
1883
+ return /* @__PURE__ */ jsx(
1884
+ "label",
1885
+ {
1886
+ ref,
1887
+ htmlFor: id,
1888
+ className: cn(textAreaVariants.label({ size, disabled, required }), className),
1889
+ children
1890
+ }
1891
+ );
1892
+ }
1893
+ );
1894
+ TextArea.Field = React2.forwardRef(
1895
+ ({ className, onFocus, onBlur, ...props }, ref) => {
1896
+ const {
1897
+ variant,
1898
+ size,
1899
+ error,
1900
+ disabled,
1901
+ id,
1902
+ maxLength,
1903
+ value: contextValue,
1904
+ onChange: contextOnChange
1905
+ } = useTextAreaContext();
1906
+ const [focused, setFocused] = React2.useState(false);
1907
+ const handleFocus = (e) => {
1908
+ setFocused(true);
1909
+ onFocus?.(e);
1910
+ };
1911
+ const handleBlur = (e) => {
1912
+ setFocused(false);
1913
+ onBlur?.(e);
1914
+ };
1915
+ const state = disabled ? "disabled" : error ? "error" : focused ? "focused" : "default";
1916
+ const isControlled = contextValue !== void 0;
1917
+ return /* @__PURE__ */ jsx(
1918
+ "textarea",
1919
+ {
1920
+ ref,
1921
+ id,
1922
+ disabled,
1923
+ maxLength,
1924
+ className: cn(textAreaVariants.field({ variant, size, state }), className),
1925
+ onFocus: handleFocus,
1926
+ onBlur: handleBlur,
1927
+ onChange: (e) => {
1928
+ contextOnChange?.(e);
1929
+ },
1930
+ ...isControlled ? { value: contextValue } : {},
1931
+ ...props
1932
+ }
1933
+ );
1934
+ }
1935
+ );
1936
+ TextArea.Description = React2.forwardRef(
1937
+ ({ children, showCounter = true, className }, ref) => {
1938
+ const { size, error, disabled, value = "", maxLength } = useTextAreaContext();
1939
+ if (!children && (!showCounter || !maxLength)) {
1940
+ return null;
1941
+ }
1942
+ return /* @__PURE__ */ jsxs("div", { ref, className: cn(textAreaVariants.descriptionContainer({ size }), className), children: [
1943
+ children && /* @__PURE__ */ jsx("p", { className: cn(textAreaVariants.description({ size, error, disabled }), "flex-1"), children }),
1944
+ showCounter && maxLength && /* @__PURE__ */ jsxs("span", { className: cn(textAreaVariants.counter({ disabled })), children: [
1945
+ value.length,
1946
+ "/",
1947
+ maxLength
1948
+ ] })
1949
+ ] });
1950
+ }
1951
+ );
1952
+ TextArea.displayName = "TextArea";
1953
+ TextArea.Label.displayName = "TextArea.Label";
1954
+ TextArea.Field.displayName = "TextArea.Field";
1955
+ TextArea.Description.displayName = "TextArea.Description";
1956
+ var TextFieldContext = createContext(null);
1957
+ var useTextFieldContext = () => {
1958
+ const context = useContext(TextFieldContext);
1959
+ if (!context) {
1960
+ throw new Error("TextField components must be used within a TextField");
1961
+ }
1962
+ return context;
1963
+ };
1964
+ var textFieldVariants = {
1965
+ container: commonInputVariants.container,
1966
+ label: commonInputVariants.label,
1967
+ wrapper: cva(
1968
+ "flex w-full flex-row items-center rounded-medium border transition-colors focus-within:border-border-focused focus-within:outline-none",
1969
+ {
1970
+ variants: {
1971
+ variant: {
1972
+ fill: "border-transparent bg-elevation-elevation-2",
1973
+ line: "border-border-primary"
1974
+ },
1975
+ size: {
1976
+ xsmall: "h-6 gap-0 px-1",
1977
+ small: "h-7 gap-0.5 px-1.5",
1978
+ medium: "h-8 gap-0.5 px-2",
1979
+ large: "h-10 gap-1 px-2.5"
1980
+ },
1981
+ state: {
1982
+ default: "text-text-primary",
1983
+ error: "text-text-primary",
1984
+ disabled: "cursor-not-allowed text-text-disabled"
1985
+ }
1986
+ },
1987
+ compoundVariants: [
1988
+ { variant: "fill", state: "error", class: "border-border-critical" },
1989
+ {
1990
+ variant: "fill",
1991
+ state: "disabled",
1992
+ class: "bg-elevation-elevation-2 border-transparent"
1993
+ },
1994
+ { variant: "line", state: "error", class: "border-border-critical" },
1995
+ { variant: "line", state: "disabled", class: "border-border-primary" }
1996
+ ],
1997
+ defaultVariants: { variant: "fill", size: "medium", state: "default" }
1998
+ }
1999
+ ),
2000
+ input: cva(
2001
+ "w-full border-none bg-transparent p-0 focus:outline-none focus:ring-0 disabled:cursor-not-allowed",
2002
+ {
2003
+ variants: {
2004
+ size: {
2005
+ xsmall: "text-body-3 placeholder:text-body-3",
2006
+ small: "text-body-2 placeholder:text-body-2",
2007
+ medium: "text-body-2 placeholder:text-body-2",
2008
+ large: "text-body-1 placeholder:text-body-1"
2009
+ },
2010
+ state: {
2011
+ default: "text-text-primary placeholder:text-text-tertiary",
2012
+ error: "text-text-primary placeholder:text-text-tertiary",
2013
+ disabled: "text-text-disabled placeholder:text-text-disabled"
2014
+ }
2015
+ },
2016
+ defaultVariants: { size: "medium", state: "default" }
2017
+ }
2018
+ ),
2019
+ description: cva("mt-0.5 font-regular text-text-tertiary", {
2020
+ variants: {
2021
+ size: {
2022
+ xsmall: "text-caption",
2023
+ small: "text-body-3",
2024
+ medium: "text-body-3",
2025
+ large: "text-body-2"
2026
+ },
2027
+ error: {
2028
+ true: "text-text-critical",
2029
+ false: ""
2030
+ },
2031
+ disabled: {
2032
+ true: "text-text-disabled",
2033
+ false: ""
2034
+ }
2035
+ },
2036
+ compoundVariants: [
2037
+ {
2038
+ disabled: true,
2039
+ error: true,
2040
+ class: "text-text-disabled"
2041
+ // disabled가 error보다 우선
2042
+ }
2043
+ ],
2044
+ defaultVariants: { size: "medium", error: false, disabled: false }
2045
+ }),
2046
+ subText: cva("ml-1 shrink-0 font-regular", {
2047
+ variants: {
2048
+ size: {
2049
+ xsmall: "text-body-3",
2050
+ small: "text-body-2",
2051
+ medium: "text-body-2",
2052
+ large: "text-body-1"
2053
+ },
2054
+ disabled: {
2055
+ true: "text-text-disabled",
2056
+ false: "text-text-tertiary"
2057
+ }
2058
+ },
2059
+ defaultVariants: { size: "medium", disabled: false }
2060
+ }),
2061
+ icon: cva("shrink-0 text-icon-tertiary", {
2062
+ variants: {
2063
+ size: {
2064
+ xsmall: "size-4",
2065
+ small: "size-4",
2066
+ medium: "size-4",
2067
+ large: "size-5"
2068
+ }
2069
+ },
2070
+ defaultVariants: { size: "medium" }
2071
+ })
2072
+ };
2073
+ var TextField = forwardRef(
2074
+ ({
2075
+ children,
2076
+ variant = "fill",
2077
+ size = "medium",
2078
+ error = false,
2079
+ disabled = false,
2080
+ className,
2081
+ id: providedId,
2082
+ value,
2083
+ onChange,
2084
+ ...inputProps
2085
+ }, ref) => {
2086
+ const uniqueId = useId();
2087
+ const id = providedId || `text-field-${uniqueId}`;
2088
+ return /* @__PURE__ */ jsx(TextFieldContext.Provider, { value: { variant, size, error, disabled, id, value, onChange }, children: /* @__PURE__ */ jsx("div", { ref, className: cn(textFieldVariants.container, className), children: children || /* @__PURE__ */ jsx(TextField.Input, { ...inputProps }) }) });
2089
+ }
2090
+ );
2091
+ TextField.Label = forwardRef(
2092
+ ({ children, required = false, className }, ref) => {
2093
+ const { size, disabled, id } = useTextFieldContext();
2094
+ return /* @__PURE__ */ jsx(
2095
+ "label",
2096
+ {
2097
+ ref,
2098
+ htmlFor: id,
2099
+ className: cn(textFieldVariants.label({ size, disabled, required }), className),
2100
+ children
2101
+ }
2102
+ );
2103
+ }
2104
+ );
2105
+ TextField.Input = forwardRef(
2106
+ ({ className, leftIcon, rightIcon, subText, ...props }, ref) => {
2107
+ const {
2108
+ variant,
2109
+ size,
2110
+ error,
2111
+ disabled,
2112
+ id,
2113
+ value: contextValue,
2114
+ onChange: contextOnChange
2115
+ } = useTextFieldContext();
2116
+ const state = disabled ? "disabled" : error ? "error" : "default";
2117
+ const isControlled = contextValue !== void 0;
2118
+ return /* @__PURE__ */ jsxs("div", { className: cn(textFieldVariants.wrapper({ variant, size, state }), className), children: [
2119
+ leftIcon && /* @__PURE__ */ jsx(
2120
+ "span",
2121
+ {
2122
+ className: cn("flex items-center justify-center", textFieldVariants.icon({ size })),
2123
+ children: leftIcon
2124
+ }
2125
+ ),
2126
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-row items-center justify-center", children: [
2127
+ /* @__PURE__ */ jsx(
2128
+ "input",
2129
+ {
2130
+ ref,
2131
+ id,
2132
+ disabled,
2133
+ className: cn(textFieldVariants.input({ size, state })),
2134
+ onChange: (e) => {
2135
+ contextOnChange?.(e);
2136
+ },
2137
+ ...props,
2138
+ ...isControlled ? { value: contextValue } : {}
2139
+ }
2140
+ ),
2141
+ subText && /* @__PURE__ */ jsx("span", { className: cn(textFieldVariants.subText({ size, disabled })), children: subText })
2142
+ ] }),
2143
+ rightIcon && /* @__PURE__ */ jsx(
2144
+ "span",
2145
+ {
2146
+ className: cn("flex items-center justify-center", textFieldVariants.icon({ size })),
2147
+ children: rightIcon
2148
+ }
2149
+ )
2150
+ ] });
2151
+ }
2152
+ );
2153
+ TextField.Description = forwardRef(
2154
+ ({ children, className }, ref) => {
2155
+ const { size, error, disabled } = useTextFieldContext();
2156
+ return /* @__PURE__ */ jsx(
2157
+ "p",
2158
+ {
2159
+ ref,
2160
+ className: cn(textFieldVariants.description({ size, error, disabled }), className),
2161
+ children
2162
+ }
2163
+ );
2164
+ }
2165
+ );
2166
+ TextField.displayName = "TextField";
2167
+ TextField.Label.displayName = "TextField.Label";
2168
+ TextField.Input.displayName = "TextField.Input";
2169
+ TextField.Description.displayName = "TextField.Description";
2170
+ function ScrollBar({
2171
+ className,
2172
+ orientation = "vertical",
2173
+ ...props
2174
+ }) {
2175
+ return /* @__PURE__ */ jsx(
2176
+ ScrollAreaPrimitive.ScrollAreaScrollbar,
2177
+ {
2178
+ "data-slot": "scroll-area-scrollbar",
2179
+ orientation,
2180
+ className: cn(
2181
+ "flex touch-none select-none transition-opacity",
2182
+ orientation === "vertical" && "w-[10px] p-[2px] opacity-0 duration-300 ease-out group-hover:opacity-100",
2183
+ orientation === "horizontal" && "h-[10px] flex-col px-[3px] py-[2px]",
2184
+ className
2185
+ ),
2186
+ ...props,
2187
+ children: /* @__PURE__ */ jsx(
2188
+ ScrollAreaPrimitive.ScrollAreaThumb,
2189
+ {
2190
+ "data-slot": "scroll-area-thumb",
2191
+ className: "relative flex-1 rounded-full bg-component-scroll"
2192
+ }
2193
+ )
2194
+ }
2195
+ );
2196
+ }
2197
+ function ScrollArea({
2198
+ className,
2199
+ children,
2200
+ onScroll,
2201
+ scrollRef,
2202
+ hideVerticalScrollbar = false,
2203
+ hideHorizontalScrollbar = false,
2204
+ disableHorizontalScroll = false,
2205
+ ...props
2206
+ }) {
2207
+ return /* @__PURE__ */ jsxs(
2208
+ ScrollAreaPrimitive.Root,
2209
+ {
2210
+ "data-slot": "scroll-area",
2211
+ className: cn("group relative overflow-hidden", className),
2212
+ ...props,
2213
+ children: [
2214
+ /* @__PURE__ */ jsx(
2215
+ ScrollAreaPrimitive.Viewport,
2216
+ {
2217
+ "data-slot": "scroll-area-viewport",
2218
+ ref: scrollRef,
2219
+ onScroll,
2220
+ className: cn(
2221
+ "size-full rounded-[inherit]",
2222
+ disableHorizontalScroll && "!overflow-x-hidden"
2223
+ ),
2224
+ children
2225
+ }
2226
+ ),
2227
+ !hideVerticalScrollbar && /* @__PURE__ */ jsx(ScrollBar, { orientation: "vertical", forceMount: true }),
2228
+ !(hideHorizontalScrollbar || disableHorizontalScroll) && /* @__PURE__ */ jsx(ScrollBar, { orientation: "horizontal", forceMount: true }),
2229
+ /* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, {})
2230
+ ]
2231
+ }
2232
+ );
2233
+ }
2234
+ var MODAL_PADDING = {
2235
+ body: "px-4 pb-4",
2236
+ footer: "px-4 py-3"
2237
+ };
2238
+ var ModalContext = createContext({ size: "medium" });
2239
+ var Modal = DialogPrimitive.Root;
2240
+ Modal.Trigger = DialogPrimitive.Trigger;
2241
+ Modal.Portal = DialogPrimitive.Portal;
2242
+ Modal.Close = forwardRef(({ size, ...props }, ref) => {
2243
+ const { size: modalSize } = useContext(ModalContext);
2244
+ return /* @__PURE__ */ jsx(DialogPrimitive.Close, { asChild: true, children: /* @__PURE__ */ jsx(
2245
+ Button,
2246
+ {
2247
+ ...props,
2248
+ ref,
2249
+ color: "assistive",
2250
+ variant: "contained",
2251
+ size: size ?? (modalSize === "fullsize" ? "large" : "medium")
2252
+ }
2253
+ ) });
2254
+ });
2255
+ Modal.Overlay = forwardRef(
2256
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2257
+ DialogPrimitive.Overlay,
2258
+ {
2259
+ ref,
2260
+ className: cn(
2261
+ "fixed inset-0 z-50 bg-component-dim data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
2262
+ className
2263
+ ),
2264
+ ...props
2265
+ }
2266
+ )
2267
+ );
2268
+ Modal.Content = forwardRef(
2269
+ ({ className, children, size = "medium", onInteractOutside, onFocusOutside, ...props }, ref) => {
2270
+ const isFullSize = size === "fullsize";
2271
+ const sizeWidthMap = {
2272
+ small: "max-w-[640px]",
2273
+ medium: "max-w-[800px]",
2274
+ large: "max-w-[960px]",
2275
+ xlarge: "max-w-[1120px]"
2276
+ };
2277
+ const shouldPreventDismissForSelect = (target) => {
2278
+ const isSelectOpen = Boolean(
2279
+ document.querySelector('[data-radix-select-content][data-state="open"]')
2280
+ );
2281
+ if (isSelectOpen) {
2282
+ return true;
2283
+ }
2284
+ if (!(target instanceof Element)) {
2285
+ return false;
2286
+ }
2287
+ return Boolean(
2288
+ target.closest("[data-radix-select-content]") || target.closest("[data-radix-select-viewport]")
2289
+ );
2290
+ };
2291
+ const handleInteractOutside = (event) => {
2292
+ if (shouldPreventDismissForSelect(event.target)) {
2293
+ event.preventDefault();
2294
+ }
2295
+ onInteractOutside?.(event);
2296
+ };
2297
+ return /* @__PURE__ */ jsx(ModalContext.Provider, { value: { size }, children: /* @__PURE__ */ jsxs(Modal.Portal, { children: [
2298
+ /* @__PURE__ */ jsx(Modal.Overlay, {}),
2299
+ /* @__PURE__ */ jsx(
2300
+ DialogPrimitive.Content,
2301
+ {
2302
+ ref,
2303
+ className: cn(
2304
+ // 공통 스타일
2305
+ "fixed z-50 flex flex-col rounded-strong border border-border-primary bg-elevation-elevation-0 duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
2306
+ // fullsize일 때
2307
+ isFullSize ? "inset-0 m-10" : (
2308
+ // 일반 모달일 때
2309
+ cn(
2310
+ "left-[50%] top-[50%] w-full max-h-[90vh] translate-x-[-50%] translate-y-[-50%] shadow-strong data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
2311
+ sizeWidthMap[size]
2312
+ )
2313
+ ),
2314
+ className
2315
+ ),
2316
+ ...props,
2317
+ onInteractOutside: handleInteractOutside,
2318
+ children
2319
+ }
2320
+ )
2321
+ ] }) });
2322
+ }
2323
+ );
2324
+ Modal.Header = forwardRef(
2325
+ ({ className, line = false, showCloseIcon = true, children, ...props }, ref) => {
2326
+ const { size } = useContext(ModalContext);
2327
+ return /* @__PURE__ */ jsxs(
2328
+ "div",
2329
+ {
2330
+ ref,
2331
+ className: cn(
2332
+ "flex shrink-0 flex-row items-center gap-2 pl-4 pr-3",
2333
+ line && "border-b border-border-primary",
2334
+ size === "fullsize" ? "h-16" : "h-14",
2335
+ className
2336
+ ),
2337
+ ...props,
2338
+ children: [
2339
+ /* @__PURE__ */ jsx("div", { className: "flex flex-1 flex-row items-center gap-1", children }),
2340
+ showCloseIcon && /* @__PURE__ */ jsx(
2341
+ DialogPrimitive.Close,
2342
+ {
2343
+ className: cn(
2344
+ "flex shrink-0 items-center justify-center size-8 rounded-medium text-icon-secondary transition-colors hover:bg-elevation-elevation-2 focus:outline-none disabled:pointer-events-none"
2345
+ ),
2346
+ children: /* @__PURE__ */ jsx(X, { type: "regular", size: 20 })
2347
+ }
2348
+ )
2349
+ ]
2350
+ }
2351
+ );
2352
+ }
2353
+ );
2354
+ Modal.Body = forwardRef(
2355
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(
2356
+ "div",
2357
+ {
2358
+ ref,
2359
+ className: cn(
2360
+ "flex-1 flex flex-col min-h-0 h-full",
2361
+ "[&_[data-slot=scroll-area-viewport]>div]:h-full"
2362
+ ),
2363
+ ...props,
2364
+ children: /* @__PURE__ */ jsx(ScrollArea, { className: "h-full flex flex-col", children: /* @__PURE__ */ jsx("div", { className: cn(MODAL_PADDING.body, className), children }) })
2365
+ }
2366
+ )
2367
+ );
2368
+ Modal.Footer = forwardRef(
2369
+ ({ className, line = true, ...props }, ref) => {
2370
+ const { size } = useContext(ModalContext);
2371
+ return /* @__PURE__ */ jsx(
2372
+ "div",
2373
+ {
2374
+ ref,
2375
+ className: cn(
2376
+ "flex flex-row items-center justify-between",
2377
+ line && "border-t border-border-primary",
2378
+ size === "fullsize" ? "gap-3" : "h-14 gap-3",
2379
+ MODAL_PADDING.footer,
2380
+ className
2381
+ ),
2382
+ ...props
2383
+ }
2384
+ );
2385
+ }
2386
+ );
2387
+ Modal.FooterDescription = forwardRef(
2388
+ ({ className, error = false, icon, children, ...props }, ref) => {
2389
+ const { size } = useContext(ModalContext);
2390
+ const isLargeFooter = size === "fullsize";
2391
+ return /* @__PURE__ */ jsxs(
2392
+ "div",
2393
+ {
2394
+ ref,
2395
+ className: cn(
2396
+ "flex flex-row items-center gap-1",
2397
+ isLargeFooter ? "text-body-2" : "text-body-3",
2398
+ error ? "text-text-critical" : "text-text-tertiary",
2399
+ className
2400
+ ),
2401
+ ...props,
2402
+ children: [
2403
+ icon && /* @__PURE__ */ jsx("span", { className: "flex shrink-0 size-4 items-center justify-center [&>svg]:size-4", children: icon }),
2404
+ children
2405
+ ]
2406
+ }
2407
+ );
2408
+ }
2409
+ );
2410
+ Modal.Actions = forwardRef(({ className, ...props }, ref) => {
2411
+ const { size } = useContext(ModalContext);
2412
+ return /* @__PURE__ */ jsx(
2413
+ "div",
2414
+ {
2415
+ ref,
2416
+ className: cn(
2417
+ "ml-auto flex flex-row items-center",
2418
+ size === "fullsize" ? "gap-3" : "gap-2",
2419
+ className
2420
+ ),
2421
+ ...props
2422
+ }
2423
+ );
2424
+ });
2425
+ Modal.Action = forwardRef(
2426
+ ({ color = "primary", size, ...props }, ref) => {
2427
+ const { size: modalSize } = useContext(ModalContext);
2428
+ return /* @__PURE__ */ jsx(DialogPrimitive.Close, { asChild: true, children: /* @__PURE__ */ jsx(
2429
+ Button,
2430
+ {
2431
+ ...props,
2432
+ ref,
2433
+ color,
2434
+ variant: "contained",
2435
+ size: size ?? (modalSize === "fullsize" ? "large" : "medium")
2436
+ }
2437
+ ) });
2438
+ }
2439
+ );
2440
+ Modal.Title = forwardRef(
2441
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2442
+ DialogPrimitive.Title,
2443
+ {
2444
+ ref,
2445
+ className: cn(
2446
+ "text-title-2 font-semibold leading-none tracking-tight text-text-primary",
2447
+ className
2448
+ ),
2449
+ ...props
2450
+ }
2451
+ )
2452
+ );
2453
+ Modal.Description = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2454
+ DialogPrimitive.Description,
2455
+ {
2456
+ ref,
2457
+ className: cn("text-body-2 text-text-tertiary", className),
2458
+ ...props
2459
+ }
2460
+ ));
2461
+ Modal.displayName = "Modal";
2462
+ Modal.Trigger.displayName = "Modal.Trigger";
2463
+ Modal.Portal.displayName = "Modal.Portal";
2464
+ Modal.Close.displayName = "Modal.Close";
2465
+ Modal.Overlay.displayName = "Modal.Overlay";
2466
+ Modal.Content.displayName = "Modal.Content";
2467
+ Modal.Header.displayName = "Modal.Header";
2468
+ Modal.Body.displayName = "Modal.Body";
2469
+ Modal.Footer.displayName = "Modal.Footer";
2470
+ Modal.FooterDescription.displayName = "Modal.FooterDescription";
2471
+ Modal.Actions.displayName = "Modal.Actions";
2472
+ Modal.Action.displayName = "Modal.Action";
2473
+ Modal.Title.displayName = "Modal.Title";
2474
+ Modal.Description.displayName = "Modal.Description";
2475
+ var MessageBoxContext = createContext({ variant: "default" });
2476
+ var MessageBoxRoot = (props) => /* @__PURE__ */ jsx(DialogPrimitive.Root, { ...props });
2477
+ var MessageBox = MessageBoxRoot;
2478
+ MessageBox.Trigger = DialogPrimitive.Trigger;
2479
+ MessageBox.Content = forwardRef(({ className, children, variant = "default", ...props }, ref) => /* @__PURE__ */ jsx(MessageBoxContext.Provider, { value: { variant }, children: /* @__PURE__ */ jsxs(DialogPrimitive.Portal, { children: [
2480
+ /* @__PURE__ */ jsx(
2481
+ DialogPrimitive.Overlay,
2482
+ {
2483
+ className: cn(
2484
+ "fixed inset-0 z-50 bg-component-dim data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0"
2485
+ )
2486
+ }
2487
+ ),
2488
+ /* @__PURE__ */ jsx(
2489
+ DialogPrimitive.Content,
2490
+ {
2491
+ ref,
2492
+ className: cn(
2493
+ "fixed left-[50%] top-[50%] z-50 flex w-[400px] translate-x-[-50%] translate-y-[-50%] flex-col items-end gap-4 rounded-medium border border-border-primary bg-elevation-elevation-0 p-4 shadow-strong duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
2494
+ className
2495
+ ),
2496
+ ...props,
2497
+ children
2498
+ }
2499
+ )
2500
+ ] }) }));
2501
+ MessageBox.Title = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2502
+ DialogPrimitive.Title,
2503
+ {
2504
+ ref,
2505
+ className: cn("w-full text-title-2 font-semibold text-text-primary", className),
2506
+ ...props
2507
+ }
2508
+ ));
2509
+ MessageBox.Description = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2510
+ DialogPrimitive.Description,
2511
+ {
2512
+ ref,
2513
+ className: cn("w-full text-body-2 text-text-secondary", className),
2514
+ ...props
2515
+ }
2516
+ ));
2517
+ MessageBox.Actions = forwardRef(
2518
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("flex flex-row gap-2", className), ...props })
2519
+ );
2520
+ MessageBox.Cancel = forwardRef(
2521
+ ({ size = "medium", ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Close, { asChild: true, children: /* @__PURE__ */ jsx(Button, { ref, color: "assistive", variant: "contained", size, ...props }) })
2522
+ );
2523
+ MessageBox.Action = forwardRef(
2524
+ ({ size = "medium", ...props }, ref) => {
2525
+ const { variant } = useContext(MessageBoxContext);
2526
+ return /* @__PURE__ */ jsx(DialogPrimitive.Close, { asChild: true, children: /* @__PURE__ */ jsx(
2527
+ Button,
2528
+ {
2529
+ ref,
2530
+ color: variant === "critical" ? "critical" : "primary",
2531
+ variant: "contained",
2532
+ size,
2533
+ ...props
2534
+ }
2535
+ ) });
2536
+ }
2537
+ );
2538
+ MessageBox.displayName = "MessageBox";
2539
+ MessageBox.Trigger.displayName = "MessageBox.Trigger";
2540
+ MessageBox.Content.displayName = "MessageBox.Content";
2541
+ MessageBox.Title.displayName = "MessageBox.Title";
2542
+ MessageBox.Description.displayName = "MessageBox.Description";
2543
+ MessageBox.Actions.displayName = "MessageBox.Actions";
2544
+ MessageBox.Cancel.displayName = "MessageBox.Cancel";
2545
+ MessageBox.Action.displayName = "MessageBox.Action";
2546
+ var containerVariants4 = cva("inset-0 z-[49] flex items-center justify-center", {
2547
+ variants: {
2548
+ position: {
2549
+ fixed: "fixed",
2550
+ absolute: "absolute"
2551
+ },
2552
+ blockInteraction: {
2553
+ true: "pointer-events-auto",
2554
+ false: "pointer-events-none"
2555
+ }
2556
+ },
2557
+ defaultVariants: {
2558
+ position: "fixed",
2559
+ blockInteraction: false
2560
+ }
2561
+ });
2562
+ var overlayVariants = cva("absolute inset-0 transition-opacity duration-150", {
2563
+ variants: {
2564
+ visible: {
2565
+ true: "opacity-100",
2566
+ false: "opacity-0"
2567
+ },
2568
+ tone: {
2569
+ // 대비감 높은 톤 설정 추후 디자인 시스템에서 추가 되어야함
2570
+ auto: "bg-black/30 dark:bg-white/10",
2571
+ dark: "bg-black/50",
2572
+ light: "bg-white/70",
2573
+ brand: "bg-primary/20"
2574
+ }
2575
+ },
2576
+ defaultVariants: {
2577
+ visible: true,
2578
+ tone: "auto"
2579
+ }
2580
+ });
2581
+ var spinnerVariants = cva(
2582
+ "z-50 shrink-0 animate-spin rounded-full border-elevation-elevation-4 border-t-transparent",
2583
+ {
2584
+ variants: {
2585
+ size: {
2586
+ small: "size-6 border-2",
2587
+ medium: "size-9 border-[3px]",
2588
+ large: "size-12 border-4"
2589
+ }
2590
+ },
2591
+ defaultVariants: {
2592
+ size: "large"
2593
+ }
2594
+ }
2595
+ );
2596
+ var Loading = forwardRef(
2597
+ ({
2598
+ isLoading = true,
2599
+ dim = true,
2600
+ blockInteraction = false,
2601
+ position = "fixed",
2602
+ size = "medium",
2603
+ containerClassName,
2604
+ overlayClassName,
2605
+ spinnerClassName,
2606
+ className,
2607
+ ...props
2608
+ }, ref) => {
2609
+ if (!isLoading) {
2610
+ return null;
2611
+ }
2612
+ return /* @__PURE__ */ jsxs(
2613
+ "div",
2614
+ {
2615
+ ref,
2616
+ role: "status",
2617
+ "aria-busy": "true",
2618
+ className: cn(
2619
+ containerVariants4({ position, blockInteraction }),
2620
+ containerClassName,
2621
+ className
2622
+ ),
2623
+ ...props,
2624
+ children: [
2625
+ /* @__PURE__ */ jsx(
2626
+ "div",
2627
+ {
2628
+ "aria-hidden": "true",
2629
+ className: cn(overlayVariants({ visible: dim }), overlayClassName)
2630
+ }
2631
+ ),
2632
+ /* @__PURE__ */ jsx("div", { className: "relative z-50 flex size-full items-center justify-center", children: /* @__PURE__ */ jsx("div", { className: cn(spinnerVariants({ size }), spinnerClassName) }) })
2633
+ ]
2634
+ }
2635
+ );
2636
+ }
2637
+ );
2638
+ Loading.displayName = "Loading";
2639
+ var trackVariants = cva("w-full overflow-hidden rounded-full bg-elevation-elevation-3", {
2640
+ variants: {
2641
+ size: {
2642
+ small: "h-1",
2643
+ medium: "h-1.5",
2644
+ large: "h-2"
2645
+ }
2646
+ },
2647
+ defaultVariants: {
2648
+ size: "large"
2649
+ }
2650
+ });
2651
+ var gaugeVariants = cva("h-full rounded-full bg-icon-accent transition-[width] duration-300", {
2652
+ variants: {
2653
+ size: {
2654
+ small: "",
2655
+ medium: "",
2656
+ large: ""
2657
+ }
2658
+ },
2659
+ defaultVariants: {
2660
+ size: "medium"
2661
+ }
2662
+ });
2663
+ var Progress = forwardRef(
2664
+ ({ value = 0, max = 100, size = "medium", trackClassName, gaugeClassName, className, ...props }, ref) => {
2665
+ const clampedValue = Math.min(Math.max(value, 0), max);
2666
+ const percent = max > 0 ? clampedValue / max * 100 : 0;
2667
+ return /* @__PURE__ */ jsx(
2668
+ "div",
2669
+ {
2670
+ ref,
2671
+ role: "progressbar",
2672
+ "aria-valuenow": clampedValue,
2673
+ "aria-valuemin": 0,
2674
+ "aria-valuemax": max,
2675
+ className: cn(trackVariants({ size }), trackClassName, className),
2676
+ ...props,
2677
+ children: /* @__PURE__ */ jsx(
2678
+ "div",
2679
+ {
2680
+ className: cn(gaugeVariants({ size }), gaugeClassName),
2681
+ style: { width: `${percent}%` }
2682
+ }
2683
+ )
2684
+ }
2685
+ );
2686
+ }
2687
+ );
2688
+ Progress.displayName = "Progress";
2689
+ var positionFix = `
2690
+ [data-sonner-toaster][data-x-position='center'] [data-sonner-toast] {
2691
+ left: calc(var(--width) / 2) !important;
2692
+ transform: translateX(-50%) var(--y) !important;
2693
+ width: fit-content !important;
2694
+ max-width: calc(100% - var(--mobile-offset-left) * 2) !important;
2695
+ }
2696
+ @media (max-width: 600px) {
2697
+ [data-sonner-toaster] {
2698
+ left: 0 !important;
2699
+ right: 0 !important;
2700
+ }
2701
+ [data-sonner-toaster] [data-sonner-toast] {
2702
+ width: fit-content !important;
2703
+ max-width: calc(100% - var(--mobile-offset-left) - var(--mobile-offset-right)) !important;
2704
+ }
2705
+ [data-sonner-toaster][data-x-position='center'] [data-sonner-toast] {
2706
+ left: 50% !important;
2707
+ }
2708
+ [data-sonner-toaster][data-x-position='right'] [data-sonner-toast] {
2709
+ left: auto !important;
2710
+ right: var(--mobile-offset-right) !important;
2711
+ }
2712
+ [data-sonner-toaster][data-x-position='left'] [data-sonner-toast] {
2713
+ left: var(--mobile-offset-left) !important;
2714
+ right: auto !important;
2715
+ }
2716
+ }
2717
+ `;
2718
+ var Toaster = ({ ...props }) => {
2719
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
2720
+ /* @__PURE__ */ jsx("style", { children: positionFix }),
2721
+ /* @__PURE__ */ jsx(
2722
+ Toaster$1,
2723
+ {
2724
+ className: "toaster group [--toast-width:auto] [&_li]:!flex [&_li]:!items-center [&_li]:!justify-between [&_li]:!gap-2",
2725
+ closeButton: false,
2726
+ toastOptions: {
2727
+ closeButton: false
2728
+ },
2729
+ ...props
2730
+ }
2731
+ )
2732
+ ] });
2733
+ };
2734
+ Toaster.Container = React2.forwardRef(
2735
+ ({ className, children, ...props }, ref) => {
2736
+ return /* @__PURE__ */ jsx(
2737
+ "div",
2738
+ {
2739
+ ref,
2740
+ className: cn(
2741
+ "flex items-center gap-3 rounded-medium border border-border-primary bg-component-toast py-[10px] pl-3 pr-4 text-mono-light shadow-strong",
2742
+ "h-10 w-auto min-w-0 max-w-none",
2743
+ className
2744
+ ),
2745
+ ...props,
2746
+ children
2747
+ }
2748
+ );
2749
+ }
2750
+ );
2751
+ Toaster.Icon = React2.forwardRef(
2752
+ ({ className, children, ...props }, ref) => {
2753
+ return /* @__PURE__ */ jsx(
2754
+ "div",
2755
+ {
2756
+ ref,
2757
+ className: cn("flex shrink-0 items-center justify-center", className),
2758
+ ...props,
2759
+ children
2760
+ }
2761
+ );
2762
+ }
2763
+ );
2764
+ Toaster.Title = React2.forwardRef(
2765
+ ({ className, children, ...props }, ref) => {
2766
+ return /* @__PURE__ */ jsx(
2767
+ "div",
2768
+ {
2769
+ ref,
2770
+ className: cn(
2771
+ "flex-1 overflow-hidden text-ellipsis whitespace-nowrap text-body-2 font-medium",
2772
+ className
2773
+ ),
2774
+ ...props,
2775
+ children
2776
+ }
2777
+ );
2778
+ }
2779
+ );
2780
+ Toaster.Description = React2.forwardRef(
2781
+ ({ className, children, ...props }, ref) => {
2782
+ return /* @__PURE__ */ jsx(
2783
+ "div",
2784
+ {
2785
+ ref,
2786
+ className: cn(
2787
+ "w-full text-body-3 font-regular text-text-static-light/80",
2788
+ "overflow-hidden text-ellipsis",
2789
+ className
2790
+ ),
2791
+ ...props,
2792
+ children
2793
+ }
2794
+ );
2795
+ }
2796
+ );
2797
+ Toaster.Action = React2.forwardRef(
2798
+ ({ className, children, altText, ...props }, ref) => {
2799
+ return /* @__PURE__ */ jsx(
2800
+ "button",
2801
+ {
2802
+ ref,
2803
+ type: "button",
2804
+ className: cn(
2805
+ "flex h-7 min-h-[28px] w-auto min-w-[28px] shrink-0 items-center justify-center",
2806
+ "rounded-small bg-transparent px-0 py-0",
2807
+ "border-0 transition-colors",
2808
+ "hover:bg-solid-primary-hovered",
2809
+ "whitespace-nowrap",
2810
+ "cursor-pointer",
2811
+ "text-body-2",
2812
+ className
2813
+ ),
2814
+ "aria-label": altText,
2815
+ ...props,
2816
+ children: children || /* @__PURE__ */ jsx(X, { type: "regular", className: "size-4" })
2817
+ }
2818
+ );
2819
+ }
2820
+ );
2821
+ Toaster.displayName = "Toaster";
2822
+ Toaster.Container.displayName = "Toaster.Container";
2823
+ Toaster.Icon.displayName = "Toaster.Icon";
2824
+ Toaster.Title.displayName = "Toaster.Title";
2825
+ Toaster.Description.displayName = "Toaster.Description";
2826
+ Toaster.Action.displayName = "Toaster.Action";
2827
+ var ToastProvider = ({
2828
+ children,
2829
+ expand = true,
2830
+ richColors = false,
2831
+ closeButton = false,
2832
+ position = "top-center",
2833
+ duration = 4e3,
2834
+ visibleToasts = 10,
2835
+ toasterProps
2836
+ }) => {
2837
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
2838
+ children,
2839
+ /* @__PURE__ */ jsx(
2840
+ Toaster,
2841
+ {
2842
+ position,
2843
+ closeButton,
2844
+ richColors,
2845
+ expand,
2846
+ duration,
2847
+ visibleToasts,
2848
+ ...toasterProps
2849
+ }
2850
+ )
2851
+ ] });
2852
+ };
2853
+ function isToastOptions(input) {
2854
+ return typeof input === "object" && input !== null && "title" in input;
2855
+ }
2856
+ function extractToastParams(input, options) {
2857
+ if (isToastOptions(input)) {
2858
+ return {
2859
+ title: input.title,
2860
+ description: input.description,
2861
+ action: input.action,
2862
+ close: input.close
2863
+ };
2864
+ }
2865
+ return {
2866
+ title: input,
2867
+ description: options?.description,
2868
+ action: options?.action,
2869
+ close: options?.close
2870
+ };
2871
+ }
2872
+ function getSonnerOptions(options) {
2873
+ if (!options) {
2874
+ return void 0;
2875
+ }
2876
+ const { description: _description, action: _action, close: _close, ...sonnerOptions } = options;
2877
+ return sonnerOptions;
2878
+ }
2879
+ function ToastContent({
2880
+ id,
2881
+ icon,
2882
+ title,
2883
+ description,
2884
+ action,
2885
+ close
2886
+ }) {
2887
+ const hasExtra = description || action;
2888
+ if (hasExtra) {
2889
+ return /* @__PURE__ */ jsxs(Toaster.Container, { className: "h-auto min-h-12 flex-col items-start gap-1 py-3", children: [
2890
+ /* @__PURE__ */ jsxs("div", { className: "flex w-full items-center gap-2", children: [
2891
+ icon && /* @__PURE__ */ jsx(Toaster.Icon, { children: icon }),
2892
+ /* @__PURE__ */ jsx(Toaster.Title, { children: title }),
2893
+ close && /* @__PURE__ */ jsx(Toaster.Action, { className: "rounded-medium", onClick: () => toast$1.dismiss(id) })
2894
+ ] }),
2895
+ description && /* @__PURE__ */ jsx(Toaster.Description, { children: description }),
2896
+ action && /* @__PURE__ */ jsx(
2897
+ Toaster.Action,
2898
+ {
2899
+ className: "mt-1 text-text-info hover:text-text-info-hovered",
2900
+ onClick: () => {
2901
+ action.onClick();
2902
+ toast$1.dismiss(id);
2903
+ },
2904
+ children: action.label
2905
+ }
2906
+ )
2907
+ ] });
2908
+ }
2909
+ if (close) {
2910
+ return /* @__PURE__ */ jsxs(Toaster.Container, { className: "py-1.5 pr-1.5", children: [
2911
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 items-center gap-2 overflow-hidden", children: [
2912
+ icon && /* @__PURE__ */ jsx(Toaster.Icon, { children: icon }),
2913
+ /* @__PURE__ */ jsx(Toaster.Title, { children: title })
2914
+ ] }),
2915
+ /* @__PURE__ */ jsx(Toaster.Action, { className: "rounded-medium", onClick: () => toast$1.dismiss(id) })
2916
+ ] });
2917
+ }
2918
+ return /* @__PURE__ */ jsxs(Toaster.Container, { children: [
2919
+ icon && /* @__PURE__ */ jsx(Toaster.Icon, { children: icon }),
2920
+ /* @__PURE__ */ jsx(Toaster.Title, { children: title })
2921
+ ] });
2922
+ }
2923
+ function createToast(input, options, icon) {
2924
+ const { title, description, action, close } = extractToastParams(input, options);
2925
+ return toast$1.custom(
2926
+ (id) => /* @__PURE__ */ jsx(
2927
+ ToastContent,
2928
+ {
2929
+ id,
2930
+ icon,
2931
+ title,
2932
+ description,
2933
+ action,
2934
+ close
2935
+ }
2936
+ ),
2937
+ { unstyled: true, ...getSonnerOptions(options) }
2938
+ );
2939
+ }
2940
+ var toast = Object.assign(
2941
+ (input, options) => createToast(input, options),
2942
+ {
2943
+ success: (input, options) => createToast(
2944
+ input,
2945
+ options,
2946
+ /* @__PURE__ */ jsx(Check, { type: "regular", className: "size-5 text-icon-success" })
2947
+ ),
2948
+ error: (input, options) => createToast(
2949
+ input,
2950
+ options,
2951
+ /* @__PURE__ */ jsx(Error$1, { type: "regular", className: "size-5 text-icon-critical" })
2952
+ ),
2953
+ info: (input, options) => createToast(
2954
+ input,
2955
+ options,
2956
+ /* @__PURE__ */ jsx(Info, { type: "regular", className: "size-5 text-icon-static-light" })
2957
+ ),
2958
+ warning: (input, options) => createToast(
2959
+ input,
2960
+ options,
2961
+ /* @__PURE__ */ jsx(Warning, { type: "regular", className: "size-5 text-icon-warning" })
2962
+ ),
2963
+ loading: (input, options) => createToast(input, options),
2964
+ dismiss: toast$1.dismiss,
2965
+ promise: toast$1.promise,
2966
+ custom: toast$1.custom
2967
+ }
2968
+ );
2969
+ function toExtended(options) {
2970
+ if (!options) {
2971
+ return void 0;
2972
+ }
2973
+ const { description: _desc, action: _act, ...rest } = options;
2974
+ const converted = { ...rest };
2975
+ if (typeof _desc === "string") {
2976
+ converted.description = _desc;
2977
+ }
2978
+ return converted;
2979
+ }
2980
+ var DEFAULT_MESSAGES = {
2981
+ success: "\uC131\uACF5",
2982
+ error: "\uC624\uB958",
2983
+ info: "\uC815\uBCF4",
2984
+ warning: "\uACBD\uACE0",
2985
+ loading: "\uB85C\uB529"
2986
+ };
2987
+ function useToast() {
2988
+ const show = (message, options) => toast(message, toExtended(options));
2989
+ const dismiss = (toastId) => toast.dismiss(toastId);
2990
+ const showTypedToast = (type, message, options) => {
2991
+ const toastMessage = message ?? DEFAULT_MESSAGES[type];
2992
+ return toast[type](toastMessage, toExtended(options));
2993
+ };
2994
+ const promiseToast = (promiseTask, options, toastOptions) => toast$1.promise(promiseTask, {
2995
+ loading: options.loading ?? DEFAULT_MESSAGES.loading,
2996
+ success: options.success ?? DEFAULT_MESSAGES.success,
2997
+ error: options.error ?? DEFAULT_MESSAGES.error,
2998
+ finally: options.finally,
2999
+ description: options.description,
3000
+ ...toastOptions
3001
+ });
3002
+ const custom = (render, options) => toast.custom(render, options);
3003
+ return {
3004
+ show,
3005
+ dismiss,
3006
+ promise: promiseToast,
3007
+ custom,
3008
+ success: (message, options) => showTypedToast("success", message, options),
3009
+ error: (message, options) => showTypedToast("error", message, options),
3010
+ info: (message, options) => showTypedToast("info", message, options),
3011
+ warning: (message, options) => showTypedToast("warning", message, options),
3012
+ loading: (message, options) => showTypedToast("loading", message, options)
3013
+ };
3014
+ }
3015
+
3016
+ export { Avatar, Badge, Breadcrumb, Button, ButtonGroup, Checkbox, DatePicker, DoubleTag, IconButton, Loading, MessageBox, Modal, Progress, Radio, ScrollArea, ScrollBar, Segment, Select, Star, Switch, Tabs, Tag, TextArea, TextField, ToastProvider, Toaster, Tooltip, toast, useToast };
28
3017
  //# sourceMappingURL=index.mjs.map
29
3018
  //# sourceMappingURL=index.mjs.map