@hua-labs/ui 2.2.0 → 2.3.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 (571) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -43
  3. package/dist/{ComponentLayout-BhM4VSoq.d.mts → ComponentLayout-Clf6C2jV.d.mts} +37 -3
  4. package/dist/DashboardSidebar-ZulecqKs.d.mts +54 -0
  5. package/dist/DashboardToolbar-BRZayZNz.d.mts +122 -0
  6. package/dist/EmptyState-SQ3Z6Vf2.d.mts +64 -0
  7. package/dist/{Modal-CrXmb3Ll.d.mts → Modal-DKKtBtbh.d.mts} +12 -6
  8. package/dist/{Section-BWzyshgX.d.mts → Section-DKdIG1sg.d.mts} +11 -12
  9. package/dist/SectionHeader-DHwQ_xh8.d.mts +1653 -0
  10. package/dist/{Switch-Dzm5TLR3.d.mts → Switch-D0l7SJrz.d.mts} +31 -15
  11. package/dist/Tooltip-Cv7nYhPW.d.mts +304 -0
  12. package/dist/advanced/Logo.d.ts +8 -4
  13. package/dist/advanced/Logo.d.ts.map +1 -1
  14. package/dist/advanced/dashboard.d.ts +28 -6
  15. package/dist/advanced/dashboard.d.ts.map +1 -1
  16. package/dist/advanced-dashboard.d.mts +9 -2278
  17. package/dist/advanced-dashboard.mjs +1 -33
  18. package/dist/advanced-dashboard.mjs.map +1 -1
  19. package/dist/advanced-emotion.d.mts +13 -5
  20. package/dist/advanced-emotion.mjs +1 -1
  21. package/dist/advanced-motion.d.mts +136 -56
  22. package/dist/advanced-motion.mjs +1 -1
  23. package/dist/advanced.d.mts +69 -36
  24. package/dist/advanced.mjs +14 -3
  25. package/dist/advanced.mjs.map +1 -1
  26. package/dist/chunk-32OZGTPV.mjs +41 -0
  27. package/dist/chunk-32OZGTPV.mjs.map +1 -0
  28. package/dist/chunk-6WBFZ2KV.mjs +3 -0
  29. package/dist/chunk-6WBFZ2KV.mjs.map +1 -0
  30. package/dist/chunk-7CGJQSJO.mjs +3 -0
  31. package/dist/chunk-7CGJQSJO.mjs.map +1 -0
  32. package/dist/chunk-7T3IUG3G.mjs +3 -0
  33. package/dist/chunk-7T3IUG3G.mjs.map +1 -0
  34. package/dist/chunk-AJOGTUWS.mjs +3 -0
  35. package/dist/chunk-AJOGTUWS.mjs.map +1 -0
  36. package/dist/chunk-AQTSQYH2.mjs +3 -0
  37. package/dist/chunk-AQTSQYH2.mjs.map +1 -0
  38. package/dist/chunk-B2MRZJQA.mjs +3 -0
  39. package/dist/chunk-B2MRZJQA.mjs.map +1 -0
  40. package/dist/chunk-BOX4TONF.mjs +3 -0
  41. package/dist/chunk-BOX4TONF.mjs.map +1 -0
  42. package/dist/chunk-C2DOXNBK.mjs +3 -0
  43. package/dist/chunk-C2DOXNBK.mjs.map +1 -0
  44. package/dist/chunk-CQBMR7VU.mjs +3 -0
  45. package/dist/chunk-CQBMR7VU.mjs.map +1 -0
  46. package/dist/chunk-CYAAAEPJ.mjs +3 -0
  47. package/dist/chunk-CYAAAEPJ.mjs.map +1 -0
  48. package/dist/chunk-D7MTTTQY.mjs +8 -0
  49. package/dist/chunk-D7MTTTQY.mjs.map +1 -0
  50. package/dist/chunk-DABVKUJN.mjs +3 -0
  51. package/dist/chunk-DABVKUJN.mjs.map +1 -0
  52. package/dist/chunk-EK6BLFVQ.mjs +3 -0
  53. package/dist/chunk-EK6BLFVQ.mjs.map +1 -0
  54. package/dist/chunk-FVUAVGP5.mjs +3 -0
  55. package/dist/chunk-FVUAVGP5.mjs.map +1 -0
  56. package/dist/chunk-GAIUZVNC.mjs +3 -0
  57. package/dist/chunk-GAIUZVNC.mjs.map +1 -0
  58. package/dist/chunk-HLBIIF4I.mjs +3 -0
  59. package/dist/chunk-HLBIIF4I.mjs.map +1 -0
  60. package/dist/chunk-I6NCGF6E.mjs +3 -0
  61. package/dist/chunk-I6NCGF6E.mjs.map +1 -0
  62. package/dist/chunk-J46VEBVF.mjs +3 -0
  63. package/dist/chunk-J46VEBVF.mjs.map +1 -0
  64. package/dist/chunk-JNW3CLCA.mjs +3 -0
  65. package/dist/chunk-JNW3CLCA.mjs.map +1 -0
  66. package/dist/chunk-JY3QVUGW.mjs +3 -0
  67. package/dist/chunk-JY3QVUGW.mjs.map +1 -0
  68. package/dist/chunk-KHBZOGUU.mjs +3 -0
  69. package/dist/chunk-KHBZOGUU.mjs.map +1 -0
  70. package/dist/chunk-KPNNAQLI.mjs +3 -0
  71. package/dist/chunk-KPNNAQLI.mjs.map +1 -0
  72. package/dist/chunk-L2LGSILS.mjs +13 -0
  73. package/dist/chunk-L2LGSILS.mjs.map +1 -0
  74. package/dist/chunk-LPHUWTQ2.mjs +3 -0
  75. package/dist/chunk-LPHUWTQ2.mjs.map +1 -0
  76. package/dist/chunk-M4JE7TQL.mjs +3 -0
  77. package/dist/chunk-M4JE7TQL.mjs.map +1 -0
  78. package/dist/chunk-MEDKGNLV.mjs +3 -0
  79. package/dist/chunk-MEDKGNLV.mjs.map +1 -0
  80. package/dist/chunk-MR46CSMC.mjs +3 -0
  81. package/dist/chunk-MR46CSMC.mjs.map +1 -0
  82. package/dist/chunk-NSDWT2JM.mjs +3 -0
  83. package/dist/chunk-NSDWT2JM.mjs.map +1 -0
  84. package/dist/chunk-OBMOTQEU.mjs +3 -0
  85. package/dist/chunk-OBMOTQEU.mjs.map +1 -0
  86. package/dist/chunk-RICRFXFP.mjs +3 -0
  87. package/dist/chunk-RICRFXFP.mjs.map +1 -0
  88. package/dist/chunk-SOK7VBSM.mjs +13 -0
  89. package/dist/chunk-SOK7VBSM.mjs.map +1 -0
  90. package/dist/chunk-SPZ7SZH4.mjs +3 -0
  91. package/dist/chunk-SPZ7SZH4.mjs.map +1 -0
  92. package/dist/chunk-TB3DARQO.mjs +3 -0
  93. package/dist/chunk-TB3DARQO.mjs.map +1 -0
  94. package/dist/chunk-TND4HPKW.mjs +51 -0
  95. package/dist/chunk-TND4HPKW.mjs.map +1 -0
  96. package/dist/chunk-TSAXVD2H.mjs +35 -0
  97. package/dist/chunk-TSAXVD2H.mjs.map +1 -0
  98. package/dist/chunk-UR3TIWBS.mjs +3 -0
  99. package/dist/chunk-UR3TIWBS.mjs.map +1 -0
  100. package/dist/chunk-XU2XBAEW.mjs +3 -0
  101. package/dist/chunk-XU2XBAEW.mjs.map +1 -0
  102. package/dist/chunk-XXHDNZTG.mjs +3 -0
  103. package/dist/chunk-XXHDNZTG.mjs.map +1 -0
  104. package/dist/chunk-YW5DA7Q6.mjs +3 -0
  105. package/dist/chunk-YW5DA7Q6.mjs.map +1 -0
  106. package/dist/chunk-ZTHUGQZL.mjs +3 -0
  107. package/dist/chunk-ZTHUGQZL.mjs.map +1 -0
  108. package/dist/chunk-ZVCGC6EV.mjs +3 -0
  109. package/dist/chunk-ZVCGC6EV.mjs.map +1 -0
  110. package/dist/chunk-ZZ67E3M5.mjs +3 -0
  111. package/dist/chunk-ZZ67E3M5.mjs.map +1 -0
  112. package/dist/{common-YLvZxA_K.d.mts → common-Bej8Okcg.d.mts} +1 -1
  113. package/dist/components/Accordion.d.ts +14 -7
  114. package/dist/components/Accordion.d.ts.map +1 -1
  115. package/dist/components/Action.d.ts.map +1 -1
  116. package/dist/components/ActionToolbar.d.ts +10 -6
  117. package/dist/components/ActionToolbar.d.ts.map +1 -1
  118. package/dist/components/Alert.d.ts +16 -2
  119. package/dist/components/Alert.d.ts.map +1 -1
  120. package/dist/components/Autocomplete.d.ts +6 -4
  121. package/dist/components/Autocomplete.d.ts.map +1 -1
  122. package/dist/components/Avatar.d.ts +20 -7
  123. package/dist/components/Avatar.d.ts.map +1 -1
  124. package/dist/components/Badge.d.ts +27 -9
  125. package/dist/components/Badge.d.ts.map +1 -1
  126. package/dist/components/Bookmark.d.ts +4 -2
  127. package/dist/components/Bookmark.d.ts.map +1 -1
  128. package/dist/components/BottomSheet.d.ts +13 -9
  129. package/dist/components/BottomSheet.d.ts.map +1 -1
  130. package/dist/components/Box.d.ts +9 -0
  131. package/dist/components/Box.d.ts.map +1 -0
  132. package/dist/components/Breadcrumb.d.ts +9 -4
  133. package/dist/components/Breadcrumb.d.ts.map +1 -1
  134. package/dist/components/Button.d.ts +3 -29
  135. package/dist/components/Button.d.ts.map +1 -1
  136. package/dist/components/Button.variants.d.ts +54 -10
  137. package/dist/components/Button.variants.d.ts.map +1 -1
  138. package/dist/components/Card.d.ts +49 -14
  139. package/dist/components/Card.d.ts.map +1 -1
  140. package/dist/components/ChatMessage.d.ts +3 -2
  141. package/dist/components/ChatMessage.d.ts.map +1 -1
  142. package/dist/components/Checkbox.d.ts +5 -2
  143. package/dist/components/Checkbox.d.ts.map +1 -1
  144. package/dist/components/CodeBlock.d.ts +8 -5
  145. package/dist/components/CodeBlock.d.ts.map +1 -1
  146. package/dist/components/ColorPicker.d.ts +4 -2
  147. package/dist/components/ColorPicker.d.ts.map +1 -1
  148. package/dist/components/Command.d.ts +28 -14
  149. package/dist/components/Command.d.ts.map +1 -1
  150. package/dist/components/ComponentLayout.d.ts +5 -2
  151. package/dist/components/ComponentLayout.d.ts.map +1 -1
  152. package/dist/components/ConfirmModal.d.ts +4 -0
  153. package/dist/components/ConfirmModal.d.ts.map +1 -1
  154. package/dist/components/Container.d.ts +18 -5
  155. package/dist/components/Container.d.ts.map +1 -1
  156. package/dist/components/ContextMenu.d.ts +36 -36
  157. package/dist/components/ContextMenu.d.ts.map +1 -1
  158. package/dist/components/DatePicker.d.ts +12 -5
  159. package/dist/components/DatePicker.d.ts.map +1 -1
  160. package/dist/components/Divider.d.ts +2 -1
  161. package/dist/components/Divider.d.ts.map +1 -1
  162. package/dist/components/Drawer.d.ts +17 -12
  163. package/dist/components/Drawer.d.ts.map +1 -1
  164. package/dist/components/Dropdown.d.ts +25 -7
  165. package/dist/components/Dropdown.d.ts.map +1 -1
  166. package/dist/components/EmotionAnalysis.d.ts +3 -1
  167. package/dist/components/EmotionAnalysis.d.ts.map +1 -1
  168. package/dist/components/EmotionButton.d.ts +3 -1
  169. package/dist/components/EmotionButton.d.ts.map +1 -1
  170. package/dist/components/EmotionMeter.d.ts +3 -1
  171. package/dist/components/EmotionMeter.d.ts.map +1 -1
  172. package/dist/components/EmotionSelector.d.ts +3 -1
  173. package/dist/components/EmotionSelector.d.ts.map +1 -1
  174. package/dist/components/FeatureCard.d.ts +9 -3
  175. package/dist/components/FeatureCard.d.ts.map +1 -1
  176. package/dist/components/Form.d.ts +20 -54
  177. package/dist/components/Form.d.ts.map +1 -1
  178. package/dist/components/FormControl.d.ts +3 -2
  179. package/dist/components/FormControl.d.ts.map +1 -1
  180. package/dist/components/Grid.d.ts +11 -4
  181. package/dist/components/Grid.d.ts.map +1 -1
  182. package/dist/components/HeroSection.d.ts +4 -2
  183. package/dist/components/HeroSection.d.ts.map +1 -1
  184. package/dist/components/Icon/Icon.d.ts +12 -8
  185. package/dist/components/Icon/Icon.d.ts.map +1 -1
  186. package/dist/components/IconsaxGallery/index.d.ts +8 -5
  187. package/dist/components/IconsaxGallery/index.d.ts.map +1 -1
  188. package/dist/components/InfoCard.d.ts +5 -2
  189. package/dist/components/InfoCard.d.ts.map +1 -1
  190. package/dist/components/Input.d.ts +29 -4
  191. package/dist/components/Input.d.ts.map +1 -1
  192. package/dist/components/Label.d.ts +15 -10
  193. package/dist/components/Label.d.ts.map +1 -1
  194. package/dist/components/LanguageToggle.d.ts +5 -3
  195. package/dist/components/LanguageToggle.d.ts.map +1 -1
  196. package/dist/components/Link.d.ts +17 -6
  197. package/dist/components/Link.d.ts.map +1 -1
  198. package/dist/components/LoadingSpinner.d.ts +7 -3
  199. package/dist/components/LoadingSpinner.d.ts.map +1 -1
  200. package/dist/components/Menu.d.ts +59 -60
  201. package/dist/components/Menu.d.ts.map +1 -1
  202. package/dist/components/Modal.d.ts +12 -6
  203. package/dist/components/Modal.d.ts.map +1 -1
  204. package/dist/components/Navigation.d.ts +26 -11
  205. package/dist/components/Navigation.d.ts.map +1 -1
  206. package/dist/components/NumberInput.d.ts +5 -2
  207. package/dist/components/NumberInput.d.ts.map +1 -1
  208. package/dist/components/PageNavigation.d.ts +6 -3
  209. package/dist/components/PageNavigation.d.ts.map +1 -1
  210. package/dist/components/PageTransition.d.ts +2 -2
  211. package/dist/components/PageTransition.d.ts.map +1 -1
  212. package/dist/components/Pagination.d.ts +5 -2
  213. package/dist/components/Pagination.d.ts.map +1 -1
  214. package/dist/components/Panel.d.ts +1 -7
  215. package/dist/components/Panel.d.ts.map +1 -1
  216. package/dist/components/Popover.d.ts +25 -9
  217. package/dist/components/Popover.d.ts.map +1 -1
  218. package/dist/components/Pressable.d.ts +14 -0
  219. package/dist/components/Pressable.d.ts.map +1 -0
  220. package/dist/components/Progress.d.ts +36 -13
  221. package/dist/components/Progress.d.ts.map +1 -1
  222. package/dist/components/Prose.d.ts +51 -0
  223. package/dist/components/Prose.d.ts.map +1 -0
  224. package/dist/components/Radio.d.ts +29 -33
  225. package/dist/components/Radio.d.ts.map +1 -1
  226. package/dist/components/ScrollArea.d.ts +8 -9
  227. package/dist/components/ScrollArea.d.ts.map +1 -1
  228. package/dist/components/ScrollIndicator.d.ts +9 -8
  229. package/dist/components/ScrollIndicator.d.ts.map +1 -1
  230. package/dist/components/ScrollProgress.d.ts +3 -2
  231. package/dist/components/ScrollProgress.d.ts.map +1 -1
  232. package/dist/components/ScrollToTop.d.ts +5 -5
  233. package/dist/components/ScrollToTop.d.ts.map +1 -1
  234. package/dist/components/Section.d.ts +12 -9
  235. package/dist/components/Section.d.ts.map +1 -1
  236. package/dist/components/SectionHeader.d.ts +3 -2
  237. package/dist/components/SectionHeader.d.ts.map +1 -1
  238. package/dist/components/Select.d.ts +18 -5
  239. package/dist/components/Select.d.ts.map +1 -1
  240. package/dist/components/Skeleton.d.ts +43 -15
  241. package/dist/components/Skeleton.d.ts.map +1 -1
  242. package/dist/components/Slider.d.ts +7 -5
  243. package/dist/components/Slider.d.ts.map +1 -1
  244. package/dist/components/Stack.d.ts +22 -6
  245. package/dist/components/Stack.d.ts.map +1 -1
  246. package/dist/components/StatsPanel.d.ts +4 -2
  247. package/dist/components/StatsPanel.d.ts.map +1 -1
  248. package/dist/components/Switch.d.ts +9 -4
  249. package/dist/components/Switch.d.ts.map +1 -1
  250. package/dist/components/Table.d.ts +43 -18
  251. package/dist/components/Table.d.ts.map +1 -1
  252. package/dist/components/Tabs.d.ts +50 -77
  253. package/dist/components/Tabs.d.ts.map +1 -1
  254. package/dist/components/Text.d.ts +11 -0
  255. package/dist/components/Text.d.ts.map +1 -0
  256. package/dist/components/Textarea.d.ts +24 -6
  257. package/dist/components/Textarea.d.ts.map +1 -1
  258. package/dist/components/ThemeToggle.d.ts +18 -27
  259. package/dist/components/ThemeToggle.d.ts.map +1 -1
  260. package/dist/components/Timeline.d.ts +4 -2
  261. package/dist/components/Timeline.d.ts.map +1 -1
  262. package/dist/components/Toast.d.ts +1 -1
  263. package/dist/components/Toast.d.ts.map +1 -1
  264. package/dist/components/Toggle.d.ts +11 -2
  265. package/dist/components/Toggle.d.ts.map +1 -1
  266. package/dist/components/Tooltip.d.ts +5 -2
  267. package/dist/components/Tooltip.d.ts.map +1 -1
  268. package/dist/components/Upload.d.ts +5 -3
  269. package/dist/components/Upload.d.ts.map +1 -1
  270. package/dist/components/advanced/AdvancedPageTransition.d.ts +7 -5
  271. package/dist/components/advanced/AdvancedPageTransition.d.ts.map +1 -1
  272. package/dist/components/advanced/AnimatedGradient.d.ts +6 -2
  273. package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
  274. package/dist/components/advanced/Carousel.d.ts +3 -1
  275. package/dist/components/advanced/Carousel.d.ts.map +1 -1
  276. package/dist/components/advanced/DotNav.d.ts +12 -5
  277. package/dist/components/advanced/DotNav.d.ts.map +1 -1
  278. package/dist/components/advanced/GlowCard.d.ts +4 -1
  279. package/dist/components/advanced/GlowCard.d.ts.map +1 -1
  280. package/dist/components/advanced/HorizontalScroll.d.ts +4 -1
  281. package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -1
  282. package/dist/components/advanced/ImageReveal.d.ts +23 -1
  283. package/dist/components/advanced/ImageReveal.d.ts.map +1 -1
  284. package/dist/components/advanced/Marquee.d.ts +4 -2
  285. package/dist/components/advanced/Marquee.d.ts.map +1 -1
  286. package/dist/components/advanced/Parallax.d.ts +4 -2
  287. package/dist/components/advanced/Parallax.d.ts.map +1 -1
  288. package/dist/components/advanced/SpotlightCard.d.ts +13 -12
  289. package/dist/components/advanced/SpotlightCard.d.ts.map +1 -1
  290. package/dist/components/advanced/TextReveal.d.ts +5 -1
  291. package/dist/components/advanced/TextReveal.d.ts.map +1 -1
  292. package/dist/components/advanced/TiltCard.d.ts +6 -2
  293. package/dist/components/advanced/TiltCard.d.ts.map +1 -1
  294. package/dist/components/advanced/VideoBackground.d.ts +4 -1
  295. package/dist/components/advanced/VideoBackground.d.ts.map +1 -1
  296. package/dist/components/advanced/blog-editor/BlogEditor.d.ts +4 -2
  297. package/dist/components/advanced/blog-editor/BlogEditor.d.ts.map +1 -1
  298. package/dist/components/advanced/blog-editor/BlogEditorActions.d.ts +4 -2
  299. package/dist/components/advanced/blog-editor/BlogEditorActions.d.ts.map +1 -1
  300. package/dist/components/advanced/blog-editor/BlogEditorContent.d.ts +4 -2
  301. package/dist/components/advanced/blog-editor/BlogEditorContent.d.ts.map +1 -1
  302. package/dist/components/advanced/blog-editor/BlogEditorHeader.d.ts +4 -2
  303. package/dist/components/advanced/blog-editor/BlogEditorHeader.d.ts.map +1 -1
  304. package/dist/components/advanced/blog-editor/BlogEditorLanguageTabs.d.ts +4 -2
  305. package/dist/components/advanced/blog-editor/BlogEditorLanguageTabs.d.ts.map +1 -1
  306. package/dist/components/advanced/blog-editor/BlogEditorMetadata.d.ts +5 -3
  307. package/dist/components/advanced/blog-editor/BlogEditorMetadata.d.ts.map +1 -1
  308. package/dist/components/advanced/blog-editor/BlogEditorPreview.d.ts +5 -3
  309. package/dist/components/advanced/blog-editor/BlogEditorPreview.d.ts.map +1 -1
  310. package/dist/components/advanced/blog-editor/BlogEditorToolbar.d.ts +4 -2
  311. package/dist/components/advanced/blog-editor/BlogEditorToolbar.d.ts.map +1 -1
  312. package/dist/components/advanced/blog-editor/BlogEditorTranslate.d.ts +4 -2
  313. package/dist/components/advanced/blog-editor/BlogEditorTranslate.d.ts.map +1 -1
  314. package/dist/components/advanced/blog-editor/types.d.ts +5 -2
  315. package/dist/components/advanced/blog-editor/types.d.ts.map +1 -1
  316. package/dist/components/advanced/emotion/EmotionAnalysis.d.ts +3 -1
  317. package/dist/components/advanced/emotion/EmotionAnalysis.d.ts.map +1 -1
  318. package/dist/components/advanced/emotion/EmotionButton.d.ts +3 -1
  319. package/dist/components/advanced/emotion/EmotionButton.d.ts.map +1 -1
  320. package/dist/components/advanced/emotion/EmotionMeter.d.ts +4 -2
  321. package/dist/components/advanced/emotion/EmotionMeter.d.ts.map +1 -1
  322. package/dist/components/advanced/emotion/EmotionSelector.d.ts +3 -1
  323. package/dist/components/advanced/emotion/EmotionSelector.d.ts.map +1 -1
  324. package/dist/components/dashboard/ActivityFeed.d.ts +5 -2
  325. package/dist/components/dashboard/ActivityFeed.d.ts.map +1 -1
  326. package/dist/components/dashboard/BarChart.d.ts +3 -2
  327. package/dist/components/dashboard/BarChart.d.ts.map +1 -1
  328. package/dist/components/dashboard/DashboardGrid.d.ts +13 -3
  329. package/dist/components/dashboard/DashboardGrid.d.ts.map +1 -1
  330. package/dist/components/dashboard/DashboardSidebar.d.ts +15 -82
  331. package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -1
  332. package/dist/components/dashboard/DashboardToolbar.d.ts +3 -2
  333. package/dist/components/dashboard/DashboardToolbar.d.ts.map +1 -1
  334. package/dist/components/dashboard/EmptyState.d.ts +3 -2
  335. package/dist/components/dashboard/EmptyState.d.ts.map +1 -1
  336. package/dist/components/dashboard/MembershipBadge.d.ts +3 -2
  337. package/dist/components/dashboard/MembershipBadge.d.ts.map +1 -1
  338. package/dist/components/dashboard/MerchantList.d.ts +3 -2
  339. package/dist/components/dashboard/MerchantList.d.ts.map +1 -1
  340. package/dist/components/dashboard/MetricCard.d.ts +3 -2
  341. package/dist/components/dashboard/MetricCard.d.ts.map +1 -1
  342. package/dist/components/dashboard/MiniBarChart.d.ts +3 -2
  343. package/dist/components/dashboard/MiniBarChart.d.ts.map +1 -1
  344. package/dist/components/dashboard/NotificationCard.d.ts +5 -2
  345. package/dist/components/dashboard/NotificationCard.d.ts.map +1 -1
  346. package/dist/components/dashboard/ProfileCard.d.ts +5 -2
  347. package/dist/components/dashboard/ProfileCard.d.ts.map +1 -1
  348. package/dist/components/dashboard/ProgressCard.d.ts +6 -3
  349. package/dist/components/dashboard/ProgressCard.d.ts.map +1 -1
  350. package/dist/components/dashboard/QuickActionCard.d.ts +22 -27
  351. package/dist/components/dashboard/QuickActionCard.d.ts.map +1 -1
  352. package/dist/components/dashboard/RoutingBreakdownCard.d.ts +3 -2
  353. package/dist/components/dashboard/RoutingBreakdownCard.d.ts.map +1 -1
  354. package/dist/components/dashboard/SettlementTimeline.d.ts +3 -2
  355. package/dist/components/dashboard/SettlementTimeline.d.ts.map +1 -1
  356. package/dist/components/dashboard/StatCard.d.ts +7 -4
  357. package/dist/components/dashboard/StatCard.d.ts.map +1 -1
  358. package/dist/components/dashboard/SummaryCard.d.ts +6 -3
  359. package/dist/components/dashboard/SummaryCard.d.ts.map +1 -1
  360. package/dist/components/dashboard/TransactionDetailDrawer.d.ts +2 -2
  361. package/dist/components/dashboard/TransactionDetailDrawer.d.ts.map +1 -1
  362. package/dist/components/dashboard/TransactionsTable.d.ts +3 -2
  363. package/dist/components/dashboard/TransactionsTable.d.ts.map +1 -1
  364. package/dist/components/dashboard/TrendChart.d.ts +3 -2
  365. package/dist/components/dashboard/TrendChart.d.ts.map +1 -1
  366. package/dist/components/dashboard/YearlyHeatmap.d.ts +4 -2
  367. package/dist/components/dashboard/YearlyHeatmap.d.ts.map +1 -1
  368. package/dist/components/dashboard/kanban/KanbanAddCard.d.ts.map +1 -1
  369. package/dist/components/dashboard/kanban/KanbanAddColumn.d.ts.map +1 -1
  370. package/dist/components/dashboard/kanban/KanbanBoard.d.ts.map +1 -1
  371. package/dist/components/dashboard/kanban/KanbanCard.d.ts.map +1 -1
  372. package/dist/components/dashboard/kanban/KanbanColumn.d.ts.map +1 -1
  373. package/dist/components/dashboard/kanban/KanbanColumnHeader.d.ts.map +1 -1
  374. package/dist/components/dashboard/kanban/KanbanDropIndicator.d.ts.map +1 -1
  375. package/dist/components/dashboard/kanban/index.d.ts +1 -1
  376. package/dist/components/dashboard/kanban/types.d.ts +24 -12
  377. package/dist/components/dashboard/kanban/types.d.ts.map +1 -1
  378. package/dist/components/scrollbar/scrollbar.d.ts +2 -1
  379. package/dist/components/scrollbar/scrollbar.d.ts.map +1 -1
  380. package/dist/context/MotionConfigContext.d.ts +41 -0
  381. package/dist/context/MotionConfigContext.d.ts.map +1 -0
  382. package/dist/data.d.mts +55 -23
  383. package/dist/data.d.ts +45 -3
  384. package/dist/data.d.ts.map +1 -1
  385. package/dist/data.mjs +2 -2
  386. package/dist/data.mjs.map +1 -1
  387. package/dist/feedback.d.mts +6 -293
  388. package/dist/feedback.d.ts +7 -5
  389. package/dist/feedback.d.ts.map +1 -1
  390. package/dist/feedback.mjs +1 -1
  391. package/dist/form.d.mts +99 -114
  392. package/dist/form.mjs +8 -3
  393. package/dist/form.mjs.map +1 -1
  394. package/dist/hooks/index.d.ts +6 -0
  395. package/dist/hooks/index.d.ts.map +1 -1
  396. package/dist/hooks/useAnimatedEntrance.d.ts +24 -0
  397. package/dist/hooks/useAnimatedEntrance.d.ts.map +1 -0
  398. package/dist/hooks/useBreakpoint.d.ts +22 -0
  399. package/dist/hooks/useBreakpoint.d.ts.map +1 -0
  400. package/dist/hooks/useDotEnv.d.ts +12 -0
  401. package/dist/hooks/useDotEnv.d.ts.map +1 -0
  402. package/dist/hooks/useDotMap.d.ts +38 -0
  403. package/dist/hooks/useDotMap.d.ts.map +1 -0
  404. package/dist/iconsax-extended.mjs +2 -2
  405. package/dist/iconsax-extended.mjs.map +1 -1
  406. package/dist/iconsax.mjs +2 -2
  407. package/dist/iconsax.mjs.map +1 -1
  408. package/dist/index.d.mts +358 -127
  409. package/dist/index.d.ts +74 -64
  410. package/dist/index.d.ts.map +1 -1
  411. package/dist/index.mjs +15 -15
  412. package/dist/index.mjs.map +1 -1
  413. package/dist/interactive/kanban.d.ts +12 -0
  414. package/dist/interactive/kanban.d.ts.map +1 -0
  415. package/dist/interactive-kanban.d.mts +378 -0
  416. package/dist/interactive-kanban.mjs +3 -0
  417. package/dist/interactive-kanban.mjs.map +1 -0
  418. package/dist/interactive.d.mts +193 -197
  419. package/dist/interactive.d.ts +7 -5
  420. package/dist/interactive.d.ts.map +1 -1
  421. package/dist/interactive.mjs +1 -1
  422. package/dist/interactive.mjs.map +1 -1
  423. package/dist/landing/LandingAbout.d.ts +2 -2
  424. package/dist/landing/LandingAbout.d.ts.map +1 -1
  425. package/dist/landing/LandingCTA.d.ts +2 -2
  426. package/dist/landing/LandingCTA.d.ts.map +1 -1
  427. package/dist/landing/LandingContact.d.ts +2 -2
  428. package/dist/landing/LandingContact.d.ts.map +1 -1
  429. package/dist/landing/LandingExperience.d.ts +1 -1
  430. package/dist/landing/LandingExperience.d.ts.map +1 -1
  431. package/dist/landing/LandingFeatures.d.ts +1 -1
  432. package/dist/landing/LandingFeatures.d.ts.map +1 -1
  433. package/dist/landing/LandingHero.d.ts +2 -2
  434. package/dist/landing/LandingHero.d.ts.map +1 -1
  435. package/dist/landing/LandingLogoCloud.d.ts +2 -2
  436. package/dist/landing/LandingLogoCloud.d.ts.map +1 -1
  437. package/dist/landing/LandingMetrics.d.ts +1 -1
  438. package/dist/landing/LandingMetrics.d.ts.map +1 -1
  439. package/dist/landing/LandingProjects.d.ts +1 -1
  440. package/dist/landing/LandingProjects.d.ts.map +1 -1
  441. package/dist/landing/LandingShowcase.d.ts +2 -2
  442. package/dist/landing/LandingShowcase.d.ts.map +1 -1
  443. package/dist/landing/LandingSkills.d.ts +1 -1
  444. package/dist/landing/LandingSkills.d.ts.map +1 -1
  445. package/dist/landing/LandingStats.d.ts +1 -1
  446. package/dist/landing/LandingStats.d.ts.map +1 -1
  447. package/dist/landing/LandingTestimonials.d.ts +1 -1
  448. package/dist/landing/LandingTestimonials.d.ts.map +1 -1
  449. package/dist/landing/types.d.ts +42 -30
  450. package/dist/landing/types.d.ts.map +1 -1
  451. package/dist/landing.d.mts +47 -37
  452. package/dist/landing.mjs +4 -20
  453. package/dist/landing.mjs.map +1 -1
  454. package/dist/lib/Slot.d.ts.map +1 -1
  455. package/dist/lib/icon-providers.d.ts +17 -3
  456. package/dist/lib/icon-providers.d.ts.map +1 -1
  457. package/dist/lib/styles/animation.d.ts +35 -0
  458. package/dist/lib/styles/animation.d.ts.map +1 -0
  459. package/dist/lib/styles/disabled.d.ts +15 -0
  460. package/dist/lib/styles/disabled.d.ts.map +1 -0
  461. package/dist/lib/styles/focus.d.ts +34 -0
  462. package/dist/lib/styles/focus.d.ts.map +1 -0
  463. package/dist/lib/styles/glass.d.ts +18 -0
  464. package/dist/lib/styles/glass.d.ts.map +1 -0
  465. package/dist/lib/styles/hover.d.ts +9 -0
  466. package/dist/lib/styles/hover.d.ts.map +1 -0
  467. package/dist/lib/styles/index.d.ts +6 -0
  468. package/dist/lib/styles/index.d.ts.map +1 -1
  469. package/dist/lib/styles/transition.d.ts +42 -0
  470. package/dist/lib/styles/transition.d.ts.map +1 -0
  471. package/dist/lib/types/common.d.ts +3 -3
  472. package/dist/lib/types/common.d.ts.map +1 -1
  473. package/dist/native/Box.d.ts +11 -0
  474. package/dist/native/Box.d.ts.map +1 -0
  475. package/dist/native/Pressable.d.ts +10 -0
  476. package/dist/native/Pressable.d.ts.map +1 -0
  477. package/dist/native/Text.d.ts +11 -0
  478. package/dist/native/Text.d.ts.map +1 -0
  479. package/dist/native/index.d.ts +9 -0
  480. package/dist/native/index.d.ts.map +1 -0
  481. package/dist/native/useDotMap.d.ts +51 -0
  482. package/dist/native/useDotMap.d.ts.map +1 -0
  483. package/dist/native.mjs +2 -0
  484. package/dist/native.mjs.map +1 -0
  485. package/dist/navigation.d.mts +48 -21
  486. package/dist/navigation.d.ts +10 -8
  487. package/dist/navigation.d.ts.map +1 -1
  488. package/dist/navigation.mjs +1 -1
  489. package/dist/navigation.mjs.map +1 -1
  490. package/dist/overlay.d.mts +84 -37
  491. package/dist/overlay.mjs +2 -2
  492. package/dist/overlay.mjs.map +1 -1
  493. package/dist/sdui/SDUIRenderer.d.ts.map +1 -1
  494. package/dist/sdui/core.d.ts +50 -0
  495. package/dist/sdui/core.d.ts.map +1 -0
  496. package/dist/sdui/index.d.ts +3 -1
  497. package/dist/sdui/index.d.ts.map +1 -1
  498. package/dist/sdui/registry.d.ts.map +1 -1
  499. package/dist/sdui/types.d.ts +38 -0
  500. package/dist/sdui/types.d.ts.map +1 -1
  501. package/dist/sdui.d.mts +89 -1
  502. package/dist/sdui.mjs +2 -2
  503. package/dist/sdui.mjs.map +1 -1
  504. package/package.json +39 -15
  505. package/src/styles/component-vars.css +503 -69
  506. package/src/styles/landing.css +12 -12
  507. package/src/styles/prose.css +284 -0
  508. package/src/styles/recommended-theme.css +123 -141
  509. package/src/styles/utilities.css +3 -3
  510. package/dist/chunk-5DPW7SVD.mjs +0 -4
  511. package/dist/chunk-5DPW7SVD.mjs.map +0 -1
  512. package/dist/chunk-5L5HIPKA.mjs +0 -3
  513. package/dist/chunk-5L5HIPKA.mjs.map +0 -1
  514. package/dist/chunk-CNW22G24.mjs +0 -13
  515. package/dist/chunk-CNW22G24.mjs.map +0 -1
  516. package/dist/chunk-CW66UBQG.mjs +0 -3
  517. package/dist/chunk-CW66UBQG.mjs.map +0 -1
  518. package/dist/chunk-EPY3432E.mjs +0 -3
  519. package/dist/chunk-EPY3432E.mjs.map +0 -1
  520. package/dist/chunk-F2M4YDDQ.mjs +0 -3
  521. package/dist/chunk-F2M4YDDQ.mjs.map +0 -1
  522. package/dist/chunk-FHMFDCX2.mjs +0 -3
  523. package/dist/chunk-FHMFDCX2.mjs.map +0 -1
  524. package/dist/chunk-HBIUCLFL.mjs +0 -3
  525. package/dist/chunk-HBIUCLFL.mjs.map +0 -1
  526. package/dist/chunk-HEBXAFRY.mjs +0 -3
  527. package/dist/chunk-HEBXAFRY.mjs.map +0 -1
  528. package/dist/chunk-IG47LMOD.mjs +0 -3
  529. package/dist/chunk-IG47LMOD.mjs.map +0 -1
  530. package/dist/chunk-J47ZEXEL.mjs +0 -3
  531. package/dist/chunk-J47ZEXEL.mjs.map +0 -1
  532. package/dist/chunk-K2FOFIST.mjs +0 -3
  533. package/dist/chunk-K2FOFIST.mjs.map +0 -1
  534. package/dist/chunk-LL6QPRD7.mjs +0 -3
  535. package/dist/chunk-LL6QPRD7.mjs.map +0 -1
  536. package/dist/chunk-NMJLOK6M.mjs +0 -3
  537. package/dist/chunk-NMJLOK6M.mjs.map +0 -1
  538. package/dist/chunk-O24K56OS.mjs +0 -3
  539. package/dist/chunk-O24K56OS.mjs.map +0 -1
  540. package/dist/chunk-OIWG3IJ7.mjs +0 -3
  541. package/dist/chunk-OIWG3IJ7.mjs.map +0 -1
  542. package/dist/chunk-OLLU7ZFH.mjs +0 -3
  543. package/dist/chunk-OLLU7ZFH.mjs.map +0 -1
  544. package/dist/chunk-Q76JW7X5.mjs +0 -73
  545. package/dist/chunk-Q76JW7X5.mjs.map +0 -1
  546. package/dist/chunk-QRM66RQG.mjs +0 -3
  547. package/dist/chunk-QRM66RQG.mjs.map +0 -1
  548. package/dist/chunk-QRRP7TGF.mjs +0 -13
  549. package/dist/chunk-QRRP7TGF.mjs.map +0 -1
  550. package/dist/chunk-SD6XGDAC.mjs +0 -3
  551. package/dist/chunk-SD6XGDAC.mjs.map +0 -1
  552. package/dist/chunk-SDFVGFXT.mjs +0 -3
  553. package/dist/chunk-SDFVGFXT.mjs.map +0 -1
  554. package/dist/chunk-SMLDNOV3.mjs +0 -8
  555. package/dist/chunk-SMLDNOV3.mjs.map +0 -1
  556. package/dist/chunk-TAP6MYDW.mjs +0 -3
  557. package/dist/chunk-TAP6MYDW.mjs.map +0 -1
  558. package/dist/chunk-TBZ645BI.mjs +0 -3
  559. package/dist/chunk-TBZ645BI.mjs.map +0 -1
  560. package/dist/chunk-V2DNYJR6.mjs +0 -3
  561. package/dist/chunk-V2DNYJR6.mjs.map +0 -1
  562. package/dist/chunk-VBABZXL7.mjs +0 -3
  563. package/dist/chunk-VBABZXL7.mjs.map +0 -1
  564. package/dist/chunk-WYBSHTGY.mjs +0 -3
  565. package/dist/chunk-WYBSHTGY.mjs.map +0 -1
  566. package/dist/chunk-ZQUMJQYV.mjs +0 -3
  567. package/dist/chunk-ZQUMJQYV.mjs.map +0 -1
  568. package/dist/chunk-ZY23NOT4.mjs +0 -3
  569. package/dist/chunk-ZY23NOT4.mjs.map +0 -1
  570. package/dist/components/EmptyState.d.ts +0 -62
  571. package/dist/components/EmptyState.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/styles/colors.ts","../src/lib/styles/variants.ts"],"names":["colorShades","colorClass","color","shade","prefix","withDarkMode","lightClass","darkClass","defaultColorConfig","gradientConfig","createColorStyles","config","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","finalConfig","defaultBorder","defaultBg","defaultStyle","merge","gradientFrom","gradientTo","gradientBorder","gradientStyle","outlineBorder","outlineBg","outlineText","outlineStyle","elevatedBorder","elevatedBg","elevatedShadow","elevatedStyle","iconBg","iconText","iconStyle","badgeBg","badgeText","badgeStyle","colorStylesCache","useColorStyles","cacheKey","createVariantStyles","variant","colorStyles","baseClasses","createSizeStyles","size","createRoundedStyles","rounded","createShadowStyles","shadow","HUA_SPRING_EASING","createHoverStyles","hover","reducedMotion","springTransition"],"mappings":"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","file":"chunk-EPY3432E.mjs","sourcesContent":["/**\n * HUA UI 공통 색상 시스템\n * 중앙화된 색상 팔레트와 스타일 생성 유틸리티\n */\n\nimport type { Color } from \"../types/common\";\nimport { merge } from \"../utils\";\n\n/**\n * Tailwind CSS 색상 클래스 매핑\n * 각 색상의 50-900 단계를 정의합니다.\n */\nconst colorShades = {\n 50: \"50\",\n 100: \"100\",\n 200: \"200\",\n 300: \"300\",\n 400: \"400\",\n 500: \"500\",\n 600: \"600\",\n 700: \"700\",\n 800: \"800\",\n 900: \"900\",\n} as const;\n\ntype ColorShade = keyof typeof colorShades;\n\n/**\n * 색상별 클래스 생성 헬퍼\n */\nfunction colorClass(color: Color, shade: ColorShade, prefix: string = \"\"): string {\n return `${prefix}${color}-${colorShades[shade]}`;\n}\n\n/**\n * 다크 모드 지원 클래스 생성\n */\nfunction withDarkMode(lightClass: string, darkClass: string): string {\n return `${lightClass} dark:${darkClass}`;\n}\n\n/**\n * 색상 스타일 설정 인터페이스\n */\nexport interface ColorStyleConfig {\n /** 기본 variant 스타일 */\n default?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n };\n /** 그라데이션 variant 스타일 */\n gradient?: {\n from?: ColorShade;\n to?: ColorShade;\n border?: { light: ColorShade; dark?: ColorShade };\n };\n /** 아웃라인 variant 스타일 */\n outline?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: string;\n text?: { light: ColorShade; dark?: ColorShade };\n };\n /** Elevated variant 스타일 */\n elevated?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: { light: string; dark: string };\n shadow?: string;\n };\n /** 아이콘 스타일 */\n icon?: {\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n text?: { light: ColorShade; dark?: ColorShade };\n };\n /** 배지 스타일 */\n badge?: {\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n text?: { light: ColorShade; dark?: ColorShade };\n };\n}\n\n/**\n * 생성된 색상 스타일 인터페이스\n */\nexport interface ColorStyles {\n default: string;\n gradient: string;\n outline: string;\n elevated: string;\n icon: string;\n badge: string;\n}\n\n/**\n * 기본 색상 스타일 설정\n * 각 색상에 대한 기본 스타일 템플릿\n */\nconst defaultColorConfig: Omit<ColorStyleConfig, \"gradient\"> = {\n default: {\n border: { light: 200, dark: 700 },\n background: { light: 50, dark: 900, opacity: \"50\" },\n },\n outline: {\n border: { light: 300, dark: 600 },\n background: \"transparent\",\n text: { light: 600, dark: 400 },\n },\n elevated: {\n border: { light: 200, dark: 700 },\n background: { light: \"white\", dark: \"gray-800\" },\n shadow: \"lg\",\n },\n icon: {\n background: { light: 100, dark: 900, opacity: \"30\" },\n text: { light: 600, dark: 400 },\n },\n badge: {\n background: { light: 50, dark: 900, opacity: \"30\" },\n text: { light: 700, dark: 300 },\n },\n};\n\n/**\n * 그라데이션 스타일 설정\n */\nconst gradientConfig: ColorStyleConfig[\"gradient\"] = {\n from: 500,\n to: 600,\n border: { light: 400, dark: 500 },\n};\n\n/**\n * 색상 스타일 생성 함수\n * \n * @param color - 색상 이름\n * @param config - 커스텀 스타일 설정 (선택사항)\n * @returns 생성된 색상 스타일 객체\n * \n * @example\n * ```tsx\n * const styles = createColorStyles(\"blue\");\n * // styles.default, styles.gradient, styles.outline 등 사용 가능\n * ```\n */\nexport function createColorStyles(\n color: Color,\n config?: Partial<ColorStyleConfig>\n): ColorStyles {\n const finalConfig: ColorStyleConfig = {\n default: config?.default || defaultColorConfig.default,\n gradient: config?.gradient || gradientConfig,\n outline: config?.outline || defaultColorConfig.outline,\n elevated: config?.elevated || defaultColorConfig.elevated,\n icon: config?.icon || defaultColorConfig.icon,\n badge: config?.badge || defaultColorConfig.badge,\n };\n\n // Default variant\n const defaultBorder = finalConfig.default?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.default.border.light)}`,\n `border-${colorClass(color, finalConfig.default.border.dark || finalConfig.default.border.light)}`\n )\n : \"\";\n \n const defaultBg = finalConfig.default?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.default.background.dark || finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`\n )\n : \"\";\n\n const defaultStyle = merge(defaultBorder, defaultBg);\n\n // Gradient variant\n const gradientFrom = finalConfig.gradient?.from\n ? `from-${colorClass(color, finalConfig.gradient.from)}`\n : \"\";\n const gradientTo = finalConfig.gradient?.to\n ? `to-${colorClass(color, finalConfig.gradient.to)}`\n : \"\";\n const gradientBorder = finalConfig.gradient?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.gradient.border.light)}`,\n `border-${colorClass(color, finalConfig.gradient.border.dark || finalConfig.gradient.border.light)}`\n )\n : \"\";\n \n const gradientStyle = merge(\n \"bg-gradient-to-br\",\n gradientFrom,\n gradientTo,\n gradientBorder\n );\n\n // Outline variant\n const outlineBorder = finalConfig.outline?.border\n ? `border-2 ${withDarkMode(\n `border-${colorClass(color, finalConfig.outline.border.light)}`,\n `border-${colorClass(color, finalConfig.outline.border.dark || finalConfig.outline.border.light)}`\n )}`\n : \"\";\n const outlineBg = finalConfig.outline?.background || \"bg-transparent\";\n const outlineText = finalConfig.outline?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.outline.text.light)}`,\n `text-${colorClass(color, finalConfig.outline.text.dark || finalConfig.outline.text.light)}`\n )\n : \"\";\n \n const outlineStyle = merge(outlineBorder, outlineBg, outlineText);\n\n // Elevated variant\n const elevatedBorder = finalConfig.elevated?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.elevated.border.light)}`,\n `border-${colorClass(color, finalConfig.elevated.border.dark || finalConfig.elevated.border.light)}`\n )\n : \"\";\n const elevatedBg = finalConfig.elevated?.background\n ? withDarkMode(\n `bg-${finalConfig.elevated.background.light}`,\n `bg-${finalConfig.elevated.background.dark}`\n )\n : \"\";\n const elevatedShadow = finalConfig.elevated?.shadow\n ? `shadow-${finalConfig.elevated.shadow}`\n : \"\";\n \n const elevatedStyle = merge(elevatedBorder, elevatedBg, elevatedShadow);\n\n // Icon style\n const iconBg = finalConfig.icon?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.icon.background.dark || finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`\n )\n : \"\";\n const iconText = finalConfig.icon?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.icon.text.light)}`,\n `text-${colorClass(color, finalConfig.icon.text.dark || finalConfig.icon.text.light)}`\n )\n : \"\";\n \n const iconStyle = merge(iconBg, iconText);\n\n // Badge style\n const badgeBg = finalConfig.badge?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.badge.background.dark || finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`\n )\n : \"\";\n const badgeText = finalConfig.badge?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.badge.text.light)}`,\n `text-${colorClass(color, finalConfig.badge.text.dark || finalConfig.badge.text.light)}`\n )\n : \"\";\n \n const badgeStyle = merge(badgeBg, badgeText);\n\n return {\n default: defaultStyle,\n gradient: gradientStyle,\n outline: outlineStyle,\n elevated: elevatedStyle,\n icon: iconStyle,\n badge: badgeStyle,\n };\n}\n\n/**\n * 색상 스타일 캐시\n * 동일한 색상과 설정에 대해 재사용하여 성능 최적화\n */\nconst colorStylesCache = new Map<string, ColorStyles>();\n\n/**\n * 메모이제이션된 색상 스타일 생성 함수\n * \n * @param color - 색상 이름\n * @param config - 커스텀 스타일 설정 (선택사항)\n * @returns 생성된 색상 스타일 객체\n */\nexport function useColorStyles(\n color: Color,\n config?: Partial<ColorStyleConfig>\n): ColorStyles {\n const cacheKey = `${color}-${JSON.stringify(config || {})}`;\n \n if (!colorStylesCache.has(cacheKey)) {\n colorStylesCache.set(cacheKey, createColorStyles(color, config));\n }\n \n return colorStylesCache.get(cacheKey)!;\n}\n\n","/**\n * HUA UI 공통 Variant 시스템\n * 컴포넌트 variant 스타일 생성 유틸리티\n */\n\nimport type { ExtendedVariant, Size } from \"../types/common\";\nimport type { ColorStyles } from \"./colors\";\nimport { merge } from \"../utils\";\n\n/**\n * Variant 스타일 생성 함수\n * \n * @param variant - Variant 타입\n * @param colorStyles - 색상 스타일 객체\n * @returns 생성된 variant 클래스 문자열\n * \n * @example\n * ```tsx\n * const colorStyles = useColorStyles(\"blue\");\n * const variantClass = createVariantStyles(\"elevated\", colorStyles);\n * ```\n */\nexport function createVariantStyles(\n variant: ExtendedVariant,\n colorStyles: ColorStyles\n): string {\n const baseClasses = \"rounded-2xl border transition-all duration-200\";\n \n switch (variant) {\n case \"default\":\n return merge(baseClasses, colorStyles.default);\n \n case \"gradient\":\n return merge(baseClasses, \"text-white\", colorStyles.gradient);\n \n case \"outline\":\n return merge(baseClasses, colorStyles.outline);\n \n case \"elevated\":\n return merge(baseClasses, colorStyles.elevated);\n \n default:\n return baseClasses;\n }\n}\n\n/**\n * Size 스타일 설정 인터페이스\n */\nexport interface SizeStyles {\n container: string;\n icon: string;\n iconContainer: string;\n text: string;\n title: string;\n description: string;\n}\n\n/**\n * Size 스타일 생성 함수\n * \n * @param size - 크기 타입\n * @returns 생성된 size 스타일 객체\n * \n * @example\n * ```tsx\n * const sizeStyles = createSizeStyles(\"md\");\n * // sizeStyles.container, sizeStyles.icon 등 사용 가능\n * ```\n */\nexport function createSizeStyles(size: Size = \"md\"): SizeStyles {\n const sizeMap: Record<Size, SizeStyles> = {\n sm: {\n container: \"p-4\",\n icon: \"h-4 w-4\",\n iconContainer: \"w-8 h-8\",\n text: \"text-xs\",\n title: \"text-xs\",\n description: \"text-xs\",\n },\n md: {\n container: \"p-6\",\n icon: \"h-6 w-6\",\n iconContainer: \"w-12 h-12\",\n text: \"text-base\",\n title: \"text-sm\",\n description: \"text-sm\",\n },\n lg: {\n container: \"p-8\",\n icon: \"h-8 w-8\",\n iconContainer: \"w-16 h-16\",\n text: \"text-lg\",\n title: \"text-base\",\n description: \"text-base\",\n },\n xl: {\n container: \"p-10\",\n icon: \"h-10 w-10\",\n iconContainer: \"w-20 h-20\",\n text: \"text-xl\",\n title: \"text-lg\",\n description: \"text-lg\",\n },\n };\n \n return sizeMap[size];\n}\n\n/**\n * Rounded 스타일 타입\n */\nexport type Rounded = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\" | \"none\";\n\n/**\n * Rounded 스타일 생성 함수\n * \n * @param rounded - Rounded 타입\n * @returns 생성된 rounded 클래스 문자열\n */\nexport function createRoundedStyles(rounded: Rounded = \"md\"): string {\n const roundedMap: Record<Rounded, string> = {\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n xl: \"rounded-xl\",\n full: \"rounded-full\",\n none: \"rounded-none\",\n };\n \n return roundedMap[rounded];\n}\n\n/**\n * Shadow 스타일 타입\n */\nexport type Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\n/**\n * Shadow 스타일 생성 함수\n * \n * @param shadow - Shadow 타입\n * @returns 생성된 shadow 클래스 문자열\n */\nexport function createShadowStyles(shadow: Shadow = \"md\"): string {\n if (shadow === \"none\") return \"\";\n \n return `shadow-${shadow}`;\n}\n\n/**\n * Hover 효과 타입\n */\nexport type HoverEffect = \"scale\" | \"glow\" | \"slide\" | \"springy\" | \"none\";\n\n/**\n * HUA-UI 스프링 이징\n * 공 튕기듯 아주 미세한 반동 - cubic-bezier(0.34, 1.56, 0.64, 1)\n */\nexport const HUA_SPRING_EASING = \"cubic-bezier(0.34, 1.56, 0.64, 1)\";\n\n/**\n * Hover 효과 스타일 생성 함수\n *\n * @param hover - Hover 효과 타입\n * @param reducedMotion - 애니메이션 축소 설정 여부\n * @returns 생성된 hover 클래스 문자열\n *\n * @description\n * HUA-UI 시그니처: \"스륵 부드럽고 아주 미세하게 쫀득\"\n * - 스프링 이징으로 미세한 반동 효과\n * - 1.5% 스케일 변화로 자연스러운 피드백\n */\nexport function createHoverStyles(\n hover: HoverEffect = \"springy\",\n reducedMotion: boolean = false\n): string {\n if (reducedMotion || hover === \"none\") return \"\";\n\n // 스프링 이징 스타일 (Tailwind arbitrary value)\n // HUA-UI 시그니처: 아주 미세한 스프링 반동 (쫀득한 느낌)\n const springTransition = \"[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]\";\n\n const hoverMap: Record<HoverEffect, string> = {\n // HUA-UI 시그니처 스프링 효과 (기본값)\n // scale 1.5% + 미세한 shadow 추가로 입체감\n springy: `hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${springTransition} transform-gpu`,\n // scale만 (스프링 없음)\n scale: \"hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu\",\n // 글로우 효과 - shadow 강화\n glow: \"hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200\",\n // 슬라이드 효과 - 위로 살짝 뜨는 느낌 + shadow\n slide: `hover:-translate-y-0.5 hover:shadow-md ${springTransition} transform-gpu`,\n none: \"\",\n };\n\n return hoverMap[hover];\n}\n\n"]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {a}from'./chunk-QEMPERUK.mjs';import h from'react';import {cva}from'class-variance-authority';import {jsx,jsxs}from'react/jsx-runtime';var b={error:"border-destructive focus-visible:ring-destructive",success:"border-green-500 focus-visible:ring-green-500"};var L=cva("flex h-10 w-full rounded-md border px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200 hover:border-accent-foreground hover:shadow-sm",{variants:{variant:{default:"border-input bg-background",outline:"border-2 border-input bg-transparent",filled:"border-transparent bg-secondary/50",glass:"border-white/20 bg-white/10 text-white placeholder:text-white/50 backdrop-blur-sm"}},defaultVariants:{variant:"default"}}),T=h.forwardRef(({className:n,type:l,variant:t="default",error:s,success:d,...e},r)=>{let o=e["aria-invalid"],i=s||(o!==void 0?o:false);return jsx("input",{type:l,className:a(L({variant:t}),i&&b.error,d&&b.success,n),ref:r,"aria-invalid":i||void 0,...e})});T.displayName="Input";var M=cva("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",{variants:{variant:{default:"text-foreground",glass:"text-white"}},defaultVariants:{variant:"default"}}),_=h.forwardRef(({className:n,children:l,required:t=false,error:s=false,disabled:d=false,variant:e="default",...r},o)=>jsxs("label",{ref:o,className:a(M({variant:e}),s&&(e==="glass"?"text-red-400":"text-destructive"),d&&(e==="glass"?"text-white/50":"text-muted-foreground"),n),"aria-required":t?true:void 0,...r,children:[l,t&&jsx("span",{className:e==="glass"?"text-red-400 ml-1":"text-destructive ml-1","aria-label":"\uD544\uC218 \uD544\uB4DC",children:"*"})]}));_.displayName="Label";var P=h.forwardRef(({className:n,variant:l="default",size:t="md",error:s=false,success:d=false,label:e,description:r,id:o,...i},v)=>{var g;let x=h.useId(),u=o||x,f=e?`${u}-label`:void 0,m=r?`${u}-description`:void 0,w={sm:"w-9 h-5",md:"w-11 h-6",lg:"w-14 h-8"},k={sm:"w-4 h-4",md:"w-5 h-5",lg:"w-7 h-7"},y={sm:"peer-checked:translate-x-4",md:"peer-checked:translate-x-5",lg:"peer-checked:translate-x-6"},I={default:"bg-muted peer-checked:bg-primary",outline:"bg-transparent border-2 border-input peer-checked:border-primary peer-checked:bg-primary",filled:"bg-secondary peer-checked:bg-primary",glass:"bg-white/20 backdrop-blur-sm border border-white/30 peer-checked:bg-primary/50 peer-checked:border-primary/30"},N=s?"bg-destructive/20 peer-checked:bg-destructive":d?"bg-green-200 peer-checked:bg-green-600 dark:bg-green-800 dark:peer-checked:bg-green-500":"";return jsxs("div",{className:"flex items-start space-x-3",children:[jsxs("div",{className:"relative",children:[jsx("input",{type:"checkbox",id:u,className:a("peer sr-only",n),ref:v,"aria-checked":(g=i.checked)!=null?g:false,"aria-invalid":s,"aria-label":e?void 0:i["aria-label"],"aria-labelledby":e?f:void 0,"aria-describedby":m,role:"switch",...i}),jsx("div",{className:a("relative inline-flex cursor-pointer items-center rounded-full transition-colors duration-200 ease-in-out","peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-ring peer-focus:ring-offset-2","peer-disabled:cursor-not-allowed peer-disabled:opacity-50",w[t],I[l],N),children:jsx("div",{className:a("pointer-events-none absolute rounded-full bg-white shadow-md ring-0","transition-all duration-200 ease-out","top-1/2 -translate-y-1/2 left-0.5",k[t],y[t])})})]}),(e||r)&&jsxs("div",{className:"flex flex-col",children:[e&&jsx("label",{htmlFor:u,id:f,className:"text-sm font-medium text-foreground cursor-pointer",children:e}),r&&jsx("p",{id:m,className:"text-sm text-muted-foreground",children:r})]})]})});P.displayName="Switch";export{b as a,T as b,_ as c,P as d};//# sourceMappingURL=chunk-F2M4YDDQ.mjs.map
3
- //# sourceMappingURL=chunk-F2M4YDDQ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/styles/cva-base.ts","../src/components/Input.tsx","../src/components/Label.tsx","../src/components/Switch.tsx"],"names":["FORM_STATE","inputVariants","cva","Input","React","className","type","variant","error","success","props","ref","ariaInvalid","isInvalid","jsx","merge","labelVariants","Label","children","required","disabled","jsxs","Switch","size","label","description","id","_a","generatedId","switchId","labelId","descriptionId","sizeClasses","thumbSizes","thumbTranslate","variantClasses","stateClasses"],"mappings":"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","file":"chunk-F2M4YDDQ.mjs","sourcesContent":["/**\n * CVA 공통 상수 — 전 컴포넌트에서 재사용\n *\n * 모든 CVA variant 정의에서 import하여 사용합니다.\n * @example\n * import { SHARED_DISABLED, SHARED_FOCUS } from '../lib/styles/cva-base'\n */\n\n/** 비활성 상태 공통 스타일 */\nexport const SHARED_DISABLED =\n 'disabled:pointer-events-none disabled:opacity-50' as const\n\n/** 포커스 링 공통 스타일 */\nexport const SHARED_FOCUS =\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2' as const\n\n/** 트랜지션 공통 스타일 */\nexport const SHARED_TRANSITION =\n 'transition-colors duration-150' as const\n\n/** 글래스모피즘 공통 스타일 */\nexport const SHARED_GLASS =\n 'backdrop-blur-md border-white/20 bg-white/10 dark:bg-white/5' as const\n\n/**\n * 폼 상태 스타일 (error / success)\n * Input, Select, Textarea, Switch 등 전체 폼 컴포넌트에서 사용\n */\nexport const FORM_STATE = {\n error: 'border-destructive focus-visible:ring-destructive',\n success: 'border-green-500 focus-visible:ring-green-500',\n} as const\n\n/**\n * HUA 시그니처 스프링 이징\n * cubic-bezier(0.34, 1.56, 0.64, 1) — \"쫀득한\" 느낌\n */\nexport const HUA_SPRING_EASING =\n 'cubic-bezier(0.34, 1.56, 0.64, 1)' as const\n\n/** 마이크로 모션 기본 트랜지션 */\nexport const SHARED_MICRO_MOTION =\n 'transition-all duration-[180ms]' as const\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { FORM_STATE } from \"../lib/styles/cva-base\"\n\nexport const inputVariants = cva(\n \"flex h-10 w-full rounded-md border px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200 hover:border-accent-foreground hover:shadow-sm\",\n {\n variants: {\n variant: {\n default: \"border-input bg-background\",\n outline: \"border-2 border-input bg-transparent\",\n filled: \"border-transparent bg-secondary/50\",\n glass: \"border-white/20 bg-white/10 text-white placeholder:text-white/50 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Input 컴포넌트의 props / Input component props\n */\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n error?: boolean\n success?: boolean\n}\n\n/**\n * Input 컴포넌트 / Input component\n *\n * 표준 HTML input 요소를 래핑한 스타일링된 입력 필드 컴포넌트입니다.\n *\n * @example\n * <Input type=\"text\" placeholder=\"이름을 입력하세요\" />\n * <Input type=\"email\" error placeholder=\"이메일\" />\n */\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, variant = \"default\", error, success, ...props }, ref) => {\n const ariaInvalid = props[\"aria-invalid\" as keyof typeof props] as boolean | undefined;\n const isInvalid = error || (ariaInvalid !== undefined ? ariaInvalid : false);\n\n return (\n <input\n type={type}\n className={merge(\n inputVariants({ variant }),\n isInvalid && FORM_STATE.error,\n success && FORM_STATE.success,\n className\n )}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n {\n variants: {\n variant: {\n default: \"text-foreground\",\n glass: \"text-white\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Label 컴포넌트의 props / Label component props\n */\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n required?: boolean\n error?: boolean\n disabled?: boolean\n variant?: \"default\" | \"glass\"\n}\n\n/**\n * Label 컴포넌트 / Label component\n *\n * 폼 필드의 레이블을 표시하는 컴포넌트입니다.\n *\n * @example\n * <Label htmlFor=\"email\">이메일</Label>\n * <Label required htmlFor=\"name\">이름</Label>\n * <Label error htmlFor=\"password\">비밀번호</Label>\n */\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({\n className,\n children,\n required = false,\n error = false,\n disabled = false,\n variant = \"default\",\n ...props\n }, ref) => {\n return (\n <label\n ref={ref}\n className={merge(\n labelVariants({ variant }),\n error && (variant === \"glass\" ? \"text-red-400\" : \"text-destructive\"),\n disabled && (variant === \"glass\" ? \"text-white/50\" : \"text-muted-foreground\"),\n className\n )}\n aria-required={required ? true : undefined}\n {...props}\n >\n {children}\n {required && (\n <span className={variant === \"glass\" ? \"text-red-400 ml-1\" : \"text-destructive ml-1\"} aria-label=\"필수 필드\">*</span>\n )}\n </label>\n )\n }\n)\nLabel.displayName = \"Label\"\n\nexport { Label } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Switch 컴포넌트의 props / Switch component props\n * @typedef {Object} SwitchProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Switch 스타일 변형 / Switch style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Switch 크기 / Switch size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 스위치 레이블 텍스트 / Switch label text\n * @property {string} [description] - 스위치 설명 텍스트 / Switch description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface SwitchProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Switch 컴포넌트 / Switch component\n * \n * 토글 스위치 입력 필드를 제공하는 컴포넌트입니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Toggle switch input field component.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Switch label=\"알림 받기\" />\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [enabled, setEnabled] = useState(false)\n * <Switch \n * checked={enabled}\n * onChange={(e) => setEnabled(e.target.checked)}\n * label=\"다크 모드\"\n * />\n * \n * @example\n * // 에러 상태 / Error state\n * <Switch \n * label=\"필수 설정\"\n * description=\"이 설정을 활성화해야 합니다\"\n * error\n * />\n * \n * @param {SwitchProps} props - Switch 컴포넌트의 props / Switch component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Switch 컴포넌트 / Switch component\n */\nconst Switch = React.forwardRef<HTMLInputElement, SwitchProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n ...props \n }, ref) => {\n const generatedId = React.useId()\n const switchId = id || generatedId\n const labelId = label ? `${switchId}-label` : undefined\n const descriptionId = description ? `${switchId}-description` : undefined\n // Track sizes - proper proportions for smooth toggle\n const sizeClasses = {\n sm: \"w-9 h-5\",\n md: \"w-11 h-6\",\n lg: \"w-14 h-8\"\n }\n\n // Thumb sizes - slightly smaller than track height for padding\n const thumbSizes = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-7 h-7\"\n }\n\n // Thumb position when checked - calculated for proper alignment\n const thumbTranslate = {\n sm: \"peer-checked:translate-x-4\",\n md: \"peer-checked:translate-x-5\",\n lg: \"peer-checked:translate-x-6\"\n }\n\n const variantClasses = {\n default: \"bg-muted peer-checked:bg-primary\",\n outline: \"bg-transparent border-2 border-input peer-checked:border-primary peer-checked:bg-primary\",\n filled: \"bg-secondary peer-checked:bg-primary\",\n glass: \"bg-white/20 backdrop-blur-sm border border-white/30 peer-checked:bg-primary/50 peer-checked:border-primary/30\",\n }\n\n const stateClasses = error\n ? \"bg-destructive/20 peer-checked:bg-destructive\"\n : success\n ? \"bg-green-200 peer-checked:bg-green-600 dark:bg-green-800 dark:peer-checked:bg-green-500\"\n : \"\"\n\n return (\n <div className=\"flex items-start space-x-3\">\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id={switchId}\n className={merge(\n \"peer sr-only\",\n className\n )}\n ref={ref}\n aria-checked={props.checked ?? false}\n aria-invalid={error}\n aria-label={!label ? props['aria-label'] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"switch\"\n {...props}\n />\n <div\n className={merge(\n \"relative inline-flex cursor-pointer items-center rounded-full transition-colors duration-200 ease-in-out\",\n \"peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-ring peer-focus:ring-offset-2\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses\n )}\n >\n <div\n className={merge(\n \"pointer-events-none absolute rounded-full bg-white shadow-md ring-0\",\n \"transition-all duration-200 ease-out\",\n \"top-1/2 -translate-y-1/2 left-0.5\",\n thumbSizes[size],\n thumbTranslate[size]\n )}\n />\n </div>\n </div>\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <label htmlFor={switchId} id={labelId} className=\"text-sm font-medium text-foreground cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nSwitch.displayName = \"Switch\"\n\nexport { Switch } "]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {l}from'./chunk-ZQUMJQYV.mjs';import {a}from'./chunk-QEMPERUK.mjs';import x from'react';import {jsxs,jsx}from'react/jsx-runtime';var y=x.forwardRef(({className:n,icon:e,title:s,description:d,variant:a$1="default",size:r="md",hover:i="scale",gradient:g="blue",customGradient:m,...c},p)=>{let u={sm:"p-4",md:"p-6",lg:"p-8"},b={default:"bg-background/90 backdrop-blur-sm border border-border/50",gradient:`bg-gradient-to-br ${m||v(g)}`,glass:"bg-white/10 dark:bg-gray-800/10 backdrop-blur-md border border-white/20 dark:border-gray-700/20",neon:"bg-gray-900/90 dark:bg-gray-900/90 border border-cyan-400/30 dark:border-cyan-400/30 shadow-lg shadow-cyan-400/20"},f={scale:"hover:scale-105 transition-transform duration-300",glow:"hover:shadow-2xl hover:shadow-cyan-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300",slide:"hover:-translate-y-2 transition-transform duration-300",none:""},h=r==="lg"?"text-5xl":r==="md"?"text-4xl":"text-3xl";return jsxs("div",{ref:p,className:a("rounded-2xl shadow-lg transition-all duration-300 flex flex-col items-center text-center",u[r],b[a$1],f[i],n),...c,children:[e&&jsx("div",{className:`mb-4 ${h} ${a$1==="neon"?"text-cyan-400":""}`,children:typeof e=="string"&&e.startsWith("http")?jsx("img",{src:e,alt:s,className:"w-full h-full object-contain"}):jsx(l,{name:e,className:"w-full h-full"})}),jsx("h3",{className:a("font-bold mb-2",r==="lg"?"text-2xl":r==="md"?"text-xl":"text-lg",a$1==="gradient"?"text-white":"text-foreground"),children:s}),jsx("p",{className:a(r==="lg"?"text-base":"text-sm",a$1==="gradient"?"text-white/90":"text-muted-foreground"),children:d})]})});y.displayName="FeatureCard";function v(n){let e={blue:"from-indigo-500 via-cyan-500 to-cyan-600",purple:"from-purple-500 via-pink-500 to-purple-600",green:"from-green-500 via-emerald-500 to-green-600",orange:"from-orange-500 via-red-500 to-orange-600",pink:"from-pink-500 via-rose-500 to-pink-600"};return e[n]||e.blue}export{y as a};//# sourceMappingURL=chunk-FHMFDCX2.mjs.map
3
- //# sourceMappingURL=chunk-FHMFDCX2.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/FeatureCard.tsx"],"names":["FeatureCard","React","className","icon","title","description","variant","size","hover","gradient","customGradient","props","ref","sizeClasses","variantClasses","getGradientClass","hoverClasses","iconSize","jsxs","merge","jsx","Icon","gradients"],"mappings":"wIAuEA,IAAMA,CAAAA,CAAcC,CAAAA,CAAM,WACxB,CAAC,CACC,UAAAC,CAAAA,CACA,IAAA,CAAAC,EACA,KAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,GAAAA,CAAU,UACV,IAAA,CAAAC,CAAAA,CAAO,KACP,KAAA,CAAAC,CAAAA,CAAQ,QACR,QAAA,CAAAC,CAAAA,CAAW,MAAA,CACX,cAAA,CAAAC,CAAAA,CACA,GAAGC,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAMC,CAAAA,CAAc,CAClB,GAAI,KAAA,CACJ,EAAA,CAAI,KAAA,CACJ,EAAA,CAAI,KACN,CAAA,CAEMC,EAAiB,CACrB,OAAA,CAAS,4DACT,QAAA,CAAU,CAAA,kBAAA,EAAqBJ,GAAkBK,CAAAA,CAAiBN,CAAQ,CAAC,CAAA,CAAA,CAC3E,KAAA,CAAO,iGAAA,CACP,KAAM,mHACR,CAAA,CAEMO,CAAAA,CAAe,CACnB,KAAA,CAAO,mDAAA,CACP,KAAM,wGAAA,CACN,KAAA,CAAO,wDAAA,CACP,IAAA,CAAM,EACR,CAAA,CAEMC,EAAWV,CAAAA,GAAS,IAAA,CAAO,WAAaA,CAAAA,GAAS,IAAA,CAAO,WAAa,UAAA,CAE3E,OACEW,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKN,CAAAA,CACL,UAAWO,CAAAA,CACT,0FAAA,CACAN,CAAAA,CAAYN,CAAI,CAAA,CAChBO,CAAAA,CAAeR,GAAO,CAAA,CACtBU,CAAAA,CAAaR,CAAK,CAAA,CAClBN,CACF,CAAA,CACC,GAAGS,CAAAA,CAEH,QAAA,CAAA,CAAAR,GACCiB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAW,CAAA,KAAA,EAAQH,CAAQ,CAAA,CAAA,EAAIX,GAAAA,GAAY,MAAA,CAAS,eAAA,CAAkB,EAAE,CAAA,CAAA,CAC1E,QAAA,CAAA,OAAOH,GAAS,QAAA,EAAYA,CAAAA,CAAK,WAAW,MAAM,CAAA,CACjDiB,GAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKjB,CAAAA,CAAM,IAAKC,CAAAA,CAAO,SAAA,CAAU,+BAA+B,CAAA,CAErEgB,GAAAA,CAACC,EAAA,CAAK,IAAA,CAAMlB,CAAAA,CAAqB,SAAA,CAAU,eAAA,CAAgB,CAAA,CAE/D,EAGFiB,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAWD,CAAAA,CACb,gBAAA,CACAZ,CAAAA,GAAS,KAAO,UAAA,CAAaA,CAAAA,GAAS,IAAA,CAAO,SAAA,CAAY,SAAA,CACzDD,GAAAA,GAAY,WAAa,YAAA,CAAe,iBAC1C,EACG,QAAA,CAAAF,CAAAA,CACH,EAEAgB,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAWD,CAAAA,CACZZ,CAAAA,GAAS,IAAA,CAAO,YAAc,SAAA,CAC9BD,GAAAA,GAAY,UAAA,CAAa,eAAA,CAAkB,uBAC7C,CAAA,CACG,SAAAD,CAAAA,CACH,CAAA,CAAA,CACF,CAEJ,CACF,EAEAL,CAAAA,CAAY,YAAc,aAAA,CAE1B,SAASe,EAAiBN,CAAAA,CAA0B,CAClD,IAAMa,CAAAA,CAAY,CAChB,IAAA,CAAM,0CAAA,CACN,MAAA,CAAQ,4CAAA,CACR,MAAO,6CAAA,CACP,MAAA,CAAQ,2CAAA,CACR,IAAA,CAAM,wCACR,CAAA,CACA,OAAOA,CAAAA,CAAUb,CAAkC,CAAA,EAAKa,CAAAA,CAAU,IACpE","file":"chunk-FHMFDCX2.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { AllIconName } from \"../lib/icon-names\"\n\n/**\n * FeatureCard 아이콘 타입 / FeatureCard icon type\n * - AllIconName: icons.ts + PROJECT_ICONS의 모든 아이콘 / All icons from icons.ts + PROJECT_ICONS\n * - `http${string}`: 이미지 URL / Image URL\n */\ntype FeatureCardIconType = AllIconName | `http${string}`\n\n/**\n * FeatureCard 컴포넌트의 props / FeatureCard component props\n * @typedef {Object} FeatureCardProps\n * @property {FeatureCardIconType} [icon] - 아이콘 (IconName, ProjectIconName 또는 이미지 URL) / Icon (IconName, ProjectIconName or image URL)\n * @property {string} title - 카드 제목 / Card title\n * @property {string} description - 카드 설명 / Card description\n * @property {\"default\" | \"gradient\" | \"glass\" | \"neon\"} [variant=\"default\"] - FeatureCard 스타일 변형 / FeatureCard style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - FeatureCard 크기 / FeatureCard size\n * @property {\"scale\" | \"glow\" | \"slide\" | \"none\"} [hover=\"scale\"] - 호버 효과 / Hover effect\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"} [gradient=\"blue\"] - 그라디언트 색상 / Gradient color\n * @property {string} [customGradient] - 커스텀 그라디언트 클래스 / Custom gradient class\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface FeatureCardProps extends React.HTMLAttributes<HTMLDivElement> {\n icon?: FeatureCardIconType\n title: string\n description: string\n variant?: \"default\" | \"gradient\" | \"glass\" | \"neon\"\n size?: \"sm\" | \"md\" | \"lg\"\n hover?: \"scale\" | \"glow\" | \"slide\" | \"none\"\n gradient?: \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"\n customGradient?: string\n}\n\n/**\n * FeatureCard 컴포넌트 / FeatureCard component\n * \n * 기능을 소개하는 카드 컴포넌트입니다.\n * 아이콘, 제목, 설명을 포함하며, 다양한 스타일과 호버 효과를 지원합니다.\n * \n * Card component that introduces features.\n * Includes icon, title, and description, supports various styles and hover effects.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <FeatureCard\n * icon=\"star\"\n * title=\"고급 기능\"\n * description=\"강력한 기능을 제공합니다\"\n * />\n * \n * @example\n * // Gradient 스타일 / Gradient style\n * <FeatureCard\n * icon=\"zap\"\n * title=\"빠른 성능\"\n * description=\"최적화된 성능\"\n * variant=\"gradient\"\n * gradient=\"purple\"\n * hover=\"glow\"\n * />\n * \n * @param {FeatureCardProps} props - FeatureCard 컴포넌트의 props / FeatureCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} FeatureCard 컴포넌트 / FeatureCard component\n */\nconst FeatureCard = React.forwardRef<HTMLDivElement, FeatureCardProps>(\n ({ \n className, \n icon, \n title, \n description, \n variant = \"default\", \n size = \"md\",\n hover = \"scale\",\n gradient = \"blue\",\n customGradient,\n ...props \n }, ref) => {\n const sizeClasses = {\n sm: \"p-4\",\n md: \"p-6\",\n lg: \"p-8\"\n }\n\n const variantClasses = {\n default: \"bg-background/90 backdrop-blur-sm border border-border/50\",\n gradient: `bg-gradient-to-br ${customGradient || getGradientClass(gradient)}`,\n glass: \"bg-white/10 dark:bg-gray-800/10 backdrop-blur-md border border-white/20 dark:border-gray-700/20\",\n neon: \"bg-gray-900/90 dark:bg-gray-900/90 border border-cyan-400/30 dark:border-cyan-400/30 shadow-lg shadow-cyan-400/20\"\n }\n\n const hoverClasses = {\n scale: \"hover:scale-105 transition-transform duration-300\",\n glow: \"hover:shadow-2xl hover:shadow-cyan-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300\",\n slide: \"hover:-translate-y-2 transition-transform duration-300\",\n none: \"\"\n }\n\n const iconSize = size === \"lg\" ? \"text-5xl\" : size === \"md\" ? \"text-4xl\" : \"text-3xl\"\n\n return (\n <div\n ref={ref}\n className={merge(\n \"rounded-2xl shadow-lg transition-all duration-300 flex flex-col items-center text-center\",\n sizeClasses[size],\n variantClasses[variant],\n hoverClasses[hover],\n className\n )}\n {...props}\n >\n {icon && (\n <div className={`mb-4 ${iconSize} ${variant === \"neon\" ? \"text-cyan-400\" : \"\"}`}>\n {typeof icon === \"string\" && icon.startsWith(\"http\") ? (\n <img src={icon} alt={title} className=\"w-full h-full object-contain\" />\n ) : (\n <Icon name={icon as AllIconName} className=\"w-full h-full\" />\n )}\n </div>\n )}\n \n <h3 className={merge(\n \"font-bold mb-2\",\n size === \"lg\" ? \"text-2xl\" : size === \"md\" ? \"text-xl\" : \"text-lg\",\n variant === \"gradient\" ? \"text-white\" : \"text-foreground\"\n )}>\n {title}\n </h3>\n \n <p className={merge(\n size === \"lg\" ? \"text-base\" : \"text-sm\",\n variant === \"gradient\" ? \"text-white/90\" : \"text-muted-foreground\"\n )}>\n {description}\n </p>\n </div>\n )\n }\n)\n\nFeatureCard.displayName = \"FeatureCard\"\n\nfunction getGradientClass(gradient: string): string {\n const gradients = {\n blue: \"from-indigo-500 via-cyan-500 to-cyan-600\",\n purple: \"from-purple-500 via-pink-500 to-purple-600\",\n green: \"from-green-500 via-emerald-500 to-green-600\",\n orange: \"from-orange-500 via-red-500 to-orange-600\",\n pink: \"from-pink-500 via-rose-500 to-pink-600\"\n }\n return gradients[gradient as keyof typeof gradients] || gradients.blue\n}\n\nexport { FeatureCard } "]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {a}from'./chunk-QEMPERUK.mjs';import n from'react';import {createPortal}from'react-dom';import {jsxs,jsx}from'react/jsx-runtime';function v({onClick:a$1,className:o}){return jsx("button",{onClick:a$1,className:a("p-2 text-muted-foreground hover:text-foreground transition-all duration-200 rounded-full hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 z-20",o),"aria-label":"\uB2EB\uAE30",children:jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})}function $(...a){return n.useCallback(o=>{a.forEach(e=>{e&&(typeof e=="function"?e(o):e.current=o);});},a)}var j=n.forwardRef(({className:a$1,isOpen:o,onClose:e,children:g,size:p="md",closable:s,closeOnOverlayClick:x=true,title:r,description:c,showBackdrop:y=true,backdropClassName:h,centered:k=true},w)=>{let m=s!=null?s:true,N=n.useRef(null),R=$(w,N);n.useEffect(()=>{let i=u=>{u.key==="Escape"&&e();};if(o){document.addEventListener("keydown",i);let u=window.innerWidth-document.documentElement.clientWidth;document.body.style.overflow="hidden",document.body.style.paddingRight=`${u}px`;}return ()=>{document.removeEventListener("keydown",i),document.body.style.overflow="unset",document.body.style.paddingRight="unset";}},[o,e]);let C=i=>{x&&i.target===i.currentTarget&&e();},E={sm:"max-w-xs",md:"max-w-sm",lg:"max-w-md",xl:"max-w-lg","2xl":"max-w-xl","3xl":"max-w-2xl"},M=n.useId(),T=n.useId(),f=r?`modal-title-${M}`:void 0,b=c?`modal-description-${T}`:void 0,[z,I]=n.useState(false);if(n.useEffect(()=>{I(true);},[]),!o)return null;let L=jsxs("div",{className:a("fixed inset-0 z-50 overflow-y-auto",a$1),onClick:C,role:"dialog","aria-modal":"true","aria-labelledby":f,"aria-describedby":b,children:[y&&jsx("div",{className:a("fixed inset-0 bg-black/85 backdrop-blur-md transition-opacity duration-300 pointer-events-none",h)}),jsx("div",{className:a("flex h-full justify-center p-4",k?"items-center":"items-start pt-16"),children:jsxs("div",{ref:R,className:a("relative bg-[var(--modal-bg)] rounded-lg shadow-2xl border border-[var(--modal-border)] transform transition-all duration-300 ease-out",E[p]),style:{animation:"modalSlideIn 0.3s cubic-bezier(0.16, 1, 0.3, 1)"},children:[r&&jsxs("div",{className:"relative z-10 px-6 pt-6 pb-4 border-b border-border/50",children:[jsxs("div",{className:"flex items-center justify-between gap-4 mb-2",children:[jsx("h2",{id:f,className:"text-xl font-semibold text-foreground flex-1 min-w-0",children:r}),m&&jsx(v,{onClick:e,className:"flex-shrink-0"})]}),c&&jsx("p",{id:b,className:"text-sm text-muted-foreground",children:c})]}),!r&&m&&jsx(v,{onClick:e,className:"absolute top-4 right-4"}),jsx("div",{className:`relative z-10 ${r?"px-6 mb-6":"p-6"}`,children:g})]})})]});return z&&typeof document!="undefined"?createPortal(L,document.body):null});j.displayName="Modal";export{j as a};//# sourceMappingURL=chunk-HBIUCLFL.mjs.map
3
- //# sourceMappingURL=chunk-HBIUCLFL.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Modal.tsx"],"names":["ModalCloseButton","onClick","className","jsx","merge","useCombinedRefs","refs","React","node","ref","Modal","isOpen","onClose","children","size","closable","closeOnOverlayClick","title","description","showBackdrop","backdropClassName","centered","_closable","modalRef","combinedRef","handleEscape","e","scrollbarWidth","handleOverlayClick","sizeClasses","generatedTitleId","generatedDescId","titleId","descriptionId","mounted","setMounted","modalContent","jsxs","createPortal"],"mappings":"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","file":"chunk-HBIUCLFL.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Modal 컴포넌트의 props / Modal component props\n * @typedef {Object} ModalProps\n * @property {boolean} isOpen - 모달 열림/닫힘 상태 / Modal open/close state\n * @property {() => void} onClose - 모달 닫기 콜백 함수 / Modal close callback function\n * @property {React.ReactNode} children - 모달 내용 / Modal content\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\"} [size=\"md\"] - 모달 크기 / Modal size\n * @property {boolean} [closable=true] - 닫기 버튼 표시 여부 / Show close button\n * @property {boolean} [closeOnOverlayClick=true] - 오버레이 클릭 시 닫기 여부 / Close on overlay click\n * @property {string} [title] - 모달 제목 / Modal title\n * @property {string} [description] - 모달 설명 / Modal description\n * @property {boolean} [showBackdrop=true] - 배경 오버레이 표시 여부 / Show backdrop overlay\n * @property {string} [backdropClassName] - 배경 오버레이 추가 CSS 클래스 / Additional CSS class for backdrop\n * @property {boolean} [centered=true] - 모달을 화면 중앙에 배치할지 여부 / Center modal on screen\n * @property {string} [className] - 모달 컨테이너 추가 CSS 클래스 / Additional CSS class for modal container\n */\nexport interface ModalProps {\n /** 모달 열림/닫힘 상태 / Modal open/close state */\n isOpen: boolean\n /** 모달 닫기 콜백 함수 / Modal close callback function */\n onClose: () => void\n /** 모달 내용 / Modal content */\n children: React.ReactNode\n /** 모달 크기 / Modal size */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\"\n /** 닫기 버튼 표시 여부 / Show close button */\n closable?: boolean\n /** 오버레이 클릭 시 닫기 여부 / Close on overlay click */\n closeOnOverlayClick?: boolean\n /** 모달 제목 / Modal title */\n title?: string\n /** 모달 설명 / Modal description */\n description?: string\n /** 배경 오버레이 표시 여부 / Show backdrop overlay */\n showBackdrop?: boolean\n /** 배경 오버레이 추가 CSS 클래스 / Additional CSS class for backdrop */\n backdropClassName?: string\n /** 모달을 화면 중앙에 배치할지 여부 / Center modal on screen */\n centered?: boolean\n /** 모달 컨테이너 추가 CSS 클래스 / Additional CSS class for modal container */\n className?: string\n}\n\n// 모달 닫기 버튼 컴포넌트 (title 유무에 따라 위치만 다름)\nfunction ModalCloseButton({\n onClick,\n className,\n}: {\n onClick: () => void;\n className?: string;\n}) {\n return (\n <button\n onClick={onClick}\n className={merge(\n \"p-2 text-muted-foreground hover:text-foreground transition-all duration-200 rounded-full hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 z-20\",\n className\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n );\n}\n\n// Ref 병합 유틸리티\nfunction useCombinedRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return React.useCallback(\n (node: T) => {\n refs.forEach((ref) => {\n if (!ref) return;\n if (typeof ref === \"function\") {\n ref(node);\n } else {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n refs\n );\n}\n\n/**\n * Modal 컴포넌트 / Modal component\n * \n * 오버레이와 함께 표시되는 모달 다이얼로그 컴포넌트입니다.\n * ESC 키로 닫기, 오버레이 클릭으로 닫기, 접근성 속성(ARIA)을 지원합니다.\n * \n * Modal dialog component displayed with overlay.\n * Supports closing with ESC key, overlay click, and ARIA accessibility attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [isOpen, setIsOpen] = useState(false)\n * \n * <Modal isOpen={isOpen} onClose={() => setIsOpen(false)}>\n * <p>모달 내용</p>\n * </Modal>\n * \n * @example\n * // 제목과 설명 포함 / With title and description\n * <Modal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"확인\"\n * description=\"이 작업을 계속하시겠습니까?\"\n * >\n * <Button onClick={handleConfirm}>확인</Button>\n * </Modal>\n * \n * @example\n * // 큰 크기 모달 / Large size modal\n * <Modal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * size=\"xl\"\n * closeOnOverlayClick={false}\n * >\n * <div>큰 모달 내용</div>\n * </Modal>\n * \n * @param {ModalProps} props - Modal 컴포넌트의 props / Modal component props\n * @param {React.Ref<HTMLDivElement>} ref - 모달 컨테이너 ref / Modal container ref\n * @returns {JSX.Element} Modal 컴포넌트 / Modal component\n */\nexport const Modal = React.forwardRef<HTMLDivElement, ModalProps>(\n ({\n className,\n isOpen,\n onClose,\n children,\n size = \"md\",\n closable,\n closeOnOverlayClick = true,\n title,\n description,\n showBackdrop = true,\n backdropClassName,\n centered = true\n }, ref) => {\n const _closable = closable ?? true\n const modalRef = React.useRef<HTMLDivElement>(null)\n const combinedRef = useCombinedRefs(ref, modalRef)\n\n // ESC 키로 모달 닫기 및 스크롤 잠금 (화면 흔들림 방지)\n React.useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onClose()\n }\n }\n\n if (isOpen) {\n document.addEventListener(\"keydown\", handleEscape)\n // 스크롤바 너비 계산하여 padding 추가 (화면 흔들림 방지)\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n document.body.style.overflow = \"hidden\"\n document.body.style.paddingRight = `${scrollbarWidth}px`\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape)\n document.body.style.overflow = \"unset\"\n document.body.style.paddingRight = \"unset\"\n }\n }, [isOpen, onClose])\n\n // 모달 외부 클릭으로 닫기\n const handleOverlayClick = (e: React.MouseEvent) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onClose()\n }\n }\n\n // 모달 크기 클래스 (max-w 기반, 콘텐츠에 맞게 자연스럽게 축소)\n const sizeClasses = {\n sm: \"max-w-xs\", // 320px\n md: \"max-w-sm\", // 384px\n lg: \"max-w-md\", // 448px\n xl: \"max-w-lg\", // 512px\n \"2xl\": \"max-w-xl\", // 576px\n \"3xl\": \"max-w-2xl\" // 672px\n }\n\n // 접근성을 위한 ID 생성\n const generatedTitleId = React.useId()\n const generatedDescId = React.useId()\n const titleId = title ? `modal-title-${generatedTitleId}` : undefined;\n const descriptionId = description ? `modal-description-${generatedDescId}` : undefined;\n\n // SSR에서는 document가 없으므로 체크\n const [mounted, setMounted] = React.useState(false)\n React.useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!isOpen) return null\n\n const modalContent = (\n <div\n className={merge(\n \"fixed inset-0 z-50 overflow-y-auto\",\n className\n )}\n onClick={handleOverlayClick}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n >\n {/* 배경 오버레이 - pointer-events-none으로 클릭이 뒤로 전달됨 */}\n {showBackdrop && (\n <div\n className={merge(\n \"fixed inset-0 bg-black/85 backdrop-blur-md transition-opacity duration-300 pointer-events-none\",\n backdropClassName\n )}\n />\n )}\n\n {/* 센터링 컨테이너 */}\n <div className={merge(\n \"flex h-full justify-center p-4\",\n centered ? \"items-center\" : \"items-start pt-16\"\n )}>\n {/* 모달 컨테이너 */}\n {/* CSS 변수 기반 배경색 (Tailwind v4 dark: + bg-* 충돌 우회) */}\n <div\n ref={combinedRef}\n className={merge(\n \"relative bg-[var(--modal-bg)] rounded-lg shadow-2xl border border-[var(--modal-border)] transform transition-all duration-300 ease-out\",\n sizeClasses[size]\n )}\n style={{\n animation: \"modalSlideIn 0.3s cubic-bezier(0.16, 1, 0.3, 1)\"\n }}\n >\n \n {/* 헤더 */}\n {title && (\n <div className=\"relative z-10 px-6 pt-6 pb-4 border-b border-border/50\">\n {/* 타이틀과 닫기 버튼 - 같은 줄, 양쪽 끝 */}\n <div className=\"flex items-center justify-between gap-4 mb-2\">\n <h2 id={titleId} className=\"text-xl font-semibold text-foreground flex-1 min-w-0\">{title}</h2>\n {/* 닫기 버튼 - 타이틀과 같은 계층의 오른쪽 끝 */}\n {_closable && (\n <ModalCloseButton onClick={onClose} className=\"flex-shrink-0\" />\n )}\n </div>\n {/* 설명 - 아래 줄 */}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n )}\n\n {/* 타이틀이 없을 때만 별도 닫기 버튼 */}\n {!title && _closable && (\n <ModalCloseButton onClick={onClose} className=\"absolute top-4 right-4\" />\n )}\n \n {/* 모달 내용 */}\n <div className={`relative z-10 ${title ? 'px-6 mb-6' : 'p-6'}`}>\n {children}\n </div>\n </div>\n </div>\n </div>\n )\n\n // 브라우저에서만 createPortal 사용 (SSR 호환)\n if (mounted && typeof document !== 'undefined') {\n return createPortal(modalContent, document.body)\n }\n\n // SSR fallback - 그냥 렌더링 (첫 렌더링에는 보이지 않음)\n return null\n})\n\nModal.displayName = \"Modal\" "]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {l as l$1}from'./chunk-ZQUMJQYV.mjs';import {a}from'./chunk-QEMPERUK.mjs';import l from'react';import {jsxs,jsx}from'react/jsx-runtime';var w=l.forwardRef(({className:i,children:a$1,items:n,maxItems:s,showHomeIcon:c,homeLabel:f="Home",separator:p=jsx(l$1,{name:"chevronRight",className:"w-3 h-3 text-muted-foreground flex-shrink-0"}),variant:g="default",...h},N)=>{let I={default:"inline-flex items-center text-sm w-fit",subtle:"inline-flex items-center text-xs bg-background/40 backdrop-blur-md rounded-md px-3 py-2 border border-border/30 w-fit shadow-sm",transparent:"inline-flex items-center text-xs w-fit",glass:"inline-flex items-center text-xs bg-background/30 backdrop-blur-lg rounded-lg px-4 py-2 border border-border/25 w-fit shadow-lg"},o=(()=>{if(n){let r=[...n];if(s&&r.length>s){let e=r[0],d=r.slice(-(s-1));r=[e,{label:"...",href:void 0},...d];}return r.map((e,d)=>{let B=d===r.length-1&&!e.href;return jsxs(x,{href:e.href,isCurrent:B,children:[e.icon&&jsx(l$1,{name:e.icon,className:"w-4 h-4 mr-1"}),e.label]},d)})}return a$1?l.Children.map(a$1,(r,e)=>l.isValidElement(r)?jsxs("li",{className:"flex items-center",children:[r,e<l.Children.count(a$1)-1&&jsx("span",{className:"mx-3 text-muted-foreground flex items-center justify-center","aria-hidden":"true",children:p})]},e):r):null})(),y=n?n.length:a$1?l.Children.count(a$1):0;return jsx("nav",{ref:N,"aria-label":"Breadcrumb",className:a(I[g],i),...h,children:jsxs("ol",{className:"inline-flex items-center",children:[c&&jsxs("li",{className:"flex items-center",children:[jsxs(x,{href:"/",children:[jsx(l$1,{name:"home",className:"w-4 h-4 mr-1"}),f]}),y>0&&jsx("span",{className:"mx-3 text-muted-foreground flex items-center justify-center","aria-hidden":"true",children:p})]}),n?o==null?void 0:o.map((r,e)=>jsxs("li",{className:"flex items-center",children:[r,e<((o==null?void 0:o.length)||0)-1&&jsx("span",{className:"mx-3 text-muted-foreground flex items-center justify-center","aria-hidden":"true",children:p})]},e)):o]})})});w.displayName="Breadcrumb";var x=l.forwardRef(({className:i,href:a$1,isCurrent:n=false,children:s,...c},f)=>n?jsx("span",{ref:f,"aria-current":"page",className:a("text-muted-foreground font-medium",i),...c,children:s}):a$1?jsx("a",{href:a$1,className:a("text-muted-foreground hover:text-foreground transition-colors",i),...c,children:s}):jsx("span",{ref:f,className:a("text-muted-foreground",i),...c,children:s}));x.displayName="BreadcrumbItem";export{w as a,x as b};//# sourceMappingURL=chunk-HEBXAFRY.mjs.map
3
- //# sourceMappingURL=chunk-HEBXAFRY.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Breadcrumb.tsx"],"names":["Breadcrumb","React","className","children","items","maxItems","showHomeIcon","homeLabel","separator","jsx","Icon","variant","props","ref","variantStyles","renderedItems","displayItems","firstItem","lastItems","item","index","isCurrent","jsxs","BreadcrumbItem","child","itemsCount","merge","href"],"mappings":"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","file":"chunk-HEBXAFRY.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { IconName } from \"../lib/icons\"\n\n/**\n * Breadcrumb 항목 타입 / Breadcrumb item type\n */\nexport interface BreadcrumbItemData {\n label: string\n href?: string\n icon?: IconName\n}\n\n/**\n * Breadcrumb 컴포넌트의 props / Breadcrumb component props\n * @typedef {Object} BreadcrumbProps\n * @property {React.ReactNode} [children] - BreadcrumbItem 컴포넌트들 / BreadcrumbItem components\n * @property {BreadcrumbItemData[]} [items] - Breadcrumb 항목 배열 (children 대신 사용 가능) / Breadcrumb items array (alternative to children)\n * @property {number} [maxItems] - 최대 표시할 항목 수 (긴 경로 처리) / Maximum number of items to display (for long paths)\n * @property {boolean} [showHomeIcon] - 홈 아이콘 표시 여부 / Show home icon\n * @property {string} [homeLabel] - 홈 라벨 (기본: \"Home\") / Home label (default: \"Home\")\n * @property {React.ReactNode} [separator] - 항목 사이 구분자 (기본: chevronRight 아이콘) / Separator between items (default: chevronRight icon)\n * @property {'default' | 'subtle' | 'transparent' | 'glass'} [variant='default'] - Breadcrumb 스타일 변형 / Breadcrumb style variant\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode\n items?: BreadcrumbItemData[]\n maxItems?: number\n showHomeIcon?: boolean\n homeLabel?: string\n separator?: React.ReactNode\n variant?: 'default' | 'subtle' | 'transparent' | 'glass'\n}\n\n/**\n * BreadcrumbItem 컴포넌트의 props / BreadcrumbItem component props\n * @typedef {Object} BreadcrumbItemProps\n * @property {string} [href] - 링크 URL (없으면 일반 텍스트) / Link URL (plain text if not provided)\n * @property {boolean} [isCurrent=false] - 현재 페이지 여부 / Current page indicator\n * @property {React.ReactNode} children - 항목 텍스트 / Item text\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface BreadcrumbItemProps {\n href?: string\n isCurrent?: boolean\n children: React.ReactNode\n className?: string\n}\n\n/**\n * Breadcrumb 컴포넌트 / Breadcrumb component\n * \n * 네비게이션 경로를 표시하는 breadcrumb 컴포넌트입니다.\n * 현재 위치와 경로를 시각적으로 표현합니다.\n * \n * Breadcrumb component for displaying navigation paths.\n * Visually represents current location and path.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Breadcrumb>\n * <BreadcrumbItem href=\"/\">홈</BreadcrumbItem>\n * <BreadcrumbItem href=\"/products\">상품</BreadcrumbItem>\n * <BreadcrumbItem isCurrent>상세</BreadcrumbItem>\n * </Breadcrumb>\n * \n * @example\n * // 커스텀 구분자 / Custom separator\n * <Breadcrumb separator={<span>/</span>}>\n * <BreadcrumbItem href=\"/\">홈</BreadcrumbItem>\n * <BreadcrumbItem isCurrent>현재</BreadcrumbItem>\n * </Breadcrumb>\n * \n * @param {BreadcrumbProps} props - Breadcrumb 컴포넌트의 props / Breadcrumb component props\n * @param {React.Ref<HTMLDivElement>} ref - nav 요소 ref / nav element ref\n * @returns {JSX.Element} Breadcrumb 컴포넌트 / Breadcrumb component\n */\nconst Breadcrumb = React.forwardRef<HTMLDivElement, BreadcrumbProps>(\n ({ \n className, \n children, \n items,\n maxItems,\n showHomeIcon,\n homeLabel = \"Home\",\n separator = <Icon name=\"chevronRight\" className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />, \n variant = 'default', \n ...props \n }, ref) => {\n const variantStyles = {\n default: \"inline-flex items-center text-sm w-fit\",\n subtle: \"inline-flex items-center text-xs bg-background/40 backdrop-blur-md rounded-md px-3 py-2 border border-border/30 w-fit shadow-sm\",\n transparent: \"inline-flex items-center text-xs w-fit\",\n glass: \"inline-flex items-center text-xs bg-background/30 backdrop-blur-lg rounded-lg px-4 py-2 border border-border/25 w-fit shadow-lg\"\n }\n \n // items prop이 있으면 BreadcrumbItem으로 변환\n const renderItems = () => {\n if (items) {\n let displayItems = [...items]\n \n // maxItems 처리\n if (maxItems && displayItems.length > maxItems) {\n const firstItem = displayItems[0]\n const lastItems = displayItems.slice(-(maxItems - 1))\n displayItems = [firstItem, { label: '...', href: undefined }, ...lastItems]\n }\n \n // 마지막 항목은 isCurrent로 표시\n return displayItems.map((item, index) => {\n const isLast = index === displayItems.length - 1\n const isCurrent = isLast && !item.href\n \n return (\n <BreadcrumbItem\n key={index}\n href={item.href}\n isCurrent={isCurrent}\n >\n {item.icon && (\n <Icon name={item.icon} className=\"w-4 h-4 mr-1\" />\n )}\n {item.label}\n </BreadcrumbItem>\n )\n })\n }\n \n // children이 있으면 그대로 사용\n if (children) {\n return React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n return (\n <li key={index} className=\"flex items-center\">\n {child}\n {index < React.Children.count(children) - 1 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n )\n }\n return child\n })\n }\n \n return null\n }\n \n const renderedItems = renderItems()\n const itemsCount = items ? items.length : (children ? React.Children.count(children) : 0)\n \n return (\n <nav\n ref={ref}\n aria-label=\"Breadcrumb\"\n className={merge(variantStyles[variant], className)}\n {...props}\n >\n <ol className=\"inline-flex items-center\">\n {showHomeIcon && (\n <li className=\"flex items-center\">\n <BreadcrumbItem href=\"/\">\n <Icon name=\"home\" className=\"w-4 h-4 mr-1\" />\n {homeLabel}\n </BreadcrumbItem>\n {itemsCount > 0 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n )}\n {items ? (\n renderedItems?.map((item, index) => (\n <li key={index} className=\"flex items-center\">\n {item}\n {index < (renderedItems?.length || 0) - 1 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n ))\n ) : (\n renderedItems\n )}\n </ol>\n </nav>\n )\n }\n)\nBreadcrumb.displayName = \"Breadcrumb\"\n\n/**\n * BreadcrumbItem 컴포넌트\n * Breadcrumb의 개별 항목을 표시합니다.\n * \n * @component\n * @param {BreadcrumbItemProps} props - BreadcrumbItem 컴포넌트의 props\n * @param {React.Ref<HTMLLIElement>} ref - li 요소 ref\n * @returns {JSX.Element} BreadcrumbItem 컴포넌트\n */\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, BreadcrumbItemProps>(\n ({ className, href, isCurrent = false, children, ...props }, ref) => {\n if (isCurrent) {\n return (\n <span\n ref={ref}\n aria-current=\"page\"\n className={merge(\n \"text-muted-foreground font-medium\",\n className\n )}\n {...props}\n >\n {children}\n </span>\n )\n }\n\n if (href) {\n return (\n <a\n href={href}\n className={merge(\n \"text-muted-foreground hover:text-foreground transition-colors\",\n className\n )}\n {...props}\n >\n {children}\n </a>\n )\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n \"text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </span>\n )\n }\n)\nBreadcrumbItem.displayName = \"BreadcrumbItem\"\n\nexport { Breadcrumb, BreadcrumbItem } "]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {a}from'./chunk-QEMPERUK.mjs';import t from'react';import {cva}from'class-variance-authority';import {jsxs,jsx}from'react/jsx-runtime';var k=cva("h-full rounded-full transition-all duration-300 ease-out",{variants:{variant:{default:"bg-foreground",success:"bg-[var(--progress-success)]",warning:"bg-[var(--progress-warning)]",error:"bg-[var(--progress-error)]",info:"bg-[var(--progress-info)]",glass:"bg-white/50 backdrop-blur-sm"}},defaultVariants:{variant:"default"}}),h=cva("relative w-full overflow-hidden rounded-full",{variants:{variant:{default:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",success:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",warning:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",error:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",info:"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]",glass:"bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/10 dark:border-slate-700/50"},size:{sm:"h-2",md:"h-3",lg:"h-4"}},defaultVariants:{variant:"default",size:"md"}}),o=t.forwardRef(({className:r,value:e=0,max:s=100,size:n="md",variant:b="default",showValue:l=false,animated:m=true,striped:P=false,label:d,description:p,autoVariant:w=false,...x},N)=>{let c=Math.min(Math.max(e/s*100,0),100),f=(()=>{if(!w)return b;let v=e/s;return v>.5?"success":v>.25?"warning":"error"})();return jsxs("div",{className:a("w-full",r),...x,children:[(d||l)&&jsxs("div",{className:"flex items-center justify-between mb-2",children:[d&&jsx("span",{className:"text-sm font-medium text-foreground",children:d}),l&&jsxs("span",{className:"text-sm text-muted-foreground",children:[Math.round(c),"%"]})]}),jsx("div",{ref:N,className:h({variant:f,size:n}),children:jsx("div",{className:a(k({variant:f}),P&&"bg-gradient-to-r from-transparent via-white/20 to-transparent bg-[length:20px_100%] animate-pulse",m&&"animate-pulse"),style:{width:`${c}%`,transition:m?"width 0.3s ease-out":"none"}})}),p&&jsx("p",{className:"mt-2 text-xs text-muted-foreground",children:p})]})});o.displayName="Progress";var M=t.forwardRef(({className:r,...e},s)=>jsx(o,{ref:s,variant:"success",className:r,...e}));M.displayName="ProgressSuccess";var T=t.forwardRef(({className:r,...e},s)=>jsx(o,{ref:s,variant:"warning",className:r,...e}));T.displayName="ProgressWarning";var E=t.forwardRef(({className:r,...e},s)=>jsx(o,{ref:s,variant:"error",className:r,...e}));E.displayName="ProgressError";var H=t.forwardRef(({className:r,...e},s)=>jsx(o,{ref:s,variant:"info",className:r,...e}));H.displayName="ProgressInfo";var L=t.forwardRef(({title:r,className:e,...s},n)=>jsxs("div",{className:a("p-4 bg-card rounded-lg border border-border",e),children:[r&&jsx("h3",{className:"text-sm font-semibold text-foreground mb-3",children:r}),jsx(o,{ref:n,...s})]}));L.displayName="ProgressWrapper";var y=t.forwardRef(({className:r,children:e,...s},n)=>jsx("div",{ref:n,className:a("space-y-4",r),...s,children:e}));y.displayName="ProgressGroup";export{o as a,M as b,T as c,E as d,H as e,y as f};//# sourceMappingURL=chunk-IG47LMOD.mjs.map
3
- //# sourceMappingURL=chunk-IG47LMOD.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Progress.tsx"],"names":["progressBarVariants","cva","progressTrackVariants","Progress","React","className","value","max","size","variant","showValue","animated","striped","label","description","autoVariant","props","ref","percentage","resolvedVariant","ratio","jsxs","merge","jsx","ProgressSuccess","ProgressWarning","ProgressError","ProgressInfo","ProgressWrapper","title","ProgressGroup","children"],"mappings":"kJAMaA,CAAAA,CAAsBC,GAAAA,CACjC,0DAAA,CACA,CACE,QAAA,CAAU,CACR,QAAS,CACP,OAAA,CAAS,eAAA,CACT,OAAA,CAAS,8BAAA,CACT,OAAA,CAAS,+BACT,KAAA,CAAO,4BAAA,CACP,KAAM,2BAAA,CACN,KAAA,CAAO,8BACT,CACF,CAAA,CACA,eAAA,CAAiB,CACf,OAAA,CAAS,SACX,CACF,CACF,CAAA,CAEaC,CAAAA,CAAwBD,GAAAA,CACnC,8CAAA,CACA,CACE,SAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,4DAAA,CACT,OAAA,CAAS,6DACT,OAAA,CAAS,4DAAA,CACT,MAAO,4DAAA,CACP,IAAA,CAAM,6DACN,KAAA,CAAO,mGACT,CAAA,CACA,IAAA,CAAM,CACJ,EAAA,CAAI,MACJ,EAAA,CAAI,KAAA,CACJ,EAAA,CAAI,KACN,CACF,CAAA,CACA,gBAAiB,CACf,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,IACR,CACF,CACF,CAAA,CA4BME,CAAAA,CAAWC,CAAAA,CAAM,UAAA,CACrB,CAAC,CACC,UAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CAAQ,CAAA,CACR,GAAA,CAAAC,CAAAA,CAAM,IACN,IAAA,CAAAC,CAAAA,CAAO,IAAA,CACP,OAAA,CAAAC,CAAAA,CAAU,SAAA,CACV,UAAAC,CAAAA,CAAY,KAAA,CACZ,QAAA,CAAAC,CAAAA,CAAW,IAAA,CACX,OAAA,CAAAC,EAAU,KAAA,CACV,KAAA,CAAAC,EACA,WAAA,CAAAC,CAAAA,CACA,YAAAC,CAAAA,CAAc,KAAA,CACd,GAAGC,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAMC,CAAAA,CAAa,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAKZ,EAAQC,CAAAA,CAAO,GAAA,CAAK,CAAC,CAAA,CAAG,GAAG,CAAA,CAE3DY,GAAmB,IAAM,CAC7B,GAAI,CAACJ,CAAAA,CAAa,OAAON,EACzB,IAAMW,CAAAA,CAAQd,CAAAA,CAAQC,CAAAA,CACtB,OAAIa,CAAAA,CAAQ,GAAY,SAAA,CACpBA,CAAAA,CAAQ,GAAA,CAAa,SAAA,CAClB,OACT,CAAA,IAEA,OACEC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,CAAAA,CAAM,QAAA,CAAUjB,CAAS,CAAA,CAAI,GAAGW,EAC5C,QAAA,CAAA,CAAA,CAAAH,CAAAA,EAASH,IACTW,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wCAAA,CACZ,QAAA,CAAA,CAAAR,CAAAA,EACCU,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qCAAA,CACb,QAAA,CAAAV,CAAAA,CACH,CAAA,CAEDH,GACCW,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAA,CAAA,IAAA,CAAK,KAAA,CAAMH,CAAU,CAAA,CAAE,GAAA,CAAA,CAC1B,CAAA,CAAA,CAEJ,CAAA,CAGFK,GAAAA,CAAC,KAAA,CAAA,CACC,IAAKN,CAAAA,CACL,SAAA,CAAWf,CAAAA,CAAsB,CAAE,OAAA,CAASiB,CAAAA,CAAiB,KAAAX,CAAK,CAAC,CAAA,CAEnE,QAAA,CAAAe,GAAAA,CAAC,KAAA,CAAA,CACC,UAAWD,CAAAA,CACTtB,CAAAA,CAAoB,CAAE,OAAA,CAASmB,CAAgB,CAAC,EAChDP,CAAAA,EAAW,mGAAA,CACXD,GAAY,eACd,CAAA,CACA,MAAO,CACL,KAAA,CAAO,CAAA,EAAGO,CAAU,CAAA,CAAA,CAAA,CACpB,UAAA,CAAYP,EAAW,qBAAA,CAAwB,MACjD,CAAA,CACF,CAAA,CACF,CAAA,CAECG,CAAAA,EACCS,IAAC,GAAA,CAAA,CAAE,SAAA,CAAU,oCAAA,CACV,QAAA,CAAAT,CAAAA,CACH,CAAA,CAAA,CAEJ,CAEJ,CACF,EACAX,CAAAA,CAAS,WAAA,CAAc,UAAA,CAGhB,IAAMqB,EAAkBpB,CAAAA,CAAM,UAAA,CACnC,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,GAAGW,CAAM,CAAA,CAAGC,CAAAA,GACxBM,GAAAA,CAACpB,CAAAA,CAAA,CAAS,IAAKc,CAAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,SAAA,CAAWZ,CAAAA,CAAY,GAAGW,EAAO,CAE3E,EACAQ,EAAgB,WAAA,CAAc,iBAAA,KAEjBC,CAAAA,CAAkBrB,CAAAA,CAAM,UAAA,CACnC,CAAC,CAAE,SAAA,CAAAC,EAAW,GAAGW,CAAM,CAAA,CAAGC,CAAAA,GACxBM,GAAAA,CAACpB,CAAAA,CAAA,CAAS,GAAA,CAAKc,CAAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,SAAA,CAAWZ,CAAAA,CAAY,GAAGW,CAAAA,CAAO,CAE3E,EACAS,CAAAA,CAAgB,WAAA,CAAc,iBAAA,KAEjBC,CAAAA,CAAgBtB,CAAAA,CAAM,UAAA,CACjC,CAAC,CAAE,SAAA,CAAAC,EAAW,GAAGW,CAAM,CAAA,CAAGC,CAAAA,GACxBM,GAAAA,CAACpB,CAAAA,CAAA,CAAS,GAAA,CAAKc,CAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,SAAA,CAAWZ,CAAAA,CAAY,GAAGW,CAAAA,CAAO,CAEzE,EACAU,CAAAA,CAAc,WAAA,CAAc,gBAErB,IAAMC,CAAAA,CAAevB,CAAAA,CAAM,UAAA,CAChC,CAAC,CAAE,UAAAC,CAAAA,CAAW,GAAGW,CAAM,CAAA,CAAGC,CAAAA,GACxBM,GAAAA,CAACpB,EAAA,CAAS,GAAA,CAAKc,CAAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAWZ,EAAY,GAAGW,CAAAA,CAAO,CAExE,EACAW,CAAAA,CAAa,WAAA,CAAc,eAGpB,IAAMC,CAAAA,CAAkBxB,CAAAA,CAAM,UAAA,CACnC,CAAC,CAAE,MAAAyB,CAAAA,CAAO,SAAA,CAAAxB,CAAAA,CAAW,GAAGW,CAAM,CAAA,CAAGC,IAC/BI,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,CAAAA,CAAM,6CAAA,CAA+CjB,CAAS,EAC3E,QAAA,CAAA,CAAAwB,CAAAA,EACCN,IAAC,IAAA,CAAA,CAAG,SAAA,CAAU,6CACX,QAAA,CAAAM,CAAAA,CACH,CAAA,CAEFN,GAAAA,CAACpB,CAAAA,CAAA,CAAS,IAAKc,CAAAA,CAAM,GAAGD,CAAAA,CAAO,CAAA,CAAA,CACjC,CAEJ,CAAA,CACAY,EAAgB,WAAA,CAAc,iBAAA,CAEvB,IAAME,CAAAA,CAAgB1B,CAAAA,CAAM,UAAA,CACjC,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,QAAA,CAAA0B,CAAAA,CAAU,GAAGf,CAAM,CAAA,CAAGC,CAAAA,GAClCM,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKN,CAAAA,CACL,UAAWK,CAAAA,CAAM,WAAA,CAAajB,CAAS,CAAA,CACtC,GAAGW,CAAAA,CAEH,SAAAe,CAAAA,CACH,CAEJ,EACAD,CAAAA,CAAc,WAAA,CAAc,eAAA","file":"chunk-IG47LMOD.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const progressBarVariants = cva(\n \"h-full rounded-full transition-all duration-300 ease-out\",\n {\n variants: {\n variant: {\n default: \"bg-foreground\",\n success: \"bg-[var(--progress-success)]\",\n warning: \"bg-[var(--progress-warning)]\",\n error: \"bg-[var(--progress-error)]\",\n info: \"bg-[var(--progress-info)]\",\n glass: \"bg-white/50 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport const progressTrackVariants = cva(\n \"relative w-full overflow-hidden rounded-full\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n success: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n warning: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n error: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n info: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n glass: \"bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/10 dark:border-slate-700/50\",\n },\n size: {\n sm: \"h-2\",\n md: \"h-3\",\n lg: \"h-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n }\n)\n\n/**\n * Progress 컴포넌트의 props\n */\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: number\n max?: number\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\" | \"glass\"\n showValue?: boolean\n animated?: boolean\n striped?: boolean\n label?: string\n description?: string\n autoVariant?: boolean\n}\n\n/**\n * Progress 컴포넌트 / Progress component\n *\n * 진행률을 표시하는 프로그레스 바 컴포넌트입니다.\n *\n * @example\n * <Progress value={50} />\n * <Progress value={75} variant=\"success\" label=\"업로드\" showValue />\n * <Progress value={90} variant=\"warning\" striped animated />\n */\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n ({\n className,\n value = 0,\n max = 100,\n size = \"md\",\n variant = \"default\",\n showValue = false,\n animated = true,\n striped = false,\n label,\n description,\n autoVariant = false,\n ...props\n }, ref) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n const resolvedVariant = (() => {\n if (!autoVariant) return variant;\n const ratio = value / max;\n if (ratio > 0.5) return 'success';\n if (ratio > 0.25) return 'warning';\n return 'error';\n })();\n\n return (\n <div className={merge(\"w-full\", className)} {...props}>\n {(label || showValue) && (\n <div className=\"flex items-center justify-between mb-2\">\n {label && (\n <span className=\"text-sm font-medium text-foreground\">\n {label}\n </span>\n )}\n {showValue && (\n <span className=\"text-sm text-muted-foreground\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n\n <div\n ref={ref}\n className={progressTrackVariants({ variant: resolvedVariant, size })}\n >\n <div\n className={merge(\n progressBarVariants({ variant: resolvedVariant }),\n striped && \"bg-gradient-to-r from-transparent via-white/20 to-transparent bg-[length:20px_100%] animate-pulse\",\n animated && \"animate-pulse\"\n )}\n style={{\n width: `${percentage}%`,\n transition: animated ? \"width 0.3s ease-out\" : \"none\"\n }}\n />\n </div>\n\n {description && (\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )\n }\n)\nProgress.displayName = \"Progress\"\n\n// 편의 컴포넌트들\nexport const ProgressSuccess = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nProgressSuccess.displayName = \"ProgressSuccess\"\n\nexport const ProgressWarning = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nProgressWarning.displayName = \"ProgressWarning\"\n\nexport const ProgressError = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nProgressError.displayName = \"ProgressError\"\n\nexport const ProgressInfo = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nProgressInfo.displayName = \"ProgressInfo\"\n\n// 복합 Progress 컴포넌트들\nexport const ProgressWrapper = React.forwardRef<HTMLDivElement, ProgressProps & { title?: string }>(\n ({ title, className, ...props }, ref) => (\n <div className={merge(\"p-4 bg-card rounded-lg border border-border\", className)}>\n {title && (\n <h3 className=\"text-sm font-semibold text-foreground mb-3\">\n {title}\n </h3>\n )}\n <Progress ref={ref} {...props} />\n </div>\n )\n)\nProgressWrapper.displayName = \"ProgressWrapper\"\n\nexport const ProgressGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nProgressGroup.displayName = \"ProgressGroup\"\n\nexport { Progress }\n"]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {a}from'./chunk-QEMPERUK.mjs';import r from'react';import {cva}from'class-variance-authority';import {jsx}from'react/jsx-runtime';var d=cva("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2",{variants:{variant:{default:"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80",secondary:"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80",destructive:"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80",error:"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80",outline:"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]",glass:"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80"}},defaultVariants:{variant:"default"}}),b=r.memo(r.forwardRef(({className:t,variant:a$1="default",...o},i)=>jsx("div",{ref:i,className:a(d({variant:a$1}),t),...o})));b.displayName="Badge";export{b as a};//# sourceMappingURL=chunk-J47ZEXEL.mjs.map
3
- //# sourceMappingURL=chunk-J47ZEXEL.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Badge.tsx"],"names":["badgeVariants","cva","Badge","React","className","variant","props","ref","jsx","merge"],"mappings":"6IAMaA,CAAAA,CAAgBC,GAAAA,CAC3B,iOAAA,CACA,CACE,SAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,iFACT,SAAA,CAAW,oFAAA,CACX,WAAA,CAAa,iEAAA,CACb,MAAO,iEAAA,CACP,OAAA,CAAS,sIAAA,CACT,KAAA,CAAO,uIACT,CACF,CAAA,CACA,eAAA,CAAiB,CACf,QAAS,SACX,CACF,CACF,CAAA,CAmBMC,EAAQC,CAAAA,CAAM,IAAA,CAAKA,CAAAA,CAAM,UAAA,CAC7B,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,OAAA,CAAAC,IAAU,SAAA,CAAW,GAAGC,CAAM,CAAA,CAAGC,IAE3CC,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKD,CAAAA,CACL,UAAWE,CAAAA,CAAMT,CAAAA,CAAc,CAAE,OAAA,CAAAK,GAAQ,CAAC,CAAA,CAAGD,CAAS,CAAA,CACrD,GAAGE,CAAAA,CACN,CAGN,CAAC,EACDJ,EAAM,WAAA,CAAc,OAAA","file":"chunk-J47ZEXEL.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80\",\n secondary: \"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80\",\n destructive: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n error: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n outline: \"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]\",\n glass: \"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n *\n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n *\n * @example\n * <Badge>New</Badge>\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge }\n"]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {a}from'./chunk-QEMPERUK.mjs';import i,{useState}from'react';import {cva}from'class-variance-authority';import {jsx}from'react/jsx-runtime';var w=cva("relative flex shrink-0 overflow-hidden rounded-full",{variants:{size:{sm:"w-8 h-8 text-xs",md:"w-10 h-10 text-sm",lg:"w-12 h-12 text-base"},variant:{default:"",glass:"ring-1 ring-white/30 backdrop-blur-sm"}},defaultVariants:{size:"md",variant:"default"}}),h=i.forwardRef(({className:e,size:a$1="md",variant:t="default",src:n,alt:l,fallbackText:o,children:m,...v},d)=>{let[u,g]=useState(false),p=()=>o||m||(l?l.charAt(0).toUpperCase():"U"),A=n&&!u;return jsx("div",{ref:d,className:a(w({size:a$1,variant:t}),e),...v,children:A?jsx(f,{src:n,alt:l||"avatar",onError:()=>g(true)}):jsx(c,{children:p()})})});h.displayName="Avatar";var f=i.forwardRef(({className:e,...a$1},t)=>jsx("img",{ref:t,className:a("aspect-square h-full w-full object-cover object-center",e),...a$1}));f.displayName="AvatarImage";var c=i.forwardRef(({className:e,...a$1},t)=>jsx("div",{ref:t,className:a("flex h-full w-full items-center justify-center rounded-full bg-primary text-primary-foreground font-semibold",e),...a$1}));c.displayName="AvatarFallback";export{h as a,f as b,c};//# sourceMappingURL=chunk-K2FOFIST.mjs.map
3
- //# sourceMappingURL=chunk-K2FOFIST.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Avatar.tsx"],"names":["avatarVariants","cva","Avatar","React","className","size","variant","src","alt","fallbackText","children","props","ref","imgError","setImgError","useState","getFallbackContent","showImage","jsx","merge","AvatarImage","AvatarFallback"],"mappings":"mJAMO,IAAMA,CAAAA,CAAiBC,IAC5B,qDAAA,CACA,CACE,SAAU,CACR,IAAA,CAAM,CACJ,EAAA,CAAI,iBAAA,CACJ,EAAA,CAAI,oBACJ,EAAA,CAAI,qBACN,EACA,OAAA,CAAS,CACP,QAAS,EAAA,CACT,KAAA,CAAO,uCACT,CACF,CAAA,CACA,gBAAiB,CACf,IAAA,CAAM,KACN,OAAA,CAAS,SACX,CACF,CACF,CAAA,CA0BMC,CAAAA,CAASC,CAAAA,CAAM,UAAA,CACnB,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,KAAAC,GAAAA,CAAO,IAAA,CAAM,QAAAC,CAAAA,CAAU,SAAA,CAAW,IAAAC,CAAAA,CAAK,GAAA,CAAAC,EAAK,YAAA,CAAAC,CAAAA,CAAc,SAAAC,CAAAA,CAAU,GAAGC,CAAM,CAAA,CAAGC,CAAAA,GAAQ,CACpG,GAAM,CAACC,CAAAA,CAAUC,CAAW,CAAA,CAAIC,QAAAA,CAAS,KAAK,CAAA,CAExCC,CAAAA,CAAqB,IACrBP,CAAAA,EACAC,CAAAA,GACAF,EAAYA,CAAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,GACvB,GAAA,CAAA,CAGHS,CAAAA,CAAYV,GAAO,CAACM,CAAAA,CAE1B,OACEK,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKN,EACL,SAAA,CAAWO,CAAAA,CAAMnB,EAAe,CAAE,IAAA,CAAAK,IAAM,OAAA,CAAAC,CAAQ,CAAC,CAAA,CAAGF,CAAS,EAC5D,GAAGO,CAAAA,CAEH,SAAAM,CAAAA,CACCC,GAAAA,CAACE,EAAA,CACC,GAAA,CAAKb,CAAAA,CACL,GAAA,CAAKC,CAAAA,EAAO,QAAA,CACZ,QAAS,IAAMM,CAAAA,CAAY,IAAI,CAAA,CACjC,CAAA,CAEAI,IAACG,CAAAA,CAAA,CACE,SAAAL,CAAAA,EAAmB,CACtB,EAEJ,CAEJ,CACF,EACAd,CAAAA,CAAO,WAAA,CAAc,SAErB,IAAMkB,CAAAA,CAAcjB,CAAAA,CAAM,UAAA,CACxB,CAAC,CAAE,UAAAC,CAAAA,CAAW,GAAGO,GAAM,CAAA,CAAGC,CAAAA,GACxBM,IAAC,KAAA,CAAA,CACC,GAAA,CAAKN,EACL,SAAA,CAAWO,CAAAA,CAAM,yDAA0Df,CAAS,CAAA,CACnF,GAAGO,GAAAA,CACN,CAEJ,EACAS,CAAAA,CAAY,WAAA,CAAc,aAAA,CAE1B,IAAMC,CAAAA,CAAiBlB,CAAAA,CAAM,WAC3B,CAAC,CAAE,UAAAC,CAAAA,CAAW,GAAGO,GAAM,CAAA,CAAGC,CAAAA,GACxBM,IAAC,KAAA,CAAA,CACC,GAAA,CAAKN,EACL,SAAA,CAAWO,CAAAA,CACT,+GACAf,CACF,CAAA,CACC,GAAGO,GAAAA,CACN,CAEJ,EACAU,CAAAA,CAAe,WAAA,CAAc,gBAAA","file":"chunk-K2FOFIST.mjs","sourcesContent":["\"use client\"\n\nimport React, { useState } from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const avatarVariants = cva(\n \"relative flex shrink-0 overflow-hidden rounded-full\",\n {\n variants: {\n size: {\n sm: \"w-8 h-8 text-xs\",\n md: \"w-10 h-10 text-sm\",\n lg: \"w-12 h-12 text-base\",\n },\n variant: {\n default: \"\",\n glass: \"ring-1 ring-white/30 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\n/**\n * Avatar 컴포넌트의 props / Avatar component props\n */\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"glass\"\n src?: string\n alt?: string\n fallbackText?: string\n}\n\nexport interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {}\nexport interface AvatarFallbackProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Avatar 컴포넌트 / Avatar component\n *\n * 사용자 프로필 이미지를 표시하는 컴포넌트입니다.\n *\n * @example\n * <Avatar src=\"/user.jpg\" alt=\"사용자\" />\n * <Avatar alt=\"홍길동\">홍</Avatar>\n * <Avatar variant=\"glass\" size=\"lg\" src=\"/user.jpg\" alt=\"사용자\" />\n */\nconst Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({ className, size = \"md\", variant = \"default\", src, alt, fallbackText, children, ...props }, ref) => {\n const [imgError, setImgError] = useState(false)\n\n const getFallbackContent = () => {\n if (fallbackText) return fallbackText\n if (children) return children\n if (alt) return alt.charAt(0).toUpperCase()\n return \"U\"\n }\n\n const showImage = src && !imgError\n\n return (\n <div\n ref={ref}\n className={merge(avatarVariants({ size, variant }), className)}\n {...props}\n >\n {showImage ? (\n <AvatarImage\n src={src}\n alt={alt || \"avatar\"}\n onError={() => setImgError(true)}\n />\n ) : (\n <AvatarFallback>\n {getFallbackContent()}\n </AvatarFallback>\n )}\n </div>\n )\n }\n)\nAvatar.displayName = \"Avatar\"\n\nconst AvatarImage = React.forwardRef<HTMLImageElement, AvatarImageProps>(\n ({ className, ...props }, ref) => (\n <img\n ref={ref}\n className={merge(\"aspect-square h-full w-full object-cover object-center\", className)}\n {...props}\n />\n )\n)\nAvatarImage.displayName = \"AvatarImage\"\n\nconst AvatarFallback = React.forwardRef<HTMLDivElement, AvatarFallbackProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\n \"flex h-full w-full items-center justify-center rounded-full bg-primary text-primary-foreground font-semibold\",\n className\n )}\n {...props}\n />\n )\n)\nAvatarFallback.displayName = \"AvatarFallback\"\n\nexport { Avatar, AvatarImage, AvatarFallback } "]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {a as a$1}from'./chunk-F2M4YDDQ.mjs';import {l}from'./chunk-ZQUMJQYV.mjs';import {a}from'./chunk-QEMPERUK.mjs';import w from'react';import {cva}from'class-variance-authority';import {jsx,jsxs}from'react/jsx-runtime';var L=cva("flex w-full rounded-md border transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-offset-2 hover:border-accent-foreground hover:shadow-sm disabled:cursor-not-allowed disabled:opacity-50 placeholder:text-muted-foreground",{variants:{variant:{default:"border-input bg-background text-foreground focus:border-ring focus:ring-ring",outline:"border-2 border-input bg-transparent text-foreground focus:border-ring focus:ring-ring",filled:"border-transparent bg-secondary/50 text-foreground focus:bg-background focus:border-ring focus:ring-ring",ghost:"border-transparent bg-transparent text-foreground focus:bg-muted focus:border-border focus:ring-muted-foreground",glass:"border-white/30 bg-white/10 backdrop-blur-sm text-white placeholder:text-white/60 focus:border-ring/50 focus:ring-ring/20 focus:bg-white/20"},size:{sm:"px-3 py-2 text-sm min-h-[80px]",md:"px-4 py-3 text-base min-h-[100px]",lg:"px-4 py-3 text-lg min-h-[120px]"},resize:{none:"resize-none",vertical:"resize-y",horizontal:"resize-x",both:"resize"}},defaultVariants:{variant:"default",size:"md",resize:"vertical"}}),O=w.forwardRef(({className:l,variant:c="default",size:i="md",error:a$2=false,success:u=false,resize:r="vertical",...t},f)=>{let e=t["aria-invalid"],g=a$2||(e!==void 0?e:false);return jsx("textarea",{className:a(L({variant:c,size:i,resize:r}),a$2&&a$1.error,u&&a$1.success,l),ref:f,"aria-invalid":g||void 0,...t})});O.displayName="Textarea";var E=w.forwardRef(({className:l$1,variant:c="default",size:i="md",error:a$1=false,success:u=false,label:r,description:t,id:f,...e},g)=>{var h,v;let k=w.useId(),s=f||k,p=r?`${s}-label`:void 0,x=t?`${s}-description`:void 0,z={sm:"w-4 h-4",md:"w-5 h-5",lg:"w-6 h-6"},T={sm:12,md:14,lg:16},C={default:"border-input bg-background text-primary focus:ring-ring",outline:"border-2 border-input bg-transparent text-primary focus:ring-ring",filled:"border-transparent bg-muted text-primary focus:bg-background focus:ring-ring",glass:"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:ring-ring/50 focus:bg-white/20"},I=a$1?"border-destructive focus:ring-destructive":u?"border-green-500 focus:ring-green-500":"",N=e.checked!==void 0,d=(v=(h=e.checked)!=null?h:e.defaultChecked)!=null?v:false,R=N&&!e.onChange&&!e.readOnly;return jsxs("div",{className:"flex items-start space-x-3",children:[jsxs("div",{className:"relative",children:[jsx("input",{type:"checkbox",id:s,className:a("peer absolute inset-0 w-full h-full opacity-0 cursor-pointer z-10",l$1),ref:g,"aria-checked":d,"aria-invalid":a$1,"aria-label":r?void 0:e["aria-label"],"aria-labelledby":r?p:void 0,"aria-describedby":x,role:"checkbox",readOnly:R||e.readOnly,...e}),jsx("div",{className:a("flex items-center justify-center rounded border transition-all duration-200 cursor-pointer relative","peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-offset-2","peer-hover:border-accent-foreground peer-hover:shadow-sm","peer-disabled:cursor-not-allowed peer-disabled:opacity-50",z[i],C[c],I,d&&"bg-primary border-primary shadow-md shadow-primary/20",!d&&"bg-background"),children:jsx(l,{name:"check",size:T[i],className:a("text-white transition-all duration-200",d?"opacity-100 scale-100":"opacity-0 scale-0")})})]}),(r||t)&&jsxs("div",{className:"flex flex-col",children:[r&&jsx("label",{htmlFor:s,id:p,className:"text-sm font-medium text-foreground cursor-pointer",children:r}),t&&jsx("p",{id:x,className:"text-sm text-muted-foreground",children:t})]})]})});E.displayName="Checkbox";export{O as a,E as b};//# sourceMappingURL=chunk-LL6QPRD7.mjs.map
3
- //# sourceMappingURL=chunk-LL6QPRD7.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Textarea.tsx","../src/components/Checkbox.tsx"],"names":["textareaVariants","cva","Textarea","React","className","variant","size","error","success","resize","props","ref","ariaInvalid","isInvalid","jsx","merge","FORM_STATE","Checkbox","label","description","id","_a","_b","generatedId","checkboxId","labelId","descriptionId","sizeClasses","iconSizes","variantClasses","stateClasses","isControlled","isChecked","needsReadOnly","jsxs","Icon"],"mappings":"+NAOO,IAAMA,EAAmBC,GAAAA,CAC9B,gPAAA,CACA,CACE,QAAA,CAAU,CACR,QAAS,CACP,OAAA,CAAS,+EACT,OAAA,CAAS,wFAAA,CACT,OAAQ,0GAAA,CACR,KAAA,CAAO,mHACP,KAAA,CAAO,6IACT,EACA,IAAA,CAAM,CACJ,GAAI,gCAAA,CACJ,EAAA,CAAI,oCACJ,EAAA,CAAI,iCACN,EACA,MAAA,CAAQ,CACN,KAAM,aAAA,CACN,QAAA,CAAU,WACV,UAAA,CAAY,UAAA,CACZ,KAAM,QACR,CACF,EACA,eAAA,CAAiB,CACf,QAAS,SAAA,CACT,IAAA,CAAM,KACN,MAAA,CAAQ,UACV,CACF,CACF,CAAA,CAiDMC,EAAWC,CAAAA,CAAM,UAAA,CACrB,CAAC,CACC,SAAA,CAAAC,EACA,OAAA,CAAAC,CAAAA,CAAU,UACV,IAAA,CAAAC,CAAAA,CAAO,KACP,KAAA,CAAAC,GAAAA,CAAQ,MACR,OAAA,CAAAC,CAAAA,CAAU,MACV,MAAA,CAAAC,CAAAA,CAAS,WACT,GAAGC,CACL,EAAGC,CAAAA,GAAQ,CACT,IAAMC,CAAAA,CAAcF,CAAAA,CAAM,cAAoC,CAAA,CACxDG,CAAAA,CAAYN,MAAUK,CAAAA,GAAgB,MAAA,CAAYA,EAAc,KAAA,CAAA,CAEtE,OACEE,IAAC,UAAA,CAAA,CACC,SAAA,CAAWC,EACTf,CAAAA,CAAiB,CAAE,QAAAK,CAAAA,CAAS,IAAA,CAAAC,EAAM,MAAA,CAAAG,CAAO,CAAC,CAAA,CAC1CF,GAAAA,EAASS,IAAW,KAAA,CACpBR,CAAAA,EAAWQ,IAAW,OAAA,CACtBZ,CACF,EACA,GAAA,CAAKO,CAAAA,CACL,eAAcE,CAAAA,EAAa,MAAA,CAC1B,GAAGH,CAAAA,CACN,CAEJ,CACF,EACAR,CAAAA,CAAS,YAAc,UAAA,CCpDvB,IAAMe,EAAWd,CAAAA,CAAM,UAAA,CACrB,CAAC,CACC,SAAA,CAAAC,IACA,OAAA,CAAAC,CAAAA,CAAU,UACV,IAAA,CAAAC,CAAAA,CAAO,KACP,KAAA,CAAAC,GAAAA,CAAQ,MACR,OAAA,CAAAC,CAAAA,CAAU,MACV,KAAA,CAAAU,CAAAA,CACA,YAAAC,CAAAA,CACA,EAAA,CAAAC,EACA,GAAGV,CACL,EAAGC,CAAAA,GAAQ,CAxEb,IAAAU,CAAAA,CAAAC,CAAAA,CAyEI,IAAMC,CAAAA,CAAcpB,CAAAA,CAAM,OAAM,CAC1BqB,CAAAA,CAAaJ,GAAMG,CAAAA,CACnBE,CAAAA,CAAUP,EAAQ,CAAA,EAAGM,CAAU,SAAW,MAAA,CAC1CE,CAAAA,CAAgBP,EAAc,CAAA,EAAGK,CAAU,eAAiB,MAAA,CAC5DG,CAAAA,CAAc,CAClB,EAAA,CAAI,SAAA,CACJ,GAAI,SAAA,CACJ,EAAA,CAAI,SACN,CAAA,CAEMC,CAAAA,CAAY,CAChB,EAAA,CAAI,EAAA,CACJ,GAAI,EAAA,CACJ,EAAA,CAAI,EACN,CAAA,CAEMC,CAAAA,CAAiB,CACrB,OAAA,CAAS,yDAAA,CACT,QAAS,mEAAA,CACT,MAAA,CAAQ,+EACR,KAAA,CAAO,8FACT,EAEMC,CAAAA,CAAevB,GAAAA,CACjB,4CACAC,CAAAA,CACA,uCAAA,CACA,GAGEuB,CAAAA,CAAerB,CAAAA,CAAM,UAAY,MAAA,CACjCsB,CAAAA,CAAAA,CAAYV,GAAAD,CAAAA,CAAAX,CAAAA,CAAM,UAAN,IAAA,CAAAW,CAAAA,CAAiBX,EAAM,cAAA,GAAvB,IAAA,CAAAY,EAAyC,KAAA,CAErDW,CAAAA,CAAgBF,GAAgB,CAACrB,CAAAA,CAAM,UAAY,CAACA,CAAAA,CAAM,SAEhE,OACEwB,IAAAA,CAAC,OAAI,SAAA,CAAU,4BAAA,CACb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,UAAA,CACb,QAAA,CAAA,CAAApB,IAAC,OAAA,CAAA,CACC,IAAA,CAAK,WACL,EAAA,CAAIU,CAAAA,CACJ,UAAWT,CAAAA,CACT,mEAAA,CACAX,GACF,CAAA,CACA,GAAA,CAAKO,EACL,cAAA,CAAcqB,CAAAA,CACd,eAAczB,GAAAA,CACd,YAAA,CAAaW,EAA8B,MAAA,CAAtBR,CAAAA,CAAM,YAAY,CAAA,CACvC,iBAAA,CAAiBQ,EAAQO,CAAAA,CAAU,MAAA,CACnC,mBAAkBC,CAAAA,CAClB,IAAA,CAAK,WACL,QAAA,CAAUO,CAAAA,EAAiBvB,EAAM,QAAA,CAChC,GAAGA,EACN,CAAA,CACAI,GAAAA,CAAC,OACC,SAAA,CAAWC,CAAAA,CACT,sGACA,oEAAA,CACA,0DAAA,CACA,4DACAY,CAAAA,CAAYrB,CAAI,EAChBuB,CAAAA,CAAexB,CAAO,EACtByB,CAAAA,CACAE,CAAAA,EAAa,wDACb,CAACA,CAAAA,EAAa,eAChB,CAAA,CAGA,QAAA,CAAAlB,IAACqB,CAAAA,CAAA,CACC,KAAK,OAAA,CACL,IAAA,CAAMP,EAAUtB,CAAI,CAAA,CACpB,UAAWS,CAAAA,CACT,wCAAA,CACAiB,EAAY,uBAAA,CAA0B,mBACxC,EACF,CAAA,CACF,CAAA,CAAA,CACF,GACEd,CAAAA,EAASC,CAAAA,GACTe,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBACZ,QAAA,CAAA,CAAAhB,CAAAA,EACCJ,IAAC,OAAA,CAAA,CAAM,OAAA,CAASU,EAAY,EAAA,CAAIC,CAAAA,CAAS,UAAU,oDAAA,CAChD,QAAA,CAAAP,EACH,CAAA,CAEDC,CAAAA,EACCL,IAAC,GAAA,CAAA,CAAE,EAAA,CAAIY,EAAe,SAAA,CAAU,+BAAA,CAC7B,SAAAP,CAAAA,CACH,CAAA,CAAA,CAEJ,GAEJ,CAEJ,CACF,EACAF,CAAAA,CAAS,WAAA,CAAc,UAAA","file":"chunk-LL6QPRD7.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { FORM_STATE } from \"../lib/styles/cva-base\"\n\nexport const textareaVariants = cva(\n \"flex w-full rounded-md border transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-offset-2 hover:border-accent-foreground hover:shadow-sm disabled:cursor-not-allowed disabled:opacity-50 placeholder:text-muted-foreground\",\n {\n variants: {\n variant: {\n default: \"border-input bg-background text-foreground focus:border-ring focus:ring-ring\",\n outline: \"border-2 border-input bg-transparent text-foreground focus:border-ring focus:ring-ring\",\n filled: \"border-transparent bg-secondary/50 text-foreground focus:bg-background focus:border-ring focus:ring-ring\",\n ghost: \"border-transparent bg-transparent text-foreground focus:bg-muted focus:border-border focus:ring-muted-foreground\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white placeholder:text-white/60 focus:border-ring/50 focus:ring-ring/20 focus:bg-white/20\",\n },\n size: {\n sm: \"px-3 py-2 text-sm min-h-[80px]\",\n md: \"px-4 py-3 text-base min-h-[100px]\",\n lg: \"px-4 py-3 text-lg min-h-[120px]\",\n },\n resize: {\n none: \"resize-none\",\n vertical: \"resize-y\",\n horizontal: \"resize-x\",\n both: \"resize\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n resize: \"vertical\",\n },\n }\n)\n\n/**\n * Textarea 컴포넌트의 props / Textarea component props\n */\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n resize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\"\n}\n\n/**\n * Textarea 컴포넌트 / Textarea component\n * \n * 여러 줄 텍스트 입력을 위한 텍스트 영역 컴포넌트입니다.\n * 다양한 스타일 변형과 크기를 지원하며, 접근성 속성을 포함합니다.\n * \n * Text area component for multi-line text input.\n * Supports various style variants and sizes, includes accessibility attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Textarea placeholder=\"내용을 입력하세요\" />\n * \n * @example\n * // 에러 상태 / Error state\n * <Textarea \n * error\n * placeholder=\"에러가 발생했습니다\"\n * aria-label=\"설명 입력\"\n * />\n * \n * @example\n * // 크기 조절 비활성화 / Disable resize\n * <Textarea \n * resize=\"none\"\n * rows={5}\n * placeholder=\"고정 크기 텍스트 영역\"\n * />\n * \n * @param {TextareaProps} props - Textarea 컴포넌트의 props / Textarea component props\n * @param {React.Ref<HTMLTextAreaElement>} ref - textarea 요소 ref / textarea element ref\n * @returns {JSX.Element} Textarea 컴포넌트 / Textarea component\n * \n * @todo 접근성 개선: aria-invalid 속성 자동 추가 필요 / Accessibility improvement: auto-add aria-invalid attribute\n */\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n resize = \"vertical\",\n ...props \n }, ref) => {\n const ariaInvalid = props['aria-invalid' as keyof typeof props] as boolean | undefined\n const isInvalid = error || (ariaInvalid !== undefined ? ariaInvalid : false)\n\n return (\n <textarea\n className={merge(\n textareaVariants({ variant, size, resize }),\n error && FORM_STATE.error,\n success && FORM_STATE.success,\n className\n )}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n {...props}\n />\n )\n }\n)\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Checkbox 컴포넌트의 props / Checkbox component props\n * @typedef {Object} CheckboxProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Checkbox 스타일 변형 / Checkbox style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Checkbox 크기 / Checkbox size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 체크박스 레이블 텍스트 / Checkbox label text\n * @property {string} [description] - 체크박스 설명 텍스트 / Checkbox description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Checkbox 컴포넌트 / Checkbox component\n * \n * 체크박스 입력 필드를 제공하는 컴포넌트입니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Checkbox input field component.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Checkbox label=\"이용약관에 동의합니다\" />\n * \n * @example\n * // 에러 상태와 설명 / Error state with description\n * <Checkbox \n * label=\"필수 항목\"\n * description=\"이 항목은 필수입니다\"\n * error\n * />\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [checked, setChecked] = useState(false)\n * <Checkbox \n * checked={checked}\n * onChange={(e) => setChecked(e.target.checked)}\n * label=\"동의\"\n * />\n * \n * @param {CheckboxProps} props - Checkbox 컴포넌트의 props / Checkbox component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Checkbox 컴포넌트 / Checkbox component\n */\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n ...props \n }, ref) => {\n const generatedId = React.useId()\n const checkboxId = id || generatedId\n const labelId = label ? `${checkboxId}-label` : undefined\n const descriptionId = description ? `${checkboxId}-description` : undefined\n const sizeClasses = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-6 h-6\"\n }\n\n const iconSizes = {\n sm: 12,\n md: 14,\n lg: 16\n }\n\n const variantClasses = {\n default: \"border-input bg-background text-primary focus:ring-ring\",\n outline: \"border-2 border-input bg-transparent text-primary focus:ring-ring\",\n filled: \"border-transparent bg-muted text-primary focus:bg-background focus:ring-ring\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:ring-ring/50 focus:bg-white/20\",\n }\n\n const stateClasses = error\n ? \"border-destructive focus:ring-destructive\"\n : success\n ? \"border-green-500 focus:ring-green-500\"\n : \"\"\n\n // Support both controlled and uncontrolled modes\n const isControlled = props.checked !== undefined;\n const isChecked = props.checked ?? props.defaultChecked ?? false;\n // Add readOnly if controlled without onChange to suppress React warning\n const needsReadOnly = isControlled && !props.onChange && !props.readOnly;\n\n return (\n <div className=\"flex items-start space-x-3\">\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id={checkboxId}\n className={merge(\n \"peer absolute inset-0 w-full h-full opacity-0 cursor-pointer z-10\",\n className\n )}\n ref={ref}\n aria-checked={isChecked}\n aria-invalid={error}\n aria-label={!label ? props['aria-label'] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"checkbox\"\n readOnly={needsReadOnly || props.readOnly}\n {...props}\n />\n <div\n className={merge(\n \"flex items-center justify-center rounded border transition-all duration-200 cursor-pointer relative\",\n \"peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-offset-2\",\n \"peer-hover:border-accent-foreground peer-hover:shadow-sm\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses,\n isChecked && \"bg-primary border-primary shadow-md shadow-primary/20\",\n !isChecked && \"bg-background\"\n )}\n >\n {/* 체크 아이콘으로 개선 */}\n <Icon \n name=\"check\" \n size={iconSizes[size]} \n className={merge(\n \"text-white transition-all duration-200\",\n isChecked ? \"opacity-100 scale-100\" : \"opacity-0 scale-0\"\n )}\n />\n </div>\n </div>\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <label htmlFor={checkboxId} id={labelId} className=\"text-sm font-medium text-foreground cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nCheckbox.displayName = \"Checkbox\"\n\nexport { Checkbox } "]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {a}from'./chunk-QEMPERUK.mjs';import o from'react';import {jsx}from'react/jsx-runtime';var b=o.forwardRef(({className:e,variant:t="default",size:a$1="md",...d},s)=>{let n=()=>{switch(t){case "bordered":return "border border-border divide-x divide-border";case "striped":return "divide-y divide-border";default:return ""}},c=()=>{switch(a$1){case "sm":return "text-sm";case "lg":return "text-base";default:return "text-sm"}};return jsx("div",{className:"w-full overflow-auto",children:jsx("table",{ref:s,className:a("w-full caption-bottom",n(),c(),e),...d})})});b.displayName="Table";var i=o.forwardRef(({className:e,...t},a$1)=>jsx("thead",{ref:a$1,className:a("[&_tr]:border-b",e),...t}));i.displayName="TableHeader";var T=o.forwardRef(({className:e,...t},a$1)=>jsx("tbody",{ref:a$1,className:a("[&_tr:last-child]:border-0",e),...t}));T.displayName="TableBody";var m=o.forwardRef(({className:e,...t},a$1)=>jsx("tfoot",{ref:a$1,className:a("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...t}));m.displayName="TableFooter";var f=o.forwardRef(({className:e,variant:t="default",...a$1},d)=>jsx("tr",{ref:d,className:a("border-b transition-colors data-[state=selected]:bg-muted/50",t==="hover"?"hover:bg-muted/50":"",e),...a$1}));f.displayName="TableRow";var p=o.forwardRef(({className:e,...t},a$1)=>jsx("th",{ref:a$1,className:a("h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",e),...t}));p.displayName="TableHead";var u=o.forwardRef(({className:e,...t},a$1)=>jsx("td",{ref:a$1,className:a("p-4 align-middle [&:has([role=checkbox])]:pr-0",e),...t}));u.displayName="TableCell";var R=o.forwardRef(({className:e,...t},a$1)=>jsx("caption",{ref:a$1,className:a("mt-4 text-sm text-muted-foreground",e),...t}));R.displayName="TableCaption";export{b as a,i as b,T as c,m as d,f as e,p as f,u as g,R as h};//# sourceMappingURL=chunk-NMJLOK6M.mjs.map
3
- //# sourceMappingURL=chunk-NMJLOK6M.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Table.tsx"],"names":["Table","React","className","variant","size","props","ref","getVariantClasses","getSizeClasses","jsx","merge","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption"],"mappings":"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","file":"chunk-NMJLOK6M.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Table 컴포넌트의 props / Table component props\n * @typedef {Object} TableProps\n * @property {React.ReactNode} children - TableHeader, TableBody, TableFooter 등 / TableHeader, TableBody, TableFooter, etc.\n * @property {\"default\" | \"bordered\" | \"striped\"} [variant=\"default\"] - Table 스타일 변형 / Table style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Table 크기 / Table size\n * @extends {React.HTMLAttributes<HTMLTableElement>}\n */\nexport interface TableProps extends React.HTMLAttributes<HTMLTableElement> {\n children: React.ReactNode\n variant?: \"default\" | \"bordered\" | \"striped\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * TableHeader 컴포넌트의 props / TableHeader component props\n * @typedef {Object} TableHeaderProps\n * @property {React.ReactNode} children - TableHead 컴포넌트들 / TableHead components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableBody 컴포넌트의 props / TableBody component props\n * @typedef {Object} TableBodyProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableFooter 컴포넌트의 props / TableFooter component props\n * @typedef {Object} TableFooterProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableRow 컴포넌트의 props / TableRow component props\n * @typedef {Object} TableRowProps\n * @property {React.ReactNode} children - TableHead 또는 TableCell 컴포넌트들 / TableHead or TableCell components\n * @property {\"default\" | \"hover\"} [variant=\"default\"] - Row 스타일 변형 / Row style variant\n * @extends {React.HTMLAttributes<HTMLTableRowElement>}\n */\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n children: React.ReactNode\n variant?: \"default\" | \"hover\"\n}\n\n/**\n * TableHead 컴포넌트의 props / TableHead component props\n * @typedef {Object} TableHeadProps\n * @property {React.ReactNode} children - 헤더 셀 내용 / Header cell content\n * @extends {React.ThHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * TableCell 컴포넌트의 props / TableCell component props\n * @typedef {Object} TableCellProps\n * @property {React.ReactNode} children - 셀 내용 / Cell content\n * @extends {React.TdHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * Table 컴포넌트 / Table component\n * \n * 데이터를 표 형태로 표시하는 테이블 컴포넌트입니다.\n * TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell과 함께 사용합니다.\n * \n * Table component that displays data in tabular format.\n * Used with TableHeader, TableBody, TableFooter, TableRow, TableHead, and TableCell.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>이름</TableHead>\n * <TableHead>나이</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>홍길동</TableCell>\n * <TableCell>30</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Bordered 스타일 / Bordered style\n * <Table variant=\"bordered\">\n * <TableHeader>\n * <TableRow>\n * <TableHead>항목</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>값</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Striped 스타일, 호버 효과 / Striped style with hover effect\n * <Table variant=\"striped\">\n * <TableBody>\n * <TableRow variant=\"hover\">\n * <TableCell>데이터</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @param {TableProps} props - Table 컴포넌트의 props / Table component props\n * @param {React.Ref<HTMLTableElement>} ref - table 요소 ref / table element ref\n * @returns {JSX.Element} Table 컴포넌트 / Table component\n */\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, variant = \"default\", size = \"md\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"bordered\":\n return \"border border-border divide-x divide-border\"\n case \"striped\":\n return \"divide-y divide-border\"\n default:\n return \"\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-sm\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <div className=\"w-full overflow-auto\">\n <table\n ref={ref}\n className={merge(\n \"w-full caption-bottom\",\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n />\n </div>\n )\n }\n)\nTable.displayName = \"Table\"\n\n/**\n * TableHeader 컴포넌트 / TableHeader component\n * 테이블의 헤더 영역을 표시합니다.\n * Displays the header area of a table.\n * \n * @component\n * @param {TableHeaderProps} props - TableHeader 컴포넌트의 props / TableHeader component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - thead 요소 ref / thead element ref\n * @returns {JSX.Element} TableHeader 컴포넌트 / TableHeader component\n */\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => (\n <thead ref={ref} className={merge(\"[&_tr]:border-b\", className)} {...props} />\n )\n)\nTableHeader.displayName = \"TableHeader\"\n\n/**\n * TableBody 컴포넌트 / TableBody component\n * 테이블의 본문 영역을 표시합니다.\n * Displays the body area of a table.\n * \n * @component\n * @param {TableBodyProps} props - TableBody 컴포넌트의 props / TableBody component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tbody 요소 ref / tbody element ref\n * @returns {JSX.Element} TableBody 컴포넌트 / TableBody component\n */\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={merge(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n)\nTableBody.displayName = \"TableBody\"\n\n/**\n * TableFooter 컴포넌트 / TableFooter component\n * 테이블의 푸터 영역을 표시합니다.\n * Displays the footer area of a table.\n * \n * @component\n * @param {TableFooterProps} props - TableFooter 컴포넌트의 props / TableFooter component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tfoot 요소 ref / tfoot element ref\n * @returns {JSX.Element} TableFooter 컴포넌트 / TableFooter component\n */\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={merge(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableFooter.displayName = \"TableFooter\"\n\n/**\n * TableRow 컴포넌트 / TableRow component\n * 테이블의 행을 표시합니다.\n * Displays a table row.\n * \n * @component\n * @param {TableRowProps} props - TableRow 컴포넌트의 props / TableRow component props\n * @param {React.Ref<HTMLTableRowElement>} ref - tr 요소 ref / tr element ref\n * @returns {JSX.Element} TableRow 컴포넌트 / TableRow component\n */\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"hover\":\n return \"hover:bg-muted/50\"\n default:\n return \"\"\n }\n }\n\n return (\n <tr\n ref={ref}\n className={merge(\n \"border-b transition-colors data-[state=selected]:bg-muted/50\",\n getVariantClasses(),\n className\n )}\n {...props}\n />\n )\n }\n)\nTableRow.displayName = \"TableRow\"\n\n/**\n * TableHead 컴포넌트 / TableHead component\n * 테이블의 헤더 셀을 표시합니다.\n * Displays a table header cell.\n * \n * @component\n * @param {TableHeadProps} props - TableHead 컴포넌트의 props / TableHead component props\n * @param {React.Ref<HTMLTableCellElement>} ref - th 요소 ref / th element ref\n * @returns {JSX.Element} TableHead 컴포넌트 / TableHead component\n */\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={merge(\n \"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableHead.displayName = \"TableHead\"\n\n/**\n * TableCell 컴포넌트 / TableCell component\n * 테이블의 데이터 셀을 표시합니다.\n * Displays a table data cell.\n * \n * @component\n * @param {TableCellProps} props - TableCell 컴포넌트의 props / TableCell component props\n * @param {React.Ref<HTMLTableCellElement>} ref - td 요소 ref / td element ref\n * @returns {JSX.Element} TableCell 컴포넌트 / TableCell component\n */\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={merge(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n)\nTableCell.displayName = \"TableCell\"\n\n/**\n * TableCaption 컴포넌트 / TableCaption component\n * 테이블의 캡션을 표시합니다.\n * Displays a table caption.\n * \n * @component\n * @param {React.HTMLAttributes<HTMLTableCaptionElement>} props - TableCaption 컴포넌트의 props / TableCaption component props\n * @param {React.Ref<HTMLTableCaptionElement>} ref - caption 요소 ref / caption element ref\n * @returns {JSX.Element} TableCaption 컴포넌트 / TableCaption component\n */\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={merge(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} "]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {a}from'./chunk-SD6XGDAC.mjs';import {a as a$1}from'./chunk-QEMPERUK.mjs';import m from'react';import {clsx}from'clsx';import {cva}from'class-variance-authority';import {jsxs,Fragment,jsx}from'react/jsx-runtime';function q(...t){return r=>{t.forEach(o=>{typeof o=="function"?o(r):o!=null&&(o.current=r);});}}function F(t,r){return o=>{t==null||t(o),o.defaultPrevented||r==null||r(o);}}function J(t,r){if(!(!t&&!r))return clsx(t,r)}function K(t,r){if(!(!t&&!r))return {...t,...r}}function Q(t,r){let o={...t};for(let e in r){let n=t[e],a=r[e];/^on[A-Z]/.test(e)?n&&a?o[e]=F(n,a):o[e]=a||n:e==="className"?o[e]=J(n,a):e==="style"?o[e]=K(n,a):o[e]=a!==void 0?a:n;}return o}function U(t){return m.isValidElement(t)}var R=m.forwardRef(({children:t,...r},o)=>{let e=m.Children.toArray(t);if(e.length!==1)return process.env.NODE_ENV!=="production"&&console.warn("[Slot] asChild\uB294 \uC815\uD655\uD788 \uD558\uB098\uC758 \uC790\uC2DD \uC694\uC18C\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4."),null;let n=e[0];if(!U(n))return process.env.NODE_ENV!=="production"&&console.warn("[Slot] \uC790\uC2DD\uC740 \uC720\uD6A8\uD55C React \uC694\uC18C\uC5EC\uC57C \uD569\uB2C8\uB2E4."),null;let a=n.props,p=n.ref,c=Q(r,a),g=q(o,p);return m.cloneElement(n,{...c,ref:g})});R.displayName="Slot";var T="[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]",B=cva("inline-flex items-center justify-center whitespace-nowrap font-medium transition-all duration-200 disabled:pointer-events-none disabled:opacity-50 min-w-fit focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--color-background)]",{variants:{variant:{default:"bg-[var(--color-primary)] text-[var(--color-primary-foreground)] hover:opacity-90",destructive:"bg-[var(--color-destructive)] text-[var(--color-destructive-foreground)] hover:opacity-90 focus-visible:ring-[var(--color-destructive)]",outline:"border-2 border-[var(--color-border)] bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0",secondary:"bg-[var(--color-secondary)] text-[var(--color-secondary-foreground)] hover:opacity-80",ghost:"bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0",link:"bg-transparent text-[var(--color-primary)] underline hover:opacity-80 focus-visible:ring-offset-0",gradient:"bg-gradient-to-r from-[var(--btn-gradient-from,theme(colors.teal.500))] to-[var(--btn-gradient-to,theme(colors.cyan.500))] text-white hover:shadow-lg",neon:"bg-slate-900 dark:bg-slate-950 text-teal-400 border border-teal-500/50 shadow-lg shadow-[var(--btn-neon-glow,theme(colors.teal.500/20%))] hover:shadow-[var(--btn-neon-glow,theme(colors.teal.500/40%))] hover:border-teal-400",glass:"bg-white/50 dark:bg-slate-900/50 backdrop-blur-md border border-slate-200/50 dark:border-slate-700/50 text-slate-900 dark:text-slate-100 hover:bg-white/70 dark:hover:bg-slate-900/70"},size:{sm:"h-8 px-4 py-2 text-sm",md:"h-10 px-6 py-2 text-base",lg:"h-12 px-8 py-3 text-lg",xl:"h-14 px-10 py-4 text-xl",icon:"h-10 w-10 p-0"},rounded:{sm:"rounded",md:"rounded-md",lg:"rounded-lg",full:"rounded-full"},shadow:{none:"",sm:"shadow-sm",md:"shadow-md",lg:"shadow-lg",xl:"shadow-xl"},hover:{springy:`hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${T} transform-gpu`,scale:"hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu",glow:"hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200",slide:`hover:-translate-y-0.5 hover:shadow-md ${T} transform-gpu`,none:""},fullWidth:{true:"w-full",false:""}},defaultVariants:{variant:"default",size:"md",rounded:"md",shadow:"md",hover:"springy",fullWidth:false}}),x={blue:"from-teal-500 to-cyan-500",purple:"from-purple-500 to-pink-500",green:"from-green-500 to-emerald-500 dark:from-green-400 dark:to-emerald-400",orange:"from-orange-500 to-red-500 dark:from-orange-300 dark:to-red-300",pink:"from-pink-500 to-rose-500"};var M=m.forwardRef(function({variant:r="default",size:o="md",loading:e=false,icon:n,iconPosition:a$2="left",gradient:p="blue",customGradient:c,rounded:g="md",shadow:L="md",hover:V="springy",fullWidth:v,iconOnly:H,className:O,children:k,disabled:d,asChild:_=false,...i},b){let z=a(),D=r==="gradient"?c?`bg-gradient-to-r ${c}`:`bg-gradient-to-r ${x[p]||x.blue}`:void 0,h=a$1(B({variant:r,size:o,rounded:g,shadow:L,hover:z?"none":V,fullWidth:v!=null?v:false}),D,O),P=jsxs(Fragment,{children:[e&&jsxs("span",{role:"status","aria-live":"polite",className:"-ml-1 mr-2 inline-flex",children:[jsxs("svg",{className:"animate-spin h-4 w-4",viewBox:"0 0 24 24",fill:"none",children:[jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}),jsx("span",{className:"sr-only",children:"\uB85C\uB529 \uC911"})]}),!e&&n&&a$2==="left"&&jsx("span",{className:"mr-2",children:n}),k,!e&&n&&a$2==="right"&&jsx("span",{className:"ml-2",children:n})]});if(H&&!("aria-label"in i)&&process.env.NODE_ENV!=="production"&&console.warn("[Button] iconOnly \uC0AC\uC6A9 \uC2DC aria-label\uC744 \uC81C\uACF5\uD558\uC138\uC694."),_){let l={className:h,ref:b,disabled:d||e,"aria-busy":e||void 0,"aria-disabled":d||e||void 0,...i};return jsx(R,{...l,children:k})}if("href"in i&&i.href){let{onClick:l,target:S,rel:u,href:G,"aria-label":te,className:j,...A}=i,y=!!d||e,W=w=>{if(y){w.preventDefault(),w.stopPropagation();return}l==null||l(w);};return jsx("a",{ref:b,href:G,className:a$1(h,j),onClick:W,"aria-busy":e||void 0,"aria-disabled":y||void 0,tabIndex:y?-1:A.tabIndex,target:S,rel:S==="_blank"?u!=null?u:"noopener noreferrer":u,...A,children:P})}let{className:I,...$}=i,E=!!d||e;return jsx("button",{ref:b,className:a$1(h,I),type:"button",disabled:E,"aria-busy":e||void 0,"aria-disabled":E||void 0,...$,children:P})});M.displayName="Button";var me=M;export{q as a,Q as b,R as c,me as d};//# sourceMappingURL=chunk-O24K56OS.mjs.map
3
- //# sourceMappingURL=chunk-O24K56OS.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/Slot.tsx","../src/components/Button.variants.ts","../src/components/Button.tsx"],"names":["composeRefs","refs","node","ref","composeEventHandlers","parentHandler","childHandler","event","mergeClassName","slotClassName","childClassName","clsx","mergeStyle","slotStyle","childStyle","mergeProps","slotProps","childProps","mergedProps","propName","slotValue","childValue","isSlottable","child","React","Slot","children","forwardedRef","childArray","childRef","mergedRef","springTransition","buttonVariants","cva","gradientPresets","ButtonInner","variant","size","loading","icon","iconPosition","gradient","customGradient","rounded","shadow","hover","fullWidth","iconOnly","className","disabled","asChild","rest","reduced","useReducedMotion","gradientClass","base","merge","content","jsxs","Fragment","jsx","onClick","target","rel","href","_ariaLabel","anchorClassName","anchorProps","isDisabled","handleAnchorClick","e","buttonClassName","btnProps","Button"],"mappings":"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","file":"chunk-O24K56OS.mjs","sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { clsx } from \"clsx\";\n\n/**\n * Slot 컴포넌트\n *\n * Radix UI의 asChild 패턴을 구현합니다.\n * 자식 요소의 props와 ref를 병합하여 하나의 요소로 렌더링합니다.\n *\n * @example\n * // Button에서 asChild 사용\n * <Button asChild>\n * <Link href=\"/home\">홈으로</Link>\n * </Button>\n *\n * @see https://www.radix-ui.com/primitives/docs/utilities/slot\n */\n\ntype SlotProps = React.HTMLAttributes<HTMLElement> & {\n children?: React.ReactNode;\n};\n\n/**\n * 여러 ref를 하나로 합칩니다\n */\nfunction composeRefs<T>(\n ...refs: (React.Ref<T> | undefined)[]\n): React.RefCallback<T> {\n return (node) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref != null) {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n };\n}\n\n/**\n * 이벤트 핸들러를 합성합니다\n * \n * 부모(slot) 핸들러를 먼저 실행하고, 그 다음 자식 핸들러를 실행합니다.\n * defaultPrevented가 true이면 자식 핸들러는 실행하지 않습니다.\n */\nfunction composeEventHandlers<E>(\n parentHandler?: (event: E) => void,\n childHandler?: (event: E) => void\n): (event: E) => void {\n return (event) => {\n parentHandler?.(event);\n if (!(event as unknown as { defaultPrevented: boolean }).defaultPrevented) {\n childHandler?.(event);\n }\n };\n}\n\n/**\n * className을 병합합니다\n */\nfunction mergeClassName(\n slotClassName?: string,\n childClassName?: string\n): string | undefined {\n if (!slotClassName && !childClassName) return undefined;\n return clsx(slotClassName, childClassName);\n}\n\n/**\n * style을 병합합니다\n */\nfunction mergeStyle(\n slotStyle?: React.CSSProperties,\n childStyle?: React.CSSProperties\n): React.CSSProperties | undefined {\n if (!slotStyle && !childStyle) return undefined;\n return { ...slotStyle, ...childStyle };\n}\n\n/**\n * props를 병합합니다 (이벤트 핸들러, className, style 등)\n */\nfunction mergeProps(\n slotProps: Record<string, unknown>,\n childProps: Record<string, unknown>\n): Record<string, unknown> {\n const mergedProps: Record<string, unknown> = { ...slotProps };\n\n for (const propName in childProps) {\n const slotValue = slotProps[propName];\n const childValue = childProps[propName];\n\n // 이벤트 핸들러 병합 (부모(slot) → 자식 순서)\n if (/^on[A-Z]/.test(propName)) {\n if (slotValue && childValue) {\n mergedProps[propName] = composeEventHandlers(\n slotValue as (event: unknown) => void,\n childValue as (event: unknown) => void\n );\n } else {\n mergedProps[propName] = childValue || slotValue;\n }\n }\n // className 병합\n else if (propName === \"className\") {\n mergedProps[propName] = mergeClassName(\n slotValue as string | undefined,\n childValue as string | undefined\n );\n }\n // style 병합\n else if (propName === \"style\") {\n mergedProps[propName] = mergeStyle(\n slotValue as React.CSSProperties | undefined,\n childValue as React.CSSProperties | undefined\n );\n }\n // 그 외: 자식 값 우선\n else {\n mergedProps[propName] = childValue !== undefined ? childValue : slotValue;\n }\n }\n\n return mergedProps;\n}\n\n/**\n * 유효한 단일 React 요소인지 확인\n */\nfunction isSlottable(child: React.ReactNode): child is React.ReactElement {\n return React.isValidElement(child);\n}\n\n/**\n * Slot 컴포넌트\n *\n * 자식 요소에 부모의 props를 주입합니다.\n * asChild 패턴을 구현할 때 사용합니다.\n */\nconst Slot = React.forwardRef<HTMLElement, SlotProps>(\n ({ children, ...slotProps }, forwardedRef) => {\n const childArray = React.Children.toArray(children);\n\n // 유효한 단일 자식이 있는지 확인\n if (childArray.length !== 1) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[Slot] asChild는 정확히 하나의 자식 요소가 필요합니다.\"\n );\n }\n return null;\n }\n\n const child = childArray[0];\n\n if (!isSlottable(child)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[Slot] 자식은 유효한 React 요소여야 합니다.\");\n }\n return null;\n }\n\n // 자식 요소의 props와 ref 추출\n const childProps = child.props as Record<string, unknown>;\n const childRef = (child as unknown as { ref?: React.Ref<HTMLElement> }).ref;\n\n // props와 ref 병합\n const mergedProps = mergeProps(slotProps, childProps);\n const mergedRef = composeRefs(forwardedRef, childRef);\n\n return React.cloneElement(child, {\n ...mergedProps,\n ref: mergedRef,\n } as React.Attributes);\n }\n);\n\nSlot.displayName = \"Slot\";\n\nexport { Slot, composeRefs, mergeProps };\nexport type { SlotProps };\n","import { cva } from 'class-variance-authority'\n\n/**\n * HUA Spring Easing transition — 시그니처 \"쫀득한\" 느낌\n * cubic-bezier(0.34, 1.56, 0.64, 1)\n */\nconst springTransition =\n '[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]'\n\nexport const buttonVariants = cva(\n // ── base ──\n 'inline-flex items-center justify-center whitespace-nowrap font-medium transition-all duration-200 disabled:pointer-events-none disabled:opacity-50 min-w-fit focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--color-background)]',\n {\n variants: {\n /** 스타일 변형 */\n variant: {\n default:\n 'bg-[var(--color-primary)] text-[var(--color-primary-foreground)] hover:opacity-90',\n destructive:\n 'bg-[var(--color-destructive)] text-[var(--color-destructive-foreground)] hover:opacity-90 focus-visible:ring-[var(--color-destructive)]',\n outline:\n 'border-2 border-[var(--color-border)] bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0',\n secondary:\n 'bg-[var(--color-secondary)] text-[var(--color-secondary-foreground)] hover:opacity-80',\n ghost:\n 'bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0',\n link:\n 'bg-transparent text-[var(--color-primary)] underline hover:opacity-80 focus-visible:ring-offset-0',\n gradient:\n 'bg-gradient-to-r from-[var(--btn-gradient-from,theme(colors.teal.500))] to-[var(--btn-gradient-to,theme(colors.cyan.500))] text-white hover:shadow-lg',\n neon:\n 'bg-slate-900 dark:bg-slate-950 text-teal-400 border border-teal-500/50 shadow-lg shadow-[var(--btn-neon-glow,theme(colors.teal.500/20%))] hover:shadow-[var(--btn-neon-glow,theme(colors.teal.500/40%))] hover:border-teal-400',\n glass:\n 'bg-white/50 dark:bg-slate-900/50 backdrop-blur-md border border-slate-200/50 dark:border-slate-700/50 text-slate-900 dark:text-slate-100 hover:bg-white/70 dark:hover:bg-slate-900/70',\n },\n /** 크기 */\n size: {\n sm: 'h-8 px-4 py-2 text-sm',\n md: 'h-10 px-6 py-2 text-base',\n lg: 'h-12 px-8 py-3 text-lg',\n xl: 'h-14 px-10 py-4 text-xl',\n icon: 'h-10 w-10 p-0',\n },\n /** 모서리 둥글기 */\n rounded: {\n sm: 'rounded',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'rounded-full',\n },\n /** 그림자 */\n shadow: {\n none: '',\n sm: 'shadow-sm',\n md: 'shadow-md',\n lg: 'shadow-lg',\n xl: 'shadow-xl',\n },\n /** 호버 효과 — springy가 HUA-UI 시그니처 */\n hover: {\n springy: `hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${springTransition} transform-gpu`,\n scale:\n 'hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu',\n glow: 'hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200',\n slide: `hover:-translate-y-0.5 hover:shadow-md ${springTransition} transform-gpu`,\n none: '',\n },\n /** 전체 너비 */\n fullWidth: {\n true: 'w-full',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n rounded: 'md',\n shadow: 'md',\n hover: 'springy',\n fullWidth: false,\n },\n }\n)\n\n/** Gradient 프리셋 */\nexport const gradientPresets: Record<string, string> = {\n blue: 'from-teal-500 to-cyan-500',\n purple: 'from-purple-500 to-pink-500',\n green: 'from-green-500 to-emerald-500 dark:from-green-400 dark:to-emerald-400',\n orange: 'from-orange-500 to-red-500 dark:from-orange-300 dark:to-red-300',\n pink: 'from-pink-500 to-rose-500',\n}\n\nexport type { VariantProps } from 'class-variance-authority'\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\nimport { buttonVariants, gradientPresets } from \"./Button.variants\";\nimport { Slot } from \"../lib/Slot\";\nimport { useReducedMotion } from \"../hooks/useReducedMotion\";\n\n/**\n * 버튼 스타일 변형 / Button style variant\n */\ntype Variant =\n | \"default\" | \"destructive\" | \"outline\" | \"secondary\"\n | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\";\n\n/**\n * 버튼 크기 / Button size\n */\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\";\n\n/**\n * 버튼 모서리 둥글기 / Button border radius\n */\ntype Rounded = \"sm\" | \"md\" | \"lg\" | \"full\";\n\n/**\n * 버튼 그림자 / Button shadow\n */\ntype Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * 버튼 호버 효과 / Button hover effect\n * \"springy\"가 HUA-UI 시그니처 - 공 튕기듯 미세한 반동\n */\ntype Hover = \"springy\" | \"scale\" | \"glow\" | \"slide\" | \"none\";\n\n/**\n * 그라디언트 색상 이름 / Gradient color name\n */\ntype GradientName = \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\";\n\n/**\n * Button 컴포넌트의 공통 props / Common props for Button component\n */\ntype CommonProps = {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n icon?: React.ReactNode;\n iconPosition?: \"left\" | \"right\";\n gradient?: GradientName;\n customGradient?: string;\n rounded?: Rounded;\n shadow?: Shadow;\n hover?: Hover;\n fullWidth?: boolean;\n iconOnly?: boolean;\n \"aria-label\"?: string;\n className?: string;\n disabled?: boolean;\n asChild?: boolean;\n};\n\ntype AnchorProps = CommonProps &\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"className\"> & {\n href: string;\n };\n\ntype NativeButtonProps = CommonProps &\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"className\" | \"type\"> & {\n href?: undefined;\n };\n\n/**\n * Button 컴포넌트의 props 타입 / Button component props type\n * href가 제공되면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n */\nexport type ButtonProps = AnchorProps | NativeButtonProps;\n\ntype AnchorOrButton = HTMLAnchorElement | HTMLButtonElement;\n\n/**\n * Button 컴포넌트 / Button component\n *\n * 다양한 스타일과 크기를 지원하는 범용 버튼 컴포넌트입니다.\n * href prop을 제공하면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n *\n * @example\n * <Button onClick={() => console.log('클릭')}>클릭하세요</Button>\n * <Button variant=\"destructive\" size=\"lg\">삭제</Button>\n * <Button variant=\"gradient\" gradient=\"purple\">그라디언트</Button>\n * <Button href=\"/about\" variant=\"link\">자세히 보기</Button>\n */\nconst ButtonInner = React.forwardRef<AnchorOrButton, ButtonProps>(function ButtonInner(\n {\n variant = \"default\",\n size = \"md\",\n loading = false,\n icon,\n iconPosition = \"left\",\n gradient = \"blue\",\n customGradient,\n rounded = \"md\",\n shadow = \"md\",\n hover = \"springy\",\n fullWidth,\n iconOnly,\n className,\n children,\n disabled,\n asChild = false,\n ...rest\n },\n ref\n) {\n const reduced = useReducedMotion();\n\n // gradient variant: 커스텀 그라디언트 클래스 처리\n const gradientClass =\n variant === \"gradient\"\n ? customGradient\n ? `bg-gradient-to-r ${customGradient}`\n : `bg-gradient-to-r ${gradientPresets[gradient] || gradientPresets.blue}`\n : undefined;\n\n const base = merge(\n buttonVariants({\n variant,\n size,\n rounded,\n shadow,\n hover: reduced ? \"none\" : hover,\n fullWidth: fullWidth ?? false,\n }),\n gradientClass,\n className\n );\n\n const Spinner = (\n <span role=\"status\" aria-live=\"polite\" className=\"-ml-1 mr-2 inline-flex\">\n <svg className=\"animate-spin h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n <span className=\"sr-only\">로딩 중</span>\n </span>\n );\n\n const content = (\n <>\n {loading && Spinner}\n {!loading && icon && iconPosition === \"left\" && <span className=\"mr-2\">{icon}</span>}\n {children}\n {!loading && icon && iconPosition === \"right\" && <span className=\"ml-2\">{icon}</span>}\n </>\n );\n\n if (iconOnly && !(\"aria-label\" in rest) && process.env.NODE_ENV !== \"production\") {\n console.warn(\"[Button] iconOnly 사용 시 aria-label을 제공하세요.\");\n }\n\n // asChild 모드: Slot을 사용하여 자식 요소에 props 병합\n if (asChild) {\n const slotProps = {\n className: base,\n ref,\n disabled: disabled || loading,\n \"aria-busy\": loading || undefined,\n \"aria-disabled\": (disabled || loading) || undefined,\n ...rest,\n };\n return <Slot {...slotProps}>{children}</Slot>;\n }\n\n // 앵커 모드\n if (\"href\" in rest && rest.href) {\n const { onClick, target, rel, href, \"aria-label\": _ariaLabel, className: anchorClassName, ...anchorProps } = rest as AnchorProps;\n const isDisabled = !!disabled || loading;\n\n const handleAnchorClick: React.MouseEventHandler<HTMLAnchorElement> = (e) => {\n if (isDisabled) { e.preventDefault(); e.stopPropagation(); return; }\n onClick?.(e);\n };\n\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={merge(base, anchorClassName)}\n onClick={handleAnchorClick}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled ? -1 : anchorProps.tabIndex}\n target={target}\n rel={target === \"_blank\" ? rel ?? \"noopener noreferrer\" : rel}\n {...anchorProps}\n >\n {content}\n </a>\n );\n }\n\n // 버튼 모드\n const { className: buttonClassName, ...btnProps } = rest as NativeButtonProps;\n const isDisabled = !!disabled || loading;\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n className={merge(base, buttonClassName)}\n type=\"button\"\n disabled={isDisabled}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n {...btnProps}\n >\n {content}\n </button>\n );\n});\n\nButtonInner.displayName = \"Button\";\n\nexport const Button = ButtonInner;\n"]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {l}from'./chunk-ZQUMJQYV.mjs';import {a}from'./chunk-QEMPERUK.mjs';import i from'react';import {offset,flip,shift,arrow,useFloating,autoUpdate,useClick,useDismiss,useRole,useInteractions,FloatingPortal,FloatingArrow}from'@floating-ui/react';import {jsxs,jsx}from'react/jsx-runtime';function Q(t,e){return e==="center"?t:`${t}-${e}`}var C=8,X=i.forwardRef(({className:t,trigger:e,children:o,open:a$1,onOpenChange:r,placement:f="bottom",align:p="start",offset:D=8,disabled:h=false,showArrow:b=false,...P},R)=>{let[x,n]=i.useState(false),w=i.useRef(null),v=a$1!==void 0,g=v?a$1:x,L=i.useCallback(H=>{h&&H||(v||n(H),r==null||r(H));},[h,v,r]),u=Q(f,p),N=[offset(D),flip(),shift({padding:8})];b&&N.push(arrow({element:w,padding:8}));let{refs:y,floatingStyles:M,context:l}=useFloating({open:g,onOpenChange:L,placement:u,middleware:N,whileElementsMounted:autoUpdate}),E=useClick(l),S=useDismiss(l),A=useRole(l,{role:"menu"}),{getReferenceProps:I,getFloatingProps:B}=useInteractions([E,S,A]);return jsxs("div",{ref:R,className:a("relative inline-block",t),...P,children:[jsx("div",{ref:y.setReference,className:"inline-block cursor-pointer",...I(),children:e}),g&&jsx(FloatingPortal,{children:jsxs("div",{ref:y.setFloating,style:M,className:a("z-50 bg-[var(--dropdown-bg,_#fff)] dark:bg-[var(--dropdown-bg,_rgb(31,41,55))] rounded-lg shadow-lg border border-border","min-w-[var(--reference-width)] w-max py-1"),...B(),children:[b&&jsx(FloatingArrow,{ref:w,context:l,width:C*2,height:C,className:"fill-[var(--dropdown-bg,_#fff)] dark:fill-[var(--dropdown-bg,_rgb(31,41,55))] [&>path:first-of-type]:stroke-border"}),o]})})]})});X.displayName="Dropdown";var Y=i.forwardRef(({className:t,icon:e,variant:o="default",children:a$1,disabled:r,...f},p)=>jsxs("button",{ref:p,className:a("w-full flex items-center gap-2 px-3 py-2 text-sm font-medium transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:bg-muted",(()=>{switch(o){case "destructive":return "text-destructive hover:bg-destructive/10";case "disabled":return "text-muted-foreground cursor-not-allowed";default:return "text-foreground hover:bg-muted"}})(),t),disabled:r||o==="disabled",...f,children:[e&&jsx("div",{className:"flex-shrink-0 w-4 h-4",children:e}),jsx("span",{className:"flex-1 text-left",children:a$1})]}));Y.displayName="DropdownItem";var O=i.forwardRef(({className:t,...e},o)=>jsx("div",{ref:o,className:a("h-px bg-border my-2",t),...e}));O.displayName="DropdownSeparator";var ee=i.forwardRef(({className:t,children:e,...o},a$1)=>jsx("div",{ref:a$1,className:a("px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide",t),...o,children:e}));ee.displayName="DropdownLabel";var te=i.forwardRef(({className:t,children:e,...o},a$1)=>jsx("div",{ref:a$1,className:a("py-1",t),...o,children:e}));te.displayName="DropdownMenu";var re=i.forwardRef(({className:t,children:e,...o},a$1)=>jsx("div",{ref:a$1,className:a("space-y-1",t),...o,children:e}));re.displayName="DropdownGroup";var oe=i.forwardRef(({isOpen:t,onClose:e,children:o,className:a$1,side:r="right",size:f="md",showBackdrop:p=true,backdropClassName:D,closeOnBackdropClick:h=true,closeOnEscape:b=true,closable:P=true,...R},x)=>{let n=t!=null?t:false,w=()=>{e==null||e();},[v,g]=i.useState(false),[L,u]=i.useState(false);if(i.useEffect(()=>{if(n){g(true),u(true);let l=setTimeout(()=>u(false),50);return ()=>clearTimeout(l)}else {u(true);let l=setTimeout(()=>{g(false),u(false);},300);return ()=>clearTimeout(l)}},[n]),i.useEffect(()=>{if(!b)return;let l=E=>{E.key==="Escape"&&n&&w();};return n&&(document.addEventListener("keydown",l),document.body.style.overflow="hidden"),()=>{document.removeEventListener("keydown",l),document.body.style.overflow="";}},[n,b]),!v)return null;let N={sm:r==="left"||r==="right"?"w-80":"h-64",md:r==="left"||r==="right"?"w-96":"h-96",lg:r==="left"||r==="right"?"w-[28rem]":"h-[32rem]",xl:r==="left"||r==="right"?"w-[32rem]":"h-[40rem]",full:r==="left"||r==="right"?"w-full":"h-full"},y={left:"left-0 top-0 h-full",right:"right-0 top-0 h-full",top:"top-0 left-0 w-full",bottom:"bottom-0 left-0 w-full"},M={left:n?"translate-x-0":"-translate-x-full",right:n?"translate-x-0":"translate-x-full",top:n?"translate-y-0":"-translate-y-full",bottom:n?"translate-y-0":"translate-y-full"};return jsxs("div",{className:"fixed inset-0 z-50",children:[p&&jsx("div",{className:a("absolute inset-0 bg-black/85 backdrop-blur-md transition-opacity duration-300",L?n?"opacity-100":"opacity-0":"",D),onClick:h?w:void 0}),jsx("div",{ref:x,className:a("absolute bg-background/95 backdrop-blur-xl border border-border/50 shadow-2xl transition-transform duration-300 ease-out",N[f],y[r],M[r],a$1),...R,children:o})]})});oe.displayName="Drawer";var ae=i.forwardRef(({children:t,className:e,showCloseButton:o=true,onClose:a$1,...r},f)=>jsxs("div",{ref:f,className:a("flex items-center justify-between p-6 border-b border-border/50",e),...r,children:[jsx("div",{className:"flex-1",children:t}),o&&jsx("button",{onClick:a$1,className:"p-2 rounded-lg hover:bg-muted transition-colors",children:jsx(l,{name:"close",size:20})})]}));ae.displayName="DrawerHeader";var se=i.forwardRef(({children:t,className:e,...o},a$1)=>jsx("div",{ref:a$1,className:a("flex-1 p-6 overflow-y-auto",e),...o,children:t}));se.displayName="DrawerContent";var ne=i.forwardRef(({children:t,className:e,...o},a$1)=>jsx("div",{ref:a$1,className:a("flex items-center justify-end gap-3 p-6 border-t border-border/50",e),...o,children:t}));ne.displayName="DrawerFooter";export{X as a,Y as b,O as c,ee as d,te as e,re as f,oe as g,ae as h,se as i,ne as j};//# sourceMappingURL=chunk-OIWG3IJ7.mjs.map
3
- //# sourceMappingURL=chunk-OIWG3IJ7.mjs.map