@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,275 @@
1
+ 'use strict';
2
+
3
+ var chunkFOMIUDRM_js = require('./chunk-FOMIUDRM.js');
4
+ var chunkREBHUF4L_js = require('./chunk-REBHUF4L.js');
5
+ var chunk5M47B2XJ_js = require('./chunk-5M47B2XJ.js');
6
+ var utils = require('@exem-ui/core/utils');
7
+ var DialogPrimitive = require('@radix-ui/react-dialog');
8
+ var react = require('react');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+
11
+ function _interopNamespace(e) {
12
+ if (e && e.__esModule) return e;
13
+ var n = Object.create(null);
14
+ if (e) {
15
+ Object.keys(e).forEach(function (k) {
16
+ if (k !== 'default') {
17
+ var d = Object.getOwnPropertyDescriptor(e, k);
18
+ Object.defineProperty(n, k, d.get ? d : {
19
+ enumerable: true,
20
+ get: function () { return e[k]; }
21
+ });
22
+ }
23
+ });
24
+ }
25
+ n.default = e;
26
+ return Object.freeze(n);
27
+ }
28
+
29
+ var DialogPrimitive__namespace = /*#__PURE__*/_interopNamespace(DialogPrimitive);
30
+
31
+ var MODAL_PADDING = {
32
+ body: "px-4 pb-4",
33
+ footer: "px-4 py-3"
34
+ };
35
+ var ModalContext = react.createContext({ size: "medium" });
36
+ var Modal = DialogPrimitive__namespace.Root;
37
+ Modal.Trigger = DialogPrimitive__namespace.Trigger;
38
+ Modal.Portal = DialogPrimitive__namespace.Portal;
39
+ Modal.Close = react.forwardRef(({ size, ...props }, ref) => {
40
+ const { size: modalSize } = react.useContext(ModalContext);
41
+ return /* @__PURE__ */ jsxRuntime.jsx(DialogPrimitive__namespace.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
42
+ chunkREBHUF4L_js.Button,
43
+ {
44
+ ...props,
45
+ ref,
46
+ color: "assistive",
47
+ variant: "contained",
48
+ size: size ?? (modalSize === "fullsize" ? "large" : "medium")
49
+ }
50
+ ) });
51
+ });
52
+ Modal.Overlay = react.forwardRef(
53
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
54
+ DialogPrimitive__namespace.Overlay,
55
+ {
56
+ ref,
57
+ className: utils.cn(
58
+ "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",
59
+ className
60
+ ),
61
+ ...props
62
+ }
63
+ )
64
+ );
65
+ Modal.Content = react.forwardRef(
66
+ ({ className, children, size = "medium", onInteractOutside, onFocusOutside, ...props }, ref) => {
67
+ const isFullSize = size === "fullsize";
68
+ const sizeWidthMap = {
69
+ small: "max-w-[640px]",
70
+ medium: "max-w-[800px]",
71
+ large: "max-w-[960px]",
72
+ xlarge: "max-w-[1120px]"
73
+ };
74
+ const shouldPreventDismissForSelect = (target) => {
75
+ const isSelectOpen = Boolean(
76
+ document.querySelector('[data-radix-select-content][data-state="open"]')
77
+ );
78
+ if (isSelectOpen) {
79
+ return true;
80
+ }
81
+ if (!(target instanceof Element)) {
82
+ return false;
83
+ }
84
+ return Boolean(
85
+ target.closest("[data-radix-select-content]") || target.closest("[data-radix-select-viewport]")
86
+ );
87
+ };
88
+ const handleInteractOutside = (event) => {
89
+ if (shouldPreventDismissForSelect(event.target)) {
90
+ event.preventDefault();
91
+ }
92
+ onInteractOutside?.(event);
93
+ };
94
+ return /* @__PURE__ */ jsxRuntime.jsx(ModalContext.Provider, { value: { size }, children: /* @__PURE__ */ jsxRuntime.jsxs(Modal.Portal, { children: [
95
+ /* @__PURE__ */ jsxRuntime.jsx(Modal.Overlay, {}),
96
+ /* @__PURE__ */ jsxRuntime.jsx(
97
+ DialogPrimitive__namespace.Content,
98
+ {
99
+ ref,
100
+ className: utils.cn(
101
+ // 공통 스타일
102
+ "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",
103
+ // fullsize일 때
104
+ isFullSize ? "inset-0 m-10" : (
105
+ // 일반 모달일 때
106
+ utils.cn(
107
+ "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%]",
108
+ sizeWidthMap[size]
109
+ )
110
+ ),
111
+ className
112
+ ),
113
+ ...props,
114
+ onInteractOutside: handleInteractOutside,
115
+ children
116
+ }
117
+ )
118
+ ] }) });
119
+ }
120
+ );
121
+ Modal.Header = react.forwardRef(
122
+ ({ className, line = false, showCloseIcon = true, children, ...props }, ref) => {
123
+ const { size } = react.useContext(ModalContext);
124
+ return /* @__PURE__ */ jsxRuntime.jsxs(
125
+ "div",
126
+ {
127
+ ref,
128
+ className: utils.cn(
129
+ "flex shrink-0 flex-row items-center gap-2 pl-4 pr-3",
130
+ line && "border-b border-border-primary",
131
+ size === "fullsize" ? "h-16" : "h-14",
132
+ className
133
+ ),
134
+ ...props,
135
+ children: [
136
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-1 flex-row items-center gap-1", children }),
137
+ showCloseIcon && /* @__PURE__ */ jsxRuntime.jsx(
138
+ DialogPrimitive__namespace.Close,
139
+ {
140
+ className: utils.cn(
141
+ "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"
142
+ ),
143
+ children: /* @__PURE__ */ jsxRuntime.jsx(chunk5M47B2XJ_js.X, { type: "regular", size: 20 })
144
+ }
145
+ )
146
+ ]
147
+ }
148
+ );
149
+ }
150
+ );
151
+ Modal.Body = react.forwardRef(
152
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
153
+ "div",
154
+ {
155
+ ref,
156
+ className: utils.cn(
157
+ "flex-1 flex flex-col min-h-0 h-full",
158
+ "[&_[data-slot=scroll-area-viewport]>div]:h-full"
159
+ ),
160
+ ...props,
161
+ children: /* @__PURE__ */ jsxRuntime.jsx(chunkFOMIUDRM_js.ScrollArea, { className: "h-full flex flex-col", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: utils.cn(MODAL_PADDING.body, className), children }) })
162
+ }
163
+ )
164
+ );
165
+ Modal.Footer = react.forwardRef(
166
+ ({ className, line = true, ...props }, ref) => {
167
+ const { size } = react.useContext(ModalContext);
168
+ return /* @__PURE__ */ jsxRuntime.jsx(
169
+ "div",
170
+ {
171
+ ref,
172
+ className: utils.cn(
173
+ "flex flex-row items-center justify-between",
174
+ line && "border-t border-border-primary",
175
+ size === "fullsize" ? "gap-3" : "h-14 gap-3",
176
+ MODAL_PADDING.footer,
177
+ className
178
+ ),
179
+ ...props
180
+ }
181
+ );
182
+ }
183
+ );
184
+ Modal.FooterDescription = react.forwardRef(
185
+ ({ className, error = false, icon, children, ...props }, ref) => {
186
+ const { size } = react.useContext(ModalContext);
187
+ const isLargeFooter = size === "fullsize";
188
+ return /* @__PURE__ */ jsxRuntime.jsxs(
189
+ "div",
190
+ {
191
+ ref,
192
+ className: utils.cn(
193
+ "flex flex-row items-center gap-1",
194
+ isLargeFooter ? "text-body-2" : "text-body-3",
195
+ error ? "text-text-critical" : "text-text-tertiary",
196
+ className
197
+ ),
198
+ ...props,
199
+ children: [
200
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0 size-4 items-center justify-center [&>svg]:size-4", children: icon }),
201
+ children
202
+ ]
203
+ }
204
+ );
205
+ }
206
+ );
207
+ Modal.Actions = react.forwardRef(({ className, ...props }, ref) => {
208
+ const { size } = react.useContext(ModalContext);
209
+ return /* @__PURE__ */ jsxRuntime.jsx(
210
+ "div",
211
+ {
212
+ ref,
213
+ className: utils.cn(
214
+ "ml-auto flex flex-row items-center",
215
+ size === "fullsize" ? "gap-3" : "gap-2",
216
+ className
217
+ ),
218
+ ...props
219
+ }
220
+ );
221
+ });
222
+ Modal.Action = react.forwardRef(
223
+ ({ color = "primary", size, ...props }, ref) => {
224
+ const { size: modalSize } = react.useContext(ModalContext);
225
+ return /* @__PURE__ */ jsxRuntime.jsx(DialogPrimitive__namespace.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
226
+ chunkREBHUF4L_js.Button,
227
+ {
228
+ ...props,
229
+ ref,
230
+ color,
231
+ variant: "contained",
232
+ size: size ?? (modalSize === "fullsize" ? "large" : "medium")
233
+ }
234
+ ) });
235
+ }
236
+ );
237
+ Modal.Title = react.forwardRef(
238
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
239
+ DialogPrimitive__namespace.Title,
240
+ {
241
+ ref,
242
+ className: utils.cn(
243
+ "text-title-2 font-semibold leading-none tracking-tight text-text-primary",
244
+ className
245
+ ),
246
+ ...props
247
+ }
248
+ )
249
+ );
250
+ Modal.Description = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
251
+ DialogPrimitive__namespace.Description,
252
+ {
253
+ ref,
254
+ className: utils.cn("text-body-2 text-text-tertiary", className),
255
+ ...props
256
+ }
257
+ ));
258
+ Modal.displayName = "Modal";
259
+ Modal.Trigger.displayName = "Modal.Trigger";
260
+ Modal.Portal.displayName = "Modal.Portal";
261
+ Modal.Close.displayName = "Modal.Close";
262
+ Modal.Overlay.displayName = "Modal.Overlay";
263
+ Modal.Content.displayName = "Modal.Content";
264
+ Modal.Header.displayName = "Modal.Header";
265
+ Modal.Body.displayName = "Modal.Body";
266
+ Modal.Footer.displayName = "Modal.Footer";
267
+ Modal.FooterDescription.displayName = "Modal.FooterDescription";
268
+ Modal.Actions.displayName = "Modal.Actions";
269
+ Modal.Action.displayName = "Modal.Action";
270
+ Modal.Title.displayName = "Modal.Title";
271
+ Modal.Description.displayName = "Modal.Description";
272
+
273
+ exports.Modal = Modal;
274
+ //# sourceMappingURL=chunk-RGB3QLQT.js.map
275
+ //# sourceMappingURL=chunk-RGB3QLQT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modal/Modal.tsx"],"names":["createContext","DialogPrimitive","forwardRef","useContext","jsx","Button","cn","jsxs","X","ScrollArea"],"mappings":"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","file":"chunk-RGB3QLQT.js","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"]}
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ var utils = require('@exem-ui/core/utils');
4
+ var TooltipPrimitive = require('@radix-ui/react-tooltip');
5
+ var react = require('react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var TooltipPrimitive__namespace = /*#__PURE__*/_interopNamespace(TooltipPrimitive);
27
+
28
+ // src/tooltip/Tooltip.tsx
29
+ var tooltipContentVariants = utils.cva(
30
+ [
31
+ // Base layout
32
+ "z-50 flex flex-col items-start overflow-hidden",
33
+ "rounded-medium",
34
+ "text-text-static-light",
35
+ "bg-component-tooltip border border-border-primary",
36
+ "shadow-medium",
37
+ "animate-in fade-in-0 zoom-in-95",
38
+ "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
39
+ "data-[side=bottom]:slide-in-from-top-2",
40
+ "data-[side=left]:slide-in-from-right-2",
41
+ "data-[side=right]:slide-in-from-left-2",
42
+ "data-[side=top]:slide-in-from-bottom-2"
43
+ ],
44
+ {
45
+ variants: {
46
+ size: {
47
+ tiny: "px-2 py-1 text-body-3",
48
+ small: "w-[160px] gap-[8px] px-[12px] py-[10px]",
49
+ medium: "w-[240px] gap-[8px] px-[12px] py-[10px]",
50
+ large: "w-[320px] gap-[8px] px-[12px] py-[10px]",
51
+ xlarge: "w-[400px] gap-[8px] px-[12px] py-[10px]"
52
+ }
53
+ },
54
+ defaultVariants: { size: "small" }
55
+ }
56
+ );
57
+ var tooltipTitleVariants = utils.cva([
58
+ "text-body-1 font-semibold text-text-static-light",
59
+ "group-data-[size=tiny]/tooltip-content:text-body-3"
60
+ ]);
61
+ var tooltipTextVariants = utils.cva([
62
+ "text-body-2 font-regular text-text-static-light",
63
+ "group-data-[size=tiny]/tooltip-content:text-body-3"
64
+ ]);
65
+ var Tooltip = TooltipPrimitive__namespace.Root;
66
+ Tooltip.Provider = TooltipPrimitive__namespace.Provider;
67
+ Tooltip.Trigger = TooltipPrimitive__namespace.Trigger;
68
+ Tooltip.Content = react.forwardRef(({ className, sideOffset = 4, size, children, portalContainer, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(TooltipPrimitive__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
69
+ TooltipPrimitive__namespace.Content,
70
+ {
71
+ ref,
72
+ sideOffset,
73
+ "data-size": size,
74
+ className: utils.cn("group/tooltip-content", tooltipContentVariants({ size }), className),
75
+ ...props,
76
+ children
77
+ }
78
+ ) }));
79
+ Tooltip.Title = react.forwardRef(
80
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: utils.cn(tooltipTitleVariants(), className), ...props, children })
81
+ );
82
+ Tooltip.Description = react.forwardRef(
83
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: utils.cn(tooltipTextVariants(), className), ...props, children })
84
+ );
85
+ Tooltip.displayName = "Tooltip";
86
+ Tooltip.Content.displayName = "Tooltip.Content";
87
+ Tooltip.Title.displayName = "Tooltip.Title";
88
+ Tooltip.Description.displayName = "Tooltip.Description";
89
+ Tooltip.Trigger.displayName = "Tooltip.Trigger";
90
+ Tooltip.Provider.displayName = "Tooltip.Provider";
91
+
92
+ exports.Tooltip = Tooltip;
93
+ //# sourceMappingURL=chunk-T7U2QRLC.js.map
94
+ //# sourceMappingURL=chunk-T7U2QRLC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tooltip/Tooltip.tsx"],"names":["cva","TooltipPrimitive","forwardRef","jsx","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,IAAM,sBAAA,GAAyBA,SAAA;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,uBAAuBA,SAAA,CAAI;AAAA,EAC/B,kDAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,sBAAsBA,SAAA,CAAI;AAAA,EAC9B,iDAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,OAAA,GAA2BC,2BAAA,CAAA;AAEjC,OAAA,CAAQ,QAAA,GAA4BA,2BAAA,CAAA,QAAA;AAEpC,OAAA,CAAQ,OAAA,GAA2BA,2BAAA,CAAA,OAAA;AAEnC,OAAA,CAAQ,UAAUC,gBAAA,CAGhB,CAAC,EAAE,SAAA,EAAW,UAAA,GAAa,GAAG,IAAA,EAAM,QAAA,EAAU,eAAA,EAAiB,GAAG,OAAM,EAAG,GAAA,oCACzDD,2BAAA,CAAA,MAAA,EAAjB,EAAwB,WAAW,eAAA,EAClC,QAAA,kBAAAE,cAAA;AAAA,EAAkBF,2BAAA,CAAA,OAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA,EAAW,IAAA;AAAA,IACX,SAAA,EAAWG,SAAG,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,GAAQF,gBAAA;AAAA,EACd,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,qBAClCC,cAAA,CAAC,SAAI,GAAA,EAAU,SAAA,EAAWC,SAAG,oBAAA,EAAqB,EAAG,SAAS,CAAA,EAAI,GAAG,OAClE,QAAA,EACH;AAEJ,CAAA;AAEA,OAAA,CAAQ,WAAA,GAAcF,gBAAA;AAAA,EACpB,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,qBAClCC,cAAA,CAAC,SAAI,GAAA,EAAU,SAAA,EAAWC,SAAG,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-T7U2QRLC.js","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,73 @@
1
+ import { cn } from '@exem-ui/core/utils';
2
+ import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ // src/scrollArea/ScrollArea.tsx
6
+ function ScrollBar({
7
+ className,
8
+ orientation = "vertical",
9
+ ...props
10
+ }) {
11
+ return /* @__PURE__ */ jsx(
12
+ ScrollAreaPrimitive.ScrollAreaScrollbar,
13
+ {
14
+ "data-slot": "scroll-area-scrollbar",
15
+ orientation,
16
+ className: cn(
17
+ "flex touch-none select-none transition-opacity",
18
+ orientation === "vertical" && "w-[10px] p-[2px] opacity-0 duration-300 ease-out group-hover:opacity-100",
19
+ orientation === "horizontal" && "h-[10px] flex-col px-[3px] py-[2px]",
20
+ className
21
+ ),
22
+ ...props,
23
+ children: /* @__PURE__ */ jsx(
24
+ ScrollAreaPrimitive.ScrollAreaThumb,
25
+ {
26
+ "data-slot": "scroll-area-thumb",
27
+ className: "relative flex-1 rounded-full bg-component-scroll"
28
+ }
29
+ )
30
+ }
31
+ );
32
+ }
33
+ function ScrollArea({
34
+ className,
35
+ children,
36
+ onScroll,
37
+ scrollRef,
38
+ hideVerticalScrollbar = false,
39
+ hideHorizontalScrollbar = false,
40
+ disableHorizontalScroll = false,
41
+ ...props
42
+ }) {
43
+ return /* @__PURE__ */ jsxs(
44
+ ScrollAreaPrimitive.Root,
45
+ {
46
+ "data-slot": "scroll-area",
47
+ className: cn("group relative overflow-hidden", className),
48
+ ...props,
49
+ children: [
50
+ /* @__PURE__ */ jsx(
51
+ ScrollAreaPrimitive.Viewport,
52
+ {
53
+ "data-slot": "scroll-area-viewport",
54
+ ref: scrollRef,
55
+ onScroll,
56
+ className: cn(
57
+ "size-full rounded-[inherit]",
58
+ disableHorizontalScroll && "!overflow-x-hidden"
59
+ ),
60
+ children
61
+ }
62
+ ),
63
+ !hideVerticalScrollbar && /* @__PURE__ */ jsx(ScrollBar, { orientation: "vertical", forceMount: true }),
64
+ !(hideHorizontalScrollbar || disableHorizontalScroll) && /* @__PURE__ */ jsx(ScrollBar, { orientation: "horizontal", forceMount: true }),
65
+ /* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, {})
66
+ ]
67
+ }
68
+ );
69
+ }
70
+
71
+ export { ScrollArea, ScrollBar };
72
+ //# sourceMappingURL=chunk-TEHHJ3CS.mjs.map
73
+ //# sourceMappingURL=chunk-TEHHJ3CS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/scrollArea/ScrollArea.tsx"],"names":[],"mappings":";;;;;AAeA,SAAS,SAAA,CAAU;AAAA,EACjB,SAAA;AAAA,EACA,WAAA,GAAc,UAAA;AAAA,EACd,GAAG;AACL,CAAA,EAAyE;AACvE,EAAA,uBACE,GAAA;AAAA,IAAqB,mBAAA,CAAA,mBAAA;AAAA,IAApB;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,WAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,gDAAA;AAAA,QACA,gBAAgB,UAAA,IACd,0EAAA;AAAA,QACF,gBAAgB,YAAA,IAAgB,qCAAA;AAAA,QAChC;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA;AAAA,QAAqB,mBAAA,CAAA,eAAA;AAAA,QAApB;AAAA,UACC,WAAA,EAAU,mBAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,GACF;AAEJ;AAeA,SAAS,UAAA,CAAW;AAAA,EAClB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,qBAAA,GAAwB,KAAA;AAAA,EACxB,uBAAA,GAA0B,KAAA;AAAA,EAC1B,uBAAA,GAA0B,KAAA;AAAA,EAC1B,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,uBACE,IAAA;AAAA,IAAqB,mBAAA,CAAA,IAAA;AAAA,IAApB;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,gCAAA,EAAkC,SAAS,CAAA;AAAA,MACxD,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAqB,mBAAA,CAAA,QAAA;AAAA,UAApB;AAAA,YACC,WAAA,EAAU,sBAAA;AAAA,YACV,GAAA,EAAK,SAAA;AAAA,YACL,QAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACT,6BAAA;AAAA,cACA,uBAAA,IAA2B;AAAA,aAC7B;AAAA,YAEC;AAAA;AAAA,SACH;AAAA,QACC,CAAC,qBAAA,oBAAyB,GAAA,CAAC,aAAU,WAAA,EAAY,UAAA,EAAW,YAAU,IAAA,EAAC,CAAA;AAAA,QACvE,EAAE,2BAA2B,uBAAA,CAAA,oBAC5B,GAAA,CAAC,aAAU,WAAA,EAAY,YAAA,EAAa,YAAU,IAAA,EAAC,CAAA;AAAA,wBAEjD,GAAA,CAAqB,4BAApB,EAA2B;AAAA;AAAA;AAAA,GAC9B;AAEJ","file":"chunk-TEHHJ3CS.mjs","sourcesContent":["import { cn } from '@exem-ui/core/utils';\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';\nimport type React from 'react';\n\ninterface ScrollAreaProps extends React.ComponentProps<typeof ScrollAreaPrimitive.Root> {\n /** 스크롤 뷰포트의 ref. 스크롤 위치 제어 시 사용합니다. */\n scrollRef?: React.ComponentProps<typeof ScrollAreaPrimitive.Viewport>['ref'];\n /** 세로 스크롤바 숨김 여부 */\n hideVerticalScrollbar?: boolean;\n /** 가로 스크롤바 숨김 여부 */\n hideHorizontalScrollbar?: boolean;\n /** 가로 스크롤 비활성화 (overflow-x: hidden) */\n disableHorizontalScroll?: boolean;\n}\n\nfunction ScrollBar({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n 'flex touch-none select-none transition-opacity',\n orientation === 'vertical' &&\n 'w-[10px] p-[2px] opacity-0 duration-300 ease-out group-hover:opacity-100',\n orientation === 'horizontal' && 'h-[10px] flex-col px-[3px] py-[2px]',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-component-scroll\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n\n/**\n * 커스텀 스크롤바를 제공하는 스크롤 영역 컴포넌트입니다.\n * 마우스 호버 시 스크롤바가 나타나는 UX를 제공합니다.\n *\n * @example\n * ```tsx\n * <ScrollArea className=\"h-[300px]\">\n * <div>스크롤 가능한 콘텐츠</div>\n * </ScrollArea>\n * ```\n *\n * @see {@link ScrollAreaProps} props 상세\n */\nfunction ScrollArea({\n className,\n children,\n onScroll,\n scrollRef,\n hideVerticalScrollbar = false,\n hideHorizontalScrollbar = false,\n disableHorizontalScroll = false,\n ...props\n}: ScrollAreaProps) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn('group relative overflow-hidden', className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n ref={scrollRef}\n onScroll={onScroll}\n className={cn(\n 'size-full rounded-[inherit]',\n disableHorizontalScroll && '!overflow-x-hidden',\n )}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n {!hideVerticalScrollbar && <ScrollBar orientation=\"vertical\" forceMount />}\n {!(hideHorizontalScrollbar || disableHorizontalScroll) && (\n <ScrollBar orientation=\"horizontal\" forceMount />\n )}\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nexport { ScrollArea, ScrollBar };\nexport type { ScrollAreaProps };\n"]}
@@ -0,0 +1,117 @@
1
+ 'use strict';
2
+
3
+ var utils = require('@exem-ui/core/utils');
4
+ var TabsPrimitive = require('@radix-ui/react-tabs');
5
+ var react = require('react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var TabsPrimitive__namespace = /*#__PURE__*/_interopNamespace(TabsPrimitive);
27
+
28
+ // src/tabs/Tabs.tsx
29
+ var TabsContext = react.createContext({ type: "primary" });
30
+ var useTabsContext = () => {
31
+ const context = react.useContext(TabsContext);
32
+ if (!context) {
33
+ throw new Error("useTabsContext must be used within a TabsProvider");
34
+ }
35
+ return context;
36
+ };
37
+ var tabsListVariants = utils.cva("inline-flex items-center", {
38
+ variants: {
39
+ type: {
40
+ primary: "h-9 gap-5 border-b border-border-primary",
41
+ secondary: "h-8 gap-1"
42
+ }
43
+ },
44
+ defaultVariants: {
45
+ type: "primary"
46
+ }
47
+ });
48
+ var tabsTriggerVariants = utils.cva(
49
+ "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",
50
+ {
51
+ variants: {
52
+ type: {
53
+ primary: [
54
+ "h-9 border-b-2 border-transparent p-0 text-text-tertiary",
55
+ "hover:text-text-primary",
56
+ "data-[state=active]:border-border-focused data-[state=active]:text-text-primary"
57
+ ],
58
+ secondary: [
59
+ "h-8 rounded-strong px-2 text-text-tertiary",
60
+ "hover:text-text-primary",
61
+ "data-[state=active]:rounded-medium data-[state=active]:bg-elevation-elevation-2 data-[state=active]:text-text-primary"
62
+ ]
63
+ }
64
+ },
65
+ defaultVariants: {
66
+ type: "primary"
67
+ }
68
+ }
69
+ );
70
+ var Tabs = react.forwardRef(
71
+ ({ type = "primary", children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(TabsContext.Provider, { value: { type }, children: /* @__PURE__ */ jsxRuntime.jsx(TabsPrimitive__namespace.Root, { ref, ...props, children }) })
72
+ );
73
+ Tabs.List = react.forwardRef(
74
+ ({ className, ...props }, ref) => {
75
+ const { type } = useTabsContext();
76
+ return /* @__PURE__ */ jsxRuntime.jsx(
77
+ TabsPrimitive__namespace.List,
78
+ {
79
+ ref,
80
+ className: utils.cn(tabsListVariants({ type }), className),
81
+ ...props
82
+ }
83
+ );
84
+ }
85
+ );
86
+ Tabs.Trigger = react.forwardRef(
87
+ ({ className, leftIcon, rightIcon, badge, children, ...props }, ref) => {
88
+ const { type } = useTabsContext();
89
+ return /* @__PURE__ */ jsxRuntime.jsxs(
90
+ TabsPrimitive__namespace.Trigger,
91
+ {
92
+ ref,
93
+ className: utils.cn(tabsTriggerVariants({ type }), className),
94
+ ...props,
95
+ children: [
96
+ leftIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-4", children: leftIcon }),
97
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1", children: [
98
+ children,
99
+ badge && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-text-tertiary group-data-[state=active]:text-text-accent", children: badge })
100
+ ] }),
101
+ rightIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-4", children: rightIcon })
102
+ ]
103
+ }
104
+ );
105
+ }
106
+ );
107
+ Tabs.Content = react.forwardRef(
108
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(TabsPrimitive__namespace.Content, { ref, className: utils.cn(className), ...props })
109
+ );
110
+ Tabs.displayName = "Tabs";
111
+ Tabs.List.displayName = "Tabs.List";
112
+ Tabs.Trigger.displayName = "Tabs.Trigger";
113
+ Tabs.Content.displayName = "Tabs.Content";
114
+
115
+ exports.Tabs = Tabs;
116
+ //# sourceMappingURL=chunk-TJY4MIBC.js.map
117
+ //# sourceMappingURL=chunk-TJY4MIBC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tabs/Tabs.tsx"],"names":["createContext","useContext","cva","forwardRef","jsx","TabsPrimitive","cn","jsxs"],"mappings":"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","file":"chunk-TJY4MIBC.js","sourcesContent":["import { cn, cva } from '@exem-ui/core/utils';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport type React from 'react';\nimport { createContext, forwardRef, useContext } from 'react';\n\ntype TabsType = 'primary' | 'secondary';\n\ntype TabsContextType = {\n type: TabsType;\n};\n\ntype TabsRootProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.Root> & {\n /**\n * 탭 스타일 유형\n * @default 'primary'\n */\n type?: TabsType;\n};\n\ntype TabsListProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>;\n\ntype TabsTriggerProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger> & {\n /** 텍스트 왼쪽에 표시할 아이콘 요소 */\n leftIcon?: React.ReactElement<{ className?: string }>;\n /** 텍스트 오른쪽에 표시할 아이콘 요소 */\n rightIcon?: React.ReactElement<{ className?: string }>;\n /** 탭 라벨 옆에 표시할 배지 텍스트 */\n badge?: string | number;\n};\n\ntype TabsContentProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>;\n\ntype TabsComponent = React.ForwardRefExoticComponent<\n TabsRootProps & React.RefAttributes<React.ElementRef<typeof TabsPrimitive.Root>>\n> & {\n List: React.ForwardRefExoticComponent<TabsListProps>;\n Trigger: React.ForwardRefExoticComponent<TabsTriggerProps>;\n Content: React.ForwardRefExoticComponent<TabsContentProps>;\n};\n\nconst TabsContext = createContext<TabsContextType>({ type: 'primary' });\n\nconst useTabsContext = () => {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error('useTabsContext must be used within a TabsProvider');\n }\n return context;\n};\n\n// TabsList variants\nconst tabsListVariants = cva('inline-flex items-center', {\n variants: {\n type: {\n primary: 'h-9 gap-5 border-b border-border-primary',\n secondary: 'h-8 gap-1',\n },\n },\n defaultVariants: {\n type: 'primary',\n },\n});\n\n// TabsTrigger variants\nconst tabsTriggerVariants = cva(\n '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',\n {\n variants: {\n type: {\n primary: [\n 'h-9 border-b-2 border-transparent p-0 text-text-tertiary',\n 'hover:text-text-primary',\n 'data-[state=active]:border-border-focused data-[state=active]:text-text-primary',\n ],\n secondary: [\n 'h-8 rounded-strong px-2 text-text-tertiary',\n 'hover:text-text-primary',\n 'data-[state=active]:rounded-medium data-[state=active]:bg-elevation-elevation-2 data-[state=active]:text-text-primary',\n ],\n },\n },\n defaultVariants: {\n type: 'primary',\n },\n },\n);\n\n/**\n * 탭 형태의 콘텐츠 전환 컴포넌트입니다.\n * Compound Component 패턴으로 `Tabs.List`, `Tabs.Trigger`, `Tabs.Content`와 함께 사용합니다.\n *\n * @example\n * ```tsx\n * <Tabs defaultValue=\"tab1\" type=\"primary\">\n * <Tabs.List>\n * <Tabs.Trigger value=\"tab1\">첫 번째</Tabs.Trigger>\n * <Tabs.Trigger value=\"tab2\">두 번째</Tabs.Trigger>\n * </Tabs.List>\n * <Tabs.Content value=\"tab1\">첫 번째 내용</Tabs.Content>\n * <Tabs.Content value=\"tab2\">두 번째 내용</Tabs.Content>\n * </Tabs>\n * ```\n *\n * @see {@link TabsRootProps} 루트 props 상세\n * @see {@link TabsTriggerProps} 트리거 props 상세\n */\nconst Tabs = forwardRef<React.ElementRef<typeof TabsPrimitive.Root>, TabsRootProps>(\n ({ type = 'primary', children, ...props }, ref) => (\n <TabsContext.Provider value={{ type }}>\n <TabsPrimitive.Root ref={ref} {...props}>\n {children}\n </TabsPrimitive.Root>\n </TabsContext.Provider>\n ),\n) as TabsComponent;\n\nTabs.List = forwardRef<React.ElementRef<typeof TabsPrimitive.List>, TabsListProps>(\n ({ className, ...props }, ref) => {\n const { type } = useTabsContext();\n return (\n <TabsPrimitive.List\n ref={ref}\n className={cn(tabsListVariants({ type }), className)}\n {...props}\n />\n );\n },\n) as TabsComponent['List'];\n\nTabs.Trigger = forwardRef<React.ElementRef<typeof TabsPrimitive.Trigger>, TabsTriggerProps>(\n ({ className, leftIcon, rightIcon, badge, children, ...props }, ref) => {\n const { type } = useTabsContext();\n return (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(tabsTriggerVariants({ type }), className)}\n {...props}\n >\n {leftIcon && <span className=\"size-4\">{leftIcon}</span>}\n <span className=\"flex items-center gap-1\">\n {children}\n {badge && (\n <span className=\"text-text-tertiary group-data-[state=active]:text-text-accent\">\n {badge}\n </span>\n )}\n </span>\n {rightIcon && <span className=\"size-4\">{rightIcon}</span>}\n </TabsPrimitive.Trigger>\n );\n },\n) as TabsComponent['Trigger'];\n\nTabs.Content = forwardRef<React.ElementRef<typeof TabsPrimitive.Content>, TabsContentProps>(\n ({ className, ...props }, ref) => (\n <TabsPrimitive.Content ref={ref} className={cn(className)} {...props} />\n ),\n) as TabsComponent['Content'];\n\nTabs.displayName = 'Tabs';\nTabs.List.displayName = 'Tabs.List';\nTabs.Trigger.displayName = 'Tabs.Trigger';\nTabs.Content.displayName = 'Tabs.Content';\n\nexport { Tabs };\nexport type { TabsComponent, TabsRootProps, TabsListProps, TabsTriggerProps, TabsContentProps };\n"]}