@exem-ui/react 0.1.0-next.bf3c711

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 (274) hide show
  1. package/README.en.md +141 -0
  2. package/README.md +141 -0
  3. package/dist/Button-CMenVfb7.d.mts +35 -0
  4. package/dist/Button-CMenVfb7.d.ts +35 -0
  5. package/dist/Select-DMvWV_rF.d.mts +94 -0
  6. package/dist/Select-DMvWV_rF.d.ts +94 -0
  7. package/dist/avatar/index.d.mts +37 -0
  8. package/dist/avatar/index.d.ts +37 -0
  9. package/dist/avatar/index.js +13 -0
  10. package/dist/avatar/index.js.map +1 -0
  11. package/dist/avatar/index.mjs +4 -0
  12. package/dist/avatar/index.mjs.map +1 -0
  13. package/dist/badge/index.d.mts +29 -0
  14. package/dist/badge/index.d.ts +29 -0
  15. package/dist/badge/index.js +12 -0
  16. package/dist/badge/index.js.map +1 -0
  17. package/dist/badge/index.mjs +3 -0
  18. package/dist/badge/index.mjs.map +1 -0
  19. package/dist/breadcrumb/index.d.mts +43 -0
  20. package/dist/breadcrumb/index.d.ts +43 -0
  21. package/dist/breadcrumb/index.js +13 -0
  22. package/dist/breadcrumb/index.js.map +1 -0
  23. package/dist/breadcrumb/index.mjs +4 -0
  24. package/dist/breadcrumb/index.mjs.map +1 -0
  25. package/dist/button/index.d.mts +9 -0
  26. package/dist/button/index.d.ts +9 -0
  27. package/dist/button/index.js +29 -0
  28. package/dist/button/index.js.map +1 -0
  29. package/dist/button/index.mjs +12 -0
  30. package/dist/button/index.mjs.map +1 -0
  31. package/dist/checkbox/index.d.mts +54 -0
  32. package/dist/checkbox/index.d.ts +54 -0
  33. package/dist/checkbox/index.js +13 -0
  34. package/dist/checkbox/index.js.map +1 -0
  35. package/dist/checkbox/index.mjs +4 -0
  36. package/dist/checkbox/index.mjs.map +1 -0
  37. package/dist/chunk-34QIGWCT.mjs +10 -0
  38. package/dist/chunk-34QIGWCT.mjs.map +1 -0
  39. package/dist/chunk-3FPMWAQT.js +30 -0
  40. package/dist/chunk-3FPMWAQT.js.map +1 -0
  41. package/dist/chunk-3HMT3DQV.js +104 -0
  42. package/dist/chunk-3HMT3DQV.js.map +1 -0
  43. package/dist/chunk-4WAO7CUT.mjs +95 -0
  44. package/dist/chunk-4WAO7CUT.mjs.map +1 -0
  45. package/dist/chunk-5M47B2XJ.js +4096 -0
  46. package/dist/chunk-5M47B2XJ.js.map +1 -0
  47. package/dist/chunk-5QX4TO4F.js +61 -0
  48. package/dist/chunk-5QX4TO4F.js.map +1 -0
  49. package/dist/chunk-5TEFN2CW.js +97 -0
  50. package/dist/chunk-5TEFN2CW.js.map +1 -0
  51. package/dist/chunk-5TES5PG6.js +41 -0
  52. package/dist/chunk-5TES5PG6.js.map +1 -0
  53. package/dist/chunk-5TVMECVF.js +148 -0
  54. package/dist/chunk-5TVMECVF.js.map +1 -0
  55. package/dist/chunk-5WGNZX7Z.mjs +27 -0
  56. package/dist/chunk-5WGNZX7Z.mjs.map +1 -0
  57. package/dist/chunk-AQ3OIM2T.js +103 -0
  58. package/dist/chunk-AQ3OIM2T.js.map +1 -0
  59. package/dist/chunk-AU5NTBK3.js +361 -0
  60. package/dist/chunk-AU5NTBK3.js.map +1 -0
  61. package/dist/chunk-DJHGCJR4.mjs +224 -0
  62. package/dist/chunk-DJHGCJR4.mjs.map +1 -0
  63. package/dist/chunk-DPUTW5KD.mjs +74 -0
  64. package/dist/chunk-DPUTW5KD.mjs.map +1 -0
  65. package/dist/chunk-E53FHDVN.mjs +336 -0
  66. package/dist/chunk-E53FHDVN.mjs.map +1 -0
  67. package/dist/chunk-ECRQD7UU.js +82 -0
  68. package/dist/chunk-ECRQD7UU.js.map +1 -0
  69. package/dist/chunk-FB4ESGOX.mjs +59 -0
  70. package/dist/chunk-FB4ESGOX.mjs.map +1 -0
  71. package/dist/chunk-FDX4IQK5.js +76 -0
  72. package/dist/chunk-FDX4IQK5.js.map +1 -0
  73. package/dist/chunk-FOMIUDRM.js +96 -0
  74. package/dist/chunk-FOMIUDRM.js.map +1 -0
  75. package/dist/chunk-FR5F3VTU.js +139 -0
  76. package/dist/chunk-FR5F3VTU.js.map +1 -0
  77. package/dist/chunk-GW53LH3I.mjs +81 -0
  78. package/dist/chunk-GW53LH3I.mjs.map +1 -0
  79. package/dist/chunk-GXMRIT5E.mjs +94 -0
  80. package/dist/chunk-GXMRIT5E.mjs.map +1 -0
  81. package/dist/chunk-IANSI7F7.mjs +393 -0
  82. package/dist/chunk-IANSI7F7.mjs.map +1 -0
  83. package/dist/chunk-IDM6MZHF.js +415 -0
  84. package/dist/chunk-IDM6MZHF.js.map +1 -0
  85. package/dist/chunk-J5ZYQ3TP.js +104 -0
  86. package/dist/chunk-J5ZYQ3TP.js.map +1 -0
  87. package/dist/chunk-KPAUBWZA.mjs +39 -0
  88. package/dist/chunk-KPAUBWZA.mjs.map +1 -0
  89. package/dist/chunk-L7P2NDST.mjs +124 -0
  90. package/dist/chunk-L7P2NDST.mjs.map +1 -0
  91. package/dist/chunk-LZWKMQJL.mjs +3886 -0
  92. package/dist/chunk-LZWKMQJL.mjs.map +1 -0
  93. package/dist/chunk-M6OWN7QH.js +118 -0
  94. package/dist/chunk-M6OWN7QH.js.map +1 -0
  95. package/dist/chunk-MQVHREEI.js +448 -0
  96. package/dist/chunk-MQVHREEI.js.map +1 -0
  97. package/dist/chunk-MT47ECUN.js +127 -0
  98. package/dist/chunk-MT47ECUN.js.map +1 -0
  99. package/dist/chunk-N6U54JI4.mjs +126 -0
  100. package/dist/chunk-N6U54JI4.mjs.map +1 -0
  101. package/dist/chunk-NDG4LR3Q.js +139 -0
  102. package/dist/chunk-NDG4LR3Q.js.map +1 -0
  103. package/dist/chunk-PPD4BU4W.mjs +80 -0
  104. package/dist/chunk-PPD4BU4W.mjs.map +1 -0
  105. package/dist/chunk-PU5NO5EZ.js +4 -0
  106. package/dist/chunk-PU5NO5EZ.js.map +1 -0
  107. package/dist/chunk-Q442ZDTI.mjs +117 -0
  108. package/dist/chunk-Q442ZDTI.mjs.map +1 -0
  109. package/dist/chunk-QH23RO3C.mjs +137 -0
  110. package/dist/chunk-QH23RO3C.mjs.map +1 -0
  111. package/dist/chunk-REBHUF4L.js +226 -0
  112. package/dist/chunk-REBHUF4L.js.map +1 -0
  113. package/dist/chunk-RGB3QLQT.js +275 -0
  114. package/dist/chunk-RGB3QLQT.js.map +1 -0
  115. package/dist/chunk-T7U2QRLC.js +94 -0
  116. package/dist/chunk-T7U2QRLC.js.map +1 -0
  117. package/dist/chunk-TEHHJ3CS.mjs +73 -0
  118. package/dist/chunk-TEHHJ3CS.mjs.map +1 -0
  119. package/dist/chunk-TJY4MIBC.js +117 -0
  120. package/dist/chunk-TJY4MIBC.js.map +1 -0
  121. package/dist/chunk-VCMZQOQM.mjs +102 -0
  122. package/dist/chunk-VCMZQOQM.mjs.map +1 -0
  123. package/dist/chunk-VKN4H4WI.mjs +3 -0
  124. package/dist/chunk-VKN4H4WI.mjs.map +1 -0
  125. package/dist/chunk-VSB25XTY.js +12 -0
  126. package/dist/chunk-VSB25XTY.js.map +1 -0
  127. package/dist/chunk-VWTE74UT.mjs +96 -0
  128. package/dist/chunk-VWTE74UT.mjs.map +1 -0
  129. package/dist/chunk-WBTL7PBV.js +105 -0
  130. package/dist/chunk-WBTL7PBV.js.map +1 -0
  131. package/dist/chunk-WOK3EP3O.js +83 -0
  132. package/dist/chunk-WOK3EP3O.js.map +1 -0
  133. package/dist/chunk-WWT73GGM.mjs +83 -0
  134. package/dist/chunk-WWT73GGM.mjs.map +1 -0
  135. package/dist/chunk-XBDXTRK3.mjs +102 -0
  136. package/dist/chunk-XBDXTRK3.mjs.map +1 -0
  137. package/dist/chunk-YGBEKZWU.mjs +81 -0
  138. package/dist/chunk-YGBEKZWU.mjs.map +1 -0
  139. package/dist/chunk-YVFLRPFV.mjs +72 -0
  140. package/dist/chunk-YVFLRPFV.mjs.map +1 -0
  141. package/dist/chunk-ZMVBIQ2Z.mjs +253 -0
  142. package/dist/chunk-ZMVBIQ2Z.mjs.map +1 -0
  143. package/dist/chunk-ZWCMSHDP.mjs +425 -0
  144. package/dist/chunk-ZWCMSHDP.mjs.map +1 -0
  145. package/dist/flat/index.d.mts +13 -0
  146. package/dist/flat/index.d.ts +13 -0
  147. package/dist/flat/index.js +31 -0
  148. package/dist/flat/index.js.map +1 -0
  149. package/dist/flat/index.mjs +10 -0
  150. package/dist/flat/index.mjs.map +1 -0
  151. package/dist/flat/segment.d.mts +39 -0
  152. package/dist/flat/segment.d.ts +39 -0
  153. package/dist/flat/segment.js +13 -0
  154. package/dist/flat/segment.js.map +1 -0
  155. package/dist/flat/segment.mjs +4 -0
  156. package/dist/flat/segment.mjs.map +1 -0
  157. package/dist/flat/select.d.mts +58 -0
  158. package/dist/flat/select.d.ts +58 -0
  159. package/dist/flat/select.js +14 -0
  160. package/dist/flat/select.js.map +1 -0
  161. package/dist/flat/select.mjs +5 -0
  162. package/dist/flat/select.mjs.map +1 -0
  163. package/dist/flat/tooltip.d.mts +98 -0
  164. package/dist/flat/tooltip.d.ts +98 -0
  165. package/dist/flat/tooltip.js +17 -0
  166. package/dist/flat/tooltip.js.map +1 -0
  167. package/dist/flat/tooltip.mjs +4 -0
  168. package/dist/flat/tooltip.mjs.map +1 -0
  169. package/dist/icon/index.d.mts +1258 -0
  170. package/dist/icon/index.d.ts +1258 -0
  171. package/dist/icon/index.js +1672 -0
  172. package/dist/icon/index.js.map +1 -0
  173. package/dist/icon/index.mjs +3 -0
  174. package/dist/icon/index.mjs.map +1 -0
  175. package/dist/index-CXip5Wb1.d.mts +62 -0
  176. package/dist/index-Drz3P-6Y.d.ts +62 -0
  177. package/dist/index.d.mts +37 -0
  178. package/dist/index.d.ts +37 -0
  179. package/dist/index.js +150 -0
  180. package/dist/index.js.map +1 -0
  181. package/dist/index.mjs +29 -0
  182. package/dist/index.mjs.map +1 -0
  183. package/dist/input/index.d.mts +82 -0
  184. package/dist/input/index.d.ts +82 -0
  185. package/dist/input/index.js +22 -0
  186. package/dist/input/index.js.map +1 -0
  187. package/dist/input/index.mjs +5 -0
  188. package/dist/input/index.mjs.map +1 -0
  189. package/dist/loading/index.d.mts +54 -0
  190. package/dist/loading/index.d.ts +54 -0
  191. package/dist/loading/index.js +12 -0
  192. package/dist/loading/index.js.map +1 -0
  193. package/dist/loading/index.mjs +3 -0
  194. package/dist/loading/index.mjs.map +1 -0
  195. package/dist/messageBox/index.d.mts +33 -0
  196. package/dist/messageBox/index.d.ts +33 -0
  197. package/dist/messageBox/index.js +13 -0
  198. package/dist/messageBox/index.js.map +1 -0
  199. package/dist/messageBox/index.mjs +4 -0
  200. package/dist/messageBox/index.mjs.map +1 -0
  201. package/dist/modal/index.d.mts +97 -0
  202. package/dist/modal/index.d.ts +97 -0
  203. package/dist/modal/index.js +15 -0
  204. package/dist/modal/index.js.map +1 -0
  205. package/dist/modal/index.mjs +6 -0
  206. package/dist/modal/index.mjs.map +1 -0
  207. package/dist/picker/index.d.mts +12 -0
  208. package/dist/picker/index.d.ts +12 -0
  209. package/dist/picker/index.js +13 -0
  210. package/dist/picker/index.js.map +1 -0
  211. package/dist/picker/index.mjs +4 -0
  212. package/dist/picker/index.mjs.map +1 -0
  213. package/dist/progress/index.d.mts +36 -0
  214. package/dist/progress/index.d.ts +36 -0
  215. package/dist/progress/index.js +12 -0
  216. package/dist/progress/index.js.map +1 -0
  217. package/dist/progress/index.mjs +3 -0
  218. package/dist/progress/index.mjs.map +1 -0
  219. package/dist/radio/index.d.mts +39 -0
  220. package/dist/radio/index.d.ts +39 -0
  221. package/dist/radio/index.js +12 -0
  222. package/dist/radio/index.js.map +1 -0
  223. package/dist/radio/index.mjs +3 -0
  224. package/dist/radio/index.mjs.map +1 -0
  225. package/dist/scrollArea/index.d.mts +31 -0
  226. package/dist/scrollArea/index.d.ts +31 -0
  227. package/dist/scrollArea/index.js +16 -0
  228. package/dist/scrollArea/index.js.map +1 -0
  229. package/dist/scrollArea/index.mjs +3 -0
  230. package/dist/scrollArea/index.mjs.map +1 -0
  231. package/dist/segment/index.d.mts +46 -0
  232. package/dist/segment/index.d.ts +46 -0
  233. package/dist/segment/index.js +12 -0
  234. package/dist/segment/index.js.map +1 -0
  235. package/dist/segment/index.mjs +3 -0
  236. package/dist/segment/index.mjs.map +1 -0
  237. package/dist/star/index.d.mts +30 -0
  238. package/dist/star/index.d.ts +30 -0
  239. package/dist/star/index.js +12 -0
  240. package/dist/star/index.js.map +1 -0
  241. package/dist/star/index.mjs +3 -0
  242. package/dist/star/index.mjs.map +1 -0
  243. package/dist/switch/index.d.mts +32 -0
  244. package/dist/switch/index.d.ts +32 -0
  245. package/dist/switch/index.js +12 -0
  246. package/dist/switch/index.js.map +1 -0
  247. package/dist/switch/index.mjs +3 -0
  248. package/dist/switch/index.mjs.map +1 -0
  249. package/dist/tabs/index.d.mts +52 -0
  250. package/dist/tabs/index.d.ts +52 -0
  251. package/dist/tabs/index.js +12 -0
  252. package/dist/tabs/index.js.map +1 -0
  253. package/dist/tabs/index.mjs +3 -0
  254. package/dist/tabs/index.mjs.map +1 -0
  255. package/dist/tag/index.d.mts +68 -0
  256. package/dist/tag/index.d.ts +68 -0
  257. package/dist/tag/index.js +17 -0
  258. package/dist/tag/index.js.map +1 -0
  259. package/dist/tag/index.mjs +4 -0
  260. package/dist/tag/index.mjs.map +1 -0
  261. package/dist/toast/index.d.mts +175 -0
  262. package/dist/toast/index.d.ts +175 -0
  263. package/dist/toast/index.js +25 -0
  264. package/dist/toast/index.js.map +1 -0
  265. package/dist/toast/index.mjs +4 -0
  266. package/dist/toast/index.mjs.map +1 -0
  267. package/dist/tooltip/index.d.mts +26 -0
  268. package/dist/tooltip/index.d.ts +26 -0
  269. package/dist/tooltip/index.js +12 -0
  270. package/dist/tooltip/index.js.map +1 -0
  271. package/dist/tooltip/index.mjs +3 -0
  272. package/dist/tooltip/index.mjs.map +1 -0
  273. package/package.json +251 -0
  274. package/styles.css +20 -0
@@ -0,0 +1,102 @@
1
+ import { Person } from './chunk-LZWKMQJL.mjs';
2
+ import { cva, cn } from '@exem-ui/core/utils';
3
+ import { forwardRef } from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var SIZE_CONFIG = {
7
+ xsmall: {
8
+ container: "size-[16px] text-body-3",
9
+ initialPadding: "px-[2.5px] leading-none tracking-tight",
10
+ imagePadding: "p-[2px]",
11
+ iconSize: "size-[12px]"
12
+ },
13
+ small: {
14
+ container: "size-[20px] text-body-2",
15
+ initialPadding: "px-[3.5px]",
16
+ imagePadding: "p-[3px]",
17
+ iconSize: "size-[14px]"
18
+ },
19
+ medium: {
20
+ container: "size-[24px] text-body-2",
21
+ initialPadding: "px-[5.5px] py-[2px]",
22
+ imagePadding: "p-[4px]",
23
+ iconSize: "size-[16px]"
24
+ },
25
+ large: {
26
+ container: "size-[32px] text-title-2",
27
+ initialPadding: "px-[8px] py-[3.5px]",
28
+ imagePadding: "p-[6px]",
29
+ iconSize: "size-[20px]"
30
+ }
31
+ };
32
+ var avatarVariants = cva(
33
+ "flex items-center justify-center rounded-[28px] text-center font-semibold",
34
+ {
35
+ variants: {
36
+ size: {
37
+ xsmall: SIZE_CONFIG.xsmall.container,
38
+ small: SIZE_CONFIG.small.container,
39
+ medium: SIZE_CONFIG.medium.container,
40
+ large: SIZE_CONFIG.large.container
41
+ },
42
+ type: {
43
+ initial: "bg-elevation-elevation-5 text-elevation-elevation-0",
44
+ image: "bg-elevation-elevation-4 text-elevation-elevation-0"
45
+ }
46
+ },
47
+ compoundVariants: [
48
+ // Initial type variants
49
+ { type: "initial", size: "xsmall", class: SIZE_CONFIG.xsmall.initialPadding },
50
+ { type: "initial", size: "small", class: SIZE_CONFIG.small.initialPadding },
51
+ { type: "initial", size: "medium", class: SIZE_CONFIG.medium.initialPadding },
52
+ { type: "initial", size: "large", class: SIZE_CONFIG.large.initialPadding }
53
+ ],
54
+ defaultVariants: {
55
+ size: "medium",
56
+ type: "initial"
57
+ }
58
+ }
59
+ );
60
+ var getInitial = (name) => {
61
+ return name ? name.charAt(0).toUpperCase() : "";
62
+ };
63
+ var renderInitialContent = (name) => {
64
+ return /* @__PURE__ */ jsx("span", { children: getInitial(name) });
65
+ };
66
+ var renderImageContent = (src, alt, name) => {
67
+ return /* @__PURE__ */ jsx("img", { src, alt: alt || name || "Avatar", className: "size-full rounded-full object-cover" });
68
+ };
69
+ var renderIconContent = (size = "medium") => {
70
+ const iconSize = SIZE_CONFIG[size].iconSize;
71
+ return /* @__PURE__ */ jsx(Person, { className: cn("shrink-0", iconSize) });
72
+ };
73
+ var Avatar = forwardRef(
74
+ ({ className, size = "medium", type = "initial", name, src, alt, ...props }, ref) => {
75
+ const resolvedSize = size || "medium";
76
+ const isFallback = type === "image" && !src;
77
+ const fallbackPadding = isFallback ? SIZE_CONFIG[resolvedSize].imagePadding : void 0;
78
+ const renderContent = () => {
79
+ if (type === "initial") {
80
+ return renderInitialContent(name);
81
+ }
82
+ if (type === "image") {
83
+ return src ? renderImageContent(src, alt, name) : renderIconContent(resolvedSize);
84
+ }
85
+ return null;
86
+ };
87
+ return /* @__PURE__ */ jsx(
88
+ "div",
89
+ {
90
+ ref,
91
+ className: cn(avatarVariants({ size, type }), fallbackPadding, className),
92
+ ...props,
93
+ children: renderContent()
94
+ }
95
+ );
96
+ }
97
+ );
98
+ Avatar.displayName = "Avatar";
99
+
100
+ export { Avatar };
101
+ //# sourceMappingURL=chunk-VCMZQOQM.mjs.map
102
+ //# sourceMappingURL=chunk-VCMZQOQM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/avatar/Avatar.tsx"],"names":[],"mappings":"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","file":"chunk-VCMZQOQM.mjs","sourcesContent":["import { cn, cva, type VariantProps } from '@exem-ui/core/utils';\nimport type React from 'react';\nimport { forwardRef } from 'react';\nimport { PersonIcon } from '../icon';\n\ninterface AvatarProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof avatarVariants> {\n /** 사용자 이름. 이미지가 없을 때 이니셜 폴백에 사용됩니다. */\n name?: string;\n /** 아바타 이미지 URL */\n src?: string;\n /** 이미지 대체 텍스트 */\n alt?: string;\n}\n\ntype AvatarComponent = React.ForwardRefExoticComponent<\n AvatarProps & React.RefAttributes<HTMLDivElement>\n>;\n\n// 크기별 설정 상수\nconst SIZE_CONFIG = {\n xsmall: {\n container: 'size-[16px] text-body-3',\n initialPadding: 'px-[2.5px] leading-none tracking-tight',\n imagePadding: 'p-[2px]',\n iconSize: 'size-[12px]',\n },\n small: {\n container: 'size-[20px] text-body-2',\n initialPadding: 'px-[3.5px]',\n imagePadding: 'p-[3px]',\n iconSize: 'size-[14px]',\n },\n medium: {\n container: 'size-[24px] text-body-2',\n initialPadding: 'px-[5.5px] py-[2px]',\n imagePadding: 'p-[4px]',\n iconSize: 'size-[16px]',\n },\n large: {\n container: 'size-[32px] text-title-2',\n initialPadding: 'px-[8px] py-[3.5px]',\n imagePadding: 'p-[6px]',\n iconSize: 'size-[20px]',\n },\n} as const;\n\nconst avatarVariants = cva(\n 'flex items-center justify-center rounded-[28px] text-center font-semibold',\n {\n variants: {\n size: {\n xsmall: SIZE_CONFIG.xsmall.container,\n small: SIZE_CONFIG.small.container,\n medium: SIZE_CONFIG.medium.container,\n large: SIZE_CONFIG.large.container,\n },\n type: {\n initial: 'bg-elevation-elevation-5 text-elevation-elevation-0',\n image: 'bg-elevation-elevation-4 text-elevation-elevation-0',\n },\n },\n compoundVariants: [\n // Initial type variants\n { type: 'initial', size: 'xsmall', class: SIZE_CONFIG.xsmall.initialPadding },\n { type: 'initial', size: 'small', class: SIZE_CONFIG.small.initialPadding },\n { type: 'initial', size: 'medium', class: SIZE_CONFIG.medium.initialPadding },\n { type: 'initial', size: 'large', class: SIZE_CONFIG.large.initialPadding },\n ],\n defaultVariants: {\n size: 'medium',\n type: 'initial',\n },\n },\n);\n\nconst getInitial = (name?: string): string => {\n return name ? name.charAt(0).toUpperCase() : '';\n};\n\nconst renderInitialContent = (name?: string) => {\n return <span>{getInitial(name)}</span>;\n};\n\nconst renderImageContent = (src: string, alt?: string, name?: string) => {\n return (\n <img src={src} alt={alt || name || 'Avatar'} className=\"size-full rounded-full object-cover\" />\n );\n};\n\nconst renderIconContent = (size: keyof typeof SIZE_CONFIG = 'medium') => {\n const iconSize = SIZE_CONFIG[size].iconSize;\n return <PersonIcon className={cn('shrink-0', iconSize)} />;\n};\n\n/**\n * 사용자 아바타를 표시하는 컴포넌트입니다. 이니셜, 이미지, 아이콘 폴백을 지원합니다.\n *\n * @example\n * ```tsx\n * // 이니셜 표시\n * <Avatar name=\"홍길동\" size=\"large\" />\n *\n * // 이미지 표시\n * <Avatar type=\"image\" src=\"/avatar.png\" name=\"홍길동\" />\n *\n * // 이미지 없을 때 아이콘 폴백\n * <Avatar type=\"image\" name=\"홍길동\" />\n * ```\n *\n * @see {@link AvatarProps} props 상세\n */\nconst Avatar = forwardRef<HTMLDivElement, AvatarProps>(\n ({ className, size = 'medium', type = 'initial', name, src, alt, ...props }, ref) => {\n const resolvedSize = size || 'medium';\n const isFallback = type === 'image' && !src;\n const fallbackPadding = isFallback ? SIZE_CONFIG[resolvedSize].imagePadding : undefined;\n\n const renderContent = () => {\n if (type === 'initial') {\n return renderInitialContent(name);\n }\n\n if (type === 'image') {\n return src ? renderImageContent(src, alt, name) : renderIconContent(resolvedSize);\n }\n\n return null;\n };\n\n return (\n <div\n ref={ref}\n className={cn(avatarVariants({ size, type }), fallbackPadding, className)}\n {...props}\n >\n {renderContent()}\n </div>\n );\n },\n) as AvatarComponent;\n\nAvatar.displayName = 'Avatar';\n\nexport { Avatar };\nexport type { AvatarComponent, AvatarProps };\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-VKN4H4WI.mjs.map
3
+ //# sourceMappingURL=chunk-VKN4H4WI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-VKN4H4WI.mjs"}
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ var chunkNDG4LR3Q_js = require('./chunk-NDG4LR3Q.js');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+ var react = require('react');
6
+
7
+ var FlatSegment = ({ items, disabled, className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(chunkNDG4LR3Q_js.Segment, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx(chunkNDG4LR3Q_js.Segment.List, { className, children: items.map((item) => /* @__PURE__ */ react.createElement(chunkNDG4LR3Q_js.Segment.Item, { ...item, key: item.value, disabled: disabled || item.disabled })) }) });
8
+ FlatSegment.displayName = "FlatSegment";
9
+
10
+ exports.FlatSegment = FlatSegment;
11
+ //# sourceMappingURL=chunk-VSB25XTY.js.map
12
+ //# sourceMappingURL=chunk-VSB25XTY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/flat/FlatSegment.tsx"],"names":["jsx","Segment","createElement"],"mappings":";;;;;;AAoCA,IAAM,cAAc,CAAC,EAAE,KAAA,EAAO,QAAA,EAAU,WAAW,GAAG,KAAA,EAAM,qBAC1DA,cAAA,CAACC,4BAAS,GAAG,KAAA,EACX,QAAA,kBAAAD,cAAA,CAACC,wBAAA,CAAQ,MAAR,EAAa,SAAA,EACX,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVC,mBAAA,CAACD,wBAAA,CAAQ,IAAA,EAAR,EAAc,GAAG,IAAA,EAAM,GAAA,EAAK,IAAA,CAAK,OAAO,QAAA,EAAU,QAAA,IAAY,KAAK,QAAA,EAAU,CAC/E,GACH,CAAA,EACF;AAGF,WAAA,CAAY,WAAA,GAAc,aAAA","file":"chunk-VSB25XTY.js","sourcesContent":["import type React from 'react';\nimport { Segment, type SegmentRootProps } from '../segment/Segment';\n\ntype FlatSegmentItem = Pick<\n React.ComponentPropsWithoutRef<typeof Segment.Item>,\n 'value' | 'children' | 'disabled' | 'leftIcon' | 'className'\n>;\n\ninterface FlatSegmentProps extends Omit<SegmentRootProps, 'children' | 'asChild'> {\n /** 세그먼트 아이템 배열 */\n items: FlatSegmentItem[];\n /**\n * 전체 비활성화 여부 (개별 아이템의 disabled와 OR 결합)\n * @default false\n */\n disabled?: boolean;\n}\n\n/**\n * Segment 컴포넌트의 간소화된 Flat API입니다.\n * items 배열만 전달하면 Compound Component 없이 간편하게 사용할 수 있습니다.\n *\n * @example\n * ```tsx\n * <FlatSegment\n * defaultValue=\"tab1\"\n * size=\"medium\"\n * items={[\n * { value: 'tab1', children: '첫 번째' },\n * { value: 'tab2', children: '두 번째' },\n * ]}\n * />\n * ```\n *\n * @see {@link FlatSegmentProps} props 상세\n */\nconst FlatSegment = ({ items, disabled, className, ...props }: FlatSegmentProps) => (\n <Segment {...props}>\n <Segment.List className={className}>\n {items.map((item) => (\n <Segment.Item {...item} key={item.value} disabled={disabled || item.disabled} />\n ))}\n </Segment.List>\n </Segment>\n);\n\nFlatSegment.displayName = 'FlatSegment';\n\nexport { FlatSegment };\nexport type { FlatSegmentProps, FlatSegmentItem };\n"]}
@@ -0,0 +1,96 @@
1
+ import { cva, cn } from '@exem-ui/core/utils';
2
+ import * as SwitchPrimitives from '@radix-ui/react-switch';
3
+ import { forwardRef, useId } from 'react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ // src/switch/Switch.tsx
7
+ var switchVariants = cva(
8
+ "peer relative inline-flex shrink-0 cursor-pointer items-center rounded-full disabled:cursor-not-allowed data-[state=checked]:bg-solid-accent-default data-[state=unchecked]:bg-elevation-elevation-4 hover:data-[state=checked]:bg-solid-accent-hovered hover:data-[state=unchecked]:bg-elevation-elevation-5 disabled:data-[state=checked]:bg-solid-accent-disabled disabled:data-[state=unchecked]:bg-elevation-elevation-3 disabled:hover:data-[state=checked]:bg-solid-accent-disabled disabled:hover:data-[state=unchecked]:bg-elevation-elevation-3",
9
+ {
10
+ variants: {
11
+ size: {
12
+ small: "h-[16px] w-[28px]",
13
+ medium: "h-[20px] w-[36px]",
14
+ large: "h-[24px] w-[44px]"
15
+ }
16
+ },
17
+ defaultVariants: {
18
+ size: "medium"
19
+ }
20
+ }
21
+ );
22
+ var switchThumbVariants = cva(
23
+ "pointer-events-none absolute bg-icon-static-light left-[2px] top-[2px] rounded-full ring-0 data-[state=unchecked]:translate-x-0 data-[disabled]:bg-icon-inverse-disabled",
24
+ {
25
+ variants: {
26
+ size: {
27
+ small: "size-[12px] data-[state=checked]:translate-x-[12px]",
28
+ medium: "size-[16px] data-[state=checked]:translate-x-[16px]",
29
+ large: "size-[20px] data-[state=checked]:translate-x-[20px]"
30
+ }
31
+ },
32
+ defaultVariants: {
33
+ size: "medium"
34
+ }
35
+ }
36
+ );
37
+ var containerVariants = cva("inline-flex items-center", {
38
+ variants: {
39
+ size: {
40
+ small: "gap-1",
41
+ medium: "gap-1.5",
42
+ large: "gap-2"
43
+ },
44
+ labelPosition: {
45
+ right: "flex-row",
46
+ left: "flex-row-reverse"
47
+ }
48
+ },
49
+ defaultVariants: {
50
+ size: "medium",
51
+ labelPosition: "right"
52
+ }
53
+ });
54
+ var switchLabelVariants = cva(
55
+ "cursor-pointer select-none font-regular text-text-primary peer-disabled:cursor-not-allowed peer-disabled:text-text-disabled",
56
+ {
57
+ variants: {
58
+ size: {
59
+ small: "text-body-3",
60
+ medium: "text-body-2",
61
+ large: "text-body-1"
62
+ }
63
+ },
64
+ defaultVariants: {
65
+ size: "medium"
66
+ }
67
+ }
68
+ );
69
+ var Switch = forwardRef(
70
+ ({ className, size = "medium", label, labelPosition = "right", id, ...props }, ref) => {
71
+ const switchId = useId();
72
+ const finalId = id || switchId;
73
+ const switchElement = /* @__PURE__ */ jsx(
74
+ SwitchPrimitives.Root,
75
+ {
76
+ id: finalId,
77
+ className: cn(switchVariants({ size }), className),
78
+ ...props,
79
+ ref,
80
+ children: /* @__PURE__ */ jsx(SwitchPrimitives.Thumb, { className: cn(switchThumbVariants({ size })) })
81
+ }
82
+ );
83
+ if (!label) {
84
+ return switchElement;
85
+ }
86
+ return /* @__PURE__ */ jsxs("div", { className: cn(containerVariants({ size, labelPosition })), children: [
87
+ switchElement,
88
+ /* @__PURE__ */ jsx("label", { htmlFor: finalId, className: cn(switchLabelVariants({ size })), children: label })
89
+ ] });
90
+ }
91
+ );
92
+ Switch.displayName = SwitchPrimitives.Root.displayName;
93
+
94
+ export { Switch };
95
+ //# sourceMappingURL=chunk-VWTE74UT.mjs.map
96
+ //# sourceMappingURL=chunk-VWTE74UT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/switch/Switch.tsx"],"names":[],"mappings":"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","file":"chunk-VWTE74UT.mjs","sourcesContent":["import { cn, cva, type VariantProps } from '@exem-ui/core/utils';\nimport * as SwitchPrimitives from '@radix-ui/react-switch';\nimport type React from 'react';\nimport { forwardRef, useId } from 'react';\n\nconst switchVariants = cva(\n 'peer relative inline-flex shrink-0 cursor-pointer items-center rounded-full disabled:cursor-not-allowed data-[state=checked]:bg-solid-accent-default data-[state=unchecked]:bg-elevation-elevation-4 hover:data-[state=checked]:bg-solid-accent-hovered hover:data-[state=unchecked]:bg-elevation-elevation-5 disabled:data-[state=checked]:bg-solid-accent-disabled disabled:data-[state=unchecked]:bg-elevation-elevation-3 disabled:hover:data-[state=checked]:bg-solid-accent-disabled disabled:hover:data-[state=unchecked]:bg-elevation-elevation-3',\n {\n variants: {\n size: {\n small: 'h-[16px] w-[28px]',\n medium: 'h-[20px] w-[36px]',\n large: 'h-[24px] w-[44px]',\n },\n },\n defaultVariants: {\n size: 'medium',\n },\n },\n);\n\nconst switchThumbVariants = cva(\n 'pointer-events-none absolute bg-icon-static-light left-[2px] top-[2px] rounded-full ring-0 data-[state=unchecked]:translate-x-0 data-[disabled]:bg-icon-inverse-disabled',\n {\n variants: {\n size: {\n small: 'size-[12px] data-[state=checked]:translate-x-[12px]',\n medium: 'size-[16px] data-[state=checked]:translate-x-[16px]',\n large: 'size-[20px] data-[state=checked]:translate-x-[20px]',\n },\n },\n defaultVariants: {\n size: 'medium',\n },\n },\n);\n\nconst containerVariants = cva('inline-flex items-center', {\n variants: {\n size: {\n small: 'gap-1',\n medium: 'gap-1.5',\n large: 'gap-2',\n },\n labelPosition: {\n right: 'flex-row',\n left: 'flex-row-reverse',\n },\n },\n defaultVariants: {\n size: 'medium',\n labelPosition: 'right',\n },\n});\n\nconst switchLabelVariants = cva(\n 'cursor-pointer select-none font-regular text-text-primary peer-disabled:cursor-not-allowed peer-disabled:text-text-disabled',\n {\n variants: {\n size: {\n small: 'text-body-3',\n medium: 'text-body-2',\n large: 'text-body-1',\n },\n },\n defaultVariants: {\n size: 'medium',\n },\n },\n);\n\ninterface SwitchProps\n extends React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>,\n VariantProps<typeof switchVariants> {\n /** 스위치 옆에 표시할 레이블 텍스트 */\n label?: string;\n /**\n * 레이블 위치\n * @default 'right'\n */\n labelPosition?: 'left' | 'right';\n}\n\ntype SwitchComponent = React.ForwardRefExoticComponent<\n SwitchProps & React.RefAttributes<HTMLButtonElement>\n>;\n\n/**\n * 켜기/끄기 상태를 전환하는 스위치 컴포넌트입니다.\n *\n * @example\n * ```tsx\n * <Switch label=\"알림 받기\" size=\"medium\" />\n * <Switch label=\"다크 모드\" labelPosition=\"left\" defaultChecked />\n * ```\n *\n * @see {@link SwitchProps} props 상세\n */\nconst Switch = forwardRef<React.ElementRef<typeof SwitchPrimitives.Root>, SwitchProps>(\n ({ className, size = 'medium', label, labelPosition = 'right', id, ...props }, ref) => {\n // 고유한 ID 생성 (접근성을 위해)\n const switchId = useId();\n const finalId = id || switchId;\n\n const switchElement = (\n <SwitchPrimitives.Root\n id={finalId}\n className={cn(switchVariants({ size }), className)}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb className={cn(switchThumbVariants({ size }))} />\n </SwitchPrimitives.Root>\n );\n\n if (!label) {\n return switchElement;\n }\n\n return (\n <div className={cn(containerVariants({ size, labelPosition }))}>\n {switchElement}\n <label htmlFor={finalId} className={cn(switchLabelVariants({ size }))}>\n {label}\n </label>\n </div>\n );\n },\n) as SwitchComponent;\n\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\nexport type { SwitchComponent, SwitchProps };\n"]}
@@ -0,0 +1,105 @@
1
+ 'use strict';
2
+
3
+ var utils = require('@exem-ui/core/utils');
4
+ var RadioGroupPrimitive = require('@radix-ui/react-radio-group');
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 RadioGroupPrimitive__namespace = /*#__PURE__*/_interopNamespace(RadioGroupPrimitive);
27
+
28
+ // src/radio/Radio.tsx
29
+ var containerVariants = utils.cva("inline-flex items-center", {
30
+ variants: {
31
+ size: { small: "gap-1", medium: "gap-1.5", large: "gap-2" },
32
+ labelPosition: { right: "flex-row", left: "flex-row-reverse" }
33
+ },
34
+ defaultVariants: { size: "medium", labelPosition: "right" }
35
+ });
36
+ var radioVariants = utils.cva(
37
+ "peer relative shrink-0 rounded-full border border-border-secondary ring-offset-background transition-colors hover:bg-elevation-elevation-2 bg-background-primary",
38
+ {
39
+ variants: { size: { small: "size-4", medium: "size-5", large: "size-6" } },
40
+ defaultVariants: { size: "medium" }
41
+ }
42
+ );
43
+ var stateClasses = [
44
+ "disabled:cursor-not-allowed",
45
+ "disabled:data-[state=unchecked]:bg-elevation-elevation-3"
46
+ ];
47
+ var checkedStateClasses = [
48
+ "data-[state=checked]:border-border-accent",
49
+ "disabled:data-[state=checked]:border-border-accent-disabled"
50
+ ];
51
+ var indicatorVariants = utils.cva(
52
+ "pointer-events-none block rounded-full bg-icon-accent data-[disabled]:bg-icon-accent-disabled",
53
+ {
54
+ variants: {
55
+ size: { small: "size-2.5", medium: "size-3", large: "size-3.5" }
56
+ },
57
+ defaultVariants: { size: "medium" }
58
+ }
59
+ );
60
+ var labelVariants = utils.cva(
61
+ "cursor-pointer select-none text-text-primary peer-disabled:cursor-not-allowed peer-disabled:text-text-disabled",
62
+ {
63
+ variants: { size: { small: "text-body-3", medium: "text-body-2", large: "text-body-1" } },
64
+ defaultVariants: { size: "medium" }
65
+ }
66
+ );
67
+ var Radio = react.forwardRef(
68
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(RadioGroupPrimitive__namespace.Root, { ref, className: utils.cn("grid gap-2", className), ...props })
69
+ );
70
+ Radio.Item = react.forwardRef(
71
+ ({ className, size = "medium", label, labelPosition = "right", id, disabled, ...props }, ref) => {
72
+ const uniqueId = react.useId();
73
+ const radioId = id || uniqueId;
74
+ const control = /* @__PURE__ */ jsxRuntime.jsx(
75
+ RadioGroupPrimitive__namespace.Item,
76
+ {
77
+ ref,
78
+ id: radioId,
79
+ disabled,
80
+ className: utils.cn(radioVariants({ size }), stateClasses, checkedStateClasses, className),
81
+ ...props,
82
+ children: /* @__PURE__ */ jsxRuntime.jsx(RadioGroupPrimitive__namespace.Indicator, { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
83
+ "span",
84
+ {
85
+ className: utils.cn("block", indicatorVariants({ size })),
86
+ "data-disabled": disabled ? "" : void 0
87
+ }
88
+ ) })
89
+ }
90
+ );
91
+ if (!label) {
92
+ return control;
93
+ }
94
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn(containerVariants({ size, labelPosition })), children: [
95
+ control,
96
+ /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: radioId, className: utils.cn(labelVariants({ size })), children: label })
97
+ ] });
98
+ }
99
+ );
100
+ Radio.displayName = "Radio";
101
+ Radio.Item.displayName = "Radio.Item";
102
+
103
+ exports.Radio = Radio;
104
+ //# sourceMappingURL=chunk-WBTL7PBV.js.map
105
+ //# sourceMappingURL=chunk-WBTL7PBV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/radio/Radio.tsx"],"names":["cva","forwardRef","jsx","RadioGroupPrimitive","cn","useId","jsxs"],"mappings":"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","file":"chunk-WBTL7PBV.js","sourcesContent":["import { cn, cva } from '@exem-ui/core/utils';\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group';\nimport type React from 'react';\nimport { forwardRef, useId } from 'react';\n\ntype RadioRootProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>;\n\ntype RadioItemProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item> & {\n /**\n * 라디오 버튼 크기\n * @default 'medium'\n */\n size?: 'small' | 'medium' | 'large';\n /** 라디오 버튼 옆에 표시할 레이블 */\n label?: React.ReactNode;\n /**\n * 레이블 위치\n * @default 'right'\n */\n labelPosition?: 'left' | 'right';\n};\n\ntype RadioComponent = React.ForwardRefExoticComponent<\n RadioRootProps & React.RefAttributes<React.ElementRef<typeof RadioGroupPrimitive.Root>>\n> & {\n Item: React.ForwardRefExoticComponent<\n RadioItemProps & React.RefAttributes<React.ElementRef<typeof RadioGroupPrimitive.Item>>\n >;\n};\n\nconst containerVariants = cva('inline-flex items-center', {\n variants: {\n size: { small: 'gap-1', medium: 'gap-1.5', large: 'gap-2' },\n labelPosition: { right: 'flex-row', left: 'flex-row-reverse' },\n },\n defaultVariants: { size: 'medium', labelPosition: 'right' },\n});\n\nconst radioVariants = cva(\n 'peer relative shrink-0 rounded-full border border-border-secondary ring-offset-background transition-colors hover:bg-elevation-elevation-2 bg-background-primary',\n {\n variants: { size: { small: 'size-4', medium: 'size-5', large: 'size-6' } },\n defaultVariants: { size: 'medium' },\n },\n);\n\nconst stateClasses = [\n 'disabled:cursor-not-allowed',\n 'disabled:data-[state=unchecked]:bg-elevation-elevation-3',\n];\n\nconst checkedStateClasses = [\n 'data-[state=checked]:border-border-accent',\n 'disabled:data-[state=checked]:border-border-accent-disabled',\n];\n\nconst indicatorVariants = cva(\n 'pointer-events-none block rounded-full bg-icon-accent data-[disabled]:bg-icon-accent-disabled',\n {\n variants: {\n size: { small: 'size-2.5', medium: 'size-3', large: 'size-3.5' },\n },\n defaultVariants: { size: 'medium' },\n },\n);\n\nconst labelVariants = cva(\n 'cursor-pointer select-none text-text-primary peer-disabled:cursor-not-allowed peer-disabled:text-text-disabled',\n {\n variants: { size: { small: 'text-body-3', medium: 'text-body-2', large: 'text-body-1' } },\n defaultVariants: { size: 'medium' },\n },\n);\n\n/**\n * 여러 옵션 중 하나를 선택하는 라디오 그룹 컴포넌트입니다.\n * Compound Component 패턴으로 `Radio.Item`과 함께 사용합니다.\n *\n * @example\n * ```tsx\n * <Radio defaultValue=\"a\">\n * <Radio.Item value=\"a\" label=\"옵션 A\" />\n * <Radio.Item value=\"b\" label=\"옵션 B\" />\n * </Radio>\n * ```\n *\n * @see {@link RadioRootProps} 루트 props 상세\n * @see {@link RadioItemProps} 아이템 props 상세\n */\nconst Radio = forwardRef<React.ElementRef<typeof RadioGroupPrimitive.Root>, RadioRootProps>(\n ({ className, ...props }, ref) => (\n <RadioGroupPrimitive.Root ref={ref} className={cn('grid gap-2', className)} {...props} />\n ),\n) as RadioComponent;\n\nRadio.Item = forwardRef<React.ElementRef<typeof RadioGroupPrimitive.Item>, RadioItemProps>(\n ({ className, size = 'medium', label, labelPosition = 'right', id, disabled, ...props }, ref) => {\n const uniqueId = useId();\n const radioId = id || uniqueId;\n const control = (\n <RadioGroupPrimitive.Item\n ref={ref}\n id={radioId}\n disabled={disabled}\n className={cn(radioVariants({ size }), stateClasses, checkedStateClasses, className)}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <span\n className={cn('block', indicatorVariants({ size }))}\n data-disabled={disabled ? '' : undefined}\n />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n );\n if (!label) {\n return control;\n }\n return (\n <div className={cn(containerVariants({ size, labelPosition }))}>\n {control}\n <label htmlFor={radioId} className={cn(labelVariants({ size }))}>\n {label}\n </label>\n </div>\n );\n },\n) as RadioComponent['Item'];\n\nRadio.displayName = 'Radio';\nRadio.Item.displayName = 'Radio.Item';\n\nexport { Radio };\nexport type { RadioComponent, RadioRootProps, RadioItemProps };\n"]}
@@ -0,0 +1,83 @@
1
+ 'use strict';
2
+
3
+ var utils = require('@exem-ui/core/utils');
4
+ var react = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ // src/star/Star.tsx
8
+ var StarRoundedEmpty = (props) => /* @__PURE__ */ jsxRuntime.jsx(
9
+ "svg",
10
+ {
11
+ xmlns: "http://www.w3.org/2000/svg",
12
+ fill: "none",
13
+ viewBox: "0 0 20 20",
14
+ width: "1em",
15
+ height: "1em",
16
+ "aria-hidden": "true",
17
+ ...props,
18
+ children: /* @__PURE__ */ jsxRuntime.jsx(
19
+ "path",
20
+ {
21
+ stroke: "#cfcfcf",
22
+ strokeLinecap: "round",
23
+ strokeLinejoin: "round",
24
+ 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"
25
+ }
26
+ )
27
+ }
28
+ );
29
+ var StarRoundedFilled = (props) => /* @__PURE__ */ jsxRuntime.jsx(
30
+ "svg",
31
+ {
32
+ xmlns: "http://www.w3.org/2000/svg",
33
+ fill: "none",
34
+ viewBox: "0 0 20 20",
35
+ width: "1em",
36
+ height: "1em",
37
+ "aria-hidden": "true",
38
+ ...props,
39
+ children: /* @__PURE__ */ jsxRuntime.jsx(
40
+ "path",
41
+ {
42
+ fill: "#FE9A00",
43
+ 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"
44
+ }
45
+ )
46
+ }
47
+ );
48
+ var Star = react.forwardRef(
49
+ ({ size = "medium", selected = false, className, onClick, ...props }, ref) => {
50
+ const sizeConfig = {
51
+ small: { width: 16, height: 16 },
52
+ medium: { width: 20, height: 20 },
53
+ large: { width: 24, height: 24 }
54
+ };
55
+ const config = sizeConfig[size];
56
+ return selected ? /* @__PURE__ */ jsxRuntime.jsx(
57
+ StarRoundedFilled,
58
+ {
59
+ ref,
60
+ width: config.width,
61
+ height: config.height,
62
+ className: utils.cn("cursor-pointer transition-colors", className),
63
+ onClick,
64
+ ...props
65
+ }
66
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
67
+ StarRoundedEmpty,
68
+ {
69
+ ref,
70
+ width: config.width,
71
+ height: config.height,
72
+ className: utils.cn("cursor-pointer transition-colors", className),
73
+ onClick,
74
+ ...props
75
+ }
76
+ );
77
+ }
78
+ );
79
+ Star.displayName = "Star";
80
+
81
+ exports.Star = Star;
82
+ //# sourceMappingURL=chunk-WOK3EP3O.js.map
83
+ //# sourceMappingURL=chunk-WOK3EP3O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/star/Star.tsx"],"names":["jsx","forwardRef","cn"],"mappings":";;;;;;;AAuBA,IAAM,gBAAA,GAAmB,CAAC,KAAA,qBACxBA,cAAA;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,kBAAAA,cAAA;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,qBACzBA,cAAA;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,kBAAAA,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,SAAA;AAAA,QACL,CAAA,EAAE;AAAA;AAAA;AACJ;AACF,CAAA;AAaF,IAAM,IAAA,GAAOC,gBAAA;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,mBACLD,cAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,SAAA,EAAWE,QAAA,CAAG,kCAAA,EAAoC,SAAS,CAAA;AAAA,QAC3D,OAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN,mBAEAF,cAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,SAAA,EAAWE,QAAA,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-WOK3EP3O.js","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,83 @@
1
+ import { cva, cn } from '@exem-ui/core/utils';
2
+ import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
3
+ import { forwardRef, useId } from 'react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ // src/radio/Radio.tsx
7
+ var containerVariants = cva("inline-flex items-center", {
8
+ variants: {
9
+ size: { small: "gap-1", medium: "gap-1.5", large: "gap-2" },
10
+ labelPosition: { right: "flex-row", left: "flex-row-reverse" }
11
+ },
12
+ defaultVariants: { size: "medium", labelPosition: "right" }
13
+ });
14
+ var radioVariants = cva(
15
+ "peer relative shrink-0 rounded-full border border-border-secondary ring-offset-background transition-colors hover:bg-elevation-elevation-2 bg-background-primary",
16
+ {
17
+ variants: { size: { small: "size-4", medium: "size-5", large: "size-6" } },
18
+ defaultVariants: { size: "medium" }
19
+ }
20
+ );
21
+ var stateClasses = [
22
+ "disabled:cursor-not-allowed",
23
+ "disabled:data-[state=unchecked]:bg-elevation-elevation-3"
24
+ ];
25
+ var checkedStateClasses = [
26
+ "data-[state=checked]:border-border-accent",
27
+ "disabled:data-[state=checked]:border-border-accent-disabled"
28
+ ];
29
+ var indicatorVariants = cva(
30
+ "pointer-events-none block rounded-full bg-icon-accent data-[disabled]:bg-icon-accent-disabled",
31
+ {
32
+ variants: {
33
+ size: { small: "size-2.5", medium: "size-3", large: "size-3.5" }
34
+ },
35
+ defaultVariants: { size: "medium" }
36
+ }
37
+ );
38
+ var labelVariants = cva(
39
+ "cursor-pointer select-none text-text-primary peer-disabled:cursor-not-allowed peer-disabled:text-text-disabled",
40
+ {
41
+ variants: { size: { small: "text-body-3", medium: "text-body-2", large: "text-body-1" } },
42
+ defaultVariants: { size: "medium" }
43
+ }
44
+ );
45
+ var Radio = forwardRef(
46
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(RadioGroupPrimitive.Root, { ref, className: cn("grid gap-2", className), ...props })
47
+ );
48
+ Radio.Item = forwardRef(
49
+ ({ className, size = "medium", label, labelPosition = "right", id, disabled, ...props }, ref) => {
50
+ const uniqueId = useId();
51
+ const radioId = id || uniqueId;
52
+ const control = /* @__PURE__ */ jsx(
53
+ RadioGroupPrimitive.Item,
54
+ {
55
+ ref,
56
+ id: radioId,
57
+ disabled,
58
+ className: cn(radioVariants({ size }), stateClasses, checkedStateClasses, className),
59
+ ...props,
60
+ children: /* @__PURE__ */ jsx(RadioGroupPrimitive.Indicator, { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx(
61
+ "span",
62
+ {
63
+ className: cn("block", indicatorVariants({ size })),
64
+ "data-disabled": disabled ? "" : void 0
65
+ }
66
+ ) })
67
+ }
68
+ );
69
+ if (!label) {
70
+ return control;
71
+ }
72
+ return /* @__PURE__ */ jsxs("div", { className: cn(containerVariants({ size, labelPosition })), children: [
73
+ control,
74
+ /* @__PURE__ */ jsx("label", { htmlFor: radioId, className: cn(labelVariants({ size })), children: label })
75
+ ] });
76
+ }
77
+ );
78
+ Radio.displayName = "Radio";
79
+ Radio.Item.displayName = "Radio.Item";
80
+
81
+ export { Radio };
82
+ //# sourceMappingURL=chunk-WWT73GGM.mjs.map
83
+ //# sourceMappingURL=chunk-WWT73GGM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/radio/Radio.tsx"],"names":[],"mappings":"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","file":"chunk-WWT73GGM.mjs","sourcesContent":["import { cn, cva } from '@exem-ui/core/utils';\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group';\nimport type React from 'react';\nimport { forwardRef, useId } from 'react';\n\ntype RadioRootProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>;\n\ntype RadioItemProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item> & {\n /**\n * 라디오 버튼 크기\n * @default 'medium'\n */\n size?: 'small' | 'medium' | 'large';\n /** 라디오 버튼 옆에 표시할 레이블 */\n label?: React.ReactNode;\n /**\n * 레이블 위치\n * @default 'right'\n */\n labelPosition?: 'left' | 'right';\n};\n\ntype RadioComponent = React.ForwardRefExoticComponent<\n RadioRootProps & React.RefAttributes<React.ElementRef<typeof RadioGroupPrimitive.Root>>\n> & {\n Item: React.ForwardRefExoticComponent<\n RadioItemProps & React.RefAttributes<React.ElementRef<typeof RadioGroupPrimitive.Item>>\n >;\n};\n\nconst containerVariants = cva('inline-flex items-center', {\n variants: {\n size: { small: 'gap-1', medium: 'gap-1.5', large: 'gap-2' },\n labelPosition: { right: 'flex-row', left: 'flex-row-reverse' },\n },\n defaultVariants: { size: 'medium', labelPosition: 'right' },\n});\n\nconst radioVariants = cva(\n 'peer relative shrink-0 rounded-full border border-border-secondary ring-offset-background transition-colors hover:bg-elevation-elevation-2 bg-background-primary',\n {\n variants: { size: { small: 'size-4', medium: 'size-5', large: 'size-6' } },\n defaultVariants: { size: 'medium' },\n },\n);\n\nconst stateClasses = [\n 'disabled:cursor-not-allowed',\n 'disabled:data-[state=unchecked]:bg-elevation-elevation-3',\n];\n\nconst checkedStateClasses = [\n 'data-[state=checked]:border-border-accent',\n 'disabled:data-[state=checked]:border-border-accent-disabled',\n];\n\nconst indicatorVariants = cva(\n 'pointer-events-none block rounded-full bg-icon-accent data-[disabled]:bg-icon-accent-disabled',\n {\n variants: {\n size: { small: 'size-2.5', medium: 'size-3', large: 'size-3.5' },\n },\n defaultVariants: { size: 'medium' },\n },\n);\n\nconst labelVariants = cva(\n 'cursor-pointer select-none text-text-primary peer-disabled:cursor-not-allowed peer-disabled:text-text-disabled',\n {\n variants: { size: { small: 'text-body-3', medium: 'text-body-2', large: 'text-body-1' } },\n defaultVariants: { size: 'medium' },\n },\n);\n\n/**\n * 여러 옵션 중 하나를 선택하는 라디오 그룹 컴포넌트입니다.\n * Compound Component 패턴으로 `Radio.Item`과 함께 사용합니다.\n *\n * @example\n * ```tsx\n * <Radio defaultValue=\"a\">\n * <Radio.Item value=\"a\" label=\"옵션 A\" />\n * <Radio.Item value=\"b\" label=\"옵션 B\" />\n * </Radio>\n * ```\n *\n * @see {@link RadioRootProps} 루트 props 상세\n * @see {@link RadioItemProps} 아이템 props 상세\n */\nconst Radio = forwardRef<React.ElementRef<typeof RadioGroupPrimitive.Root>, RadioRootProps>(\n ({ className, ...props }, ref) => (\n <RadioGroupPrimitive.Root ref={ref} className={cn('grid gap-2', className)} {...props} />\n ),\n) as RadioComponent;\n\nRadio.Item = forwardRef<React.ElementRef<typeof RadioGroupPrimitive.Item>, RadioItemProps>(\n ({ className, size = 'medium', label, labelPosition = 'right', id, disabled, ...props }, ref) => {\n const uniqueId = useId();\n const radioId = id || uniqueId;\n const control = (\n <RadioGroupPrimitive.Item\n ref={ref}\n id={radioId}\n disabled={disabled}\n className={cn(radioVariants({ size }), stateClasses, checkedStateClasses, className)}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <span\n className={cn('block', indicatorVariants({ size }))}\n data-disabled={disabled ? '' : undefined}\n />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n );\n if (!label) {\n return control;\n }\n return (\n <div className={cn(containerVariants({ size, labelPosition }))}>\n {control}\n <label htmlFor={radioId} className={cn(labelVariants({ size }))}>\n {label}\n </label>\n </div>\n );\n },\n) as RadioComponent['Item'];\n\nRadio.displayName = 'Radio';\nRadio.Item.displayName = 'Radio.Item';\n\nexport { Radio };\nexport type { RadioComponent, RadioRootProps, RadioItemProps };\n"]}