@exem-ui/react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/README.md +40 -0
  2. package/dist/Button-CMenVfb7.d.mts +35 -0
  3. package/dist/Button-CMenVfb7.d.ts +35 -0
  4. package/dist/Select-DMvWV_rF.d.mts +94 -0
  5. package/dist/Select-DMvWV_rF.d.ts +94 -0
  6. package/dist/avatar/index.d.mts +37 -0
  7. package/dist/avatar/index.d.ts +37 -0
  8. package/dist/avatar/index.js +13 -0
  9. package/dist/avatar/index.js.map +1 -0
  10. package/dist/avatar/index.mjs +4 -0
  11. package/dist/avatar/index.mjs.map +1 -0
  12. package/dist/badge/index.d.mts +29 -0
  13. package/dist/badge/index.d.ts +29 -0
  14. package/dist/badge/index.js +12 -0
  15. package/dist/badge/index.js.map +1 -0
  16. package/dist/badge/index.mjs +3 -0
  17. package/dist/badge/index.mjs.map +1 -0
  18. package/dist/breadcrumb/index.d.mts +43 -0
  19. package/dist/breadcrumb/index.d.ts +43 -0
  20. package/dist/breadcrumb/index.js +13 -0
  21. package/dist/breadcrumb/index.js.map +1 -0
  22. package/dist/breadcrumb/index.mjs +4 -0
  23. package/dist/breadcrumb/index.mjs.map +1 -0
  24. package/dist/button/index.d.mts +9 -0
  25. package/dist/button/index.d.ts +9 -0
  26. package/dist/button/index.js +29 -0
  27. package/dist/button/index.js.map +1 -0
  28. package/dist/button/index.mjs +12 -0
  29. package/dist/button/index.mjs.map +1 -0
  30. package/dist/checkbox/index.d.mts +54 -0
  31. package/dist/checkbox/index.d.ts +54 -0
  32. package/dist/checkbox/index.js +13 -0
  33. package/dist/checkbox/index.js.map +1 -0
  34. package/dist/checkbox/index.mjs +4 -0
  35. package/dist/checkbox/index.mjs.map +1 -0
  36. package/dist/chunk-34QIGWCT.mjs +10 -0
  37. package/dist/chunk-34QIGWCT.mjs.map +1 -0
  38. package/dist/chunk-3FPMWAQT.js +30 -0
  39. package/dist/chunk-3FPMWAQT.js.map +1 -0
  40. package/dist/chunk-3HMT3DQV.js +104 -0
  41. package/dist/chunk-3HMT3DQV.js.map +1 -0
  42. package/dist/chunk-4WAO7CUT.mjs +95 -0
  43. package/dist/chunk-4WAO7CUT.mjs.map +1 -0
  44. package/dist/chunk-5M47B2XJ.js +4096 -0
  45. package/dist/chunk-5M47B2XJ.js.map +1 -0
  46. package/dist/chunk-5QX4TO4F.js +61 -0
  47. package/dist/chunk-5QX4TO4F.js.map +1 -0
  48. package/dist/chunk-5TEFN2CW.js +97 -0
  49. package/dist/chunk-5TEFN2CW.js.map +1 -0
  50. package/dist/chunk-5TES5PG6.js +41 -0
  51. package/dist/chunk-5TES5PG6.js.map +1 -0
  52. package/dist/chunk-5TVMECVF.js +148 -0
  53. package/dist/chunk-5TVMECVF.js.map +1 -0
  54. package/dist/chunk-5WGNZX7Z.mjs +27 -0
  55. package/dist/chunk-5WGNZX7Z.mjs.map +1 -0
  56. package/dist/chunk-AQ3OIM2T.js +103 -0
  57. package/dist/chunk-AQ3OIM2T.js.map +1 -0
  58. package/dist/chunk-AU5NTBK3.js +361 -0
  59. package/dist/chunk-AU5NTBK3.js.map +1 -0
  60. package/dist/chunk-DJHGCJR4.mjs +224 -0
  61. package/dist/chunk-DJHGCJR4.mjs.map +1 -0
  62. package/dist/chunk-DPUTW5KD.mjs +74 -0
  63. package/dist/chunk-DPUTW5KD.mjs.map +1 -0
  64. package/dist/chunk-E53FHDVN.mjs +336 -0
  65. package/dist/chunk-E53FHDVN.mjs.map +1 -0
  66. package/dist/chunk-ECRQD7UU.js +82 -0
  67. package/dist/chunk-ECRQD7UU.js.map +1 -0
  68. package/dist/chunk-FB4ESGOX.mjs +59 -0
  69. package/dist/chunk-FB4ESGOX.mjs.map +1 -0
  70. package/dist/chunk-FDX4IQK5.js +76 -0
  71. package/dist/chunk-FDX4IQK5.js.map +1 -0
  72. package/dist/chunk-FOMIUDRM.js +96 -0
  73. package/dist/chunk-FOMIUDRM.js.map +1 -0
  74. package/dist/chunk-FR5F3VTU.js +139 -0
  75. package/dist/chunk-FR5F3VTU.js.map +1 -0
  76. package/dist/chunk-GW53LH3I.mjs +81 -0
  77. package/dist/chunk-GW53LH3I.mjs.map +1 -0
  78. package/dist/chunk-GXMRIT5E.mjs +94 -0
  79. package/dist/chunk-GXMRIT5E.mjs.map +1 -0
  80. package/dist/chunk-IANSI7F7.mjs +393 -0
  81. package/dist/chunk-IANSI7F7.mjs.map +1 -0
  82. package/dist/chunk-IDM6MZHF.js +415 -0
  83. package/dist/chunk-IDM6MZHF.js.map +1 -0
  84. package/dist/chunk-J5ZYQ3TP.js +104 -0
  85. package/dist/chunk-J5ZYQ3TP.js.map +1 -0
  86. package/dist/chunk-KPAUBWZA.mjs +39 -0
  87. package/dist/chunk-KPAUBWZA.mjs.map +1 -0
  88. package/dist/chunk-L7P2NDST.mjs +124 -0
  89. package/dist/chunk-L7P2NDST.mjs.map +1 -0
  90. package/dist/chunk-LZWKMQJL.mjs +3886 -0
  91. package/dist/chunk-LZWKMQJL.mjs.map +1 -0
  92. package/dist/chunk-M6OWN7QH.js +118 -0
  93. package/dist/chunk-M6OWN7QH.js.map +1 -0
  94. package/dist/chunk-MQVHREEI.js +448 -0
  95. package/dist/chunk-MQVHREEI.js.map +1 -0
  96. package/dist/chunk-MT47ECUN.js +127 -0
  97. package/dist/chunk-MT47ECUN.js.map +1 -0
  98. package/dist/chunk-N6U54JI4.mjs +126 -0
  99. package/dist/chunk-N6U54JI4.mjs.map +1 -0
  100. package/dist/chunk-NDG4LR3Q.js +139 -0
  101. package/dist/chunk-NDG4LR3Q.js.map +1 -0
  102. package/dist/chunk-PPD4BU4W.mjs +80 -0
  103. package/dist/chunk-PPD4BU4W.mjs.map +1 -0
  104. package/dist/chunk-PU5NO5EZ.js +4 -0
  105. package/dist/chunk-PU5NO5EZ.js.map +1 -0
  106. package/dist/chunk-Q442ZDTI.mjs +117 -0
  107. package/dist/chunk-Q442ZDTI.mjs.map +1 -0
  108. package/dist/chunk-QH23RO3C.mjs +137 -0
  109. package/dist/chunk-QH23RO3C.mjs.map +1 -0
  110. package/dist/chunk-REBHUF4L.js +226 -0
  111. package/dist/chunk-REBHUF4L.js.map +1 -0
  112. package/dist/chunk-RGB3QLQT.js +275 -0
  113. package/dist/chunk-RGB3QLQT.js.map +1 -0
  114. package/dist/chunk-T7U2QRLC.js +94 -0
  115. package/dist/chunk-T7U2QRLC.js.map +1 -0
  116. package/dist/chunk-TEHHJ3CS.mjs +73 -0
  117. package/dist/chunk-TEHHJ3CS.mjs.map +1 -0
  118. package/dist/chunk-TJY4MIBC.js +117 -0
  119. package/dist/chunk-TJY4MIBC.js.map +1 -0
  120. package/dist/chunk-VCMZQOQM.mjs +102 -0
  121. package/dist/chunk-VCMZQOQM.mjs.map +1 -0
  122. package/dist/chunk-VKN4H4WI.mjs +3 -0
  123. package/dist/chunk-VKN4H4WI.mjs.map +1 -0
  124. package/dist/chunk-VSB25XTY.js +12 -0
  125. package/dist/chunk-VSB25XTY.js.map +1 -0
  126. package/dist/chunk-VWTE74UT.mjs +96 -0
  127. package/dist/chunk-VWTE74UT.mjs.map +1 -0
  128. package/dist/chunk-WBTL7PBV.js +105 -0
  129. package/dist/chunk-WBTL7PBV.js.map +1 -0
  130. package/dist/chunk-WOK3EP3O.js +83 -0
  131. package/dist/chunk-WOK3EP3O.js.map +1 -0
  132. package/dist/chunk-WWT73GGM.mjs +83 -0
  133. package/dist/chunk-WWT73GGM.mjs.map +1 -0
  134. package/dist/chunk-XBDXTRK3.mjs +102 -0
  135. package/dist/chunk-XBDXTRK3.mjs.map +1 -0
  136. package/dist/chunk-YGBEKZWU.mjs +81 -0
  137. package/dist/chunk-YGBEKZWU.mjs.map +1 -0
  138. package/dist/chunk-YVFLRPFV.mjs +72 -0
  139. package/dist/chunk-YVFLRPFV.mjs.map +1 -0
  140. package/dist/chunk-ZMVBIQ2Z.mjs +253 -0
  141. package/dist/chunk-ZMVBIQ2Z.mjs.map +1 -0
  142. package/dist/chunk-ZWCMSHDP.mjs +425 -0
  143. package/dist/chunk-ZWCMSHDP.mjs.map +1 -0
  144. package/dist/flat/index.d.mts +13 -0
  145. package/dist/flat/index.d.ts +13 -0
  146. package/dist/flat/index.js +31 -0
  147. package/dist/flat/index.js.map +1 -0
  148. package/dist/flat/index.mjs +10 -0
  149. package/dist/flat/index.mjs.map +1 -0
  150. package/dist/flat/segment.d.mts +39 -0
  151. package/dist/flat/segment.d.ts +39 -0
  152. package/dist/flat/segment.js +13 -0
  153. package/dist/flat/segment.js.map +1 -0
  154. package/dist/flat/segment.mjs +4 -0
  155. package/dist/flat/segment.mjs.map +1 -0
  156. package/dist/flat/select.d.mts +58 -0
  157. package/dist/flat/select.d.ts +58 -0
  158. package/dist/flat/select.js +14 -0
  159. package/dist/flat/select.js.map +1 -0
  160. package/dist/flat/select.mjs +5 -0
  161. package/dist/flat/select.mjs.map +1 -0
  162. package/dist/flat/tooltip.d.mts +98 -0
  163. package/dist/flat/tooltip.d.ts +98 -0
  164. package/dist/flat/tooltip.js +17 -0
  165. package/dist/flat/tooltip.js.map +1 -0
  166. package/dist/flat/tooltip.mjs +4 -0
  167. package/dist/flat/tooltip.mjs.map +1 -0
  168. package/dist/icon/index.d.mts +1258 -0
  169. package/dist/icon/index.d.ts +1258 -0
  170. package/dist/icon/index.js +1672 -0
  171. package/dist/icon/index.js.map +1 -0
  172. package/dist/icon/index.mjs +3 -0
  173. package/dist/icon/index.mjs.map +1 -0
  174. package/dist/index-CXip5Wb1.d.mts +62 -0
  175. package/dist/index-Drz3P-6Y.d.ts +62 -0
  176. package/dist/index.d.mts +37 -0
  177. package/dist/index.d.ts +37 -0
  178. package/dist/index.js +150 -0
  179. package/dist/index.js.map +1 -0
  180. package/dist/index.mjs +29 -0
  181. package/dist/index.mjs.map +1 -0
  182. package/dist/input/index.d.mts +82 -0
  183. package/dist/input/index.d.ts +82 -0
  184. package/dist/input/index.js +22 -0
  185. package/dist/input/index.js.map +1 -0
  186. package/dist/input/index.mjs +5 -0
  187. package/dist/input/index.mjs.map +1 -0
  188. package/dist/loading/index.d.mts +54 -0
  189. package/dist/loading/index.d.ts +54 -0
  190. package/dist/loading/index.js +12 -0
  191. package/dist/loading/index.js.map +1 -0
  192. package/dist/loading/index.mjs +3 -0
  193. package/dist/loading/index.mjs.map +1 -0
  194. package/dist/messageBox/index.d.mts +33 -0
  195. package/dist/messageBox/index.d.ts +33 -0
  196. package/dist/messageBox/index.js +13 -0
  197. package/dist/messageBox/index.js.map +1 -0
  198. package/dist/messageBox/index.mjs +4 -0
  199. package/dist/messageBox/index.mjs.map +1 -0
  200. package/dist/modal/index.d.mts +97 -0
  201. package/dist/modal/index.d.ts +97 -0
  202. package/dist/modal/index.js +15 -0
  203. package/dist/modal/index.js.map +1 -0
  204. package/dist/modal/index.mjs +6 -0
  205. package/dist/modal/index.mjs.map +1 -0
  206. package/dist/picker/index.d.mts +12 -0
  207. package/dist/picker/index.d.ts +12 -0
  208. package/dist/picker/index.js +13 -0
  209. package/dist/picker/index.js.map +1 -0
  210. package/dist/picker/index.mjs +4 -0
  211. package/dist/picker/index.mjs.map +1 -0
  212. package/dist/progress/index.d.mts +36 -0
  213. package/dist/progress/index.d.ts +36 -0
  214. package/dist/progress/index.js +12 -0
  215. package/dist/progress/index.js.map +1 -0
  216. package/dist/progress/index.mjs +3 -0
  217. package/dist/progress/index.mjs.map +1 -0
  218. package/dist/radio/index.d.mts +39 -0
  219. package/dist/radio/index.d.ts +39 -0
  220. package/dist/radio/index.js +12 -0
  221. package/dist/radio/index.js.map +1 -0
  222. package/dist/radio/index.mjs +3 -0
  223. package/dist/radio/index.mjs.map +1 -0
  224. package/dist/scrollArea/index.d.mts +31 -0
  225. package/dist/scrollArea/index.d.ts +31 -0
  226. package/dist/scrollArea/index.js +16 -0
  227. package/dist/scrollArea/index.js.map +1 -0
  228. package/dist/scrollArea/index.mjs +3 -0
  229. package/dist/scrollArea/index.mjs.map +1 -0
  230. package/dist/segment/index.d.mts +46 -0
  231. package/dist/segment/index.d.ts +46 -0
  232. package/dist/segment/index.js +12 -0
  233. package/dist/segment/index.js.map +1 -0
  234. package/dist/segment/index.mjs +3 -0
  235. package/dist/segment/index.mjs.map +1 -0
  236. package/dist/star/index.d.mts +30 -0
  237. package/dist/star/index.d.ts +30 -0
  238. package/dist/star/index.js +12 -0
  239. package/dist/star/index.js.map +1 -0
  240. package/dist/star/index.mjs +3 -0
  241. package/dist/star/index.mjs.map +1 -0
  242. package/dist/switch/index.d.mts +32 -0
  243. package/dist/switch/index.d.ts +32 -0
  244. package/dist/switch/index.js +12 -0
  245. package/dist/switch/index.js.map +1 -0
  246. package/dist/switch/index.mjs +3 -0
  247. package/dist/switch/index.mjs.map +1 -0
  248. package/dist/tabs/index.d.mts +52 -0
  249. package/dist/tabs/index.d.ts +52 -0
  250. package/dist/tabs/index.js +12 -0
  251. package/dist/tabs/index.js.map +1 -0
  252. package/dist/tabs/index.mjs +3 -0
  253. package/dist/tabs/index.mjs.map +1 -0
  254. package/dist/tag/index.d.mts +68 -0
  255. package/dist/tag/index.d.ts +68 -0
  256. package/dist/tag/index.js +17 -0
  257. package/dist/tag/index.js.map +1 -0
  258. package/dist/tag/index.mjs +4 -0
  259. package/dist/tag/index.mjs.map +1 -0
  260. package/dist/toast/index.d.mts +175 -0
  261. package/dist/toast/index.d.ts +175 -0
  262. package/dist/toast/index.js +25 -0
  263. package/dist/toast/index.js.map +1 -0
  264. package/dist/toast/index.mjs +4 -0
  265. package/dist/toast/index.mjs.map +1 -0
  266. package/dist/tooltip/index.d.mts +26 -0
  267. package/dist/tooltip/index.d.ts +26 -0
  268. package/dist/tooltip/index.js +12 -0
  269. package/dist/tooltip/index.js.map +1 -0
  270. package/dist/tooltip/index.mjs +3 -0
  271. package/dist/tooltip/index.mjs.map +1 -0
  272. package/package.json +249 -0
  273. package/styles.css +20 -0
@@ -0,0 +1,102 @@
1
+ import { cva, cn } from '@exem-ui/core/utils';
2
+ import { forwardRef } from 'react';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ // src/loading/Loading.tsx
6
+ var containerVariants = cva("inset-0 z-[49] flex items-center justify-center", {
7
+ variants: {
8
+ position: {
9
+ fixed: "fixed",
10
+ absolute: "absolute"
11
+ },
12
+ blockInteraction: {
13
+ true: "pointer-events-auto",
14
+ false: "pointer-events-none"
15
+ }
16
+ },
17
+ defaultVariants: {
18
+ position: "fixed",
19
+ blockInteraction: false
20
+ }
21
+ });
22
+ var overlayVariants = cva("absolute inset-0 transition-opacity duration-150", {
23
+ variants: {
24
+ visible: {
25
+ true: "opacity-100",
26
+ false: "opacity-0"
27
+ },
28
+ tone: {
29
+ // 대비감 높은 톤 설정 추후 디자인 시스템에서 추가 되어야함
30
+ auto: "bg-black/30 dark:bg-white/10",
31
+ dark: "bg-black/50",
32
+ light: "bg-white/70",
33
+ brand: "bg-primary/20"
34
+ }
35
+ },
36
+ defaultVariants: {
37
+ visible: true,
38
+ tone: "auto"
39
+ }
40
+ });
41
+ var spinnerVariants = cva(
42
+ "z-50 shrink-0 animate-spin rounded-full border-elevation-elevation-4 border-t-transparent",
43
+ {
44
+ variants: {
45
+ size: {
46
+ small: "size-6 border-2",
47
+ medium: "size-9 border-[3px]",
48
+ large: "size-12 border-4"
49
+ }
50
+ },
51
+ defaultVariants: {
52
+ size: "large"
53
+ }
54
+ }
55
+ );
56
+ var Loading = forwardRef(
57
+ ({
58
+ isLoading = true,
59
+ dim = true,
60
+ blockInteraction = false,
61
+ position = "fixed",
62
+ size = "medium",
63
+ containerClassName,
64
+ overlayClassName,
65
+ spinnerClassName,
66
+ className,
67
+ ...props
68
+ }, ref) => {
69
+ if (!isLoading) {
70
+ return null;
71
+ }
72
+ return /* @__PURE__ */ jsxs(
73
+ "div",
74
+ {
75
+ ref,
76
+ role: "status",
77
+ "aria-busy": "true",
78
+ className: cn(
79
+ containerVariants({ position, blockInteraction }),
80
+ containerClassName,
81
+ className
82
+ ),
83
+ ...props,
84
+ children: [
85
+ /* @__PURE__ */ jsx(
86
+ "div",
87
+ {
88
+ "aria-hidden": "true",
89
+ className: cn(overlayVariants({ visible: dim }), overlayClassName)
90
+ }
91
+ ),
92
+ /* @__PURE__ */ jsx("div", { className: "relative z-50 flex size-full items-center justify-center", children: /* @__PURE__ */ jsx("div", { className: cn(spinnerVariants({ size }), spinnerClassName) }) })
93
+ ]
94
+ }
95
+ );
96
+ }
97
+ );
98
+ Loading.displayName = "Loading";
99
+
100
+ export { Loading };
101
+ //# sourceMappingURL=chunk-XBDXTRK3.mjs.map
102
+ //# sourceMappingURL=chunk-XBDXTRK3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/loading/Loading.tsx"],"names":[],"mappings":";;;;;AAmCA,IAAM,iBAAA,GAAoB,IAAI,iDAAA,EAAmD;AAAA,EAC/E,QAAA,EAAU;AAAA,IACR,QAAA,EAAU;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,IAAA,EAAM,qBAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,QAAA,EAAU,OAAA;AAAA,IACV,gBAAA,EAAkB;AAAA;AAEtB,CAAC,CAAA;AAED,IAAM,eAAA,GAAkB,IAAI,kDAAA,EAAoD;AAAA,EAC9E,QAAA,EAAU;AAAA,IACR,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,IAAA,EAAM;AAAA;AAAA,MAEJ,IAAA,EAAM,8BAAA;AAAA,MACN,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAO,aAAA;AAAA,MACP,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA;AAEV,CAAC,CAAA;AAED,IAAM,eAAA,GAAkB,GAAA;AAAA,EACtB,2FAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,iBAAA;AAAA,QACP,MAAA,EAAQ,qBAAA;AAAA,QACR,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AAkBA,IAAM,OAAA,GAAU,UAAA;AAAA,EACd,CACE;AAAA,IACE,SAAA,GAAY,IAAA;AAAA,IACZ,GAAA,GAAM,IAAA;AAAA,IACN,gBAAA,GAAmB,KAAA;AAAA,IACnB,QAAA,GAAW,OAAA;AAAA,IACX,IAAA,GAAO,QAAA;AAAA,IACP,kBAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,WAAA,EAAU,MAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,iBAAA,CAAkB,EAAE,QAAA,EAAU,gBAAA,EAAkB,CAAA;AAAA,UAChD,kBAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAGJ,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAY,MAAA;AAAA,cACZ,SAAA,EAAW,GAAG,eAAA,CAAgB,EAAE,SAAS,GAAA,EAAK,GAAG,gBAAgB;AAAA;AAAA,WACnE;AAAA,0BAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAAA,EACb,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,eAAA,CAAgB,EAAE,IAAA,EAAM,CAAA,EAAG,gBAAgB,GAAG,CAAA,EACnE;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA","file":"chunk-XBDXTRK3.mjs","sourcesContent":["import { cn, cva, type VariantProps } from '@exem-ui/core/utils';\nimport type React from 'react';\nimport { forwardRef } from 'react';\n\ninterface LoadingProps\n extends VariantProps<typeof containerVariants>,\n VariantProps<typeof spinnerVariants>,\n Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * 로딩 표시 여부\n * @default true\n */\n isLoading?: boolean;\n /**\n * 배경 딤 처리 여부\n * @default true\n */\n dim?: boolean;\n /**\n * 로딩 중 하위 요소 인터랙션 차단 여부\n * @default false\n */\n blockInteraction?: boolean;\n /** 컨테이너 추가 클래스 */\n containerClassName?: string;\n /** 오버레이 추가 클래스 */\n overlayClassName?: string;\n /** 스피너 추가 클래스 */\n spinnerClassName?: string;\n}\n\ntype LoadingComponent = React.ForwardRefExoticComponent<\n LoadingProps & React.RefAttributes<HTMLDivElement>\n>;\n\nconst containerVariants = cva('inset-0 z-[49] flex items-center justify-center', {\n variants: {\n position: {\n fixed: 'fixed',\n absolute: 'absolute',\n },\n blockInteraction: {\n true: 'pointer-events-auto',\n false: 'pointer-events-none',\n },\n },\n defaultVariants: {\n position: 'fixed',\n blockInteraction: false,\n },\n});\n\nconst overlayVariants = cva('absolute inset-0 transition-opacity duration-150', {\n variants: {\n visible: {\n true: 'opacity-100',\n false: 'opacity-0',\n },\n tone: {\n // 대비감 높은 톤 설정 추후 디자인 시스템에서 추가 되어야함\n auto: 'bg-black/30 dark:bg-white/10',\n dark: 'bg-black/50',\n light: 'bg-white/70',\n brand: 'bg-primary/20',\n },\n },\n defaultVariants: {\n visible: true,\n tone: 'auto',\n },\n});\n\nconst spinnerVariants = cva(\n 'z-50 shrink-0 animate-spin rounded-full border-elevation-elevation-4 border-t-transparent',\n {\n variants: {\n size: {\n small: 'size-6 border-2',\n medium: 'size-9 border-[3px]',\n large: 'size-12 border-4',\n },\n },\n defaultVariants: {\n size: 'large',\n },\n },\n);\n\n/**\n * 비동기 작업 중 로딩 상태를 표시하는 오버레이 컴포넌트입니다.\n *\n * @example\n * ```tsx\n * // 기본 사용 (전체 화면 고정)\n * <Loading isLoading />\n *\n * // 특정 영역 내 로딩 (absolute 위치)\n * <div style={{ position: 'relative' }}>\n * <Loading isLoading position=\"absolute\" size=\"small\" />\n * </div>\n * ```\n *\n * @see {@link LoadingProps} props 상세\n */\nconst Loading = forwardRef<HTMLDivElement, LoadingProps>(\n (\n {\n isLoading = true,\n dim = true,\n blockInteraction = false,\n position = 'fixed',\n size = 'medium',\n containerClassName,\n overlayClassName,\n spinnerClassName,\n className,\n ...props\n },\n ref,\n ) => {\n if (!isLoading) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-busy=\"true\"\n className={cn(\n containerVariants({ position, blockInteraction }),\n containerClassName,\n className,\n )}\n {...props}\n >\n {/* overlay 항상 존재 (dim 여부로만 표시) */}\n <div\n aria-hidden=\"true\"\n className={cn(overlayVariants({ visible: dim }), overlayClassName)}\n />\n {/* 스피너 레이어 */}\n <div className=\"relative z-50 flex size-full items-center justify-center\">\n <div className={cn(spinnerVariants({ size }), spinnerClassName)} />\n </div>\n </div>\n );\n },\n) as LoadingComponent;\n\nLoading.displayName = 'Loading';\n\nexport { Loading };\nexport type { LoadingComponent, LoadingProps };\n"]}
@@ -0,0 +1,81 @@
1
+ import { cn } from '@exem-ui/core/utils';
2
+ import { forwardRef } from 'react';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ // src/star/Star.tsx
6
+ var StarRoundedEmpty = (props) => /* @__PURE__ */ jsx(
7
+ "svg",
8
+ {
9
+ xmlns: "http://www.w3.org/2000/svg",
10
+ fill: "none",
11
+ viewBox: "0 0 20 20",
12
+ width: "1em",
13
+ height: "1em",
14
+ "aria-hidden": "true",
15
+ ...props,
16
+ children: /* @__PURE__ */ jsx(
17
+ "path",
18
+ {
19
+ stroke: "#cfcfcf",
20
+ strokeLinecap: "round",
21
+ strokeLinejoin: "round",
22
+ 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"
23
+ }
24
+ )
25
+ }
26
+ );
27
+ var StarRoundedFilled = (props) => /* @__PURE__ */ jsx(
28
+ "svg",
29
+ {
30
+ xmlns: "http://www.w3.org/2000/svg",
31
+ fill: "none",
32
+ viewBox: "0 0 20 20",
33
+ width: "1em",
34
+ height: "1em",
35
+ "aria-hidden": "true",
36
+ ...props,
37
+ children: /* @__PURE__ */ jsx(
38
+ "path",
39
+ {
40
+ fill: "#FE9A00",
41
+ 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"
42
+ }
43
+ )
44
+ }
45
+ );
46
+ var Star = forwardRef(
47
+ ({ size = "medium", selected = false, className, onClick, ...props }, ref) => {
48
+ const sizeConfig = {
49
+ small: { width: 16, height: 16 },
50
+ medium: { width: 20, height: 20 },
51
+ large: { width: 24, height: 24 }
52
+ };
53
+ const config = sizeConfig[size];
54
+ return selected ? /* @__PURE__ */ jsx(
55
+ StarRoundedFilled,
56
+ {
57
+ ref,
58
+ width: config.width,
59
+ height: config.height,
60
+ className: cn("cursor-pointer transition-colors", className),
61
+ onClick,
62
+ ...props
63
+ }
64
+ ) : /* @__PURE__ */ jsx(
65
+ StarRoundedEmpty,
66
+ {
67
+ ref,
68
+ width: config.width,
69
+ height: config.height,
70
+ className: cn("cursor-pointer transition-colors", className),
71
+ onClick,
72
+ ...props
73
+ }
74
+ );
75
+ }
76
+ );
77
+ Star.displayName = "Star";
78
+
79
+ export { Star };
80
+ //# sourceMappingURL=chunk-YGBEKZWU.mjs.map
81
+ //# sourceMappingURL=chunk-YGBEKZWU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/star/Star.tsx"],"names":[],"mappings":";;;;;AAuBA,IAAM,gBAAA,GAAmB,CAAC,KAAA,qBACxB,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAM,4BAAA;AAAA,IACN,IAAA,EAAK,MAAA;AAAA,IACL,OAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAO,KAAA;AAAA,IACP,aAAA,EAAY,MAAA;AAAA,IACX,GAAG,KAAA;AAAA,IAEJ,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAO,SAAA;AAAA,QACP,aAAA,EAAc,OAAA;AAAA,QACd,cAAA,EAAe,OAAA;AAAA,QACf,CAAA,EAAE;AAAA;AAAA;AACJ;AACF,CAAA;AAGF,IAAM,iBAAA,GAAoB,CAAC,KAAA,qBACzB,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAM,4BAAA;AAAA,IACN,IAAA,EAAK,MAAA;AAAA,IACL,OAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAO,KAAA;AAAA,IACP,aAAA,EAAY,MAAA;AAAA,IACX,GAAG,KAAA;AAAA,IAEJ,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,SAAA;AAAA,QACL,CAAA,EAAE;AAAA;AAAA;AACJ;AACF,CAAA;AAaF,IAAM,IAAA,GAAO,UAAA;AAAA,EACX,CAAC,EAAE,IAAA,GAAO,QAAA,EAAU,QAAA,GAAW,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC5E,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,KAAA,EAAO,EAAE,KAAA,EAAO,EAAA,EAAI,QAAQ,EAAA,EAAG;AAAA,MAC/B,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,QAAQ,EAAA,EAAG;AAAA,MAChC,KAAA,EAAO,EAAE,KAAA,EAAO,EAAA,EAAI,QAAQ,EAAA;AAAG,KACjC;AACA,IAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAE9B,IAAA,OAAO,QAAA,mBACL,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,SAAA,EAAW,EAAA,CAAG,kCAAA,EAAoC,SAAS,CAAA;AAAA,QAC3D,OAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN,mBAEA,GAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,SAAA,EAAW,EAAA,CAAG,kCAAA,EAAoC,SAAS,CAAA;AAAA,QAC3D,OAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AAEA,IAAA,CAAK,WAAA,GAAc,MAAA","file":"chunk-YGBEKZWU.mjs","sourcesContent":["import { cn } from '@exem-ui/core/utils';\nimport type React from 'react';\nimport { forwardRef, type SVGProps } from 'react';\n\ninterface StarProps extends React.SVGProps<SVGSVGElement> {\n /**\n * 별 아이콘 크기\n * @default 'medium'\n */\n size?: 'small' | 'medium' | 'large';\n /**\n * 선택(채워짐) 상태 여부\n * @default false\n */\n selected?: boolean;\n /** 클릭 이벤트 핸들러 */\n onClick?: (event: React.MouseEvent<SVGSVGElement>) => void;\n}\n\ntype StarComponent = React.ForwardRefExoticComponent<\n Omit<StarProps, 'ref'> & React.RefAttributes<SVGSVGElement>\n>;\n\nconst StarRoundedEmpty = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 20 20\"\n width=\"1em\"\n height=\"1em\"\n aria-hidden=\"true\"\n {...props}\n >\n <path\n stroke=\"#cfcfcf\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n 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\"\n />\n </svg>\n);\n\nconst StarRoundedFilled = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 20 20\"\n width=\"1em\"\n height=\"1em\"\n aria-hidden=\"true\"\n {...props}\n >\n <path\n fill=\"#FE9A00\"\n 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\"\n />\n </svg>\n);\n\n/**\n * 별점 평가에 사용되는 Star 아이콘 컴포넌트입니다.\n *\n * @example\n * ```tsx\n * <Star selected size=\"medium\" onClick={() => console.log('clicked')} />\n * ```\n *\n * @see {@link StarProps} props 상세\n */\nconst Star = forwardRef<SVGSVGElement, StarProps>(\n ({ size = 'medium', selected = false, className, onClick, ...props }, ref) => {\n const sizeConfig = {\n small: { width: 16, height: 16 },\n medium: { width: 20, height: 20 },\n large: { width: 24, height: 24 },\n };\n const config = sizeConfig[size];\n\n return selected ? (\n <StarRoundedFilled\n ref={ref}\n width={config.width}\n height={config.height}\n className={cn('cursor-pointer transition-colors', className)}\n onClick={onClick}\n {...props}\n />\n ) : (\n <StarRoundedEmpty\n ref={ref}\n width={config.width}\n height={config.height}\n className={cn('cursor-pointer transition-colors', className)}\n onClick={onClick}\n {...props}\n />\n );\n },\n) as StarComponent;\n\nStar.displayName = 'Star';\n\nexport { Star };\nexport type { StarComponent, StarProps };\n"]}
@@ -0,0 +1,72 @@
1
+ import { cva, cn } from '@exem-ui/core/utils';
2
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
3
+ import { forwardRef } from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ // src/tooltip/Tooltip.tsx
7
+ var tooltipContentVariants = cva(
8
+ [
9
+ // Base layout
10
+ "z-50 flex flex-col items-start overflow-hidden",
11
+ "rounded-medium",
12
+ "text-text-static-light",
13
+ "bg-component-tooltip border border-border-primary",
14
+ "shadow-medium",
15
+ "animate-in fade-in-0 zoom-in-95",
16
+ "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
17
+ "data-[side=bottom]:slide-in-from-top-2",
18
+ "data-[side=left]:slide-in-from-right-2",
19
+ "data-[side=right]:slide-in-from-left-2",
20
+ "data-[side=top]:slide-in-from-bottom-2"
21
+ ],
22
+ {
23
+ variants: {
24
+ size: {
25
+ tiny: "px-2 py-1 text-body-3",
26
+ small: "w-[160px] gap-[8px] px-[12px] py-[10px]",
27
+ medium: "w-[240px] gap-[8px] px-[12px] py-[10px]",
28
+ large: "w-[320px] gap-[8px] px-[12px] py-[10px]",
29
+ xlarge: "w-[400px] gap-[8px] px-[12px] py-[10px]"
30
+ }
31
+ },
32
+ defaultVariants: { size: "small" }
33
+ }
34
+ );
35
+ var tooltipTitleVariants = cva([
36
+ "text-body-1 font-semibold text-text-static-light",
37
+ "group-data-[size=tiny]/tooltip-content:text-body-3"
38
+ ]);
39
+ var tooltipTextVariants = cva([
40
+ "text-body-2 font-regular text-text-static-light",
41
+ "group-data-[size=tiny]/tooltip-content:text-body-3"
42
+ ]);
43
+ var Tooltip = TooltipPrimitive.Root;
44
+ Tooltip.Provider = TooltipPrimitive.Provider;
45
+ Tooltip.Trigger = TooltipPrimitive.Trigger;
46
+ Tooltip.Content = forwardRef(({ className, sideOffset = 4, size, children, portalContainer, ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
47
+ TooltipPrimitive.Content,
48
+ {
49
+ ref,
50
+ sideOffset,
51
+ "data-size": size,
52
+ className: cn("group/tooltip-content", tooltipContentVariants({ size }), className),
53
+ ...props,
54
+ children
55
+ }
56
+ ) }));
57
+ Tooltip.Title = forwardRef(
58
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn(tooltipTitleVariants(), className), ...props, children })
59
+ );
60
+ Tooltip.Description = forwardRef(
61
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn(tooltipTextVariants(), className), ...props, children })
62
+ );
63
+ Tooltip.displayName = "Tooltip";
64
+ Tooltip.Content.displayName = "Tooltip.Content";
65
+ Tooltip.Title.displayName = "Tooltip.Title";
66
+ Tooltip.Description.displayName = "Tooltip.Description";
67
+ Tooltip.Trigger.displayName = "Tooltip.Trigger";
68
+ Tooltip.Provider.displayName = "Tooltip.Provider";
69
+
70
+ export { Tooltip };
71
+ //# sourceMappingURL=chunk-YVFLRPFV.mjs.map
72
+ //# sourceMappingURL=chunk-YVFLRPFV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tooltip/Tooltip.tsx"],"names":[],"mappings":";;;;;;AAgCA,IAAM,sBAAA,GAAyB,GAAA;AAAA,EAC7B;AAAA;AAAA,IAEE,gDAAA;AAAA,IACA,gBAAA;AAAA,IACA,wBAAA;AAAA,IACA,mDAAA;AAAA,IACA,eAAA;AAAA,IACA,iCAAA;AAAA,IACA,gGAAA;AAAA,IACA,wCAAA;AAAA,IACA,wCAAA;AAAA,IACA,wCAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,uBAAA;AAAA,QACN,KAAA,EAAO,yCAAA;AAAA,QACP,MAAA,EAAQ,yCAAA;AAAA,QACR,KAAA,EAAO,yCAAA;AAAA,QACP,MAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,OAAA;AAAQ;AAErC,CAAA;AAEA,IAAM,uBAAuB,GAAA,CAAI;AAAA,EAC/B,kDAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,sBAAsB,GAAA,CAAI;AAAA,EAC9B,iDAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,OAAA,GAA2B,gBAAA,CAAA;AAEjC,OAAA,CAAQ,QAAA,GAA4B,gBAAA,CAAA,QAAA;AAEpC,OAAA,CAAQ,OAAA,GAA2B,gBAAA,CAAA,OAAA;AAEnC,OAAA,CAAQ,UAAU,UAAA,CAGhB,CAAC,EAAE,SAAA,EAAW,UAAA,GAAa,GAAG,IAAA,EAAM,QAAA,EAAU,eAAA,EAAiB,GAAG,OAAM,EAAG,GAAA,yBACzD,gBAAA,CAAA,MAAA,EAAjB,EAAwB,WAAW,eAAA,EAClC,QAAA,kBAAA,GAAA;AAAA,EAAkB,gBAAA,CAAA,OAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA,EAAW,IAAA;AAAA,IACX,SAAA,EAAW,GAAG,uBAAA,EAAyB,sBAAA,CAAuB,EAAE,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,IACjF,GAAG,KAAA;AAAA,IAEH;AAAA;AACH,CAAA,EACF,CACD,CAAA;AAED,OAAA,CAAQ,KAAA,GAAQ,UAAA;AAAA,EACd,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,qBAClC,GAAA,CAAC,SAAI,GAAA,EAAU,SAAA,EAAW,GAAG,oBAAA,EAAqB,EAAG,SAAS,CAAA,EAAI,GAAG,OAClE,QAAA,EACH;AAEJ,CAAA;AAEA,OAAA,CAAQ,WAAA,GAAc,UAAA;AAAA,EACpB,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,qBAClC,GAAA,CAAC,SAAI,GAAA,EAAU,SAAA,EAAW,GAAG,mBAAA,EAAoB,EAAG,SAAS,CAAA,EAAI,GAAG,OACjE,QAAA,EACH;AAEJ,CAAA;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;AACtB,OAAA,CAAQ,QAAQ,WAAA,GAAc,iBAAA;AAC9B,OAAA,CAAQ,MAAM,WAAA,GAAc,eAAA;AAC5B,OAAA,CAAQ,YAAY,WAAA,GAAc,qBAAA;AAClC,OAAA,CAAQ,QAAQ,WAAA,GAAc,iBAAA;AAC9B,OAAA,CAAQ,SAAS,WAAA,GAAc,kBAAA","file":"chunk-YVFLRPFV.mjs","sourcesContent":["import { cn, cva, type VariantProps } from '@exem-ui/core/utils';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport type React from 'react';\nimport { forwardRef } from 'react';\n\ntype TooltipRootProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>;\n\ntype TooltipProviderProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Provider>;\n\ntype TooltipTriggerProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger>;\n\ntype TooltipContentProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> &\n VariantProps<typeof tooltipContentVariants> & {\n portalContainer?: HTMLElement | null;\n };\n\ntype TooltipTitleProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype TooltipDescriptionProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype TooltipComponent = typeof TooltipPrimitive.Root & {\n Provider: typeof TooltipPrimitive.Provider;\n Trigger: typeof TooltipPrimitive.Trigger;\n Content: React.ForwardRefExoticComponent<\n TooltipContentProps & React.RefAttributes<React.ElementRef<typeof TooltipPrimitive.Content>>\n >;\n Title: React.ForwardRefExoticComponent<TooltipTitleProps & React.RefAttributes<HTMLDivElement>>;\n Description: React.ForwardRefExoticComponent<\n TooltipDescriptionProps & React.RefAttributes<HTMLDivElement>\n >;\n};\n\nconst tooltipContentVariants = cva(\n [\n // Base layout\n 'z-50 flex flex-col items-start overflow-hidden',\n 'rounded-medium',\n 'text-text-static-light',\n 'bg-component-tooltip border border-border-primary',\n 'shadow-medium',\n 'animate-in fade-in-0 zoom-in-95',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n 'data-[side=bottom]:slide-in-from-top-2',\n 'data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2',\n 'data-[side=top]:slide-in-from-bottom-2',\n ],\n {\n variants: {\n size: {\n tiny: 'px-2 py-1 text-body-3',\n small: 'w-[160px] gap-[8px] px-[12px] py-[10px]',\n medium: 'w-[240px] gap-[8px] px-[12px] py-[10px]',\n large: 'w-[320px] gap-[8px] px-[12px] py-[10px]',\n xlarge: 'w-[400px] gap-[8px] px-[12px] py-[10px]',\n },\n },\n defaultVariants: { size: 'small' },\n },\n);\n\nconst tooltipTitleVariants = cva([\n 'text-body-1 font-semibold text-text-static-light',\n 'group-data-[size=tiny]/tooltip-content:text-body-3',\n]);\n\nconst tooltipTextVariants = cva([\n 'text-body-2 font-regular text-text-static-light',\n 'group-data-[size=tiny]/tooltip-content:text-body-3',\n]);\n\nconst Tooltip = TooltipPrimitive.Root as TooltipComponent;\n\nTooltip.Provider = TooltipPrimitive.Provider;\n\nTooltip.Trigger = TooltipPrimitive.Trigger;\n\nTooltip.Content = forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n TooltipContentProps\n>(({ className, sideOffset = 4, size, children, portalContainer, ...props }, ref) => (\n <TooltipPrimitive.Portal container={portalContainer}>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n data-size={size}\n className={cn('group/tooltip-content', tooltipContentVariants({ size }), className)}\n {...props}\n >\n {children}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n)) as TooltipComponent['Content'];\n\nTooltip.Title = forwardRef<HTMLDivElement, TooltipTitleProps>(\n ({ className, children, ...props }, ref) => (\n <div ref={ref} className={cn(tooltipTitleVariants(), className)} {...props}>\n {children}\n </div>\n ),\n) as TooltipComponent['Title'];\n\nTooltip.Description = forwardRef<HTMLDivElement, TooltipDescriptionProps>(\n ({ className, children, ...props }, ref) => (\n <div ref={ref} className={cn(tooltipTextVariants(), className)} {...props}>\n {children}\n </div>\n ),\n) as TooltipComponent['Description'];\n\nTooltip.displayName = 'Tooltip';\nTooltip.Content.displayName = 'Tooltip.Content';\nTooltip.Title.displayName = 'Tooltip.Title';\nTooltip.Description.displayName = 'Tooltip.Description';\nTooltip.Trigger.displayName = 'Tooltip.Trigger';\nTooltip.Provider.displayName = 'Tooltip.Provider';\n\nexport { Tooltip };\nexport type {\n TooltipComponent,\n TooltipContentProps,\n TooltipDescriptionProps,\n TooltipProviderProps,\n TooltipRootProps,\n TooltipTitleProps,\n TooltipTriggerProps,\n};\n"]}
@@ -0,0 +1,253 @@
1
+ import { ScrollArea } from './chunk-TEHHJ3CS.mjs';
2
+ import { Button } from './chunk-DJHGCJR4.mjs';
3
+ import { X } from './chunk-LZWKMQJL.mjs';
4
+ import { cn } from '@exem-ui/core/utils';
5
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
6
+ import { createContext, forwardRef, useContext } from 'react';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
+
9
+ var MODAL_PADDING = {
10
+ body: "px-4 pb-4",
11
+ footer: "px-4 py-3"
12
+ };
13
+ var ModalContext = createContext({ size: "medium" });
14
+ var Modal = DialogPrimitive.Root;
15
+ Modal.Trigger = DialogPrimitive.Trigger;
16
+ Modal.Portal = DialogPrimitive.Portal;
17
+ Modal.Close = forwardRef(({ size, ...props }, ref) => {
18
+ const { size: modalSize } = useContext(ModalContext);
19
+ return /* @__PURE__ */ jsx(DialogPrimitive.Close, { asChild: true, children: /* @__PURE__ */ jsx(
20
+ Button,
21
+ {
22
+ ...props,
23
+ ref,
24
+ color: "assistive",
25
+ variant: "contained",
26
+ size: size ?? (modalSize === "fullsize" ? "large" : "medium")
27
+ }
28
+ ) });
29
+ });
30
+ Modal.Overlay = forwardRef(
31
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
32
+ DialogPrimitive.Overlay,
33
+ {
34
+ ref,
35
+ className: cn(
36
+ "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",
37
+ className
38
+ ),
39
+ ...props
40
+ }
41
+ )
42
+ );
43
+ Modal.Content = forwardRef(
44
+ ({ className, children, size = "medium", onInteractOutside, onFocusOutside, ...props }, ref) => {
45
+ const isFullSize = size === "fullsize";
46
+ const sizeWidthMap = {
47
+ small: "max-w-[640px]",
48
+ medium: "max-w-[800px]",
49
+ large: "max-w-[960px]",
50
+ xlarge: "max-w-[1120px]"
51
+ };
52
+ const shouldPreventDismissForSelect = (target) => {
53
+ const isSelectOpen = Boolean(
54
+ document.querySelector('[data-radix-select-content][data-state="open"]')
55
+ );
56
+ if (isSelectOpen) {
57
+ return true;
58
+ }
59
+ if (!(target instanceof Element)) {
60
+ return false;
61
+ }
62
+ return Boolean(
63
+ target.closest("[data-radix-select-content]") || target.closest("[data-radix-select-viewport]")
64
+ );
65
+ };
66
+ const handleInteractOutside = (event) => {
67
+ if (shouldPreventDismissForSelect(event.target)) {
68
+ event.preventDefault();
69
+ }
70
+ onInteractOutside?.(event);
71
+ };
72
+ return /* @__PURE__ */ jsx(ModalContext.Provider, { value: { size }, children: /* @__PURE__ */ jsxs(Modal.Portal, { children: [
73
+ /* @__PURE__ */ jsx(Modal.Overlay, {}),
74
+ /* @__PURE__ */ jsx(
75
+ DialogPrimitive.Content,
76
+ {
77
+ ref,
78
+ className: cn(
79
+ // 공통 스타일
80
+ "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",
81
+ // fullsize일 때
82
+ isFullSize ? "inset-0 m-10" : (
83
+ // 일반 모달일 때
84
+ cn(
85
+ "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%]",
86
+ sizeWidthMap[size]
87
+ )
88
+ ),
89
+ className
90
+ ),
91
+ ...props,
92
+ onInteractOutside: handleInteractOutside,
93
+ children
94
+ }
95
+ )
96
+ ] }) });
97
+ }
98
+ );
99
+ Modal.Header = forwardRef(
100
+ ({ className, line = false, showCloseIcon = true, children, ...props }, ref) => {
101
+ const { size } = useContext(ModalContext);
102
+ return /* @__PURE__ */ jsxs(
103
+ "div",
104
+ {
105
+ ref,
106
+ className: cn(
107
+ "flex shrink-0 flex-row items-center gap-2 pl-4 pr-3",
108
+ line && "border-b border-border-primary",
109
+ size === "fullsize" ? "h-16" : "h-14",
110
+ className
111
+ ),
112
+ ...props,
113
+ children: [
114
+ /* @__PURE__ */ jsx("div", { className: "flex flex-1 flex-row items-center gap-1", children }),
115
+ showCloseIcon && /* @__PURE__ */ jsx(
116
+ DialogPrimitive.Close,
117
+ {
118
+ className: cn(
119
+ "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"
120
+ ),
121
+ children: /* @__PURE__ */ jsx(X, { type: "regular", size: 20 })
122
+ }
123
+ )
124
+ ]
125
+ }
126
+ );
127
+ }
128
+ );
129
+ Modal.Body = forwardRef(
130
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(
131
+ "div",
132
+ {
133
+ ref,
134
+ className: cn(
135
+ "flex-1 flex flex-col min-h-0 h-full",
136
+ "[&_[data-slot=scroll-area-viewport]>div]:h-full"
137
+ ),
138
+ ...props,
139
+ children: /* @__PURE__ */ jsx(ScrollArea, { className: "h-full flex flex-col", children: /* @__PURE__ */ jsx("div", { className: cn(MODAL_PADDING.body, className), children }) })
140
+ }
141
+ )
142
+ );
143
+ Modal.Footer = forwardRef(
144
+ ({ className, line = true, ...props }, ref) => {
145
+ const { size } = useContext(ModalContext);
146
+ return /* @__PURE__ */ jsx(
147
+ "div",
148
+ {
149
+ ref,
150
+ className: cn(
151
+ "flex flex-row items-center justify-between",
152
+ line && "border-t border-border-primary",
153
+ size === "fullsize" ? "gap-3" : "h-14 gap-3",
154
+ MODAL_PADDING.footer,
155
+ className
156
+ ),
157
+ ...props
158
+ }
159
+ );
160
+ }
161
+ );
162
+ Modal.FooterDescription = forwardRef(
163
+ ({ className, error = false, icon, children, ...props }, ref) => {
164
+ const { size } = useContext(ModalContext);
165
+ const isLargeFooter = size === "fullsize";
166
+ return /* @__PURE__ */ jsxs(
167
+ "div",
168
+ {
169
+ ref,
170
+ className: cn(
171
+ "flex flex-row items-center gap-1",
172
+ isLargeFooter ? "text-body-2" : "text-body-3",
173
+ error ? "text-text-critical" : "text-text-tertiary",
174
+ className
175
+ ),
176
+ ...props,
177
+ children: [
178
+ icon && /* @__PURE__ */ jsx("span", { className: "flex shrink-0 size-4 items-center justify-center [&>svg]:size-4", children: icon }),
179
+ children
180
+ ]
181
+ }
182
+ );
183
+ }
184
+ );
185
+ Modal.Actions = forwardRef(({ className, ...props }, ref) => {
186
+ const { size } = useContext(ModalContext);
187
+ return /* @__PURE__ */ jsx(
188
+ "div",
189
+ {
190
+ ref,
191
+ className: cn(
192
+ "ml-auto flex flex-row items-center",
193
+ size === "fullsize" ? "gap-3" : "gap-2",
194
+ className
195
+ ),
196
+ ...props
197
+ }
198
+ );
199
+ });
200
+ Modal.Action = forwardRef(
201
+ ({ color = "primary", size, ...props }, ref) => {
202
+ const { size: modalSize } = useContext(ModalContext);
203
+ return /* @__PURE__ */ jsx(DialogPrimitive.Close, { asChild: true, children: /* @__PURE__ */ jsx(
204
+ Button,
205
+ {
206
+ ...props,
207
+ ref,
208
+ color,
209
+ variant: "contained",
210
+ size: size ?? (modalSize === "fullsize" ? "large" : "medium")
211
+ }
212
+ ) });
213
+ }
214
+ );
215
+ Modal.Title = forwardRef(
216
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
217
+ DialogPrimitive.Title,
218
+ {
219
+ ref,
220
+ className: cn(
221
+ "text-title-2 font-semibold leading-none tracking-tight text-text-primary",
222
+ className
223
+ ),
224
+ ...props
225
+ }
226
+ )
227
+ );
228
+ Modal.Description = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
229
+ DialogPrimitive.Description,
230
+ {
231
+ ref,
232
+ className: cn("text-body-2 text-text-tertiary", className),
233
+ ...props
234
+ }
235
+ ));
236
+ Modal.displayName = "Modal";
237
+ Modal.Trigger.displayName = "Modal.Trigger";
238
+ Modal.Portal.displayName = "Modal.Portal";
239
+ Modal.Close.displayName = "Modal.Close";
240
+ Modal.Overlay.displayName = "Modal.Overlay";
241
+ Modal.Content.displayName = "Modal.Content";
242
+ Modal.Header.displayName = "Modal.Header";
243
+ Modal.Body.displayName = "Modal.Body";
244
+ Modal.Footer.displayName = "Modal.Footer";
245
+ Modal.FooterDescription.displayName = "Modal.FooterDescription";
246
+ Modal.Actions.displayName = "Modal.Actions";
247
+ Modal.Action.displayName = "Modal.Action";
248
+ Modal.Title.displayName = "Modal.Title";
249
+ Modal.Description.displayName = "Modal.Description";
250
+
251
+ export { Modal };
252
+ //# sourceMappingURL=chunk-ZMVBIQ2Z.mjs.map
253
+ //# sourceMappingURL=chunk-ZMVBIQ2Z.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modal/Modal.tsx"],"names":[],"mappings":"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","file":"chunk-ZMVBIQ2Z.mjs","sourcesContent":["import { cn } from '@exem-ui/core/utils';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport type React from 'react';\nimport { createContext, forwardRef, useContext } from 'react';\nimport type { ButtonProps } from '../button/Button';\nimport { Button } from '../button/Button';\nimport { XIcon } from '../icon';\nimport { ScrollArea } from '../scrollArea/ScrollArea';\n\ntype ModalSize = 'small' | 'medium' | 'large' | 'xlarge' | 'fullsize';\n\ntype ModalRootProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>;\n\ntype ModalTriggerProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Trigger>;\n\ntype ModalPortalProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Portal>;\n\ntype ModalOverlayProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>;\n\ntype ModalContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n /**\n * 모달 크기\n * @default 'medium'\n */\n size?: ModalSize;\n};\n\ntype DialogContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>;\ntype InteractOutsideEvent = Parameters<NonNullable<DialogContentProps['onInteractOutside']>>[0];\n\ntype ModalCloseProps = Omit<ButtonProps, 'color' | 'variant'>;\n\ntype ModalHeaderProps = React.HTMLAttributes<HTMLDivElement> & {\n /**\n * 하단 구분선 표시 여부\n * @default false\n */\n line?: boolean;\n /**\n * 닫기 아이콘 표시 여부\n * @default true\n */\n showCloseIcon?: boolean;\n};\n\ntype ModalBodyProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype ModalFooterProps = React.HTMLAttributes<HTMLDivElement> & {\n /**\n * 상단 구분선 표시 여부\n * @default true\n */\n line?: boolean;\n};\n\ntype ModalFooterDescriptionProps = React.HTMLAttributes<HTMLDivElement> & {\n /** 에러 상태 표시 여부 */\n error?: boolean;\n /** 설명 앞에 표시할 아이콘 요소 */\n icon?: React.ReactNode;\n};\n\ntype ModalActionsProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype ModalActionProps = Omit<ButtonProps, 'color' | 'variant'> & {\n /**\n * 버튼 색상\n * @default 'primary'\n */\n color?: 'primary' | 'critical';\n};\n\ntype ModalTitleProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>;\n\ntype ModalDescriptionProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>;\n\ntype ModalComponent = typeof DialogPrimitive.Root & {\n Trigger: typeof DialogPrimitive.Trigger;\n Portal: typeof DialogPrimitive.Portal;\n Close: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalCloseProps> & React.RefAttributes<HTMLButtonElement>\n >;\n Overlay: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalOverlayProps> &\n React.RefAttributes<React.ElementRef<typeof DialogPrimitive.Overlay>>\n >;\n Content: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalContentProps> &\n React.RefAttributes<React.ElementRef<typeof DialogPrimitive.Content>>\n >;\n Header: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalHeaderProps> & React.RefAttributes<HTMLDivElement>\n >;\n Body: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalBodyProps> & React.RefAttributes<HTMLDivElement>\n >;\n Footer: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalFooterProps> & React.RefAttributes<HTMLDivElement>\n >;\n FooterDescription: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalFooterDescriptionProps> & React.RefAttributes<HTMLDivElement>\n >;\n Actions: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalActionsProps> & React.RefAttributes<HTMLDivElement>\n >;\n Action: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalActionProps> & React.RefAttributes<HTMLButtonElement>\n >;\n Title: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalTitleProps> &\n React.RefAttributes<React.ElementRef<typeof DialogPrimitive.Title>>\n >;\n Description: React.ForwardRefExoticComponent<\n React.PropsWithoutRef<ModalDescriptionProps> &\n React.RefAttributes<React.ElementRef<typeof DialogPrimitive.Description>>\n >;\n};\n\nconst MODAL_PADDING = {\n body: 'px-4 pb-4',\n footer: 'px-4 py-3',\n};\n\nconst ModalContext = createContext<{ size: ModalSize }>({ size: 'medium' });\n\n/**\n * 사용자 인터랙션이 필요한 오버레이 다이얼로그 컴포넌트입니다.\n * Compound Component 패턴으로 하위 컴포넌트와 함께 사용합니다.\n *\n * @example\n * ```tsx\n * <Modal>\n * <Modal.Trigger>열기</Modal.Trigger>\n * <Modal.Content size=\"medium\">\n * <Modal.Header>\n * <Modal.Title>제목</Modal.Title>\n * </Modal.Header>\n * <Modal.Body>내용</Modal.Body>\n * <Modal.Footer>\n * <Modal.Actions>\n * <Modal.Close>닫기</Modal.Close>\n * </Modal.Actions>\n * </Modal.Footer>\n * </Modal.Content>\n * </Modal>\n * ```\n *\n * @see {@link ModalContentProps} Content props 상세\n */\nconst Modal = DialogPrimitive.Root as ModalComponent;\n\nModal.Trigger = DialogPrimitive.Trigger;\n\nModal.Portal = DialogPrimitive.Portal;\n\nModal.Close = forwardRef<HTMLButtonElement, ModalCloseProps>(({ size, ...props }, ref) => {\n const { size: modalSize } = useContext(ModalContext);\n\n return (\n <DialogPrimitive.Close asChild>\n <Button\n {...props}\n ref={ref}\n color=\"assistive\"\n variant=\"contained\"\n size={size ?? (modalSize === 'fullsize' ? 'large' : 'medium')}\n />\n </DialogPrimitive.Close>\n );\n}) as ModalComponent['Close'];\n\nModal.Overlay = forwardRef<React.ComponentRef<typeof DialogPrimitive.Overlay>, ModalOverlayProps>(\n ({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n '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',\n className,\n )}\n {...props}\n />\n ),\n) as ModalComponent['Overlay'];\n\nModal.Content = forwardRef<React.ComponentRef<typeof DialogPrimitive.Content>, ModalContentProps>(\n ({ className, children, size = 'medium', onInteractOutside, onFocusOutside, ...props }, ref) => {\n const isFullSize = size === 'fullsize';\n\n const sizeWidthMap: Record<Exclude<ModalSize, 'fullsize'>, string> = {\n small: 'max-w-[640px]',\n medium: 'max-w-[800px]',\n large: 'max-w-[960px]',\n xlarge: 'max-w-[1120px]',\n };\n\n const shouldPreventDismissForSelect = (target: EventTarget | null) => {\n const isSelectOpen = Boolean(\n document.querySelector('[data-radix-select-content][data-state=\"open\"]'),\n );\n if (isSelectOpen) {\n return true;\n }\n\n if (!(target instanceof Element)) {\n return false;\n }\n\n return Boolean(\n target.closest('[data-radix-select-content]') ||\n target.closest('[data-radix-select-viewport]'),\n );\n };\n\n const handleInteractOutside = (event: InteractOutsideEvent) => {\n // Select가 열려있는 경우: Modal 닫힘 방지\n if (shouldPreventDismissForSelect(event.target)) {\n event.preventDefault();\n }\n\n onInteractOutside?.(event);\n };\n\n return (\n <ModalContext.Provider value={{ size }}>\n <Modal.Portal>\n <Modal.Overlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n // 공통 스타일\n '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',\n // fullsize일 때\n isFullSize\n ? 'inset-0 m-10'\n : // 일반 모달일 때\n cn(\n '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%]',\n sizeWidthMap[size],\n ),\n className,\n )}\n {...props}\n onInteractOutside={handleInteractOutside}\n >\n {children}\n </DialogPrimitive.Content>\n </Modal.Portal>\n </ModalContext.Provider>\n );\n },\n) as ModalComponent['Content'];\n\nModal.Header = forwardRef<HTMLDivElement, ModalHeaderProps>(\n ({ className, line = false, showCloseIcon = true, children, ...props }, ref) => {\n const { size } = useContext(ModalContext);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex shrink-0 flex-row items-center gap-2 pl-4 pr-3',\n line && 'border-b border-border-primary',\n size === 'fullsize' ? 'h-16' : 'h-14',\n className,\n )}\n {...props}\n >\n <div className=\"flex flex-1 flex-row items-center gap-1\">{children}</div>\n {showCloseIcon && (\n <DialogPrimitive.Close\n className={cn(\n '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',\n )}\n >\n <XIcon type=\"regular\" size={20} />\n </DialogPrimitive.Close>\n )}\n </div>\n );\n },\n) as ModalComponent['Header'];\n\nModal.Body = forwardRef<HTMLDivElement, ModalBodyProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex-1 flex flex-col min-h-0 h-full',\n '[&_[data-slot=scroll-area-viewport]>div]:h-full',\n )}\n {...props}\n >\n <ScrollArea className=\"h-full flex flex-col\">\n <div className={cn(MODAL_PADDING.body, className)}>{children}</div>\n </ScrollArea>\n </div>\n ),\n) as ModalComponent['Body'];\n\nModal.Footer = forwardRef<HTMLDivElement, ModalFooterProps>(\n ({ className, line = true, ...props }, ref) => {\n const { size } = useContext(ModalContext);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-row items-center justify-between',\n line && 'border-t border-border-primary',\n size === 'fullsize' ? 'gap-3' : 'h-14 gap-3',\n MODAL_PADDING.footer,\n className,\n )}\n {...props}\n />\n );\n },\n) as ModalComponent['Footer'];\n\nModal.FooterDescription = forwardRef<HTMLDivElement, ModalFooterDescriptionProps>(\n ({ className, error = false, icon, children, ...props }, ref) => {\n const { size } = useContext(ModalContext);\n const isLargeFooter = size === 'fullsize';\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-row items-center gap-1',\n isLargeFooter ? 'text-body-2' : 'text-body-3',\n error ? 'text-text-critical' : 'text-text-tertiary',\n className,\n )}\n {...props}\n >\n {icon && (\n <span className=\"flex shrink-0 size-4 items-center justify-center [&>svg]:size-4\">\n {icon}\n </span>\n )}\n {children}\n </div>\n );\n },\n) as ModalComponent['FooterDescription'];\n\nModal.Actions = forwardRef<HTMLDivElement, ModalActionsProps>(({ className, ...props }, ref) => {\n const { size } = useContext(ModalContext);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'ml-auto flex flex-row items-center',\n size === 'fullsize' ? 'gap-3' : 'gap-2',\n className,\n )}\n {...props}\n />\n );\n}) as ModalComponent['Actions'];\n\nModal.Action = forwardRef<HTMLButtonElement, ModalActionProps>(\n ({ color = 'primary', size, ...props }, ref) => {\n const { size: modalSize } = useContext(ModalContext);\n\n return (\n <DialogPrimitive.Close asChild>\n <Button\n {...props}\n ref={ref}\n color={color}\n variant=\"contained\"\n size={size ?? (modalSize === 'fullsize' ? 'large' : 'medium')}\n />\n </DialogPrimitive.Close>\n );\n },\n) as ModalComponent['Action'];\n\nModal.Title = forwardRef<React.ComponentRef<typeof DialogPrimitive.Title>, ModalTitleProps>(\n ({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n 'text-title-2 font-semibold leading-none tracking-tight text-text-primary',\n className,\n )}\n {...props}\n />\n ),\n) as ModalComponent['Title'];\n\nModal.Description = forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n ModalDescriptionProps\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-body-2 text-text-tertiary', className)}\n {...props}\n />\n)) as ModalComponent['Description'];\n\nModal.displayName = 'Modal';\nModal.Trigger.displayName = 'Modal.Trigger';\nModal.Portal.displayName = 'Modal.Portal';\nModal.Close.displayName = 'Modal.Close';\nModal.Overlay.displayName = 'Modal.Overlay';\nModal.Content.displayName = 'Modal.Content';\nModal.Header.displayName = 'Modal.Header';\nModal.Body.displayName = 'Modal.Body';\nModal.Footer.displayName = 'Modal.Footer';\nModal.FooterDescription.displayName = 'Modal.FooterDescription';\nModal.Actions.displayName = 'Modal.Actions';\nModal.Action.displayName = 'Modal.Action';\nModal.Title.displayName = 'Modal.Title';\nModal.Description.displayName = 'Modal.Description';\n\nexport { Modal };\nexport type {\n ModalComponent,\n ModalRootProps,\n ModalTriggerProps,\n ModalPortalProps,\n ModalOverlayProps,\n ModalContentProps,\n ModalCloseProps,\n ModalHeaderProps,\n ModalBodyProps,\n ModalFooterProps,\n ModalFooterDescriptionProps,\n ModalActionsProps,\n ModalActionProps,\n ModalTitleProps,\n ModalDescriptionProps,\n};\n"]}