@hua-labs/ui 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/README.md +55 -67
  2. package/dist/{ComponentLayout-btJq4TjA.d.mts → ComponentLayout-BhM4VSoq.d.mts} +1 -1
  3. package/dist/Section-BWzyshgX.d.mts +67 -0
  4. package/dist/advanced/dashboard.d.ts.map +1 -1
  5. package/dist/advanced-dashboard.d.mts +1 -1
  6. package/dist/advanced-dashboard.mjs +3 -3
  7. package/dist/advanced-dashboard.mjs.map +1 -1
  8. package/dist/advanced-emotion.mjs +1 -1
  9. package/dist/advanced-motion.d.mts +74 -7
  10. package/dist/advanced-motion.mjs +1 -1
  11. package/dist/advanced.d.mts +4 -4
  12. package/dist/advanced.mjs +3 -3
  13. package/dist/advanced.mjs.map +1 -1
  14. package/dist/{chunk-GLZKT7JN.mjs → chunk-5DPW7SVD.mjs} +3 -3
  15. package/dist/{chunk-GLZKT7JN.mjs.map → chunk-5DPW7SVD.mjs.map} +1 -1
  16. package/dist/{chunk-X7ZIWYRC.mjs → chunk-5L5HIPKA.mjs} +2 -2
  17. package/dist/{chunk-X7ZIWYRC.mjs.map → chunk-5L5HIPKA.mjs.map} +1 -1
  18. package/dist/chunk-A5YOVVM5.mjs +3 -0
  19. package/dist/chunk-A5YOVVM5.mjs.map +1 -0
  20. package/dist/chunk-CNW22G24.mjs +13 -0
  21. package/dist/chunk-CNW22G24.mjs.map +1 -0
  22. package/dist/chunk-CW66UBQG.mjs +3 -0
  23. package/dist/chunk-CW66UBQG.mjs.map +1 -0
  24. package/dist/chunk-EAZEI74V.mjs +3 -0
  25. package/dist/chunk-EAZEI74V.mjs.map +1 -0
  26. package/dist/{chunk-LH77I6HO.mjs → chunk-EPY3432E.mjs} +2 -2
  27. package/dist/{chunk-LH77I6HO.mjs.map → chunk-EPY3432E.mjs.map} +1 -1
  28. package/dist/{chunk-SGEP3CQE.mjs → chunk-F2M4YDDQ.mjs} +2 -2
  29. package/dist/{chunk-SGEP3CQE.mjs.map → chunk-F2M4YDDQ.mjs.map} +1 -1
  30. package/dist/chunk-FHMFDCX2.mjs +3 -0
  31. package/dist/chunk-FHMFDCX2.mjs.map +1 -0
  32. package/dist/chunk-HBIUCLFL.mjs +3 -0
  33. package/dist/chunk-HBIUCLFL.mjs.map +1 -0
  34. package/dist/{chunk-LOYAJIWO.mjs → chunk-HEBXAFRY.mjs} +2 -2
  35. package/dist/{chunk-LOYAJIWO.mjs.map → chunk-HEBXAFRY.mjs.map} +1 -1
  36. package/dist/chunk-IG47LMOD.mjs +3 -0
  37. package/dist/chunk-IG47LMOD.mjs.map +1 -0
  38. package/dist/{chunk-IFSEJVOR.mjs → chunk-J47ZEXEL.mjs} +2 -2
  39. package/dist/{chunk-IFSEJVOR.mjs.map → chunk-J47ZEXEL.mjs.map} +1 -1
  40. package/dist/{chunk-IN7RWQCJ.mjs → chunk-K2FOFIST.mjs} +2 -2
  41. package/dist/{chunk-IN7RWQCJ.mjs.map → chunk-K2FOFIST.mjs.map} +1 -1
  42. package/dist/{chunk-UWHCM3S6.mjs → chunk-LL6QPRD7.mjs} +2 -2
  43. package/dist/{chunk-UWHCM3S6.mjs.map → chunk-LL6QPRD7.mjs.map} +1 -1
  44. package/dist/{chunk-PAEKNQWW.mjs → chunk-NMJLOK6M.mjs} +2 -2
  45. package/dist/{chunk-PAEKNQWW.mjs.map → chunk-NMJLOK6M.mjs.map} +1 -1
  46. package/dist/chunk-O24K56OS.mjs +3 -0
  47. package/dist/chunk-O24K56OS.mjs.map +1 -0
  48. package/dist/chunk-OIWG3IJ7.mjs +3 -0
  49. package/dist/chunk-OIWG3IJ7.mjs.map +1 -0
  50. package/dist/{chunk-VWSBJUNI.mjs → chunk-OLLU7ZFH.mjs} +2 -2
  51. package/dist/{chunk-VWSBJUNI.mjs.map → chunk-OLLU7ZFH.mjs.map} +1 -1
  52. package/dist/chunk-Q76JW7X5.mjs +73 -0
  53. package/dist/chunk-Q76JW7X5.mjs.map +1 -0
  54. package/dist/chunk-QEMPERUK.mjs +3 -0
  55. package/dist/chunk-QEMPERUK.mjs.map +1 -0
  56. package/dist/{chunk-XV3Y7QVU.mjs → chunk-QRM66RQG.mjs} +2 -2
  57. package/dist/{chunk-XV3Y7QVU.mjs.map → chunk-QRM66RQG.mjs.map} +1 -1
  58. package/dist/{chunk-6KTHJ3EL.mjs → chunk-QRRP7TGF.mjs} +3 -3
  59. package/dist/{chunk-6KTHJ3EL.mjs.map → chunk-QRRP7TGF.mjs.map} +1 -1
  60. package/dist/chunk-SD6XGDAC.mjs +3 -0
  61. package/dist/chunk-SD6XGDAC.mjs.map +1 -0
  62. package/dist/chunk-SDFVGFXT.mjs +3 -0
  63. package/dist/chunk-SDFVGFXT.mjs.map +1 -0
  64. package/dist/{chunk-N7M6RIN4.mjs → chunk-SMLDNOV3.mjs} +3 -3
  65. package/dist/{chunk-N7M6RIN4.mjs.map → chunk-SMLDNOV3.mjs.map} +1 -1
  66. package/dist/{chunk-NBJUE7NR.mjs → chunk-TAP6MYDW.mjs} +2 -2
  67. package/dist/{chunk-NBJUE7NR.mjs.map → chunk-TAP6MYDW.mjs.map} +1 -1
  68. package/dist/{chunk-PYBYZVSL.mjs → chunk-TBZ645BI.mjs} +2 -2
  69. package/dist/{chunk-PYBYZVSL.mjs.map → chunk-TBZ645BI.mjs.map} +1 -1
  70. package/dist/{chunk-C4OACMTB.mjs → chunk-V2DNYJR6.mjs} +2 -2
  71. package/dist/{chunk-C4OACMTB.mjs.map → chunk-V2DNYJR6.mjs.map} +1 -1
  72. package/dist/chunk-VBABZXL7.mjs +3 -0
  73. package/dist/chunk-VBABZXL7.mjs.map +1 -0
  74. package/dist/{chunk-OSCMSA2Q.mjs → chunk-WYBSHTGY.mjs} +2 -2
  75. package/dist/{chunk-OSCMSA2Q.mjs.map → chunk-WYBSHTGY.mjs.map} +1 -1
  76. package/dist/chunk-ZQUMJQYV.mjs +3 -0
  77. package/dist/chunk-ZQUMJQYV.mjs.map +1 -0
  78. package/dist/chunk-ZY23NOT4.mjs +3 -0
  79. package/dist/chunk-ZY23NOT4.mjs.map +1 -0
  80. package/dist/components/Action.d.ts.map +1 -1
  81. package/dist/components/Badge.d.ts +1 -1
  82. package/dist/components/Button.d.ts.map +1 -1
  83. package/dist/components/Card.d.ts.map +1 -1
  84. package/dist/components/DatePicker.d.ts.map +1 -1
  85. package/dist/components/Dropdown.d.ts +0 -50
  86. package/dist/components/Dropdown.d.ts.map +1 -1
  87. package/dist/components/Icon/Icon.d.ts.map +1 -1
  88. package/dist/components/Modal.d.ts.map +1 -1
  89. package/dist/components/Popover.d.ts +2 -0
  90. package/dist/components/Popover.d.ts.map +1 -1
  91. package/dist/components/Progress.d.ts +3 -2
  92. package/dist/components/Progress.d.ts.map +1 -1
  93. package/dist/components/Section.d.ts +44 -0
  94. package/dist/components/Section.d.ts.map +1 -0
  95. package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
  96. package/dist/components/advanced/Carousel.d.ts.map +1 -1
  97. package/dist/components/advanced/DotNav.d.ts +26 -0
  98. package/dist/components/advanced/DotNav.d.ts.map +1 -0
  99. package/dist/components/advanced/HorizontalScroll.d.ts +20 -0
  100. package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -0
  101. package/dist/components/advanced/ImageReveal.d.ts +24 -0
  102. package/dist/components/advanced/ImageReveal.d.ts.map +1 -0
  103. package/dist/components/advanced/Parallax.d.ts +9 -6
  104. package/dist/components/advanced/Parallax.d.ts.map +1 -1
  105. package/dist/components/advanced/TextReveal.d.ts.map +1 -1
  106. package/dist/components/advanced/index.d.ts +6 -0
  107. package/dist/components/advanced/index.d.ts.map +1 -1
  108. package/dist/data.mjs +1 -1
  109. package/dist/data.mjs.map +1 -1
  110. package/dist/feedback.mjs +1 -1
  111. package/dist/form.mjs +3 -3
  112. package/dist/form.mjs.map +1 -1
  113. package/dist/{icons-Bj_nr8Ba.d.mts → icons-DcOBy9Hf.d.mts} +10 -1
  114. package/dist/iconsax-extended.mjs +2 -2
  115. package/dist/iconsax-extended.mjs.map +1 -1
  116. package/dist/index.d.mts +10 -109
  117. package/dist/index.d.ts +4 -0
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.mjs +14 -14
  120. package/dist/index.mjs.map +1 -1
  121. package/dist/interactive.mjs +1 -1
  122. package/dist/interactive.mjs.map +1 -1
  123. package/dist/landing/LandingAbout.d.ts +3 -0
  124. package/dist/landing/LandingAbout.d.ts.map +1 -0
  125. package/dist/landing/LandingCTA.d.ts +3 -0
  126. package/dist/landing/LandingCTA.d.ts.map +1 -0
  127. package/dist/landing/LandingContact.d.ts +3 -0
  128. package/dist/landing/LandingContact.d.ts.map +1 -0
  129. package/dist/landing/LandingExperience.d.ts +3 -0
  130. package/dist/landing/LandingExperience.d.ts.map +1 -0
  131. package/dist/landing/LandingFeatures.d.ts +3 -0
  132. package/dist/landing/LandingFeatures.d.ts.map +1 -0
  133. package/dist/landing/LandingHero.d.ts +3 -0
  134. package/dist/landing/LandingHero.d.ts.map +1 -0
  135. package/dist/landing/LandingLogoCloud.d.ts +3 -0
  136. package/dist/landing/LandingLogoCloud.d.ts.map +1 -0
  137. package/dist/landing/LandingMetrics.d.ts +3 -0
  138. package/dist/landing/LandingMetrics.d.ts.map +1 -0
  139. package/dist/landing/LandingProjects.d.ts +3 -0
  140. package/dist/landing/LandingProjects.d.ts.map +1 -0
  141. package/dist/landing/LandingProvider.d.ts +4 -0
  142. package/dist/landing/LandingProvider.d.ts.map +1 -0
  143. package/dist/landing/LandingShowcase.d.ts +3 -0
  144. package/dist/landing/LandingShowcase.d.ts.map +1 -0
  145. package/dist/landing/LandingSkills.d.ts +3 -0
  146. package/dist/landing/LandingSkills.d.ts.map +1 -0
  147. package/dist/landing/LandingStats.d.ts +3 -0
  148. package/dist/landing/LandingStats.d.ts.map +1 -0
  149. package/dist/landing/LandingTestimonials.d.ts +3 -0
  150. package/dist/landing/LandingTestimonials.d.ts.map +1 -0
  151. package/dist/landing/index.d.ts +47 -0
  152. package/dist/landing/index.d.ts.map +1 -0
  153. package/dist/landing/themes/app.d.ts +3 -0
  154. package/dist/landing/themes/app.d.ts.map +1 -0
  155. package/dist/landing/themes/corporate.d.ts +3 -0
  156. package/dist/landing/themes/corporate.d.ts.map +1 -0
  157. package/dist/landing/themes/dashboard.d.ts +3 -0
  158. package/dist/landing/themes/dashboard.d.ts.map +1 -0
  159. package/dist/landing/themes/immersive.d.ts +3 -0
  160. package/dist/landing/themes/immersive.d.ts.map +1 -0
  161. package/dist/landing/themes/index.d.ts +15 -0
  162. package/dist/landing/themes/index.d.ts.map +1 -0
  163. package/dist/landing/themes/marketing.d.ts +3 -0
  164. package/dist/landing/themes/marketing.d.ts.map +1 -0
  165. package/dist/landing/themes/portfolio.d.ts +3 -0
  166. package/dist/landing/themes/portfolio.d.ts.map +1 -0
  167. package/dist/landing/themes/product.d.ts +3 -0
  168. package/dist/landing/themes/product.d.ts.map +1 -0
  169. package/dist/landing/types.d.ts +346 -0
  170. package/dist/landing/types.d.ts.map +1 -0
  171. package/dist/landing.d.mts +417 -0
  172. package/dist/landing.mjs +31 -0
  173. package/dist/landing.mjs.map +1 -0
  174. package/dist/lib/icon-providers.d.ts +9 -25
  175. package/dist/lib/icon-providers.d.ts.map +1 -1
  176. package/dist/lib/icons.d.ts +10 -1
  177. package/dist/lib/icons.d.ts.map +1 -1
  178. package/dist/lib/utils.d.ts.map +1 -1
  179. package/dist/navigation.d.mts +1 -1
  180. package/dist/navigation.mjs +1 -1
  181. package/dist/navigation.mjs.map +1 -1
  182. package/dist/overlay.d.mts +2 -50
  183. package/dist/overlay.mjs +1 -1
  184. package/dist/overlay.mjs.map +1 -1
  185. package/dist/sdui.mjs +1 -1
  186. package/dist/sdui.mjs.map +1 -1
  187. package/dist/theme.d.mts +85 -0
  188. package/dist/theme.d.ts +14 -0
  189. package/dist/theme.d.ts.map +1 -0
  190. package/dist/theme.mjs +3 -0
  191. package/dist/theme.mjs.map +1 -0
  192. package/package.json +30 -20
  193. package/src/styles/landing.css +107 -0
  194. package/src/styles/utilities.css +58 -0
  195. package/dist/advanced-dashboard.js +0 -39
  196. package/dist/advanced-dashboard.js.map +0 -1
  197. package/dist/advanced-emotion.js +0 -2
  198. package/dist/advanced-emotion.js.map +0 -1
  199. package/dist/advanced-motion.js +0 -82
  200. package/dist/advanced-motion.js.map +0 -1
  201. package/dist/advanced.js +0 -112
  202. package/dist/advanced.js.map +0 -1
  203. package/dist/chunk-BXX2TZUB.mjs +0 -3
  204. package/dist/chunk-BXX2TZUB.mjs.map +0 -1
  205. package/dist/chunk-COR6CDMA.mjs +0 -83
  206. package/dist/chunk-COR6CDMA.mjs.map +0 -1
  207. package/dist/chunk-FFH4ZFKS.mjs +0 -3
  208. package/dist/chunk-FFH4ZFKS.mjs.map +0 -1
  209. package/dist/chunk-HN5LSP6L.mjs +0 -3
  210. package/dist/chunk-HN5LSP6L.mjs.map +0 -1
  211. package/dist/chunk-LPAG7DCA.mjs +0 -3
  212. package/dist/chunk-LPAG7DCA.mjs.map +0 -1
  213. package/dist/chunk-QQCELXFD.mjs +0 -3
  214. package/dist/chunk-QQCELXFD.mjs.map +0 -1
  215. package/dist/chunk-RPUS7G7Q.mjs +0 -3
  216. package/dist/chunk-RPUS7G7Q.mjs.map +0 -1
  217. package/dist/chunk-SDFHJ4GB.mjs +0 -3
  218. package/dist/chunk-SDFHJ4GB.mjs.map +0 -1
  219. package/dist/chunk-UUHAXGMO.mjs +0 -3
  220. package/dist/chunk-UUHAXGMO.mjs.map +0 -1
  221. package/dist/data.js +0 -3
  222. package/dist/data.js.map +0 -1
  223. package/dist/feedback.js +0 -12
  224. package/dist/feedback.js.map +0 -1
  225. package/dist/form.js +0 -8
  226. package/dist/form.js.map +0 -1
  227. package/dist/iconsax-extended.js +0 -3
  228. package/dist/iconsax-extended.js.map +0 -1
  229. package/dist/iconsax.js +0 -3
  230. package/dist/iconsax.js.map +0 -1
  231. package/dist/index.js +0 -51
  232. package/dist/index.js.map +0 -1
  233. package/dist/interactive.js +0 -2
  234. package/dist/interactive.js.map +0 -1
  235. package/dist/lib/phosphor-icons.d.ts +0 -6
  236. package/dist/lib/phosphor-icons.d.ts.map +0 -1
  237. package/dist/navigation.js +0 -12
  238. package/dist/navigation.js.map +0 -1
  239. package/dist/overlay.js +0 -3
  240. package/dist/overlay.js.map +0 -1
  241. package/dist/sdui.js +0 -9
  242. package/dist/sdui.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Alert.tsx"],"names":["Alert","React","className","variant","title","description","icon","action","closable","onClose","children","props","ref","getVariantClasses","getIconClasses","getDefaultIcon","jsx","merge","jsxs","AlertSuccess","AlertWarning","AlertError","AlertInfo"],"mappings":"mGAgEA,IAAMA,CAAAA,CAAQC,CAAAA,CAAM,UAAA,CAClB,CAAC,CACC,SAAA,CAAAC,GAAAA,CACA,OAAA,CAAAC,CAAAA,CAAU,SAAA,CACV,MAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,EACA,QAAA,CAAAC,CAAAA,CAAW,KAAA,CACX,OAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,EACA,GAAGC,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAMC,EAAoB,IAAM,CAC9B,OAAQV,CAAAA,EACN,KAAK,UACH,OAAO,uIAAA,CACT,KAAK,SAAA,CACH,OAAO,6IAAA,CACT,KAAK,OAAA,CACH,OAAO,4HACT,KAAK,MAAA,CACH,OAAO,qIAAA,CACT,QACE,OAAO,2HACX,CACF,CAAA,CAEMW,EAAiB,IAAM,CAC3B,OAAQX,CAAAA,EACN,KAAK,UACH,OAAO,oCAAA,CACT,KAAK,SAAA,CACH,OAAO,sCAAA,CACT,KAAK,OAAA,CACH,OAAO,gCAAA,CACT,KAAK,MAAA,CACH,OAAO,mCACT,QACE,OAAO,uBACX,CACF,CAAA,CAEMY,CAAAA,CAAiB,IAAM,CAC3B,OAAQZ,CAAAA,EACN,KAAK,SAAA,CACH,OACEa,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,OAAO,cAAA,CAAe,OAAA,CAAQ,YACjE,QAAA,CAAAA,GAAAA,CAAC,QAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,EAAE,gBAAA,CAAiB,CAAA,CACxF,CAAA,CAEJ,KAAK,SAAA,CACH,OACEA,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,eAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,QAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,2IAAA,CAA4I,EACnN,CAAA,CAEJ,KAAK,OAAA,CACH,OACEA,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,YACjE,QAAA,CAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,QAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,sBAAA,CAAuB,CAAA,CAC9F,CAAA,CAEJ,KAAK,MAAA,CACH,OACEA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,KAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAAA,IAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,EAAG,CAAA,CAAE,2DAAA,CAA4D,CAAA,CACnI,CAAA,CAEJ,QACE,OAAO,IACX,CACF,CAAA,CAEA,OACEA,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKJ,EACL,SAAA,CAAWK,CAAAA,CACT,gCAAA,CACAJ,CAAAA,EAAkB,CAClBX,GACF,EACC,GAAGS,CAAAA,CAEJ,SAAAO,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wBAAA,CAAyB,QAAA,CAAA,CAAA,GAAA,CAAA,CAEpCZ,CAAAA,EAAQS,CAAAA,EAAe,GACvBC,GAAAA,CAAC,OAAI,SAAA,CAAWC,CAAAA,CAAM,sBAAA,CAAwBH,CAAAA,EAAgB,CAAA,CAC3D,SAAAR,CAAAA,EAAQS,CAAAA,EAAe,CAC1B,CAAA,CAIFG,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gBAAA,CACZ,QAAA,CAAA,CAAAd,CAAAA,EACCc,IAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,6BAA6B,QAAA,CAAA,CAAA,GAAA,CACxCd,CAAAA,CAAAA,CACH,CAAA,CAEDC,CAAAA,EACCW,GAAAA,CAAC,GAAA,CAAA,CAAE,UAAU,yBAAA,CACV,QAAA,CAAAX,CAAAA,CACH,CAAA,CAEDK,CAAAA,EACCQ,IAAAA,CAAC,OAAI,SAAA,CAAU,MAAA,CAAO,QAAA,CAAA,CAAA,GAAA,CACnBR,CAAAA,CAAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAAA,CAGEH,GAAUC,CAAAA,GACVU,IAAAA,CAAC,OAAI,SAAA,CAAU,uCAAA,CAAwC,cACpDX,CAAAA,CACAC,CAAAA,EACCQ,GAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASP,CAAAA,CACT,UAAWQ,CAAAA,CACT,4LAAA,CACAH,CAAAA,EACF,CAAA,CACA,YAAA,CAAW,eAEX,QAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,OAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAAA,GAAAA,CAAC,QAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,EAAE,sBAAA,CAAuB,CAAA,CAC9F,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,CACF,EACAhB,CAAAA,CAAM,WAAA,CAAc,OAAA,CAGb,IAAMmB,EAAelB,CAAAA,CAAM,UAAA,CAChC,CAAC,CAAE,SAAA,CAAAC,EAAW,GAAGS,CAAM,CAAA,CAAGC,CAAAA,GACxBI,GAAAA,CAAChB,CAAAA,CAAA,CAAM,GAAA,CAAKY,CAAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,SAAA,CAAWV,CAAAA,CAAY,GAAGS,CAAAA,CAAO,CAExE,EACAQ,CAAAA,CAAa,WAAA,CAAc,cAAA,KAEdC,CAAAA,CAAenB,CAAAA,CAAM,UAAA,CAChC,CAAC,CAAE,SAAA,CAAAC,EAAW,GAAGS,CAAM,CAAA,CAAGC,CAAAA,GACxBI,GAAAA,CAAChB,CAAAA,CAAA,CAAM,GAAA,CAAKY,CAAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,SAAA,CAAWV,CAAAA,CAAY,GAAGS,CAAAA,CAAO,CAExE,EACAS,CAAAA,CAAa,WAAA,CAAc,cAAA,KAEdC,CAAAA,CAAapB,CAAAA,CAAM,UAAA,CAC9B,CAAC,CAAE,SAAA,CAAAC,EAAW,GAAGS,CAAM,CAAA,CAAGC,CAAAA,GACxBI,GAAAA,CAAChB,CAAAA,CAAA,CAAM,GAAA,CAAKY,CAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,SAAA,CAAWV,CAAAA,CAAY,GAAGS,CAAAA,CAAO,CAEtE,EACAU,CAAAA,CAAW,WAAA,CAAc,YAAA,KAEZC,CAAAA,CAAYrB,CAAAA,CAAM,UAAA,CAC7B,CAAC,CAAE,SAAA,CAAAC,EAAW,GAAGS,CAAM,CAAA,CAAGC,CAAAA,GACxBI,GAAAA,CAAChB,CAAAA,CAAA,CAAM,GAAA,CAAKY,CAAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAWV,CAAAA,CAAY,GAAGS,CAAAA,CAAO,CAErE,EACAW,CAAAA,CAAU,WAAA,CAAc,WAAA","file":"chunk-C4OACMTB.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Alert 컴포넌트의 props\n * @typedef {Object} AlertProps\n * @property {\"default\" | \"success\" | \"warning\" | \"error\" | \"info\"} [variant=\"default\"] - Alert 스타일 변형\n * @property {string} [title] - Alert 제목\n * @property {string} [description] - Alert 설명\n * @property {React.ReactNode} [icon] - 커스텀 아이콘\n * @property {React.ReactNode} [action] - 액션 버튼/요소\n * @property {boolean} [closable=false] - 닫기 버튼 표시 여부\n * @property {() => void} [onClose] - 닫기 버튼 클릭 시 호출되는 콜백\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\"\n title?: string\n description?: string\n icon?: React.ReactNode\n action?: React.ReactNode\n closable?: boolean\n onClose?: () => void\n}\n\n/**\n * Alert 컴포넌트 / Alert component\n * \n * 사용자에게 중요한 정보나 경고를 표시하는 컴포넌트입니다.\n * 다양한 변형(variant)을 지원하며, 아이콘, 제목, 설명, 액션 버튼을 포함할 수 있습니다.\n * \n * Component for displaying important information or warnings to users.\n * Supports various variants and can include icons, titles, descriptions, and action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Alert variant=\"info\" title=\"정보\" description=\"이것은 정보 메시지입니다.\" />\n * \n * @example\n * // 닫기 버튼 포함 / With close button\n * <Alert \n * variant=\"warning\" \n * title=\"경고\" \n * closable \n * onClose={() => console.log('닫기')}\n * />\n * \n * @example\n * // 커스텀 아이콘과 액션 / Custom icon and action\n * <Alert \n * variant=\"success\"\n * icon={<Icon name=\"check\" />}\n * action={<Button size=\"sm\">확인</Button>}\n * >\n * 작업이 완료되었습니다.\n * </Alert>\n * \n * @param {AlertProps} props - Alert 컴포넌트의 props / Alert component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Alert 컴포넌트 / Alert component\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ \n className, \n variant = \"default\",\n title,\n description,\n icon,\n action,\n closable = false,\n onClose,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"success\":\n return \"bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200\"\n case \"warning\":\n return \"bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200\"\n case \"error\":\n return \"bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200\"\n case \"info\":\n return \"bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200\"\n default:\n return \"bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200\"\n }\n }\n\n const getIconClasses = () => {\n switch (variant) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n default:\n return \"text-muted-foreground\"\n }\n }\n\n const getDefaultIcon = () => {\n switch (variant) {\n case \"success\":\n return (\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=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"warning\":\n return (\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=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"error\":\n return (\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 )\n case \"info\":\n return (\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=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n default:\n return null\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative rounded-lg border p-4\", // 16px 패딩\n getVariantClasses(),\n className\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\"> {/* 12px 간격 */}\n {/* 아이콘 */}\n {(icon || getDefaultIcon()) && (\n <div className={merge(\"flex-shrink-0 mt-0.5\", getIconClasses())}>\n {icon || getDefaultIcon()}\n </div>\n )}\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {title}\n </h4>\n )}\n {description && (\n <p className=\"text-sm leading-relaxed\">\n {description}\n </p>\n )}\n {children && (\n <div className=\"mt-2\"> {/* 8px 여백 */}\n {children}\n </div>\n )}\n </div>\n\n {/* 액션 */}\n {(action || closable) && (\n <div className=\"flex-shrink-0 flex items-center gap-2\"> {/* 8px 간격 */}\n {action}\n {closable && (\n <button\n onClick={onClose}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconClasses()\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" 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 </div>\n )}\n </div>\n </div>\n )\n }\n)\nAlert.displayName = \"Alert\"\n\n// 편의 컴포넌트들\nexport const AlertSuccess = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nAlertSuccess.displayName = \"AlertSuccess\"\n\nexport const AlertWarning = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nAlertWarning.displayName = \"AlertWarning\"\n\nexport const AlertError = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nAlertError.displayName = \"AlertError\"\n\nexport const AlertInfo = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nAlertInfo.displayName = \"AlertInfo\"\n\nexport { Alert } "]}
1
+ {"version":3,"sources":["../src/components/Alert.tsx"],"names":["Alert","React","className","variant","title","description","icon","action","closable","onClose","children","props","ref","getVariantClasses","getIconClasses","getDefaultIcon","jsx","merge","jsxs","AlertSuccess","AlertWarning","AlertError","AlertInfo"],"mappings":"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","file":"chunk-V2DNYJR6.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Alert 컴포넌트의 props\n * @typedef {Object} AlertProps\n * @property {\"default\" | \"success\" | \"warning\" | \"error\" | \"info\"} [variant=\"default\"] - Alert 스타일 변형\n * @property {string} [title] - Alert 제목\n * @property {string} [description] - Alert 설명\n * @property {React.ReactNode} [icon] - 커스텀 아이콘\n * @property {React.ReactNode} [action] - 액션 버튼/요소\n * @property {boolean} [closable=false] - 닫기 버튼 표시 여부\n * @property {() => void} [onClose] - 닫기 버튼 클릭 시 호출되는 콜백\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\"\n title?: string\n description?: string\n icon?: React.ReactNode\n action?: React.ReactNode\n closable?: boolean\n onClose?: () => void\n}\n\n/**\n * Alert 컴포넌트 / Alert component\n * \n * 사용자에게 중요한 정보나 경고를 표시하는 컴포넌트입니다.\n * 다양한 변형(variant)을 지원하며, 아이콘, 제목, 설명, 액션 버튼을 포함할 수 있습니다.\n * \n * Component for displaying important information or warnings to users.\n * Supports various variants and can include icons, titles, descriptions, and action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Alert variant=\"info\" title=\"정보\" description=\"이것은 정보 메시지입니다.\" />\n * \n * @example\n * // 닫기 버튼 포함 / With close button\n * <Alert \n * variant=\"warning\" \n * title=\"경고\" \n * closable \n * onClose={() => console.log('닫기')}\n * />\n * \n * @example\n * // 커스텀 아이콘과 액션 / Custom icon and action\n * <Alert \n * variant=\"success\"\n * icon={<Icon name=\"check\" />}\n * action={<Button size=\"sm\">확인</Button>}\n * >\n * 작업이 완료되었습니다.\n * </Alert>\n * \n * @param {AlertProps} props - Alert 컴포넌트의 props / Alert component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Alert 컴포넌트 / Alert component\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ \n className, \n variant = \"default\",\n title,\n description,\n icon,\n action,\n closable = false,\n onClose,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"success\":\n return \"bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200\"\n case \"warning\":\n return \"bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200\"\n case \"error\":\n return \"bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200\"\n case \"info\":\n return \"bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200\"\n default:\n return \"bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200\"\n }\n }\n\n const getIconClasses = () => {\n switch (variant) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n default:\n return \"text-muted-foreground\"\n }\n }\n\n const getDefaultIcon = () => {\n switch (variant) {\n case \"success\":\n return (\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=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"warning\":\n return (\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=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"error\":\n return (\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 )\n case \"info\":\n return (\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=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n default:\n return null\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative rounded-lg border p-4\", // 16px 패딩\n getVariantClasses(),\n className\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\"> {/* 12px 간격 */}\n {/* 아이콘 */}\n {(icon || getDefaultIcon()) && (\n <div className={merge(\"flex-shrink-0 mt-0.5\", getIconClasses())}>\n {icon || getDefaultIcon()}\n </div>\n )}\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {title}\n </h4>\n )}\n {description && (\n <p className=\"text-sm leading-relaxed\">\n {description}\n </p>\n )}\n {children && (\n <div className=\"mt-2\"> {/* 8px 여백 */}\n {children}\n </div>\n )}\n </div>\n\n {/* 액션 */}\n {(action || closable) && (\n <div className=\"flex-shrink-0 flex items-center gap-2\"> {/* 8px 간격 */}\n {action}\n {closable && (\n <button\n onClick={onClose}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconClasses()\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" 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 </div>\n )}\n </div>\n </div>\n )\n }\n)\nAlert.displayName = \"Alert\"\n\n// 편의 컴포넌트들\nexport const AlertSuccess = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nAlertSuccess.displayName = \"AlertSuccess\"\n\nexport const AlertWarning = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nAlertWarning.displayName = \"AlertWarning\"\n\nexport const AlertError = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nAlertError.displayName = \"AlertError\"\n\nexport const AlertInfo = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nAlertInfo.displayName = \"AlertInfo\"\n\nexport { Alert } "]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import {a}from'./chunk-SDFVGFXT.mjs';import {a as a$1}from'./chunk-QEMPERUK.mjs';import x from'react';import {cva}from'class-variance-authority';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var y=cva("relative w-full",{variants:{spacing:{none:"",sm:"py-12 sm:py-16",md:"py-16 sm:py-20 lg:py-24",lg:"py-20 sm:py-28",xl:"py-28 sm:py-36"},background:{none:"",muted:"bg-muted/30",accent:"bg-accent/5",primary:"bg-primary/5"}},defaultVariants:{spacing:"lg",background:"none"}}),b={width:"80px",height:"3px",borderRadius:"9999px",background:"linear-gradient(90deg, var(--color-primary, hsl(var(--primary))), var(--color-accent, hsl(var(--accent-foreground))))",marginBottom:"1.5rem"};function v({config:e}){let n=e.align!=="left";return jsxs("div",{className:a$1("mb-16",n&&"text-center"),children:[e.decorator!==false&&jsx("div",{style:b,className:a$1(n&&"mx-auto"),"aria-hidden":"true"}),jsx("h2",{className:"text-3xl md:text-5xl font-extrabold mb-4",children:e.title}),e.subtitle&&jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto",children:e.subtitle}),e.action&&jsx("div",{className:"mt-6",children:e.action})]})}var S=x.forwardRef(({className:e,spacing:n,background:c,container:l="lg",containerPadding:p="none",header:r,fullWidth:d=false,children:m,...g},u)=>{let o=jsxs(Fragment,{children:[r&&jsx(v,{config:r}),m]});return jsx("section",{ref:u,className:a$1(y({spacing:n,background:c}),"px-6",e),...g,children:d?o:jsx(a,{size:l,padding:p,centered:true,children:o})})});S.displayName="Section";export{y as a,S as b};//# sourceMappingURL=chunk-VBABZXL7.mjs.map
3
+ //# sourceMappingURL=chunk-VBABZXL7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Section.tsx"],"names":["sectionVariants","cva","sectionLineStyle","SectionHeader","config","isCenter","jsxs","merge","jsx","Section","React","className","spacing","background","container","containerPadding","header","fullWidth","children","props","ref","content","Fragment","Container"],"mappings":"mMAOO,IAAMA,CAAAA,CAAkBC,GAAAA,CAAI,iBAAA,CAAmB,CACpD,QAAA,CAAU,CACR,OAAA,CAAS,CACP,IAAA,CAAM,EAAA,CACN,GAAI,gBAAA,CACJ,EAAA,CAAI,yBAAA,CACJ,EAAA,CAAI,gBAAA,CACJ,EAAA,CAAI,gBACN,CAAA,CACA,UAAA,CAAY,CACV,IAAA,CAAM,EAAA,CACN,KAAA,CAAO,cACP,MAAA,CAAQ,aAAA,CACR,OAAA,CAAS,cACX,CACF,CAAA,CACA,gBAAiB,CAAE,OAAA,CAAS,IAAA,CAAM,UAAA,CAAY,MAAO,CACvD,CAAC,CAAA,CAyBKC,CAAAA,CAAwC,CAC5C,KAAA,CAAO,MAAA,CACP,MAAA,CAAQ,MACR,YAAA,CAAc,QAAA,CACd,UAAA,CAAY,uHAAA,CACZ,YAAA,CAAc,QAChB,EAEA,SAASC,CAAAA,CAAc,CAAE,MAAA,CAAAC,CAAO,CAAA,CAAoC,CAClE,IAAMC,CAAAA,CAAWD,CAAAA,CAAO,KAAA,GAAU,MAAA,CAElC,OACEE,KAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,GAAAA,CAAM,OAAA,CAASF,CAAAA,EAAY,aAAa,EACrD,QAAA,CAAA,CAAAD,CAAAA,CAAO,SAAA,GAAc,KAAA,EACpBI,GAAAA,CAAC,KAAA,CAAA,CACC,MAAON,CAAAA,CACP,SAAA,CAAWK,GAAAA,CAAMF,CAAAA,EAAY,SAAS,CAAA,CACtC,cAAY,MAAA,CACd,CAAA,CAEFG,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,0CAAA,CACX,SAAAJ,CAAAA,CAAO,KAAA,CACV,CAAA,CACCA,CAAAA,CAAO,QAAA,EACNI,GAAAA,CAAC,KAAE,SAAA,CAAU,iDAAA,CACV,QAAA,CAAAJ,CAAAA,CAAO,QAAA,CACV,CAAA,CAEDA,EAAO,MAAA,EACNI,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CAAQ,QAAA,CAAAJ,EAAO,MAAA,CAAO,CAAA,CAAA,CAEzC,CAEJ,CAiBA,IAAMK,CAAAA,CAAUC,EAAM,UAAA,CACpB,CAAC,CACC,SAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,EACA,UAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CAAY,IAAA,CACZ,gBAAA,CAAAC,EAAmB,MAAA,CACnB,MAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CAAY,KAAA,CACZ,SAAAC,CAAAA,CACA,GAAGC,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAMC,CAAAA,CACJf,IAAAA,CAAAgB,QAAAA,CAAA,CACG,QAAA,CAAA,CAAAN,CAAAA,EAAUR,IAACL,CAAAA,CAAA,CAAc,MAAA,CAAQa,CAAAA,CAAQ,CAAA,CACzCE,CAAAA,CAAAA,CACH,EAGF,OACEV,GAAAA,CAAC,SAAA,CAAA,CACC,GAAA,CAAKY,CAAAA,CACL,SAAA,CAAWb,IACTP,CAAAA,CAAgB,CAAE,OAAA,CAAAY,CAAAA,CAAS,UAAA,CAAAC,CAAW,CAAC,CAAA,CACvC,MAAA,CACAF,CACF,CAAA,CACC,GAAGQ,CAAAA,CAEH,SAAAF,CAAAA,CAAYI,CAAAA,CACXb,GAAAA,CAACe,CAAAA,CAAA,CAAU,IAAA,CAAMT,EAAW,OAAA,CAASC,CAAAA,CAAkB,QAAA,CAAQ,IAAA,CAC5D,QAAA,CAAAM,CAAAA,CACH,EAEJ,CAEJ,CACF,EACAZ,CAAAA,CAAQ,WAAA,CAAc,SAAA","file":"chunk-VBABZXL7.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { Container, type ContainerProps } from \"./Container\"\n\nexport const sectionVariants = cva(\"relative w-full\", {\n variants: {\n spacing: {\n none: \"\",\n sm: \"py-12 sm:py-16\",\n md: \"py-16 sm:py-20 lg:py-24\",\n lg: \"py-20 sm:py-28\",\n xl: \"py-28 sm:py-36\",\n },\n background: {\n none: \"\",\n muted: \"bg-muted/30\",\n accent: \"bg-accent/5\",\n primary: \"bg-primary/5\",\n },\n },\n defaultVariants: { spacing: \"lg\", background: \"none\" },\n})\n\nexport interface SectionHeaderConfig {\n title: string\n subtitle?: string\n action?: React.ReactNode\n /** section-line 데코레이터 표시 @default true */\n decorator?: boolean\n /** 텍스트 정렬 @default 'center' */\n align?: 'left' | 'center'\n}\n\nexport interface SectionProps\n extends React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof sectionVariants> {\n /** Container 사이즈 @default 'lg' */\n container?: ContainerProps['size']\n /** Container 패딩 @default 'none' */\n containerPadding?: ContainerProps['padding']\n /** 섹션 헤더 설정 */\n header?: SectionHeaderConfig\n /** 풀위드 모드 (Container 없이 직접) */\n fullWidth?: boolean\n}\n\nconst sectionLineStyle: React.CSSProperties = {\n width: '80px',\n height: '3px',\n borderRadius: '9999px',\n background: 'linear-gradient(90deg, var(--color-primary, hsl(var(--primary))), var(--color-accent, hsl(var(--accent-foreground))))',\n marginBottom: '1.5rem',\n}\n\nfunction SectionHeader({ config }: { config: SectionHeaderConfig }) {\n const isCenter = config.align !== 'left'\n\n return (\n <div className={merge(\"mb-16\", isCenter && \"text-center\")}>\n {config.decorator !== false && (\n <div\n style={sectionLineStyle}\n className={merge(isCenter && \"mx-auto\")}\n aria-hidden=\"true\"\n />\n )}\n <h2 className=\"text-3xl md:text-5xl font-extrabold mb-4\">\n {config.title}\n </h2>\n {config.subtitle && (\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto\">\n {config.subtitle}\n </p>\n )}\n {config.action && (\n <div className=\"mt-6\">{config.action}</div>\n )}\n </div>\n )\n}\n\n/**\n * Section 컴포넌트\n *\n * 랜딩 페이지 섹션의 보일러플레이트를 줄이는 시맨틱 래퍼.\n * 내부적으로 Container를 사용하며, header prop으로 제목/부제/데코레이터를 자동 생성합니다.\n *\n * @example\n * <Section header={{ title: \"제목\", subtitle: \"부제\" }}>\n * {children}\n * </Section>\n *\n * <Section spacing=\"xl\" background=\"muted\" fullWidth>\n * {fullWidthContent}\n * </Section>\n */\nconst Section = React.forwardRef<HTMLElement, SectionProps>(\n ({\n className,\n spacing,\n background,\n container = \"lg\",\n containerPadding = \"none\",\n header,\n fullWidth = false,\n children,\n ...props\n }, ref) => {\n const content = (\n <>\n {header && <SectionHeader config={header} />}\n {children}\n </>\n )\n\n return (\n <section\n ref={ref}\n className={merge(\n sectionVariants({ spacing, background }),\n \"px-6\",\n className\n )}\n {...props}\n >\n {fullWidth ? content : (\n <Container size={container} padding={containerPadding} centered>\n {content}\n </Container>\n )}\n </section>\n )\n }\n)\nSection.displayName = \"Section\"\n\nexport { Section }\n"]}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import {a}from'./chunk-UUHAXGMO.mjs';import b,{createContext,useContext,useState,useCallback}from'react';import {jsxs,jsx}from'react/jsx-runtime';var f=createContext(void 0);function I(){let t=useContext(f);if(!t)throw new Error("useToast must be used within a ToastProvider");return t}var w=()=>{},k=()=>{},y=()=>{};function R(){let t=useContext(f);return t||{toasts:[],addToast:w,removeToast:k,clearToasts:y}}function S({children:t,maxToasts:n=5,position:a="top-right"}){let[r,s]=useState([]),i=useCallback(o=>{s(u=>u.filter(g=>g.id!==o));},[]),l=useCallback(o=>{let u=Math.random().toString(36).substr(2,9),g={...o,id:u};s(v=>[...v,g].slice(-n)),o.duration!==0&&setTimeout(()=>{i(u);},o.duration||5e3);},[n,i]),m=useCallback(()=>{s([]);},[]);return jsxs(f.Provider,{value:{toasts:r,addToast:l,removeToast:i,clearToasts:m},children:[t,jsx(C,{toasts:r,removeToast:i,position:a})]})}function C({toasts:t,removeToast:n,position:a$1}){let r={"top-right":"top-4 right-4","top-left":"top-4 left-4","bottom-right":"bottom-4 right-4","bottom-left":"bottom-4 left-4","top-center":"top-4 left-1/2 transform -translate-x-1/2","bottom-center":"bottom-4 left-1/2 transform -translate-x-1/2"};return t.length===0?null:jsx("div",{className:a("fixed z-50 space-y-3 max-w-sm",r[a$1]),children:t.map(s=>jsx(L,{toast:s,onRemove:n},s.id))})}function L({toast:t,onRemove:n}){let[a$1,r]=useState(false);b.useEffect(()=>{r(true);},[]);let s=()=>{r(false),setTimeout(()=>n(t.id),300);},i=o=>{switch(o){case "success":return "bg-[var(--toast-success-bg)] border-green-300 dark:border-green-700 text-green-800 dark:text-green-200 shadow-lg shadow-green-100/50 dark:shadow-none";case "error":return "bg-[var(--toast-error-bg)] border-red-300 dark:border-red-700 text-red-800 dark:text-red-200 shadow-lg shadow-red-100/50 dark:shadow-none";case "warning":return "bg-[var(--toast-warning-bg)] border-yellow-300 dark:border-yellow-700 text-yellow-800 dark:text-yellow-200 shadow-lg shadow-yellow-100/50 dark:shadow-none";case "info":return "bg-[var(--toast-info-bg)] border-indigo-300 dark:border-indigo-700 text-cyan-800 dark:text-cyan-200 shadow-lg shadow-indigo-100/50 dark:shadow-none"}},l=o=>{switch(o){case "success":return "text-green-500 dark:text-green-400";case "error":return "text-red-500 dark:text-red-400";case "warning":return "text-yellow-500 dark:text-yellow-400";case "info":return "text-cyan-500 dark:text-cyan-400"}},m=o=>{switch(o){case "success":return 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:"M5 13l4 4L19 7"})});case "error":return 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"})});case "warning":return 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:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})});case "info":return 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:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})}};return jsxs("div",{className:a("flex items-start p-4 rounded-xl border backdrop-blur-sm transition-all duration-300 transform",i(t.type),a$1?"translate-x-0 opacity-100 scale-100":"translate-x-full opacity-0 scale-95"),style:{animation:a$1?"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)":void 0},children:[jsxs("div",{className:a("flex-shrink-0 mr-3",l(t.type)),children:[" ",m(t.type)]}),jsxs("div",{className:"flex-1 min-w-0",children:[t.title&&jsxs("h4",{className:"text-sm font-semibold mb-1",children:[" ",t.title]}),jsx("p",{className:"text-sm leading-relaxed",children:t.message}),t.action&&jsx("button",{onClick:t.action.onClick,className:"mt-3 text-sm font-medium underline hover:no-underline transition-all duration-200",children:t.action.label})]}),jsxs("div",{className:"flex-shrink-0 ml-4",children:[" ",jsx("button",{onClick:s,className:a("inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2",l(t.type)),"aria-label":"\uB2EB\uAE30",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]})]})}export{I as a,R as b,S as c};//# sourceMappingURL=chunk-OSCMSA2Q.mjs.map
3
- //# sourceMappingURL=chunk-OSCMSA2Q.mjs.map
2
+ import {a}from'./chunk-QEMPERUK.mjs';import b,{createContext,useContext,useState,useCallback}from'react';import {jsxs,jsx}from'react/jsx-runtime';var f=createContext(void 0);function I(){let t=useContext(f);if(!t)throw new Error("useToast must be used within a ToastProvider");return t}var w=()=>{},k=()=>{},y=()=>{};function R(){let t=useContext(f);return t||{toasts:[],addToast:w,removeToast:k,clearToasts:y}}function S({children:t,maxToasts:n=5,position:a="top-right"}){let[r,s]=useState([]),i=useCallback(o=>{s(u=>u.filter(g=>g.id!==o));},[]),l=useCallback(o=>{let u=Math.random().toString(36).substr(2,9),g={...o,id:u};s(v=>[...v,g].slice(-n)),o.duration!==0&&setTimeout(()=>{i(u);},o.duration||5e3);},[n,i]),m=useCallback(()=>{s([]);},[]);return jsxs(f.Provider,{value:{toasts:r,addToast:l,removeToast:i,clearToasts:m},children:[t,jsx(C,{toasts:r,removeToast:i,position:a})]})}function C({toasts:t,removeToast:n,position:a$1}){let r={"top-right":"top-4 right-4","top-left":"top-4 left-4","bottom-right":"bottom-4 right-4","bottom-left":"bottom-4 left-4","top-center":"top-4 left-1/2 transform -translate-x-1/2","bottom-center":"bottom-4 left-1/2 transform -translate-x-1/2"};return t.length===0?null:jsx("div",{className:a("fixed z-50 space-y-3 max-w-sm",r[a$1]),children:t.map(s=>jsx(L,{toast:s,onRemove:n},s.id))})}function L({toast:t,onRemove:n}){let[a$1,r]=useState(false);b.useEffect(()=>{r(true);},[]);let s=()=>{r(false),setTimeout(()=>n(t.id),300);},i=o=>{switch(o){case "success":return "bg-[var(--toast-success-bg)] border-green-300 dark:border-green-700 text-green-800 dark:text-green-200 shadow-lg shadow-green-100/50 dark:shadow-none";case "error":return "bg-[var(--toast-error-bg)] border-red-300 dark:border-red-700 text-red-800 dark:text-red-200 shadow-lg shadow-red-100/50 dark:shadow-none";case "warning":return "bg-[var(--toast-warning-bg)] border-yellow-300 dark:border-yellow-700 text-yellow-800 dark:text-yellow-200 shadow-lg shadow-yellow-100/50 dark:shadow-none";case "info":return "bg-[var(--toast-info-bg)] border-indigo-300 dark:border-indigo-700 text-cyan-800 dark:text-cyan-200 shadow-lg shadow-indigo-100/50 dark:shadow-none"}},l=o=>{switch(o){case "success":return "text-green-500 dark:text-green-400";case "error":return "text-red-500 dark:text-red-400";case "warning":return "text-yellow-500 dark:text-yellow-400";case "info":return "text-cyan-500 dark:text-cyan-400"}},m=o=>{switch(o){case "success":return 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:"M5 13l4 4L19 7"})});case "error":return 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"})});case "warning":return 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:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})});case "info":return 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:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})}};return jsxs("div",{className:a("flex items-start p-4 rounded-xl border backdrop-blur-sm transition-all duration-300 transform",i(t.type),a$1?"translate-x-0 opacity-100 scale-100":"translate-x-full opacity-0 scale-95"),style:{animation:a$1?"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)":void 0},children:[jsxs("div",{className:a("flex-shrink-0 mr-3",l(t.type)),children:[" ",m(t.type)]}),jsxs("div",{className:"flex-1 min-w-0",children:[t.title&&jsxs("h4",{className:"text-sm font-semibold mb-1",children:[" ",t.title]}),jsx("p",{className:"text-sm leading-relaxed",children:t.message}),t.action&&jsx("button",{onClick:t.action.onClick,className:"mt-3 text-sm font-medium underline hover:no-underline transition-all duration-200",children:t.action.label})]}),jsxs("div",{className:"flex-shrink-0 ml-4",children:[" ",jsx("button",{onClick:s,className:a("inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2",l(t.type)),"aria-label":"\uB2EB\uAE30",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]})]})}export{I as a,R as b,S as c};//# sourceMappingURL=chunk-WYBSHTGY.mjs.map
3
+ //# sourceMappingURL=chunk-WYBSHTGY.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Toast.tsx"],"names":["ToastContext","createContext","useToast","context","useContext","noopAddToast","noopRemoveToast","noopClearToasts","useToastSafe","ToastProvider","children","maxToasts","position","toasts","setToasts","useState","removeToast","useCallback","id","prev","toast","addToast","newToast","clearToasts","jsxs","jsx","ToastContainer","positionClasses","merge","ToastItem","onRemove","isVisible","setIsVisible","React","handleRemove","getToastStyles","type","getIconStyles","getToastIcon"],"mappings":"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","file":"chunk-OSCMSA2Q.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { createContext, useContext, useState, useCallback } from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Toast 메시지 타입 / Toast message type\n * @typedef {Object} Toast\n * @property {string} id - Toast 고유 ID / Toast unique ID\n * @property {\"success\" | \"error\" | \"warning\" | \"info\"} type - Toast 타입 / Toast type\n * @property {string} [title] - Toast 제목 / Toast title\n * @property {string} message - Toast 메시지 / Toast message\n * @property {number} [duration] - 표시 시간(ms), 0이면 자동 제거 안 함 / Display duration (ms), 0 means no auto-remove\n * @property {Object} [action] - 액션 버튼 / Action button\n * @property {string} action.label - 액션 버튼 레이블 / Action button label\n * @property {() => void} action.onClick - 액션 버튼 클릭 핸들러 / Action button click handler\n */\nexport interface Toast {\n id: string\n type: \"success\" | \"error\" | \"warning\" | \"info\"\n title?: string\n message: string\n duration?: number\n action?: {\n label: string\n onClick: () => void\n }\n}\n\n// Toast Context 타입\ninterface ToastContextType {\n toasts: Toast[]\n addToast: (toast: Omit<Toast, \"id\">) => void\n removeToast: (id: string) => void\n clearToasts: () => void\n}\n\n// Toast Context 생성\nconst ToastContext = createContext<ToastContextType | undefined>(undefined)\n\n/**\n * useToast Hook\n *\n * Toast를 추가, 제거, 초기화하는 훅입니다.\n * ToastProvider 내부에서만 사용 가능합니다.\n *\n * Hook for adding, removing, and clearing toasts.\n * Can only be used within ToastProvider.\n *\n * @example\n * const { addToast, removeToast, clearToasts } = useToast()\n *\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * duration: 3000\n * })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 / Toast context value\n * @throws {Error} ToastProvider 외부에서 사용 시 에러 발생 / Error when used outside ToastProvider\n */\nexport function useToast(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\")\n }\n return context\n}\n\n// No-op functions for safe toast hook\nconst noopAddToast = () => {}\nconst noopRemoveToast = () => {}\nconst noopClearToasts = () => {}\n\n/**\n * useToastSafe Hook\n *\n * ToastProvider 없이도 안전하게 사용할 수 있는 useToast 훅입니다.\n * Provider가 없으면 no-op 함수를 반환합니다.\n *\n * Safe version of useToast that works without ToastProvider.\n * Returns no-op functions when used outside ToastProvider.\n *\n * @example\n * const { addToast } = useToastSafe()\n *\n * // 안전하게 호출 가능 - Provider 없으면 아무 일도 안 함\n * addToast({ type: \"success\", message: \"저장됨\" })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 또는 no-op 함수들\n */\nexport function useToastSafe(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n return {\n toasts: [],\n addToast: noopAddToast,\n removeToast: noopRemoveToast,\n clearToasts: noopClearToasts,\n }\n }\n return context\n}\n\n/**\n * ToastProvider 컴포넌트의 props / ToastProvider component props\n * @typedef {Object} ToastProviderProps\n * @property {React.ReactNode} children - 자식 컴포넌트 / Child components\n * @property {number} [maxToasts=5] - 최대 Toast 개수 / Maximum number of toasts\n * @property {\"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"} [position=\"top-right\"] - Toast 표시 위치 / Toast display position\n */\ninterface ToastProviderProps {\n children: React.ReactNode\n maxToasts?: number\n position?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"\n}\n\n/**\n * ToastProvider 컴포넌트 / ToastProvider component\n * \n * Toast 시스템의 컨텍스트를 제공하는 Provider 컴포넌트입니다.\n * 앱의 루트 레벨에서 사용하여 전역 Toast 기능을 활성화합니다.\n * \n * Provider component that provides context for the Toast system.\n * Use at the root level of your app to enable global Toast functionality.\n * \n * @component\n * @example\n * // App.tsx\n * <ToastProvider position=\"top-center\" maxToasts={3}>\n * <App />\n * </ToastProvider>\n * \n * @example\n * // 컴포넌트에서 사용 / Usage in component\n * const { addToast } = useToast()\n * \n * const handleSave = () => {\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * title: \"성공\"\n * })\n * }\n * \n * @param {ToastProviderProps} props - ToastProvider 컴포넌트의 props / ToastProvider component props\n * @returns {JSX.Element} ToastProvider 컴포넌트 / ToastProvider component\n * \n * @todo 접근성 개선: ToastItem에 role=\"alert\" 또는 role=\"status\" 추가 필요 / Accessibility: Add role=\"alert\" or role=\"status\" to ToastItem\n * @todo 접근성 개선: aria-live=\"polite\" 또는 aria-live=\"assertive\" 추가 필요 / Accessibility: Add aria-live=\"polite\" or aria-live=\"assertive\"\n */\nexport function ToastProvider({\n children,\n maxToasts = 5,\n position = \"top-right\"\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<Toast[]>([])\n\n const removeToast = useCallback((id: string) => {\n setToasts(prev => prev.filter(toast => toast.id !== id))\n }, [])\n\n const addToast = useCallback((toast: Omit<Toast, \"id\">) => {\n const id = Math.random().toString(36).substr(2, 9)\n const newToast: Toast = { ...toast, id }\n\n setToasts(prev => {\n const updatedToasts = [...prev, newToast]\n return updatedToasts.slice(-maxToasts) // 최대 개수 제한\n })\n\n // 자동 제거\n if (toast.duration !== 0) {\n setTimeout(() => {\n removeToast(id)\n }, toast.duration || 5000)\n }\n }, [maxToasts, removeToast])\n\n const clearToasts = useCallback(() => {\n setToasts([])\n }, [])\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast, clearToasts }}>\n {children}\n <ToastContainer toasts={toasts} removeToast={removeToast} position={position} />\n </ToastContext.Provider>\n )\n}\n\n// Toast Container Props\ninterface ToastContainerProps {\n toasts: Toast[]\n removeToast: (id: string) => void\n position: string\n}\n\n// Toast Container\nfunction ToastContainer({ toasts, removeToast, position }: ToastContainerProps) {\n const positionClasses = {\n \"top-right\": \"top-4 right-4\",\n \"top-left\": \"top-4 left-4\",\n \"bottom-right\": \"bottom-4 right-4\",\n \"bottom-left\": \"bottom-4 left-4\",\n \"top-center\": \"top-4 left-1/2 transform -translate-x-1/2\",\n \"bottom-center\": \"bottom-4 left-1/2 transform -translate-x-1/2\"\n }\n\n if (toasts.length === 0) return null\n\n return (\n <div className={merge(\n \"fixed z-50 space-y-3 max-w-sm\", // 12px 간격\n positionClasses[position as keyof typeof positionClasses]\n )}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n )\n}\n\n// Toast Item Props\ninterface ToastItemProps {\n toast: Toast\n onRemove: (id: string) => void\n}\n\n// Toast Item\nfunction ToastItem({ toast, onRemove }: ToastItemProps) {\n const [isVisible, setIsVisible] = useState(false)\n\n React.useEffect(() => {\n setIsVisible(true)\n }, [])\n\n const handleRemove = () => {\n setIsVisible(false)\n setTimeout(() => onRemove(toast.id), 300)\n }\n\n // CSS 변수 기반 배경색 (Tailwind v4 dark: variant + bg-color 충돌 우회)\n // 앱에서 --toast-*-bg 변수 정의 필요\n const getToastStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"bg-[var(--toast-success-bg)] border-green-300 dark:border-green-700 text-green-800 dark:text-green-200 shadow-lg shadow-green-100/50 dark:shadow-none\"\n case \"error\":\n return \"bg-[var(--toast-error-bg)] border-red-300 dark:border-red-700 text-red-800 dark:text-red-200 shadow-lg shadow-red-100/50 dark:shadow-none\"\n case \"warning\":\n return \"bg-[var(--toast-warning-bg)] border-yellow-300 dark:border-yellow-700 text-yellow-800 dark:text-yellow-200 shadow-lg shadow-yellow-100/50 dark:shadow-none\"\n case \"info\":\n return \"bg-[var(--toast-info-bg)] border-indigo-300 dark:border-indigo-700 text-cyan-800 dark:text-cyan-200 shadow-lg shadow-indigo-100/50 dark:shadow-none\"\n }\n }\n\n const getIconStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n }\n }\n\n const getToastIcon = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return (\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=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"error\":\n return (\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 )\n case \"warning\":\n return (\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=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"info\":\n return (\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=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n }\n }\n\n return (\n <div\n className={merge(\n \"flex items-start p-4 rounded-xl border backdrop-blur-sm transition-all duration-300 transform\",\n getToastStyles(toast.type),\n isVisible\n ? \"translate-x-0 opacity-100 scale-100\"\n : \"translate-x-full opacity-0 scale-95\"\n )}\n style={{\n animation: isVisible ? \"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)\" : undefined\n }}\n >\n {/* 아이콘 */}\n <div className={merge(\"flex-shrink-0 mr-3\", getIconStyles(toast.type))}> {/* 12px 여백 */}\n {getToastIcon(toast.type)}\n </div>\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {toast.title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {toast.title}\n </h4>\n )}\n <p className=\"text-sm leading-relaxed\">\n {toast.message}\n </p>\n\n {/* 액션 버튼 */}\n {toast.action && (\n <button\n onClick={toast.action.onClick}\n className=\"mt-3 text-sm font-medium underline hover:no-underline transition-all duration-200\" // 12px 여백\n >\n {toast.action.label}\n </button>\n )}\n </div>\n\n {/* 닫기 버튼 */}\n <div className=\"flex-shrink-0 ml-4\"> {/* 16px 여백 */}\n <button\n onClick={handleRemove}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconStyles(toast.type)\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" 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 </div>\n </div>\n )\n}\n\n// 편의 함수들 (ToastProvider 내부에서만 사용 가능 - 스텁 함수)\nexport const showToast = (_toast: Omit<Toast, \"id\">) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showSuccessToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showErrorToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showWarningToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showInfoToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n} "]}
1
+ {"version":3,"sources":["../src/components/Toast.tsx"],"names":["ToastContext","createContext","useToast","context","useContext","noopAddToast","noopRemoveToast","noopClearToasts","useToastSafe","ToastProvider","children","maxToasts","position","toasts","setToasts","useState","removeToast","useCallback","id","prev","toast","addToast","newToast","clearToasts","jsxs","jsx","ToastContainer","positionClasses","merge","ToastItem","onRemove","isVisible","setIsVisible","React","handleRemove","getToastStyles","type","getIconStyles","getToastIcon"],"mappings":"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","file":"chunk-WYBSHTGY.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { createContext, useContext, useState, useCallback } from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Toast 메시지 타입 / Toast message type\n * @typedef {Object} Toast\n * @property {string} id - Toast 고유 ID / Toast unique ID\n * @property {\"success\" | \"error\" | \"warning\" | \"info\"} type - Toast 타입 / Toast type\n * @property {string} [title] - Toast 제목 / Toast title\n * @property {string} message - Toast 메시지 / Toast message\n * @property {number} [duration] - 표시 시간(ms), 0이면 자동 제거 안 함 / Display duration (ms), 0 means no auto-remove\n * @property {Object} [action] - 액션 버튼 / Action button\n * @property {string} action.label - 액션 버튼 레이블 / Action button label\n * @property {() => void} action.onClick - 액션 버튼 클릭 핸들러 / Action button click handler\n */\nexport interface Toast {\n id: string\n type: \"success\" | \"error\" | \"warning\" | \"info\"\n title?: string\n message: string\n duration?: number\n action?: {\n label: string\n onClick: () => void\n }\n}\n\n// Toast Context 타입\ninterface ToastContextType {\n toasts: Toast[]\n addToast: (toast: Omit<Toast, \"id\">) => void\n removeToast: (id: string) => void\n clearToasts: () => void\n}\n\n// Toast Context 생성\nconst ToastContext = createContext<ToastContextType | undefined>(undefined)\n\n/**\n * useToast Hook\n *\n * Toast를 추가, 제거, 초기화하는 훅입니다.\n * ToastProvider 내부에서만 사용 가능합니다.\n *\n * Hook for adding, removing, and clearing toasts.\n * Can only be used within ToastProvider.\n *\n * @example\n * const { addToast, removeToast, clearToasts } = useToast()\n *\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * duration: 3000\n * })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 / Toast context value\n * @throws {Error} ToastProvider 외부에서 사용 시 에러 발생 / Error when used outside ToastProvider\n */\nexport function useToast(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\")\n }\n return context\n}\n\n// No-op functions for safe toast hook\nconst noopAddToast = () => {}\nconst noopRemoveToast = () => {}\nconst noopClearToasts = () => {}\n\n/**\n * useToastSafe Hook\n *\n * ToastProvider 없이도 안전하게 사용할 수 있는 useToast 훅입니다.\n * Provider가 없으면 no-op 함수를 반환합니다.\n *\n * Safe version of useToast that works without ToastProvider.\n * Returns no-op functions when used outside ToastProvider.\n *\n * @example\n * const { addToast } = useToastSafe()\n *\n * // 안전하게 호출 가능 - Provider 없으면 아무 일도 안 함\n * addToast({ type: \"success\", message: \"저장됨\" })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 또는 no-op 함수들\n */\nexport function useToastSafe(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n return {\n toasts: [],\n addToast: noopAddToast,\n removeToast: noopRemoveToast,\n clearToasts: noopClearToasts,\n }\n }\n return context\n}\n\n/**\n * ToastProvider 컴포넌트의 props / ToastProvider component props\n * @typedef {Object} ToastProviderProps\n * @property {React.ReactNode} children - 자식 컴포넌트 / Child components\n * @property {number} [maxToasts=5] - 최대 Toast 개수 / Maximum number of toasts\n * @property {\"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"} [position=\"top-right\"] - Toast 표시 위치 / Toast display position\n */\ninterface ToastProviderProps {\n children: React.ReactNode\n maxToasts?: number\n position?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"\n}\n\n/**\n * ToastProvider 컴포넌트 / ToastProvider component\n * \n * Toast 시스템의 컨텍스트를 제공하는 Provider 컴포넌트입니다.\n * 앱의 루트 레벨에서 사용하여 전역 Toast 기능을 활성화합니다.\n * \n * Provider component that provides context for the Toast system.\n * Use at the root level of your app to enable global Toast functionality.\n * \n * @component\n * @example\n * // App.tsx\n * <ToastProvider position=\"top-center\" maxToasts={3}>\n * <App />\n * </ToastProvider>\n * \n * @example\n * // 컴포넌트에서 사용 / Usage in component\n * const { addToast } = useToast()\n * \n * const handleSave = () => {\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * title: \"성공\"\n * })\n * }\n * \n * @param {ToastProviderProps} props - ToastProvider 컴포넌트의 props / ToastProvider component props\n * @returns {JSX.Element} ToastProvider 컴포넌트 / ToastProvider component\n * \n * @todo 접근성 개선: ToastItem에 role=\"alert\" 또는 role=\"status\" 추가 필요 / Accessibility: Add role=\"alert\" or role=\"status\" to ToastItem\n * @todo 접근성 개선: aria-live=\"polite\" 또는 aria-live=\"assertive\" 추가 필요 / Accessibility: Add aria-live=\"polite\" or aria-live=\"assertive\"\n */\nexport function ToastProvider({\n children,\n maxToasts = 5,\n position = \"top-right\"\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<Toast[]>([])\n\n const removeToast = useCallback((id: string) => {\n setToasts(prev => prev.filter(toast => toast.id !== id))\n }, [])\n\n const addToast = useCallback((toast: Omit<Toast, \"id\">) => {\n const id = Math.random().toString(36).substr(2, 9)\n const newToast: Toast = { ...toast, id }\n\n setToasts(prev => {\n const updatedToasts = [...prev, newToast]\n return updatedToasts.slice(-maxToasts) // 최대 개수 제한\n })\n\n // 자동 제거\n if (toast.duration !== 0) {\n setTimeout(() => {\n removeToast(id)\n }, toast.duration || 5000)\n }\n }, [maxToasts, removeToast])\n\n const clearToasts = useCallback(() => {\n setToasts([])\n }, [])\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast, clearToasts }}>\n {children}\n <ToastContainer toasts={toasts} removeToast={removeToast} position={position} />\n </ToastContext.Provider>\n )\n}\n\n// Toast Container Props\ninterface ToastContainerProps {\n toasts: Toast[]\n removeToast: (id: string) => void\n position: string\n}\n\n// Toast Container\nfunction ToastContainer({ toasts, removeToast, position }: ToastContainerProps) {\n const positionClasses = {\n \"top-right\": \"top-4 right-4\",\n \"top-left\": \"top-4 left-4\",\n \"bottom-right\": \"bottom-4 right-4\",\n \"bottom-left\": \"bottom-4 left-4\",\n \"top-center\": \"top-4 left-1/2 transform -translate-x-1/2\",\n \"bottom-center\": \"bottom-4 left-1/2 transform -translate-x-1/2\"\n }\n\n if (toasts.length === 0) return null\n\n return (\n <div className={merge(\n \"fixed z-50 space-y-3 max-w-sm\", // 12px 간격\n positionClasses[position as keyof typeof positionClasses]\n )}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n )\n}\n\n// Toast Item Props\ninterface ToastItemProps {\n toast: Toast\n onRemove: (id: string) => void\n}\n\n// Toast Item\nfunction ToastItem({ toast, onRemove }: ToastItemProps) {\n const [isVisible, setIsVisible] = useState(false)\n\n React.useEffect(() => {\n setIsVisible(true)\n }, [])\n\n const handleRemove = () => {\n setIsVisible(false)\n setTimeout(() => onRemove(toast.id), 300)\n }\n\n // CSS 변수 기반 배경색 (Tailwind v4 dark: variant + bg-color 충돌 우회)\n // 앱에서 --toast-*-bg 변수 정의 필요\n const getToastStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"bg-[var(--toast-success-bg)] border-green-300 dark:border-green-700 text-green-800 dark:text-green-200 shadow-lg shadow-green-100/50 dark:shadow-none\"\n case \"error\":\n return \"bg-[var(--toast-error-bg)] border-red-300 dark:border-red-700 text-red-800 dark:text-red-200 shadow-lg shadow-red-100/50 dark:shadow-none\"\n case \"warning\":\n return \"bg-[var(--toast-warning-bg)] border-yellow-300 dark:border-yellow-700 text-yellow-800 dark:text-yellow-200 shadow-lg shadow-yellow-100/50 dark:shadow-none\"\n case \"info\":\n return \"bg-[var(--toast-info-bg)] border-indigo-300 dark:border-indigo-700 text-cyan-800 dark:text-cyan-200 shadow-lg shadow-indigo-100/50 dark:shadow-none\"\n }\n }\n\n const getIconStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n }\n }\n\n const getToastIcon = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return (\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=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"error\":\n return (\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 )\n case \"warning\":\n return (\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=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"info\":\n return (\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=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n }\n }\n\n return (\n <div\n className={merge(\n \"flex items-start p-4 rounded-xl border backdrop-blur-sm transition-all duration-300 transform\",\n getToastStyles(toast.type),\n isVisible\n ? \"translate-x-0 opacity-100 scale-100\"\n : \"translate-x-full opacity-0 scale-95\"\n )}\n style={{\n animation: isVisible ? \"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)\" : undefined\n }}\n >\n {/* 아이콘 */}\n <div className={merge(\"flex-shrink-0 mr-3\", getIconStyles(toast.type))}> {/* 12px 여백 */}\n {getToastIcon(toast.type)}\n </div>\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {toast.title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {toast.title}\n </h4>\n )}\n <p className=\"text-sm leading-relaxed\">\n {toast.message}\n </p>\n\n {/* 액션 버튼 */}\n {toast.action && (\n <button\n onClick={toast.action.onClick}\n className=\"mt-3 text-sm font-medium underline hover:no-underline transition-all duration-200\" // 12px 여백\n >\n {toast.action.label}\n </button>\n )}\n </div>\n\n {/* 닫기 버튼 */}\n <div className=\"flex-shrink-0 ml-4\"> {/* 16px 여백 */}\n <button\n onClick={handleRemove}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconStyles(toast.type)\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" 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 </div>\n </div>\n )\n}\n\n// 편의 함수들 (ToastProvider 내부에서만 사용 가능 - 스텁 함수)\nexport const showToast = (_toast: Omit<Toast, \"id\">) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showSuccessToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showErrorToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showWarningToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showInfoToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n} "]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import {d,a}from'./chunk-QEMPERUK.mjs';import {House}from'@phosphor-icons/react/dist/ssr/House';import {ArrowLeft}from'@phosphor-icons/react/dist/ssr/ArrowLeft';import {ArrowRight}from'@phosphor-icons/react/dist/ssr/ArrowRight';import {ArrowUp}from'@phosphor-icons/react/dist/ssr/ArrowUp';import {ArrowDown}from'@phosphor-icons/react/dist/ssr/ArrowDown';import {List}from'@phosphor-icons/react/dist/ssr/List';import {X}from'@phosphor-icons/react/dist/ssr/X';import {MagnifyingGlass}from'@phosphor-icons/react/dist/ssr/MagnifyingGlass';import {Gear}from'@phosphor-icons/react/dist/ssr/Gear';import {ArrowSquareOut}from'@phosphor-icons/react/dist/ssr/ArrowSquareOut';import {CaretLeft}from'@phosphor-icons/react/dist/ssr/CaretLeft';import {CaretRight}from'@phosphor-icons/react/dist/ssr/CaretRight';import {CaretDown}from'@phosphor-icons/react/dist/ssr/CaretDown';import {CaretUp}from'@phosphor-icons/react/dist/ssr/CaretUp';import {Pencil}from'@phosphor-icons/react/dist/ssr/Pencil';import {Trash}from'@phosphor-icons/react/dist/ssr/Trash';import {Plus}from'@phosphor-icons/react/dist/ssr/Plus';import {Minus}from'@phosphor-icons/react/dist/ssr/Minus';import {Download}from'@phosphor-icons/react/dist/ssr/Download';import {Upload}from'@phosphor-icons/react/dist/ssr/Upload';import {ArrowClockwise}from'@phosphor-icons/react/dist/ssr/ArrowClockwise';import {FloppyDisk}from'@phosphor-icons/react/dist/ssr/FloppyDisk';import {Copy}from'@phosphor-icons/react/dist/ssr/Copy';import {TextB}from'@phosphor-icons/react/dist/ssr/TextB';import {TextItalic}from'@phosphor-icons/react/dist/ssr/TextItalic';import {TextStrikethrough}from'@phosphor-icons/react/dist/ssr/TextStrikethrough';import {TextHOne}from'@phosphor-icons/react/dist/ssr/TextHOne';import {Link}from'@phosphor-icons/react/dist/ssr/Link';import {Code}from'@phosphor-icons/react/dist/ssr/Code';import {FileCode}from'@phosphor-icons/react/dist/ssr/FileCode';import {Quotes}from'@phosphor-icons/react/dist/ssr/Quotes';import {ListNumbers}from'@phosphor-icons/react/dist/ssr/ListNumbers';import {SpinnerGap}from'@phosphor-icons/react/dist/ssr/SpinnerGap';import {CheckCircle}from'@phosphor-icons/react/dist/ssr/CheckCircle';import {XCircle}from'@phosphor-icons/react/dist/ssr/XCircle';import {WarningCircle}from'@phosphor-icons/react/dist/ssr/WarningCircle';import {Info}from'@phosphor-icons/react/dist/ssr/Info';import {Check}from'@phosphor-icons/react/dist/ssr/Check';import {Circle}from'@phosphor-icons/react/dist/ssr/Circle';import {Question}from'@phosphor-icons/react/dist/ssr/Question';import {User}from'@phosphor-icons/react/dist/ssr/User';import {Users}from'@phosphor-icons/react/dist/ssr/Users';import {UserPlus}from'@phosphor-icons/react/dist/ssr/UserPlus';import {SignIn}from'@phosphor-icons/react/dist/ssr/SignIn';import {SignOut}from'@phosphor-icons/react/dist/ssr/SignOut';import {Eye}from'@phosphor-icons/react/dist/ssr/Eye';import {EyeSlash}from'@phosphor-icons/react/dist/ssr/EyeSlash';import {ChartBar}from'@phosphor-icons/react/dist/ssr/ChartBar';import {TrendUp}from'@phosphor-icons/react/dist/ssr/TrendUp';import {Pulse}from'@phosphor-icons/react/dist/ssr/Pulse';import {Database}from'@phosphor-icons/react/dist/ssr/Database';import {Lightning}from'@phosphor-icons/react/dist/ssr/Lightning';import {FileText}from'@phosphor-icons/react/dist/ssr/FileText';import {File}from'@phosphor-icons/react/dist/ssr/File';import {Folder}from'@phosphor-icons/react/dist/ssr/Folder';import {Book}from'@phosphor-icons/react/dist/ssr/Book';import {BookOpen}from'@phosphor-icons/react/dist/ssr/BookOpen';import {Envelope}from'@phosphor-icons/react/dist/ssr/Envelope';import {ChatCircle}from'@phosphor-icons/react/dist/ssr/ChatCircle';import {Phone}from'@phosphor-icons/react/dist/ssr/Phone';import {Image}from'@phosphor-icons/react/dist/ssr/Image';import {Video}from'@phosphor-icons/react/dist/ssr/Video';import {Camera}from'@phosphor-icons/react/dist/ssr/Camera';import {Smiley}from'@phosphor-icons/react/dist/ssr/Smiley';import {SmileySad}from'@phosphor-icons/react/dist/ssr/SmileySad';import {SmileyMeh}from'@phosphor-icons/react/dist/ssr/SmileyMeh';import {Lock}from'@phosphor-icons/react/dist/ssr/Lock';import {LockOpen}from'@phosphor-icons/react/dist/ssr/LockOpen';import {Shield}from'@phosphor-icons/react/dist/ssr/Shield';import {Wallet}from'@phosphor-icons/react/dist/ssr/Wallet';import {Key}from'@phosphor-icons/react/dist/ssr/Key';import {CurrencyDollar}from'@phosphor-icons/react/dist/ssr/CurrencyDollar';import {Clock}from'@phosphor-icons/react/dist/ssr/Clock';import {Calendar}from'@phosphor-icons/react/dist/ssr/Calendar';import {CalendarPlus}from'@phosphor-icons/react/dist/ssr/CalendarPlus';import {Bell}from'@phosphor-icons/react/dist/ssr/Bell';import {Heart}from'@phosphor-icons/react/dist/ssr/Heart';import {Star}from'@phosphor-icons/react/dist/ssr/Star';import {Bookmark}from'@phosphor-icons/react/dist/ssr/Bookmark';import {Share}from'@phosphor-icons/react/dist/ssr/Share';import {Monitor}from'@phosphor-icons/react/dist/ssr/Monitor';import {Sun}from'@phosphor-icons/react/dist/ssr/Sun';import {Moon}from'@phosphor-icons/react/dist/ssr/Moon';import {Lightbulb}from'@phosphor-icons/react/dist/ssr/Lightbulb';import {Brain}from'@phosphor-icons/react/dist/ssr/Brain';import {Flag}from'@phosphor-icons/react/dist/ssr/Flag';import {Square}from'@phosphor-icons/react/dist/ssr/Square';import {Sparkle}from'@phosphor-icons/react/dist/ssr/Sparkle';import {Globe}from'@phosphor-icons/react/dist/ssr/Globe';import {DeviceMobile}from'@phosphor-icons/react/dist/ssr/DeviceMobile';import {Ticket}from'@phosphor-icons/react/dist/ssr/Ticket';import {Clipboard}from'@phosphor-icons/react/dist/ssr/Clipboard';import {WifiHigh}from'@phosphor-icons/react/dist/ssr/WifiHigh';import {WifiSlash}from'@phosphor-icons/react/dist/ssr/WifiSlash';import {Cpu}from'@phosphor-icons/react/dist/ssr/Cpu';import {MaskHappy}from'@phosphor-icons/react/dist/ssr/MaskHappy';import {Rocket}from'@phosphor-icons/react/dist/ssr/Rocket';import {Layout}from'@phosphor-icons/react/dist/ssr/Layout';import {Megaphone}from'@phosphor-icons/react/dist/ssr/Megaphone';import {Stack}from'@phosphor-icons/react/dist/ssr/Stack';import {Prohibit}from'@phosphor-icons/react/dist/ssr/Prohibit';import t,{createContext,useContext}from'react';import {jsx}from'react/jsx-runtime';var $={home:House,arrowLeft:ArrowLeft,arrowRight:ArrowRight,arrowUp:ArrowUp,arrowDown:ArrowDown,menu:List,x:X,close:X,search:MagnifyingGlass,settings:Gear,externalLink:ArrowSquareOut,chevronLeft:CaretLeft,chevronRight:CaretRight,chevronDown:CaretDown,chevronUp:CaretUp,edit:Pencil,delete:Trash,add:Plus,remove:Minus,download:Download,upload:Upload,refresh:ArrowClockwise,save:FloppyDisk,copy:Copy,loader:SpinnerGap,success:CheckCircle,error:XCircle,alertCircle:WarningCircle,warning:WarningCircle,info:Info,check:Check,circle:Circle,helpCircle:Question,user:User,users:Users,userPlus:UserPlus,logIn:SignIn,logOut:SignOut,eye:Eye,eyeOff:EyeSlash,chart:ChartBar,barChart:ChartBar,trendingUp:TrendUp,activity:Pulse,database:Database,zap:Lightning,fileText:FileText,file:File,folder:Folder,book:Book,bookOpen:BookOpen,mail:Envelope,message:ChatCircle,phone:Phone,image:Image,video:Video,camera:Camera,smile:Smiley,frown:SmileySad,meh:SmileyMeh,lock:Lock,unlock:LockOpen,shield:Shield,wallet:Wallet,key:Key,dollar:CurrencyDollar,dollarSign:CurrencyDollar,currency:CurrencyDollar,clock:Clock,calendar:Calendar,calendarPlus:CalendarPlus,bell:Bell,heart:Heart,star:Star,bookmark:Bookmark,share:Share,monitor:Monitor,sun:Sun,moon:Moon,lightbulb:Lightbulb,brain:Brain,flag:Flag,square:Square,sparkle:Sparkle,sparkles:Sparkle,globe:Globe,smartphone:DeviceMobile,deviceMobile:DeviceMobile,floppyDisk:FloppyDisk,ticket:Ticket,clipboard:Clipboard,wifi:WifiHigh,wifiOff:WifiSlash,cpu:Cpu,mask:MaskHappy,rocket:Rocket,layout:Layout,megaphone:Megaphone,layers:Stack,ban:Prohibit,bold:TextB,italic:TextItalic,strikethrough:TextStrikethrough,heading:TextHOne,link:Link,code:Code,fileCode:FileCode,quote:Quotes,list:List,listOrdered:ListNumbers,minus:Minus},Q={happy:"smile",sad:"frown",neutral:"meh",excited:"smile",angry:"frown",love:"heart",like:"heart",dislike:"frown"},Z={loading:"loader",success:"success",error:"error",warning:"warning",info:"info",locked:"lock",unlocked:"unlock",visible:"eye",hidden:"eyeOff"},rt={navigation:["home","arrowLeft","arrowRight","arrowUp","arrowDown","menu","close","search","settings","externalLink","chevronLeft","chevronRight","chevronDown","chevronUp"],actions:["edit","delete","add","remove","download","upload","refresh","save","copy"],status:["loader","success","error","alertCircle","warning","info","check","circle"],user:["user","users","userPlus","logIn","logOut","eye","eyeOff"],data:["chart","barChart","trendingUp","activity","database","zap"],files:["fileText","file","folder","book"],communication:["mail","message","phone"],media:["image","video","camera"],emotions:["smile","frown","meh"],security:["lock","unlock","shield"],time:["clock","calendar"],ui:["bell","heart","star","bookmark","share"],theme:["monitor","sun","moon"]};var g={"arrow-left":"arrowLeft","arrow-right":"arrowRight","arrow-up":"arrowUp","arrow-down":"arrowDown","chevron-left":"chevronLeft","chevron-right":"chevronRight","chevron-up":"chevronUp","chevron-down":"chevronDown","external-link":"externalLink","more-horizontal":"moreHorizontal","more-vertical":"moreVertical","user-plus":"userPlus","log-in":"logIn","log-out":"logOut","check-circle":"checkCircle","check-square":"checkSquare","alert-circle":"alertCircle","eye-off":"eyeOff","file-text":"fileText","book-open":"bookOpen","bar-chart":"barChart","trending-up":"trendingUp","trending-down":"trendingDown","message-square":"messageSquare","calendar-plus":"calendarPlus","refresh-cw":"refreshCw","dollar-sign":"dollarSign","layout-dashboard":"layoutDashboard","device-mobile":"deviceMobile","floppy-disk":"floppyDisk",back:"arrowLeft",prev:"arrowLeft",previous:"arrowLeft",forward:"arrowRight",next:"arrowRight",close:"x",cancel:"x",remove:"delete",trash:"delete",plus:"add",new:"add",pencil:"edit",modify:"edit",store:"save",floppy:"save",magnify:"search",person:"user",account:"user",profile:"user",gear:"settings",config:"settings",preferences:"settings",house:"home",main:"home",done:"check",complete:"check",tick:"check",information:"info",help:"info",alert:"warning",caution:"warning",checkmark:"success",checkCircle:"success",fail:"error",cross:"error",xCircle:"error",spinner:"loader",loading:"loader",wait:"loader",reload:"refresh",update:"refresh",sync:"refresh",show:"eye",view:"eye",hide:"eyeOff",hidden:"eyeOff",secure:"lock",locked:"lock",unsecure:"unlock",unlocked:"unlock",get:"download",fetch:"download",post:"upload",send:"share",export:"share",duplicate:"copy",clone:"copy",email:"mail",envelope:"mail",chat:"message",comment:"message",talk:"message",date:"calendar",schedule:"calendar",time:"clock",watch:"clock",document:"fileText",doc:"fileText",text:"fileText",directory:"folder",dir:"folder",picture:"image",img:"image",movie:"video",film:"video",photo:"camera",capture:"camera",start:"play",run:"play",stop:"pause",halt:"pause",like:"heart",love:"heart",favorite:"star",saveBookmark:"bookmark",notification:"bell",notify:"bell",alarm:"bell",prefs:"settings",lookup:"search",dots:"moreHorizontal",moreMenu:"moreHorizontal",moreOptions:"moreVertical",external:"externalLink",outbound:"externalLink",open:"externalLink",url:"link",hyperlink:"link",graph:"barChart",stats:"barChart",analytics:"barChart",db:"database",storage:"database",pulse:"activity",monitor:"activity",up:"trendingUp",down:"trendingDown",lightning:"zap",bolt:"zap",flash:"zap",security:"shield",protect:"shield",password:"key",secret:"key",signin:"logIn",login:"logIn",enter:"logIn",signout:"logOut",logout:"logOut",exit:"logOut",people:"users",group:"users",team:"users",addUser:"userPlus",invite:"userPlus",read:"book",library:"book",reading:"bookOpen",openBook:"bookOpen",light:"sun",day:"sun",dark:"moon",night:"moon",screen:"monitor",display:"monitor",ai:"brain",intelligence:"brain",think:"brain",idea:"lightbulb",bulb:"lightbulb",inspiration:"lightbulb",magic:"sparkles",stars:"sparkles",glitter:"sparkles"};function tt(o){if(typeof o!="string")throw new TypeError("iconName must be a string");return g[o]||o}function nt(o){if(typeof o!="string")throw new TypeError("iconName must be a string");return Object.entries(g).filter(([e,r])=>r===o).map(([e])=>e)}var s={set:"phosphor",weight:"regular",size:20,color:"currentColor",strokeWidth:1.25,iconsaxVariant:"line"},ir=o=>{switch(o){case "lucide":return 1.25;case "phosphor":return 1.25;case "iconsax":return 1.5;default:return 1.25}};var J=createContext(s);function ar({set:o=s.set,weight:e=s.weight,iconsaxVariant:r=s.iconsaxVariant,size:a=s.size,color:d=s.color,strokeWidth:b=s.strokeWidth,children:S}){let v={set:o,weight:e,iconsaxVariant:r,size:a,color:d,strokeWidth:b};return jsx(J.Provider,{value:v,children:S})}function O(){return useContext(J)}function K(o){return !o||!/[-_]/.test(o)&&/^[a-z]/.test(o)?o:/^[A-Z]+$/.test(o)?o.toLowerCase():/^[A-Z]/.test(o)&&!/[-_]/.test(o)?o.charAt(0).toLowerCase()+o.slice(1):o.split(/[-_]/).map((e,r)=>r===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}var Y={home:{lucide:"Home",phosphor:"House",iconsax:"Home2"},"layout-dashboard":{lucide:"LayoutDashboard",phosphor:"SquaresFour"},folder:{lucide:"Folder",phosphor:"Folder",iconsax:"Folder"},"alert-circle":{lucide:"AlertCircle",phosphor:"WarningCircle",iconsax:"Danger"},alertCircle:{lucide:"AlertCircle",phosphor:"WarningCircle",iconsax:"Danger"},columns:{lucide:"Columns",phosphor:"Columns"},users:{lucide:"Users",phosphor:"Users",iconsax:"People"},settings:{lucide:"Settings",phosphor:"Gear"},menu:{lucide:"Menu",phosphor:"List",iconsax:"Menu"},close:{lucide:"X",phosphor:"X",iconsax:"CloseCircle"},chevronLeft:{lucide:"ChevronLeft",phosphor:"CaretLeft",iconsax:"ArrowLeft2"},chevronRight:{lucide:"ChevronRight",phosphor:"CaretRight",iconsax:"ArrowRight2"},chevronDown:{lucide:"ChevronDown",phosphor:"CaretDown",iconsax:"ArrowDown2"},chevronUp:{lucide:"ChevronUp",phosphor:"CaretUp",iconsax:"ArrowUp2"},arrowLeft:{lucide:"ArrowLeft",phosphor:"ArrowLeft",iconsax:"ArrowLeft"},arrowRight:{lucide:"ArrowRight",phosphor:"ArrowRight",iconsax:"ArrowRight"},arrowUp:{lucide:"ArrowUp",phosphor:"ArrowUp",iconsax:"ArrowUp"},arrowDown:{lucide:"ArrowDown",phosphor:"ArrowDown",iconsax:"ArrowDown"},add:{lucide:"Plus",phosphor:"Plus",iconsax:"Add"},edit:{lucide:"Edit",phosphor:"Pencil"},pencil:{lucide:"Pencil",phosphor:"Pencil"},delete:{lucide:"Trash2",phosphor:"Trash",iconsax:"Trash"},trash:{lucide:"Trash2",phosphor:"Trash",iconsax:"Trash"},upload:{lucide:"Upload",phosphor:"Upload",iconsax:"Upload"},download:{lucide:"Download",phosphor:"Download",iconsax:"Download"},x:{lucide:"X",phosphor:"X"},check:{lucide:"Check",phosphor:"Check",iconsax:"Check"},search:{lucide:"Search",phosphor:"MagnifyingGlass",iconsax:"SearchNormal"},share:{lucide:"Share",phosphor:"Share"},copy:{lucide:"Copy",phosphor:"Copy"},save:{lucide:"Save",phosphor:"FloppyDisk"},loader:{lucide:"Loader2",phosphor:"Spinner"},loader2:{lucide:"Loader2",phosphor:"Spinner"},"check-circle":{lucide:"CheckCircle",phosphor:"CheckCircle",iconsax:"TickCircle"},checkCircle:{lucide:"CheckCircle",phosphor:"CheckCircle",iconsax:"TickCircle"},success:{lucide:"CheckCircle",phosphor:"CheckCircle",iconsax:"TickCircle"},error:{lucide:"XCircle",phosphor:"XCircle",iconsax:"CloseCircle"},warning:{lucide:"AlertCircle",phosphor:"WarningCircle",iconsax:"Warning2"},info:{lucide:"Info",phosphor:"Info",iconsax:"InfoCircle"},refresh:{lucide:"RefreshCw",phosphor:"ArrowClockwise",iconsax:"Refresh"},refreshCw:{lucide:"RefreshCw",phosphor:"ArrowClockwise",iconsax:"Refresh"},bell:{lucide:"Bell",phosphor:"Bell",iconsax:"Bell"},heart:{lucide:"Heart",phosphor:"Heart",iconsax:"Heart"},star:{lucide:"Star",phosphor:"Star",iconsax:"Star"},bookmark:{lucide:"Bookmark",phosphor:"Bookmark"},user:{lucide:"User",phosphor:"User",iconsax:"User"},userPlus:{lucide:"UserPlus",phosphor:"UserPlus",iconsax:"UserAdd"},logIn:{lucide:"LogIn",phosphor:"SignIn",iconsax:"Login"},logOut:{lucide:"LogOut",phosphor:"SignOut",iconsax:"Logout"},chrome:{lucide:"Chrome",phosphor:"ChromeLogo",iconsax:"Chrome"},github:{lucide:"Github",phosphor:"GithubLogo"},message:{lucide:"MessageCircle",phosphor:"ChatCircle"},messageSquare:{lucide:"MessageSquare",phosphor:"ChatSquare"},"message-square":{lucide:"MessageSquare",phosphor:"ChatSquare"},inbox:{lucide:"Inbox",phosphor:"Inbox"},calendar:{lucide:"Calendar",phosphor:"Calendar"},calendarPlus:{lucide:"CalendarPlus",phosphor:"CalendarPlus"},checkSquare:{lucide:"CheckSquare",phosphor:"CheckSquare",iconsax:"TickSquare"},clock:{lucide:"Clock",phosphor:"Clock"},book:{lucide:"Book",phosphor:"Book",iconsax:"Book"},bookOpen:{lucide:"BookOpen",phosphor:"BookOpen",iconsax:"Book"},monitor:{lucide:"Monitor",phosphor:"Monitor",iconsax:"Monitor"},sun:{lucide:"Sun",phosphor:"Sun",iconsax:"Sun"},moon:{lucide:"Moon",phosphor:"Moon",iconsax:"Moon"},sparkle:{lucide:"Sparkle",phosphor:"Sparkle"},sparkles:{lucide:"Sparkles",phosphor:"Sparkle"},lightbulb:{lucide:"Lightbulb",phosphor:"Lightbulb"},brain:{lucide:"Brain",phosphor:"Brain"},zap:{lucide:"Zap",phosphor:"Lightning"},globe:{lucide:"Globe",phosphor:"Globe",iconsax:"Global"},deviceMobile:{lucide:"Smartphone",phosphor:"DeviceMobile"},smartphone:{lucide:"Smartphone",phosphor:"DeviceMobile"},floppyDisk:{lucide:"Save",phosphor:"FloppyDisk"},chart:{lucide:"BarChart3",phosphor:"ChartBar"},barChart:{lucide:"BarChart",phosphor:"ChartBar"},trendingUp:{lucide:"TrendingUp",phosphor:"TrendUp"},trendingDown:{lucide:"TrendingDown",phosphor:"TrendDown"},activity:{lucide:"Activity",phosphor:"Pulse"},database:{lucide:"Database",phosphor:"Database"},dollarSign:{lucide:"DollarSign",phosphor:"CurrencyDollar"},dollar:{lucide:"DollarSign",phosphor:"CurrencyDollar"},currency:{lucide:"DollarSign",phosphor:"CurrencyDollar"},layers:{lucide:"Layers",phosphor:"Stack"},ban:{lucide:"Ban",phosphor:"Prohibit"},lock:{lucide:"Lock",phosphor:"Lock",iconsax:"Lock"},unlock:{lucide:"Unlock",phosphor:"LockOpen",iconsax:"Unlock"},shield:{lucide:"Shield",phosphor:"Shield",iconsax:"Shield"},key:{lucide:"Key",phosphor:"Key"},play:{lucide:"Play",phosphor:"Play",iconsax:"Play"},pause:{lucide:"Pause",phosphor:"Pause",iconsax:"Pause"},image:{lucide:"Image",phosphor:"Image",iconsax:"Image"},video:{lucide:"Video",phosphor:"Video",iconsax:"Video"},camera:{lucide:"Camera",phosphor:"Camera",iconsax:"Camera"},fileText:{lucide:"FileText",phosphor:"FileText"},file:{lucide:"File",phosphor:"File"},externalLink:{lucide:"ExternalLink",phosphor:"ArrowSquareOut"},link:{lucide:"Link",phosphor:"Link",iconsax:"Link"},moreHorizontal:{lucide:"MoreHorizontal",phosphor:"DotsThreeOutline"},moreVertical:{lucide:"MoreVertical",phosphor:"DotsThreeVertical"},remove:{lucide:"Minus",phosphor:"Minus",iconsax:"Minus"},eye:{lucide:"Eye",phosphor:"Eye",iconsax:"Eye"},eyeOff:{lucide:"EyeOff",phosphor:"EyeSlash",iconsax:"EyeSlash"},smile:{lucide:"Smile",phosphor:"Smiley",iconsax:"EmojiHappy"},frown:{lucide:"Frown",phosphor:"SmileySad",iconsax:"EmojiSad"},meh:{lucide:"Meh",phosphor:"SmileyMeh",iconsax:"EmojiNormal"},mail:{lucide:"Mail",phosphor:"Envelope"},phone:{lucide:"Phone",phosphor:"Phone"},flag:{lucide:"Flag",phosphor:"Flag",iconsax:"Flag"},rocket:{lucide:"Rocket",phosphor:"Rocket",iconsax:"Rocket"},ticket:{lucide:"Ticket",phosphor:"Ticket",iconsax:"Ticket"},clipboard:{lucide:"ClipboardList",phosphor:"Clipboard",iconsax:"Sticker"},wifi:{lucide:"Wifi",phosphor:"WifiHigh",iconsax:"Wifi"},wifiOff:{lucide:"WifiOff",phosphor:"WifiSlash"},cpu:{lucide:"Cpu",phosphor:"Cpu",iconsax:"Computing"},mask:{lucide:"Drama",phosphor:"MaskHappy",iconsax:"EmojiHappy"},bold:{lucide:"Bold",phosphor:"TextB"},italic:{lucide:"Italic",phosphor:"TextItalic"},strikethrough:{lucide:"Strikethrough",phosphor:"TextStrikethrough"},heading:{lucide:"Heading",phosphor:"TextHOne"},code:{lucide:"Code",phosphor:"Code",iconsax:"Code"},fileCode:{lucide:"FileCode",phosphor:"FileCode"},quote:{lucide:"Quote",phosphor:"Quotes",iconsax:"QuoteUp"},list:{lucide:"List",phosphor:"List"},listOrdered:{lucide:"ListOrdered",phosphor:"ListNumbers"},minus:{lucide:"Minus",phosphor:"Minus",iconsax:"Minus"}};function U(o,e="phosphor"){return null;}function oo(o,e){let r=Y[o];if(r){let a=r[e];if(a)return a}return o}function eo(o){if(!o||typeof o!="string")return {normalized:o||"",wasAlias:false};let e=K(o),r=g[o]||g[e];return r?{normalized:r,wasAlias:true,originalAlias:o}:{normalized:e,wasAlias:false}}var ro=t.forwardRef(({name:o,size:e,className:r,emotion:a$1,status:d$1,provider:b,weight:S,animated:v=false,pulse:co=false,spin:lo=false,bounce:po=false,variant:p="default","aria-label":k,"aria-hidden":x},E)=>{var W,z;let m=O(),n=b||m.set,i=e!=null?e:m.size,ho=S||m.weight,uo=m.color,mo=(W=m.strokeWidth)!=null?W:1.25,N=(z=m.iconsaxVariant)!=null?z:"line",[L,fo]=t.useState(false);t.useEffect(()=>{fo(true);},[]);let P=t.useMemo(()=>{let y=a$1?Q[a$1]:d$1?Z[d$1]:o,{normalized:B}=eo(y),xo=oo(B,n);return {normalized:B,providerName:xo}},[o,a$1,d$1,n]),h=P.normalized,go=t.useMemo(()=>{return null},[n,P.providerName,L,N]),C=d({"text-current":p==="default","text-primary":p==="primary","text-muted-foreground":p==="secondary"||p==="muted","text-green-600 dark:text-green-400":p==="success","text-yellow-600 dark:text-yellow-400":p==="warning","text-destructive":p==="error"});if(!L)return jsx("span",{style:{width:i,height:i},className:a(C,r),"aria-hidden":x!==void 0?x:true,"aria-label":k});let l=null;if(n==="phosphor"?l=$[h]||null:n==="iconsax"?(l=go,l||(l=U(h,n))):l=U(h,n),!l)return n==="iconsax"&&true?process.env.NODE_ENV==="development"&&console.warn(`Icon "${h}" \u2014 iconsax resolver not registered. Use HuaProvider with icons.set='iconsax', or add: import '@hua-labs/ui/iconsax'`):console.warn(`Icon "${h}" not found for provider "${n}"`),jsx("span",{ref:E,className:a("inline-flex items-center justify-center rounded-full border-2 border-dashed border-border",C,r),style:{width:i,height:i},"aria-label":k||`\uC544\uC774\uCF58\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C: ${h}`,title:`Icon not found: ${h}`,children:jsx("span",{className:"text-xs text-muted-foreground","aria-hidden":"true",children:"?"})});let T={size:typeof i=="number"?i:void 0,width:i,height:i,color:uo};n==="phosphor"?T.weight=ho:T.strokeWidth=mo;let ko=d({"animate-pulse":co,"animate-spin":lo,"animate-bounce":po,"transition-all duration-200 ease-in-out":v}),f={};return k?(f["aria-label"]=k,f["aria-hidden"]=false):x!==void 0?f["aria-hidden"]=x:f["aria-hidden"]=true,jsx("span",{ref:E,className:a("inline-flex items-center justify-center",ko,C,r),style:{width:i,height:i},...f,children:l&&t.createElement(l,{...T,className:C,"aria-hidden":true})})});ro.displayName="Icon";var cr=t.memo(ro,(o,e)=>o.name===e.name&&o.size===e.size&&o.className===e.className&&o.emotion===e.emotion&&o.status===e.status&&o.provider===e.provider&&o.animated===e.animated&&o.pulse===e.pulse&&o.spin===e.spin&&o.bounce===e.bounce&&o.variant===e.variant&&o.weight===e.weight&&o["aria-label"]===e["aria-label"]&&o["aria-hidden"]===e["aria-hidden"]),u=cr;u.displayName="Icon";var io=t.forwardRef((o,e)=>jsx(u,{ref:e,name:"smile",...o}));io.displayName="EmotionIcon";var to=t.forwardRef((o,e)=>jsx(u,{ref:e,name:"info",...o}));to.displayName="StatusIcon";var no=t.forwardRef((o,e)=>jsx(u,{ref:e,name:"loader",status:"loading",spin:true,"aria-label":"\uB85C\uB529 \uC911",...o}));no.displayName="LoadingIcon";var ao=t.forwardRef((o,e)=>jsx(u,{ref:e,name:"check",status:"success",variant:"success","aria-label":"\uC131\uACF5",...o}));ao.displayName="SuccessIcon";var so=t.forwardRef((o,e)=>jsx(u,{ref:e,name:"alertCircle",status:"error",variant:"error","aria-label":"\uC624\uB958",...o}));so.displayName="ErrorIcon";export{Q as a,Z as b,rt as c,Y as d,g as e,tt as f,nt as g,s as h,ir as i,ar as j,O as k,u as l,io as m,to as n,no as o,ao as p,so as q};//# sourceMappingURL=chunk-ZQUMJQYV.mjs.map
3
+ //# sourceMappingURL=chunk-ZQUMJQYV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/icons.ts","../src/lib/icon-aliases.ts","../src/components/Icon/icon-store.ts","../src/components/Icon/IconProvider.tsx","../src/lib/case-utils.ts","../src/lib/icon-providers.ts","../src/lib/normalize-icon-name.ts","../src/components/Icon/Icon.tsx"],"names":["icons","House","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","List","X","MagnifyingGlass","Gear","ArrowSquareOut","CaretLeft","CaretRight","CaretDown","CaretUp","Pencil","Trash","Plus","Minus","Download","Upload","ArrowClockwise","FloppyDisk","Copy","SpinnerGap","CheckCircle","XCircle","WarningCircle","Info","Check","Circle","Question","User","Users","UserPlus","SignIn","SignOut","Eye","EyeSlash","ChartBar","TrendUp","Pulse","Database","Lightning","FileText","File","Folder","Book","BookOpen","Envelope","ChatCircle","Phone","Image","Video","Camera","Smiley","SmileySad","SmileyMeh","Lock","LockOpen","Shield","Wallet","Key","CurrencyDollar","Clock","Calendar","CalendarPlus","Bell","Heart","Star","Bookmark","Share","Monitor","Sun","Moon","Lightbulb","Brain","Flag","Square","Sparkle","Globe","DeviceMobile","Ticket","Clipboard","WifiHigh","WifiSlash","Cpu","MaskHappy","Rocket","Layout","Megaphone","Stack","Prohibit","TextB","TextItalic","TextStrikethrough","TextHOne","Link","Code","FileCode","Quotes","ListNumbers","emotionIcons","statusIcons","iconCategories","ICON_ALIASES","resolveIconAlias","iconName","getIconAliases","_","target","alias","defaultIconConfig","getDefaultStrokeWidth","set","IconContext","createContext","IconProvider","weight","iconsaxVariant","size","color","strokeWidth","children","value","jsx","useIconContext","useContext","toCamelCase","str","word","index","PROJECT_ICONS","getIconFromProvider","provider","getIconNameForProvider","iconMapping","mappedName","normalizeIconName","camelCased","aliasTarget","IconComponent","React","name","className","emotion","status","animated","pulse","spin","bounce","variant","ariaLabel","ariaHidden","ref","_a","_b","config","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","isClient","setIsClient","resolvedIcon","baseName","normalized","providerName","iconsaxIcon","variantClasses","mergeMap","merge","ResolvedIcon","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","props","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon"],"mappings":"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","file":"chunk-ZQUMJQYV.mjs","sourcesContent":["/**\n * Core Icons (Phosphor Icons)\n *\n * 핵심 아이콘만 포함하여 번들 크기를 최적화합니다.\n * 나머지 아이콘은 동적 fallback으로 처리됩니다.\n *\n * 포함 기준:\n * 1. my-app에서 실제 사용 중인 아이콘\n * 2. UI 컴포넌트에서 자주 사용되는 아이콘\n * 3. 각 카테고리의 대표 아이콘\n *\n * 새로운 아이콘이 필요하면 동적 fallback이 자동으로 처리합니다.\n */\n\n// Navigation\nimport { House } from '@phosphor-icons/react/dist/ssr/House'\nimport { ArrowLeft } from '@phosphor-icons/react/dist/ssr/ArrowLeft'\nimport { ArrowRight } from '@phosphor-icons/react/dist/ssr/ArrowRight'\nimport { ArrowUp } from '@phosphor-icons/react/dist/ssr/ArrowUp'\nimport { ArrowDown } from '@phosphor-icons/react/dist/ssr/ArrowDown'\nimport { List } from '@phosphor-icons/react/dist/ssr/List'\nimport { X } from '@phosphor-icons/react/dist/ssr/X'\nimport { MagnifyingGlass } from '@phosphor-icons/react/dist/ssr/MagnifyingGlass'\nimport { Gear } from '@phosphor-icons/react/dist/ssr/Gear'\nimport { ArrowSquareOut } from '@phosphor-icons/react/dist/ssr/ArrowSquareOut'\nimport { CaretLeft } from '@phosphor-icons/react/dist/ssr/CaretLeft'\nimport { CaretRight } from '@phosphor-icons/react/dist/ssr/CaretRight'\nimport { CaretDown } from '@phosphor-icons/react/dist/ssr/CaretDown'\nimport { CaretUp } from '@phosphor-icons/react/dist/ssr/CaretUp'\n\n// Actions\nimport { Pencil } from '@phosphor-icons/react/dist/ssr/Pencil'\nimport { Trash } from '@phosphor-icons/react/dist/ssr/Trash'\nimport { Plus } from '@phosphor-icons/react/dist/ssr/Plus'\nimport { Minus } from '@phosphor-icons/react/dist/ssr/Minus'\nimport { Download } from '@phosphor-icons/react/dist/ssr/Download'\nimport { Upload } from '@phosphor-icons/react/dist/ssr/Upload'\nimport { ArrowClockwise } from '@phosphor-icons/react/dist/ssr/ArrowClockwise'\nimport { FloppyDisk } from '@phosphor-icons/react/dist/ssr/FloppyDisk'\nimport { Copy } from '@phosphor-icons/react/dist/ssr/Copy'\n\n// Text Formatting (Markdown Toolbar)\nimport { TextB } from '@phosphor-icons/react/dist/ssr/TextB'\nimport { TextItalic } from '@phosphor-icons/react/dist/ssr/TextItalic'\nimport { TextStrikethrough } from '@phosphor-icons/react/dist/ssr/TextStrikethrough'\nimport { TextHOne } from '@phosphor-icons/react/dist/ssr/TextHOne'\nimport { Link } from '@phosphor-icons/react/dist/ssr/Link'\nimport { Code } from '@phosphor-icons/react/dist/ssr/Code'\nimport { FileCode } from '@phosphor-icons/react/dist/ssr/FileCode'\nimport { Quotes } from '@phosphor-icons/react/dist/ssr/Quotes'\nimport { ListNumbers } from '@phosphor-icons/react/dist/ssr/ListNumbers'\n\n// Status & Feedback\nimport { SpinnerGap } from '@phosphor-icons/react/dist/ssr/SpinnerGap'\nimport { CheckCircle } from '@phosphor-icons/react/dist/ssr/CheckCircle'\nimport { XCircle } from '@phosphor-icons/react/dist/ssr/XCircle'\nimport { WarningCircle } from '@phosphor-icons/react/dist/ssr/WarningCircle'\nimport { Info } from '@phosphor-icons/react/dist/ssr/Info'\nimport { Check } from '@phosphor-icons/react/dist/ssr/Check'\nimport { Circle } from '@phosphor-icons/react/dist/ssr/Circle'\nimport { Question } from '@phosphor-icons/react/dist/ssr/Question'\n\n// User & Auth\nimport { User } from '@phosphor-icons/react/dist/ssr/User'\nimport { Users } from '@phosphor-icons/react/dist/ssr/Users'\nimport { UserPlus } from '@phosphor-icons/react/dist/ssr/UserPlus'\nimport { SignIn } from '@phosphor-icons/react/dist/ssr/SignIn'\nimport { SignOut } from '@phosphor-icons/react/dist/ssr/SignOut'\nimport { Eye } from '@phosphor-icons/react/dist/ssr/Eye'\nimport { EyeSlash } from '@phosphor-icons/react/dist/ssr/EyeSlash'\n\n// Data & Analytics\nimport { ChartBar } from '@phosphor-icons/react/dist/ssr/ChartBar'\nimport { TrendUp } from '@phosphor-icons/react/dist/ssr/TrendUp'\nimport { Pulse } from '@phosphor-icons/react/dist/ssr/Pulse'\nimport { Database } from '@phosphor-icons/react/dist/ssr/Database'\nimport { Lightning } from '@phosphor-icons/react/dist/ssr/Lightning'\n\n// Files & Content\nimport { FileText } from '@phosphor-icons/react/dist/ssr/FileText'\nimport { File } from '@phosphor-icons/react/dist/ssr/File'\nimport { Folder } from '@phosphor-icons/react/dist/ssr/Folder'\nimport { Book } from '@phosphor-icons/react/dist/ssr/Book'\nimport { BookOpen } from '@phosphor-icons/react/dist/ssr/BookOpen'\n\n// Communication\nimport { Envelope } from '@phosphor-icons/react/dist/ssr/Envelope'\nimport { ChatCircle } from '@phosphor-icons/react/dist/ssr/ChatCircle'\nimport { Phone } from '@phosphor-icons/react/dist/ssr/Phone'\n\n// Media\nimport { Image } from '@phosphor-icons/react/dist/ssr/Image'\nimport { Video } from '@phosphor-icons/react/dist/ssr/Video'\nimport { Camera } from '@phosphor-icons/react/dist/ssr/Camera'\n\n// Emotions\nimport { Smiley } from '@phosphor-icons/react/dist/ssr/Smiley'\nimport { SmileySad } from '@phosphor-icons/react/dist/ssr/SmileySad'\nimport { SmileyMeh } from '@phosphor-icons/react/dist/ssr/SmileyMeh'\n\n// Security & Finance\nimport { Lock } from '@phosphor-icons/react/dist/ssr/Lock'\nimport { LockOpen } from '@phosphor-icons/react/dist/ssr/LockOpen'\nimport { Shield } from '@phosphor-icons/react/dist/ssr/Shield'\nimport { Wallet } from '@phosphor-icons/react/dist/ssr/Wallet'\nimport { Key } from '@phosphor-icons/react/dist/ssr/Key'\nimport { CurrencyDollar } from '@phosphor-icons/react/dist/ssr/CurrencyDollar'\n\n// Time & Date\nimport { Clock } from '@phosphor-icons/react/dist/ssr/Clock'\nimport { Calendar } from '@phosphor-icons/react/dist/ssr/Calendar'\nimport { CalendarPlus } from '@phosphor-icons/react/dist/ssr/CalendarPlus'\n\n// UI Elements\nimport { Bell } from '@phosphor-icons/react/dist/ssr/Bell'\nimport { Heart } from '@phosphor-icons/react/dist/ssr/Heart'\nimport { Star } from '@phosphor-icons/react/dist/ssr/Star'\nimport { Bookmark } from '@phosphor-icons/react/dist/ssr/Bookmark'\nimport { Share } from '@phosphor-icons/react/dist/ssr/Share'\n\n// Theme\nimport { Monitor } from '@phosphor-icons/react/dist/ssr/Monitor'\nimport { Sun } from '@phosphor-icons/react/dist/ssr/Sun'\nimport { Moon } from '@phosphor-icons/react/dist/ssr/Moon'\n\n// Additional\nimport { Lightbulb } from '@phosphor-icons/react/dist/ssr/Lightbulb'\nimport { Brain } from '@phosphor-icons/react/dist/ssr/Brain'\nimport { Flag } from '@phosphor-icons/react/dist/ssr/Flag'\nimport { Square } from '@phosphor-icons/react/dist/ssr/Square'\nimport { Sparkle } from '@phosphor-icons/react/dist/ssr/Sparkle'\nimport { Globe } from '@phosphor-icons/react/dist/ssr/Globe'\nimport { DeviceMobile } from '@phosphor-icons/react/dist/ssr/DeviceMobile'\nimport { Ticket } from '@phosphor-icons/react/dist/ssr/Ticket'\nimport { Clipboard } from '@phosphor-icons/react/dist/ssr/Clipboard'\nimport { WifiHigh } from '@phosphor-icons/react/dist/ssr/WifiHigh'\nimport { WifiSlash } from '@phosphor-icons/react/dist/ssr/WifiSlash'\nimport { Cpu } from '@phosphor-icons/react/dist/ssr/Cpu'\nimport { MaskHappy } from '@phosphor-icons/react/dist/ssr/MaskHappy'\nimport { Rocket } from '@phosphor-icons/react/dist/ssr/Rocket'\n\n// Admin\nimport { Layout } from '@phosphor-icons/react/dist/ssr/Layout'\nimport { Megaphone } from '@phosphor-icons/react/dist/ssr/Megaphone'\nimport { Stack } from '@phosphor-icons/react/dist/ssr/Stack'\nimport { Prohibit } from '@phosphor-icons/react/dist/ssr/Prohibit'\n\n// 핵심 아이콘 객체 (키는 기존과 동일, 값만 Phosphor로 교체)\nexport const icons = {\n // Navigation\n home: House,\n arrowLeft: ArrowLeft,\n arrowRight: ArrowRight,\n arrowUp: ArrowUp,\n arrowDown: ArrowDown,\n menu: List,\n x: X,\n close: X,\n search: MagnifyingGlass,\n settings: Gear,\n externalLink: ArrowSquareOut,\n chevronLeft: CaretLeft,\n chevronRight: CaretRight,\n chevronDown: CaretDown,\n chevronUp: CaretUp,\n\n // Actions\n edit: Pencil,\n delete: Trash,\n add: Plus,\n remove: Minus,\n download: Download,\n upload: Upload,\n refresh: ArrowClockwise,\n save: FloppyDisk,\n copy: Copy,\n\n // Status & Feedback\n loader: SpinnerGap,\n success: CheckCircle,\n error: XCircle,\n alertCircle: WarningCircle,\n warning: WarningCircle,\n info: Info,\n check: Check,\n circle: Circle,\n helpCircle: Question,\n\n // User & Auth\n user: User,\n users: Users,\n userPlus: UserPlus,\n logIn: SignIn,\n logOut: SignOut,\n eye: Eye,\n eyeOff: EyeSlash,\n\n // Data & Analytics\n chart: ChartBar,\n barChart: ChartBar,\n trendingUp: TrendUp,\n activity: Pulse,\n database: Database,\n zap: Lightning,\n\n // Files & Content\n fileText: FileText,\n file: File,\n folder: Folder,\n book: Book,\n bookOpen: BookOpen,\n\n // Communication\n mail: Envelope,\n message: ChatCircle,\n phone: Phone,\n\n // Media\n image: Image,\n video: Video,\n camera: Camera,\n\n // Emotions\n smile: Smiley,\n frown: SmileySad,\n meh: SmileyMeh,\n\n // Security\n lock: Lock,\n unlock: LockOpen,\n shield: Shield,\n wallet: Wallet,\n key: Key,\n dollar: CurrencyDollar,\n dollarSign: CurrencyDollar,\n currency: CurrencyDollar,\n\n // Time & Date\n clock: Clock,\n calendar: Calendar,\n calendarPlus: CalendarPlus,\n\n // UI Elements\n bell: Bell,\n heart: Heart,\n star: Star,\n bookmark: Bookmark,\n share: Share,\n\n // Theme\n monitor: Monitor,\n sun: Sun,\n moon: Moon,\n\n // Additional\n lightbulb: Lightbulb,\n brain: Brain,\n flag: Flag,\n square: Square,\n sparkle: Sparkle,\n sparkles: Sparkle,\n globe: Globe,\n smartphone: DeviceMobile,\n deviceMobile: DeviceMobile,\n floppyDisk: FloppyDisk,\n\n // Connectivity\n ticket: Ticket,\n clipboard: Clipboard,\n wifi: WifiHigh,\n wifiOff: WifiSlash,\n cpu: Cpu,\n mask: MaskHappy,\n rocket: Rocket,\n\n // Admin\n layout: Layout,\n megaphone: Megaphone,\n layers: Stack,\n ban: Prohibit,\n\n // Text Formatting (Markdown Toolbar)\n bold: TextB,\n italic: TextItalic,\n strikethrough: TextStrikethrough,\n heading: TextHOne,\n link: Link,\n code: Code,\n fileCode: FileCode,\n quote: Quotes,\n list: List,\n listOrdered: ListNumbers,\n minus: Minus,\n} as const\n\n// 아이콘 이름 타입\nexport type IconName = keyof typeof icons\n\n// 감정별 아이콘 매핑\nexport const emotionIcons = {\n happy: 'smile',\n sad: 'frown',\n neutral: 'meh',\n excited: 'smile',\n angry: 'frown',\n love: 'heart',\n like: 'heart',\n dislike: 'frown',\n} as const\n\n// 상태별 아이콘 매핑\nexport const statusIcons = {\n loading: 'loader',\n success: 'success',\n error: 'error',\n warning: 'warning',\n info: 'info',\n locked: 'lock',\n unlocked: 'unlock',\n visible: 'eye',\n hidden: 'eyeOff',\n} as const\n\n// 아이콘 카테고리별 그룹화 (참고용)\nexport const iconCategories = {\n navigation: ['home', 'arrowLeft', 'arrowRight', 'arrowUp', 'arrowDown', 'menu', 'close', 'search', 'settings', 'externalLink', 'chevronLeft', 'chevronRight', 'chevronDown', 'chevronUp'],\n actions: ['edit', 'delete', 'add', 'remove', 'download', 'upload', 'refresh', 'save', 'copy'],\n status: ['loader', 'success', 'error', 'alertCircle', 'warning', 'info', 'check', 'circle'],\n user: ['user', 'users', 'userPlus', 'logIn', 'logOut', 'eye', 'eyeOff'],\n data: ['chart', 'barChart', 'trendingUp', 'activity', 'database', 'zap'],\n files: ['fileText', 'file', 'folder', 'book'],\n communication: ['mail', 'message', 'phone'],\n media: ['image', 'video', 'camera'],\n emotions: ['smile', 'frown', 'meh'],\n security: ['lock', 'unlock', 'shield'],\n time: ['clock', 'calendar'],\n ui: ['bell', 'heart', 'star', 'bookmark', 'share'],\n theme: ['monitor', 'sun', 'moon'],\n} as const\n","/**\n * Icon Aliases\n * \n * 여러 이름이 같은 아이콘을 가리키도록 하는 alias 시스템\n * DX 향상을 위해 직관적인 이름들을 지원합니다.\n */\n\nexport const ICON_ALIASES: Record<string, string> = {\n // kebab-case → camelCase mappings (자동 변환 지원)\n 'arrow-left': 'arrowLeft',\n 'arrow-right': 'arrowRight',\n 'arrow-up': 'arrowUp',\n 'arrow-down': 'arrowDown',\n 'chevron-left': 'chevronLeft',\n 'chevron-right': 'chevronRight',\n 'chevron-up': 'chevronUp',\n 'chevron-down': 'chevronDown',\n 'external-link': 'externalLink',\n 'more-horizontal': 'moreHorizontal',\n 'more-vertical': 'moreVertical',\n 'user-plus': 'userPlus',\n 'log-in': 'logIn',\n 'log-out': 'logOut',\n 'check-circle': 'checkCircle',\n 'check-square': 'checkSquare',\n 'alert-circle': 'alertCircle',\n 'eye-off': 'eyeOff',\n 'file-text': 'fileText',\n 'book-open': 'bookOpen',\n 'bar-chart': 'barChart',\n 'trending-up': 'trendingUp',\n 'trending-down': 'trendingDown',\n 'message-square': 'messageSquare',\n 'calendar-plus': 'calendarPlus',\n 'refresh-cw': 'refreshCw',\n 'dollar-sign': 'dollarSign',\n 'layout-dashboard': 'layoutDashboard',\n 'device-mobile': 'deviceMobile',\n 'floppy-disk': 'floppyDisk',\n\n // Navigation aliases\n 'back': 'arrowLeft',\n 'prev': 'arrowLeft',\n 'previous': 'arrowLeft',\n 'forward': 'arrowRight',\n 'next': 'arrowRight',\n \n // Close aliases\n 'close': 'x',\n 'cancel': 'x',\n \n // Delete aliases\n 'remove': 'delete',\n 'trash': 'delete',\n \n // Add aliases\n 'plus': 'add',\n 'new': 'add',\n \n // Edit aliases\n 'pencil': 'edit',\n 'modify': 'edit',\n \n // Save aliases\n 'store': 'save',\n 'floppy': 'save',\n \n // Search aliases\n 'magnify': 'search',\n \n // User aliases\n 'person': 'user',\n 'account': 'user',\n 'profile': 'user',\n \n // Settings aliases\n 'gear': 'settings',\n 'config': 'settings',\n 'preferences': 'settings',\n \n // Home aliases\n 'house': 'home',\n 'main': 'home',\n \n // Check aliases\n 'done': 'check',\n 'complete': 'check',\n 'tick': 'check',\n \n // Info aliases\n 'information': 'info',\n 'help': 'info',\n \n // Warning aliases\n 'alert': 'warning',\n 'caution': 'warning',\n \n // Success aliases\n 'checkmark': 'success',\n 'checkCircle': 'success',\n \n // Error aliases\n 'fail': 'error',\n 'cross': 'error',\n 'xCircle': 'error',\n \n // Loading aliases\n 'spinner': 'loader',\n 'loading': 'loader',\n 'wait': 'loader',\n \n // Refresh aliases\n 'reload': 'refresh',\n 'update': 'refresh',\n 'sync': 'refresh',\n \n // Eye aliases\n 'show': 'eye',\n 'view': 'eye',\n 'hide': 'eyeOff',\n 'hidden': 'eyeOff',\n \n // Lock aliases\n 'secure': 'lock',\n 'locked': 'lock',\n 'unsecure': 'unlock',\n 'unlocked': 'unlock',\n \n // Download aliases\n 'get': 'download',\n 'fetch': 'download',\n \n // Upload aliases\n 'post': 'upload',\n \n // Share aliases\n 'send': 'share',\n 'export': 'share',\n \n // Copy aliases\n 'duplicate': 'copy',\n 'clone': 'copy',\n \n // Mail aliases\n 'email': 'mail',\n 'envelope': 'mail',\n \n // Message aliases\n 'chat': 'message',\n 'comment': 'message',\n 'talk': 'message',\n \n // Calendar aliases\n 'date': 'calendar',\n 'schedule': 'calendar',\n \n // Clock aliases\n 'time': 'clock',\n 'watch': 'clock',\n \n // File aliases\n 'document': 'fileText',\n 'doc': 'fileText',\n 'text': 'fileText',\n \n // Folder aliases\n 'directory': 'folder',\n 'dir': 'folder',\n \n // Image aliases\n 'picture': 'image',\n 'img': 'image',\n \n // Video aliases\n 'movie': 'video',\n 'film': 'video',\n \n // Camera aliases\n 'photo': 'camera',\n 'capture': 'camera',\n \n // Play aliases\n 'start': 'play',\n 'run': 'play',\n \n // Pause aliases\n 'stop': 'pause',\n 'halt': 'pause',\n \n // Heart aliases\n 'like': 'heart',\n 'love': 'heart',\n \n // Star aliases\n 'favorite': 'star',\n \n // Bookmark aliases\n 'saveBookmark': 'bookmark',\n \n // Bell aliases\n 'notification': 'bell',\n 'notify': 'bell',\n 'alarm': 'bell',\n \n // Settings aliases\n 'prefs': 'settings',\n \n // Search aliases (duplicate removed - see line 37)\n 'lookup': 'search',\n \n // More aliases\n 'dots': 'moreHorizontal',\n 'moreMenu': 'moreHorizontal',\n 'moreOptions': 'moreVertical',\n \n // External link aliases\n 'external': 'externalLink',\n 'outbound': 'externalLink',\n 'open': 'externalLink',\n \n // Link aliases\n 'url': 'link',\n 'hyperlink': 'link',\n \n // Chart aliases\n 'graph': 'barChart',\n 'stats': 'barChart',\n 'analytics': 'barChart',\n \n // Database aliases\n 'db': 'database',\n 'storage': 'database',\n \n // Activity aliases\n 'pulse': 'activity',\n 'monitor': 'activity',\n \n // Trending aliases\n 'up': 'trendingUp',\n 'down': 'trendingDown',\n \n // Zap aliases\n 'lightning': 'zap',\n 'bolt': 'zap',\n 'flash': 'zap',\n \n // Shield aliases\n 'security': 'shield',\n 'protect': 'shield',\n \n // Key aliases\n 'password': 'key',\n 'secret': 'key',\n \n // Log in aliases\n 'signin': 'logIn',\n 'login': 'logIn',\n 'enter': 'logIn',\n \n // Log out aliases\n 'signout': 'logOut',\n 'logout': 'logOut',\n 'exit': 'logOut',\n \n // Users aliases\n 'people': 'users',\n 'group': 'users',\n 'team': 'users',\n \n // User plus aliases\n 'addUser': 'userPlus',\n 'invite': 'userPlus',\n \n // Book aliases\n 'read': 'book',\n 'library': 'book',\n \n // Book open aliases\n 'reading': 'bookOpen',\n 'openBook': 'bookOpen',\n \n // Sun aliases\n 'light': 'sun',\n 'day': 'sun',\n \n // Moon aliases\n 'dark': 'moon',\n 'night': 'moon',\n \n // Monitor aliases\n 'screen': 'monitor',\n 'display': 'monitor',\n \n // Brain aliases\n 'ai': 'brain',\n 'intelligence': 'brain',\n 'think': 'brain',\n \n // Lightbulb aliases\n 'idea': 'lightbulb',\n 'bulb': 'lightbulb',\n 'inspiration': 'lightbulb',\n \n // Sparkles aliases\n 'magic': 'sparkles',\n 'stars': 'sparkles',\n 'glitter': 'sparkles',\n} as const\n\n/**\n * Resolve icon alias to actual icon name\n * \n * @param iconName - 아이콘 이름 또는 별칭 / Icon name or alias\n * @returns 실제 아이콘 이름 / Actual icon name\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function resolveIconAlias(iconName: string): string {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return ICON_ALIASES[iconName] || iconName;\n}\n\n/**\n * Get all aliases for an icon name\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @returns 해당 아이콘의 모든 별칭 배열 / Array of all aliases for the icon\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function getIconAliases(iconName: string): string[] {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return Object.entries(ICON_ALIASES)\n .filter(([_, target]) => target === iconName)\n .map(([alias]) => alias);\n}\n\n\n","/**\n * Icon Config Types\n *\n * Icon 시스템의 설정 타입 정의\n * 상태관리는 서비스 레벨에서 관리 (Zustand 등)\n */\n\nexport type IconSet = 'lucide' | 'phosphor' | 'iconsax'\n\nexport type PhosphorWeight = 'thin' | 'light' | 'regular' | 'bold' | 'duotone' | 'fill'\n\nexport type IconsaxVariant = 'line' | 'bold'\n\nexport interface IconConfig {\n set: IconSet\n weight: PhosphorWeight\n size: number\n color: string\n strokeWidth?: number // Lucide용\n iconsaxVariant?: IconsaxVariant // Iconsax용 (line | bold)\n}\n\nexport const defaultIconConfig: IconConfig = {\n set: 'phosphor',\n weight: 'regular',\n size: 20,\n color: 'currentColor',\n strokeWidth: 1.25,\n iconsaxVariant: 'line',\n}\n\n/**\n * 세트별 기본 strokeWidth\n */\nexport const getDefaultStrokeWidth = (set: IconSet): number => {\n switch (set) {\n case 'lucide':\n return 1.25\n case 'phosphor':\n return 1.25 // Phosphor는 weight 사용\n case 'iconsax':\n return 1.5\n default:\n return 1.25\n }\n}\n","'use client'\n\n/**\n * IconProvider - Icon 시스템 전역 설정 Provider\n *\n * React Context를 사용하여 전역 아이콘 설정을 제공합니다.\n *\n * @example\n * ```tsx\n * <IconProvider set=\"phosphor\" weight=\"regular\" size={20}>\n * <App />\n * </IconProvider>\n * ```\n */\n\nimport React, { createContext, useContext } from 'react'\nimport { type IconConfig, type IconSet, type PhosphorWeight, type IconsaxVariant, defaultIconConfig } from './icon-store'\n\n/**\n * IconProvider 컴포넌트 Props\n */\nexport interface IconProviderProps {\n /** 아이콘 세트 (lucide, phosphor, iconsax) */\n set?: IconSet\n /** Phosphor 아이콘 weight */\n weight?: PhosphorWeight\n /** Iconsax 아이콘 변형 (line, bold) */\n iconsaxVariant?: IconsaxVariant\n /** 기본 아이콘 크기 */\n size?: number\n /** 기본 아이콘 색상 */\n color?: string\n /** Lucide/Iconsax 아이콘 stroke width */\n strokeWidth?: number\n /** 자식 컴포넌트 */\n children: React.ReactNode\n}\n\ninterface IconContextValue extends IconConfig {}\n\nconst IconContext = createContext<IconContextValue>(defaultIconConfig)\n\nexport function IconProvider({\n set = defaultIconConfig.set,\n weight = defaultIconConfig.weight,\n iconsaxVariant = defaultIconConfig.iconsaxVariant,\n size = defaultIconConfig.size,\n color = defaultIconConfig.color,\n strokeWidth = defaultIconConfig.strokeWidth,\n children,\n}: IconProviderProps) {\n const value: IconContextValue = {\n set,\n weight,\n iconsaxVariant,\n size,\n color,\n strokeWidth,\n }\n\n return (\n <IconContext.Provider value={value}>\n {children}\n </IconContext.Provider>\n )\n}\n\nexport function useIconContext(): IconContextValue {\n return useContext(IconContext)\n}\n\n// Re-export types for convenience\nexport type { IconSet, PhosphorWeight, IconsaxVariant, IconConfig } from './icon-store'\nexport { defaultIconConfig, getDefaultStrokeWidth } from './icon-store'\n","/**\n * Case Conversion Utilities\n *\n * 문자열 케이스 변환 유틸리티 함수들입니다.\n * Utility functions for string case conversion.\n */\n\n/**\n * 문자열을 camelCase로 변환합니다.\n * Converts a string to camelCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns camelCase 문자열 / camelCase string\n *\n * @example\n * toCamelCase('arrow-left') // 'arrowLeft'\n * toCamelCase('arrow_left') // 'arrowLeft'\n * toCamelCase('ArrowLeft') // 'arrowLeft'\n * toCamelCase('arrowLeft') // 'arrowLeft'\n * toCamelCase('HEART') // 'heart'\n */\nexport function toCamelCase(str: string): string {\n if (!str) return str\n\n // 이미 camelCase인지 확인 (kebab/snake가 아니고 첫 글자가 소문자)\n if (!/[-_]/.test(str) && /^[a-z]/.test(str)) {\n return str\n }\n\n // 전체가 대문자인 경우 (HEART, USER 등) → 전체 소문자로\n if (/^[A-Z]+$/.test(str)) {\n return str.toLowerCase()\n }\n\n // PascalCase를 camelCase로 변환 (ArrowLeft → arrowLeft)\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str.charAt(0).toLowerCase() + str.slice(1)\n }\n\n // kebab-case 또는 snake_case를 camelCase로 변환\n return str\n .split(/[-_]/)\n .map((word, index) => {\n if (index === 0) {\n return word.toLowerCase()\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n })\n .join('')\n}\n\n/**\n * 문자열을 PascalCase로 변환합니다.\n * Converts a string to PascalCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns PascalCase 문자열 / PascalCase string\n *\n * @example\n * toPascalCase('arrow-left') // 'ArrowLeft'\n * toPascalCase('arrow_left') // 'ArrowLeft'\n * toPascalCase('arrowLeft') // 'ArrowLeft'\n * toPascalCase('ArrowLeft') // 'ArrowLeft'\n */\nexport function toPascalCase(str: string): string {\n if (!str) return str\n\n // 이미 PascalCase인지 확인\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str\n }\n\n // kebab-case 또는 snake_case가 포함된 경우\n if (/[-_]/.test(str)) {\n return str\n .split(/[-_]/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n }\n\n // camelCase를 PascalCase로 변환\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n","/**\n * Icon Provider System\n *\n * 각 프로바이더별 로딩 전략 / Loading strategies per provider:\n *\n * 1. Phosphor Icons (https://phosphoricons.com) - default\n * - Official package: @phosphor-icons/react (MIT License)\n * - icons.ts에서 정적 subpath import (SSR-safe /dist/ssr)\n * - PROJECT_ICONS 매핑으로 통합 이름 지원\n * - 정적 맵에 없는 아이콘은 \"?\" fallback UI 표시\n *\n * 2. Iconsax Icons (https://iconsax.io) - separate entry\n * - '@hua-labs/ui/iconsax'에서 import 시 자동 등록\n * - 코어 번들에 포함되지 않음 / Not in core bundle\n * - registerIconsaxResolver()로 lazy 연결\n *\n * Note: Lucide provider는 deprecated → 제거됨.\n * Note: 동적 barrel import (import('@phosphor-icons/react'))는 Turbopack에서\n * 전체 라이브러리(4.6MB)를 번들하므로 사용 금지.\n */\n\nimport { toPascalCase } from './case-utils'\n\n// Iconsax resolver - registered lazily when iconsax entry is loaded\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet iconsaxResolver: ((name: string, variant?: string) => any) | null = null\n\n/**\n * Register iconsax resolver (called from iconsax entry point).\n * Allows the core Icon component to resolve iconsax icons\n * without statically importing the iconsax bundle.\n */\nexport function registerIconsaxResolver(resolver: typeof iconsaxResolver) {\n iconsaxResolver = resolver\n}\n\n/**\n * Get registered iconsax resolver\n */\nexport function getIconsaxResolver() {\n return iconsaxResolver\n}\n\n// Icon Provider Type\nexport type IconProvider = 'lucide' | 'phosphor' | 'iconsax'\n\n// Icon Provider Configuration\nexport interface IconProviderConfig {\n provider: IconProvider\n prefix?: string\n}\n\n/**\n * Project-specific icon list\n * These are the icons actually used in SumUp project\n * Only these icons will be loaded for optimal bundle size\n */\nexport const PROJECT_ICONS = {\n // Navigation & Layout\n 'home': { lucide: 'Home', phosphor: 'House', iconsax: 'Home2' },\n 'layout-dashboard': { lucide: 'LayoutDashboard', phosphor: 'SquaresFour' },\n 'folder': { lucide: 'Folder', phosphor: 'Folder', iconsax: 'Folder' },\n 'alert-circle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'alertCircle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'columns': { lucide: 'Columns', phosphor: 'Columns' },\n 'users': { lucide: 'Users', phosphor: 'Users', iconsax: 'People' },\n 'settings': { lucide: 'Settings', phosphor: 'Gear' },\n 'menu': { lucide: 'Menu', phosphor: 'List', iconsax: 'Menu' },\n 'close': { lucide: 'X', phosphor: 'X', iconsax: 'CloseCircle' },\n 'chevronLeft': { lucide: 'ChevronLeft', phosphor: 'CaretLeft', iconsax: 'ArrowLeft2' },\n 'chevronRight': { lucide: 'ChevronRight', phosphor: 'CaretRight', iconsax: 'ArrowRight2' },\n 'chevronDown': { lucide: 'ChevronDown', phosphor: 'CaretDown', iconsax: 'ArrowDown2' },\n 'chevronUp': { lucide: 'ChevronUp', phosphor: 'CaretUp', iconsax: 'ArrowUp2' },\n 'arrowLeft': { lucide: 'ArrowLeft', phosphor: 'ArrowLeft', iconsax: 'ArrowLeft' },\n 'arrowRight': { lucide: 'ArrowRight', phosphor: 'ArrowRight', iconsax: 'ArrowRight' },\n 'arrowUp': { lucide: 'ArrowUp', phosphor: 'ArrowUp', iconsax: 'ArrowUp' },\n 'arrowDown': { lucide: 'ArrowDown', phosphor: 'ArrowDown', iconsax: 'ArrowDown' },\n\n // Actions\n 'add': { lucide: 'Plus', phosphor: 'Plus', iconsax: 'Add' },\n 'edit': { lucide: 'Edit', phosphor: 'Pencil' },\n 'pencil': { lucide: 'Pencil', phosphor: 'Pencil' },\n 'delete': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'trash': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'upload': { lucide: 'Upload', phosphor: 'Upload', iconsax: 'Upload' },\n 'download': { lucide: 'Download', phosphor: 'Download', iconsax: 'Download' },\n 'x': { lucide: 'X', phosphor: 'X' },\n 'check': { lucide: 'Check', phosphor: 'Check', iconsax: 'Check' },\n 'search': { lucide: 'Search', phosphor: 'MagnifyingGlass', iconsax: 'SearchNormal' },\n 'share': { lucide: 'Share', phosphor: 'Share' },\n 'copy': { lucide: 'Copy', phosphor: 'Copy' },\n 'save': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Status & Feedback\n 'loader': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'loader2': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'check-circle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'checkCircle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'success': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'error': { lucide: 'XCircle', phosphor: 'XCircle', iconsax: 'CloseCircle' },\n 'warning': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Warning2' },\n 'info': { lucide: 'Info', phosphor: 'Info', iconsax: 'InfoCircle' },\n 'refresh': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'refreshCw': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'bell': { lucide: 'Bell', phosphor: 'Bell', iconsax: 'Bell' },\n 'heart': { lucide: 'Heart', phosphor: 'Heart', iconsax: 'Heart' },\n 'star': { lucide: 'Star', phosphor: 'Star', iconsax: 'Star' },\n 'bookmark': { lucide: 'Bookmark', phosphor: 'Bookmark' },\n\n // User & Auth\n 'user': { lucide: 'User', phosphor: 'User', iconsax: 'User' },\n 'userPlus': { lucide: 'UserPlus', phosphor: 'UserPlus', iconsax: 'UserAdd' },\n 'logIn': { lucide: 'LogIn', phosphor: 'SignIn', iconsax: 'Login' },\n 'logOut': { lucide: 'LogOut', phosphor: 'SignOut', iconsax: 'Logout' },\n 'chrome': { lucide: 'Chrome', phosphor: 'ChromeLogo', iconsax: 'Chrome' },\n 'github': { lucide: 'Github', phosphor: 'GithubLogo' },\n 'message': { lucide: 'MessageCircle', phosphor: 'ChatCircle' },\n\n // Content\n 'messageSquare': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'message-square': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'inbox': { lucide: 'Inbox', phosphor: 'Inbox' },\n 'calendar': { lucide: 'Calendar', phosphor: 'Calendar' },\n 'calendarPlus': { lucide: 'CalendarPlus', phosphor: 'CalendarPlus' },\n 'checkSquare': { lucide: 'CheckSquare', phosphor: 'CheckSquare', iconsax: 'TickSquare' },\n 'clock': { lucide: 'Clock', phosphor: 'Clock' },\n 'book': { lucide: 'Book', phosphor: 'Book', iconsax: 'Book' },\n 'bookOpen': { lucide: 'BookOpen', phosphor: 'BookOpen', iconsax: 'Book' },\n\n // Theme & UI\n 'monitor': { lucide: 'Monitor', phosphor: 'Monitor', iconsax: 'Monitor' },\n 'sun': { lucide: 'Sun', phosphor: 'Sun', iconsax: 'Sun' },\n 'moon': { lucide: 'Moon', phosphor: 'Moon', iconsax: 'Moon' },\n\n // AI & Features\n 'sparkle': { lucide: 'Sparkle', phosphor: 'Sparkle' },\n 'sparkles': { lucide: 'Sparkles', phosphor: 'Sparkle' },\n 'lightbulb': { lucide: 'Lightbulb', phosphor: 'Lightbulb' },\n 'brain': { lucide: 'Brain', phosphor: 'Brain' },\n 'zap': { lucide: 'Zap', phosphor: 'Lightning' },\n\n // Device & Platform\n 'globe': { lucide: 'Globe', phosphor: 'Globe', iconsax: 'Global' },\n 'deviceMobile': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'smartphone': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'floppyDisk': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Data & Analytics\n 'chart': { lucide: 'BarChart3', phosphor: 'ChartBar' },\n 'barChart': { lucide: 'BarChart', phosphor: 'ChartBar' },\n 'trendingUp': { lucide: 'TrendingUp', phosphor: 'TrendUp' },\n 'trendingDown': { lucide: 'TrendingDown', phosphor: 'TrendDown' },\n 'activity': { lucide: 'Activity', phosphor: 'Pulse' },\n 'database': { lucide: 'Database', phosphor: 'Database' },\n 'dollarSign': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'dollar': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'currency': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n\n 'layers': { lucide: 'Layers', phosphor: 'Stack' },\n 'ban': { lucide: 'Ban', phosphor: 'Prohibit' },\n\n // Security\n 'lock': { lucide: 'Lock', phosphor: 'Lock', iconsax: 'Lock' },\n 'unlock': { lucide: 'Unlock', phosphor: 'LockOpen', iconsax: 'Unlock' },\n 'shield': { lucide: 'Shield', phosphor: 'Shield', iconsax: 'Shield' },\n 'key': { lucide: 'Key', phosphor: 'Key' },\n\n // Media\n 'play': { lucide: 'Play', phosphor: 'Play', iconsax: 'Play' },\n 'pause': { lucide: 'Pause', phosphor: 'Pause', iconsax: 'Pause' },\n 'image': { lucide: 'Image', phosphor: 'Image', iconsax: 'Image' },\n 'video': { lucide: 'Video', phosphor: 'Video', iconsax: 'Video' },\n 'camera': { lucide: 'Camera', phosphor: 'Camera', iconsax: 'Camera' },\n\n // Files\n 'fileText': { lucide: 'FileText', phosphor: 'FileText' },\n 'file': { lucide: 'File', phosphor: 'File' },\n\n // Navigation\n 'externalLink': { lucide: 'ExternalLink', phosphor: 'ArrowSquareOut' },\n 'link': { lucide: 'Link', phosphor: 'Link', iconsax: 'Link' },\n 'moreHorizontal': { lucide: 'MoreHorizontal', phosphor: 'DotsThreeOutline' },\n 'moreVertical': { lucide: 'MoreVertical', phosphor: 'DotsThreeVertical' },\n\n // Priority\n 'remove': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n\n // Eye (password)\n 'eye': { lucide: 'Eye', phosphor: 'Eye', iconsax: 'Eye' },\n 'eyeOff': { lucide: 'EyeOff', phosphor: 'EyeSlash', iconsax: 'EyeSlash' },\n\n // Emotions\n 'smile': { lucide: 'Smile', phosphor: 'Smiley', iconsax: 'EmojiHappy' },\n 'frown': { lucide: 'Frown', phosphor: 'SmileySad', iconsax: 'EmojiSad' },\n 'meh': { lucide: 'Meh', phosphor: 'SmileyMeh', iconsax: 'EmojiNormal' },\n\n // Social\n 'mail': { lucide: 'Mail', phosphor: 'Envelope' },\n 'phone': { lucide: 'Phone', phosphor: 'Phone' },\n\n // Additional\n 'flag': { lucide: 'Flag', phosphor: 'Flag', iconsax: 'Flag' },\n 'rocket': { lucide: 'Rocket', phosphor: 'Rocket', iconsax: 'Rocket' },\n\n // Connectivity & Misc\n 'ticket': { lucide: 'Ticket', phosphor: 'Ticket', iconsax: 'Ticket' },\n 'clipboard': { lucide: 'ClipboardList', phosphor: 'Clipboard', iconsax: 'Sticker' },\n 'wifi': { lucide: 'Wifi', phosphor: 'WifiHigh', iconsax: 'Wifi' },\n 'wifiOff': { lucide: 'WifiOff', phosphor: 'WifiSlash' },\n 'cpu': { lucide: 'Cpu', phosphor: 'Cpu', iconsax: 'Computing' },\n 'mask': { lucide: 'Drama', phosphor: 'MaskHappy', iconsax: 'EmojiHappy' },\n\n // Text Formatting (Markdown Toolbar)\n 'bold': { lucide: 'Bold', phosphor: 'TextB' },\n 'italic': { lucide: 'Italic', phosphor: 'TextItalic' },\n 'strikethrough': { lucide: 'Strikethrough', phosphor: 'TextStrikethrough' },\n 'heading': { lucide: 'Heading', phosphor: 'TextHOne' },\n 'code': { lucide: 'Code', phosphor: 'Code', iconsax: 'Code' },\n 'fileCode': { lucide: 'FileCode', phosphor: 'FileCode' },\n 'quote': { lucide: 'Quote', phosphor: 'Quotes', iconsax: 'QuoteUp' },\n 'list': { lucide: 'List', phosphor: 'List' },\n 'listOrdered': { lucide: 'ListOrdered', phosphor: 'ListNumbers' },\n 'minus': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n} as const\n\n/**\n * Get icon from provider (iconsax only)\n *\n * Phosphor/Lucide는 정적 맵(icons.ts)으로 해결. 이 함수는 iconsax fallback용.\n */\nexport function getIconFromProvider(\n iconName: string,\n provider: IconProvider = 'phosphor'\n): React.ComponentType<Record<string, unknown>> | null {\n if (provider !== 'iconsax' || !iconsaxResolver) return null\n\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n const iconsaxName = iconMapping\n ? (iconMapping as Record<string, string | undefined>)['iconsax'] || toPascalCase(iconName)\n : toPascalCase(iconName)\n\n return iconsaxResolver(iconsaxName) || null\n}\n\n/**\n * Get icon name for provider\n */\nexport function getIconNameForProvider(\n iconName: string,\n provider: IconProvider\n): string {\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n if (iconMapping) {\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n if (mappedName) {\n return mappedName\n }\n }\n return iconName\n}\n\n/**\n * Get all project icon names\n */\nexport function getProjectIconNames(): string[] {\n return Object.keys(PROJECT_ICONS)\n}\n","/**\n * Icon Name Normalization System\n *\n * 아이콘 이름 정규화를 위한 통합 시스템입니다.\n *\n * Features:\n * - kebab-case → camelCase conversion\n * - snake_case → camelCase conversion\n * - PascalCase → camelCase conversion\n * - Alias resolution\n * - Provider-specific name mapping\n */\n\nimport { ICON_ALIASES } from './icon-aliases'\nimport { toCamelCase, toPascalCase } from './case-utils'\n\n// Re-export case utils for backward compatibility\nexport { toCamelCase, toPascalCase } from './case-utils'\n\n// IconProvider type (avoid circular dependency with icon-providers.ts)\nexport type IconProviderType = 'lucide' | 'phosphor' | 'iconsax'\n\n/**\n * 정규화 결과 인터페이스\n */\nexport interface NormalizeResult {\n /** 정규화된 아이콘 이름 (camelCase) */\n normalized: string\n /** 원본 이름이 alias였는지 여부 */\n wasAlias: boolean\n /** 원본 alias 이름 (alias였던 경우) */\n originalAlias?: string\n}\n\n/**\n * 아이콘 이름을 정규화합니다.\n *\n * @example\n * normalizeIconName('arrow-left') // { normalized: 'arrowLeft', wasAlias: false }\n * normalizeIconName('back') // { normalized: 'arrowLeft', wasAlias: true, originalAlias: 'back' }\n * normalizeIconName('ArrowLeft') // { normalized: 'arrowLeft', wasAlias: false }\n */\nexport function normalizeIconName(iconName: string): NormalizeResult {\n if (!iconName || typeof iconName !== 'string') {\n return { normalized: iconName || '', wasAlias: false }\n }\n\n const camelCased = toCamelCase(iconName)\n const aliasTarget = ICON_ALIASES[iconName] || ICON_ALIASES[camelCased]\n\n if (aliasTarget) {\n return {\n normalized: aliasTarget,\n wasAlias: true,\n originalAlias: iconName\n }\n }\n\n return {\n normalized: camelCased,\n wasAlias: false\n }\n}\n\n/**\n * 프로바이더별 아이콘 이름을 반환합니다.\n *\n * @example\n * getProviderIconName('arrowLeft', 'lucide') // 'ArrowLeft'\n * getProviderIconName('heart', 'iconsax') // 'Heart'\n */\nexport function getProviderIconName(\n normalizedName: string,\n provider: IconProviderType\n): string {\n switch (provider) {\n case 'lucide':\n case 'phosphor':\n case 'iconsax':\n return toPascalCase(normalizedName)\n default:\n return normalizedName\n }\n}\n","import React from 'react'\nimport type { IconProps as PhosphorIconProps } from '@phosphor-icons/react'\nimport { merge, mergeMap } from '../../lib/utils'\nimport { icons, IconName, emotionIcons, statusIcons } from '../../lib/icons'\nimport { getIconFromProvider, getIconsaxResolver, getIconNameForProvider } from '../../lib/icon-providers'\nimport { normalizeIconName } from '../../lib/normalize-icon-name'\nimport { useIconContext, type IconSet } from './IconProvider'\nimport { type PhosphorWeight } from './icon-store'\nimport type { AllIconName } from '../../lib/icon-names'\n\n/**\n * Icon 컴포넌트 Props\n */\nexport interface IconProps {\n /** 아이콘 이름 / Icon name */\n name: AllIconName\n /** 아이콘 크기 (숫자 또는 문자열) / Icon size (number or string) */\n size?: number | string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** 감정 아이콘 타입 / Emotion icon type */\n emotion?: keyof typeof emotionIcons\n /** 상태 아이콘 타입 / Status icon type */\n status?: keyof typeof statusIcons\n /** 아이콘 프로바이더 오버라이드 / Icon provider override */\n provider?: IconSet\n /** 부드러운 애니메이션 효과 / Smooth animation effect */\n animated?: boolean\n /** 펄스 애니메이션 / Pulse animation */\n pulse?: boolean\n /** 회전 애니메이션 / Spin animation */\n spin?: boolean\n /** 바운스 애니메이션 / Bounce animation */\n bounce?: boolean\n /** 색상 변형 / Color variant */\n variant?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'muted' | 'inherit'\n /** Phosphor 아이콘 weight 오버라이드 / Phosphor icon weight override */\n weight?: PhosphorWeight\n /** 스크린 리더용 라벨 / Screen reader label */\n 'aria-label'?: string\n /** 장식용 아이콘 / Decorative icon (hidden from screen readers) */\n 'aria-hidden'?: boolean\n}\n\n/**\n * Icon 컴포넌트\n *\n * 다중 아이콘 라이브러리(Phosphor, Lucide, Iconsax)를 지원하는 통합 아이콘 컴포넌트.\n * IconProvider를 통해 전역 설정을 관리하며, 개별 아이콘에서도 오버라이드 가능.\n *\n * Iconsax는 별도 entry('@hua-labs/ui/iconsax')를 import해야 동작합니다.\n *\n * @example\n * ```tsx\n * <Icon name=\"heart\" />\n * <Icon name=\"user\" size={24} />\n * <Icon name=\"check\" variant=\"success\" />\n * <Icon name=\"loader\" spin />\n * ```\n */\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(({\n name,\n size,\n className,\n emotion,\n status,\n provider,\n weight,\n animated = false,\n pulse = false,\n spin = false,\n bounce = false,\n variant = 'default',\n 'aria-label': ariaLabel,\n 'aria-hidden': ariaHidden\n}, ref) => {\n const config = useIconContext()\n\n const iconSet = provider || config.set\n const iconSize = size ?? config.size\n const iconWeight = weight || config.weight\n const iconColor = config.color\n const iconStrokeWidth = config.strokeWidth ?? 1.25\n const iconsaxVariant = config.iconsaxVariant ?? 'line'\n\n const [isClient, setIsClient] = React.useState(false)\n\n React.useEffect(() => {\n setIsClient(true)\n }, [])\n\n // 통합 정규화\n const resolvedIcon = React.useMemo(() => {\n const baseName = emotion ? emotionIcons[emotion] :\n status ? statusIcons[status] : name\n const { normalized } = normalizeIconName(baseName)\n const providerName = getIconNameForProvider(normalized, iconSet)\n return { normalized, providerName }\n }, [name, emotion, status, iconSet])\n\n const iconName = resolvedIcon.normalized as AllIconName\n\n // Iconsax: resolver를 통해 가져오기 (iconsax entry import 시 자동 등록됨)\n const iconsaxIcon = React.useMemo(() => {\n if (iconSet === 'iconsax' && isClient) {\n const resolver = getIconsaxResolver()\n if (resolver) {\n return resolver(resolvedIcon.providerName, iconsaxVariant)\n }\n }\n return null\n }, [iconSet, resolvedIcon.providerName, isClient, iconsaxVariant])\n\n // 색상 변형 클래스\n const variantClasses = mergeMap({\n 'text-current': variant === 'default',\n 'text-primary': variant === 'primary',\n 'text-muted-foreground': variant === 'secondary' || variant === 'muted',\n 'text-green-600 dark:text-green-400': variant === 'success',\n 'text-yellow-600 dark:text-yellow-400': variant === 'warning',\n 'text-destructive': variant === 'error',\n })\n\n // 서버사이드에서는 빈 span 반환\n if (!isClient) {\n return (\n <span\n style={{ width: iconSize, height: iconSize }}\n className={merge(variantClasses, className)}\n aria-hidden={ariaHidden !== undefined ? ariaHidden : true}\n aria-label={ariaLabel}\n />\n )\n }\n\n // Provider에 따라 아이콘 가져오기\n type IconComponentType = React.ComponentType<PhosphorIconProps | React.SVGProps<SVGSVGElement> | Record<string, unknown>>\n let ResolvedIcon: IconComponentType | null = null\n\n if (iconSet === 'phosphor') {\n // 1. icons.ts에서 먼저 찾기 (Phosphor 아이콘이 기본, 정적 import)\n ResolvedIcon = (icons[iconName as IconName] || null) as IconComponentType | null\n // 2. 정적 맵에 없으면 null (fallback UI \"?\" 표시)\n // getIconFromProvider는 iconsax 전용, phosphor는 정적 맵만 사용\n } else if (iconSet === 'iconsax') {\n ResolvedIcon = iconsaxIcon as IconComponentType | null\n if (!ResolvedIcon) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else {\n // Lucide나 다른 provider\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n\n if (!ResolvedIcon) {\n if (iconSet === 'iconsax' && !getIconsaxResolver()) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `Icon \"${iconName}\" — iconsax resolver not registered. ` +\n `Use HuaProvider with icons.set='iconsax', or add: import '@hua-labs/ui/iconsax'`\n )\n }\n } else {\n console.warn(`Icon \"${iconName}\" not found for provider \"${iconSet}\"`)\n }\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center rounded-full border-2 border-dashed border-border',\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n aria-label={ariaLabel || `아이콘을 찾을 수 없음: ${iconName}`}\n title={`Icon not found: ${iconName}`}\n >\n <span className=\"text-xs text-muted-foreground\" aria-hidden=\"true\">\n ?\n </span>\n </span>\n )\n }\n\n // 세트별 props 준비\n type IconPropsType = PhosphorIconProps & {\n size?: number\n width?: number | string\n height?: number | string\n color?: string\n weight?: PhosphorWeight\n strokeWidth?: number\n }\n\n const iconProps: IconPropsType = {\n size: typeof iconSize === 'number' ? iconSize : undefined,\n width: typeof iconSize === 'string' ? iconSize : iconSize,\n height: typeof iconSize === 'string' ? iconSize : iconSize,\n color: iconColor,\n } as IconPropsType\n\n if (iconSet === 'phosphor') {\n iconProps.weight = iconWeight\n } else {\n iconProps.strokeWidth = iconStrokeWidth\n }\n\n const animationClasses = mergeMap({\n 'animate-pulse': pulse,\n 'animate-spin': spin,\n 'animate-bounce': bounce,\n 'transition-all duration-200 ease-in-out': animated,\n })\n\n const accessibilityProps: React.AriaAttributes = {}\n\n if (ariaLabel) {\n accessibilityProps['aria-label'] = ariaLabel\n accessibilityProps['aria-hidden'] = false\n } else if (ariaHidden !== undefined) {\n accessibilityProps['aria-hidden'] = ariaHidden\n } else {\n accessibilityProps['aria-hidden'] = true\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center',\n animationClasses,\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n {...accessibilityProps}\n >\n {ResolvedIcon && React.createElement(ResolvedIcon, {\n ...iconProps,\n className: variantClasses,\n 'aria-hidden': true\n } as React.ComponentProps<typeof ResolvedIcon>)}\n </span>\n )\n})\n\nIconComponent.displayName = 'Icon'\n\nconst MemoizedIcon = React.memo(IconComponent, (prevProps, nextProps) => {\n return (\n prevProps.name === nextProps.name &&\n prevProps.size === nextProps.size &&\n prevProps.className === nextProps.className &&\n prevProps.emotion === nextProps.emotion &&\n prevProps.status === nextProps.status &&\n prevProps.provider === nextProps.provider &&\n prevProps.animated === nextProps.animated &&\n prevProps.pulse === nextProps.pulse &&\n prevProps.spin === nextProps.spin &&\n prevProps.bounce === nextProps.bounce &&\n prevProps.variant === nextProps.variant &&\n prevProps.weight === nextProps.weight &&\n prevProps['aria-label'] === nextProps['aria-label'] &&\n prevProps['aria-hidden'] === nextProps['aria-hidden']\n )\n})\n\nexport const Icon = MemoizedIcon as typeof IconComponent\nIcon.displayName = 'Icon'\n\nexport const EmotionIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { emotion: keyof typeof emotionIcons }>(\n (props, ref) => <Icon ref={ref} name=\"smile\" {...props} />\n)\nEmotionIcon.displayName = 'EmotionIcon'\n\nexport const StatusIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { status: keyof typeof statusIcons }>(\n (props, ref) => <Icon ref={ref} name=\"info\" {...props} />\n)\nStatusIcon.displayName = 'StatusIcon'\n\nexport const LoadingIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"loader\" status=\"loading\" spin aria-label=\"로딩 중\" {...props} />\n )\n)\nLoadingIcon.displayName = 'LoadingIcon'\n\nexport const SuccessIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"check\" status=\"success\" variant=\"success\" aria-label=\"성공\" {...props} />\n )\n)\nSuccessIcon.displayName = 'SuccessIcon'\n\nexport const ErrorIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"alertCircle\" status=\"error\" variant=\"error\" aria-label=\"오류\" {...props} />\n )\n)\nErrorIcon.displayName = 'ErrorIcon'\n"]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import {a}from'./chunk-QEMPERUK.mjs';import o from'react';import {jsxs,jsx}from'react/jsx-runtime';var P=o.forwardRef(({className:l,children:s,trigger:n,open:a$1,onOpenChange:u,position:t="bottom",align:M="center",offset:d=8,disabled:g=false,contentClassName:x,fullWidth:y=false,...N},R)=>{let[T,w]=o.useState(false),f=o.useRef(null),b=o.useRef(null),m=a$1!==void 0,i=m?a$1:T,p=o.useCallback(e=>{g||(m||w(e),u==null||u(e));},[g,m,u]),L=()=>{p(!i);};o.useEffect(()=>{let e=v=>{f.current&&b.current&&!f.current.contains(v.target)&&!b.current.contains(v.target)&&p(false);};if(i)return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e);}},[i,p]);let k=()=>{let e="absolute z-50";switch(t){case "top":return a(e,"bottom-full",`mb-${Math.max(1,Math.floor(d/4))}`);case "bottom":return a(e,"top-full",`mt-${Math.max(1,Math.floor(d/4))}`);case "left":return a(e,"right-full",`mr-${Math.max(1,Math.floor(d/4))}`);case "right":return a(e,"left-full",`ml-${Math.max(1,Math.floor(d/4))}`);default:return a(e,"top-full",`mt-${Math.max(1,Math.floor(d/4))}`)}},E=()=>{switch(M){case "start":return t==="top"||t==="bottom"?"left-0":"top-0";case "end":return t==="top"||t==="bottom"?"right-0":"bottom-0";default:return t==="top"||t==="bottom"?"left-1/2 -translate-x-1/2":"top-1/2 -translate-y-1/2"}},H=()=>{let e="absolute w-0 h-0 border-4 border-transparent";switch(t){case "top":return `${e} top-full left-1/2 -translate-x-1/2 border-t-gray-200 dark:border-t-gray-700`;case "bottom":return `${e} bottom-full left-1/2 -translate-x-1/2 border-b-gray-200 dark:border-b-gray-700`;case "left":return `${e} left-full top-1/2 -translate-y-1/2 border-l-gray-200 dark:border-l-gray-700`;case "right":return `${e} right-full top-1/2 -translate-y-1/2 border-r-gray-200 dark:border-r-gray-700`;default:return `${e} bottom-full left-1/2 -translate-x-1/2 border-b-gray-200 dark:border-b-gray-700`}};return jsxs("div",{ref:R,className:a("relative",l),...N,children:[jsx("div",{ref:f,onClick:L,className:a(y?"block w-full":"inline-block","cursor-pointer"),"aria-expanded":i,"aria-haspopup":"true",children:n}),i&&jsxs("div",{ref:b,role:"dialog",className:a("bg-popover text-popover-foreground border border-border rounded-lg shadow-lg p-4 min-w-[200px]",k(),E(),x),children:[jsx("div",{className:H()}),jsx("div",{className:"relative z-10",children:s})]})]})});P.displayName="Popover";var C=o.forwardRef(({className:l,children:s,...n},a$1)=>jsx("div",{ref:a$1,className:a("inline-block cursor-pointer",l),...n,children:s}));C.displayName="PopoverTrigger";var $=o.forwardRef(({className:l,children:s,...n},a$1)=>jsx("div",{ref:a$1,className:a("bg-popover text-popover-foreground border border-border rounded-lg shadow-lg p-4",l),...n,children:s}));$.displayName="PopoverContent";export{P as a,C as b,$ as c};//# sourceMappingURL=chunk-ZY23NOT4.mjs.map
3
+ //# sourceMappingURL=chunk-ZY23NOT4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Popover.tsx"],"names":["Popover","React","className","children","trigger","controlledOpen","onOpenChange","position","align","offset","disabled","contentClassName","fullWidth","props","ref","internalOpen","setInternalOpen","triggerRef","popoverRef","isControlled","isOpen","handleOpenChange","newOpen","handleTriggerClick","handleClickOutside","event","getPositionClasses","baseClasses","merge","getAlignmentClasses","getArrowClasses","jsxs","jsx","PopoverTrigger","PopoverContent"],"mappings":"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","file":"chunk-ZY23NOT4.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Popover 컴포넌트의 props / Popover component props\n * @typedef {Object} PopoverProps\n * @property {React.ReactNode} children - Popover 내용 / Popover content\n * @property {React.ReactNode} trigger - Popover를 열기 위한 트리거 요소 / Trigger element to open popover\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [position=\"bottom\"] - Popover 표시 위치 / Popover display position\n * @property {\"start\" | \"center\" | \"end\"} [align=\"center\"] - Popover 정렬 / Popover alignment\n * @property {number} [offset=8] - 트리거와 Popover 사이 간격 (px) / Spacing between trigger and popover (px)\n * @property {boolean} [disabled=false] - Popover 비활성화 여부 / Disable popover\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface PopoverProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n trigger: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n position?: \"top\" | \"bottom\" | \"left\" | \"right\"\n align?: \"start\" | \"center\" | \"end\"\n offset?: number\n disabled?: boolean\n /** Popover 콘텐츠 영역 추가 클래스 / Additional class for popover content area */\n contentClassName?: string\n /** 트리거를 full-width로 렌더링 (DatePicker 등) / Render trigger as full-width */\n fullWidth?: boolean\n}\n\n/**\n * Popover 컴포넌트 / Popover component\n * \n * 트리거 요소를 클릭하면 표시되는 팝오버 컴포넌트입니다.\n * 외부 클릭 시 자동으로 닫힙니다.\n * \n * Popover component that appears when the trigger element is clicked.\n * Automatically closes when clicking outside.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Popover trigger={<Button>열기</Button>}>\n * <div className=\"p-4\">Popover 내용</div>\n * </Popover>\n * \n * @example\n * // 제어 모드 / Controlled mode\n * const [open, setOpen] = useState(false)\n * <Popover \n * open={open}\n * onOpenChange={setOpen}\n * trigger={<Button>제어 모드</Button>}\n * position=\"top\"\n * >\n * <div className=\"p-4\">내용</div>\n * </Popover>\n * \n * @param {PopoverProps} props - Popover 컴포넌트의 props / Popover component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Popover 컴포넌트 / Popover component\n */\nconst Popover = React.forwardRef<HTMLDivElement, PopoverProps>(\n ({ \n className,\n children,\n trigger,\n open: controlledOpen,\n onOpenChange,\n position = \"bottom\",\n align = \"center\",\n offset = 8,\n disabled = false,\n contentClassName,\n fullWidth = false,\n ...props\n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const triggerRef = React.useRef<HTMLDivElement>(null)\n const popoverRef = React.useRef<HTMLDivElement>(null)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const handleOpenChange = React.useCallback((newOpen: boolean) => {\n if (disabled) return\n\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }, [disabled, isControlled, onOpenChange])\n\n const handleTriggerClick = () => {\n handleOpenChange(!isOpen)\n }\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current && \n popoverRef.current && \n !triggerRef.current.contains(event.target as Node) &&\n !popoverRef.current.contains(event.target as Node)\n ) {\n handleOpenChange(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }\n }, [isOpen, handleOpenChange])\n\n const getPositionClasses = () => {\n const baseClasses = \"absolute z-50\"\n\n switch (position) {\n case \"top\":\n return merge(baseClasses, \"bottom-full\", `mb-${Math.max(1, Math.floor(offset / 4))}`)\n case \"bottom\":\n return merge(baseClasses, \"top-full\", `mt-${Math.max(1, Math.floor(offset / 4))}`)\n case \"left\":\n return merge(baseClasses, \"right-full\", `mr-${Math.max(1, Math.floor(offset / 4))}`)\n case \"right\":\n return merge(baseClasses, \"left-full\", `ml-${Math.max(1, Math.floor(offset / 4))}`)\n default:\n return merge(baseClasses, \"top-full\", `mt-${Math.max(1, Math.floor(offset / 4))}`)\n }\n }\n\n const getAlignmentClasses = () => {\n switch (align) {\n case \"start\":\n if (position === \"top\" || position === \"bottom\") {\n return \"left-0\"\n } else {\n return \"top-0\"\n }\n case \"end\":\n if (position === \"top\" || position === \"bottom\") {\n return \"right-0\"\n } else {\n return \"bottom-0\"\n }\n case \"center\":\n default:\n if (position === \"top\" || position === \"bottom\") {\n return \"left-1/2 -translate-x-1/2\"\n } else {\n return \"top-1/2 -translate-y-1/2\"\n }\n }\n }\n\n const getArrowClasses = () => {\n const baseClasses = \"absolute w-0 h-0 border-4 border-transparent\"\n \n switch (position) {\n case \"top\":\n return `${baseClasses} top-full left-1/2 -translate-x-1/2 border-t-gray-200 dark:border-t-gray-700`\n case \"bottom\":\n return `${baseClasses} bottom-full left-1/2 -translate-x-1/2 border-b-gray-200 dark:border-b-gray-700`\n case \"left\":\n return `${baseClasses} left-full top-1/2 -translate-y-1/2 border-l-gray-200 dark:border-l-gray-700`\n case \"right\":\n return `${baseClasses} right-full top-1/2 -translate-y-1/2 border-r-gray-200 dark:border-r-gray-700`\n default:\n return `${baseClasses} bottom-full left-1/2 -translate-x-1/2 border-b-gray-200 dark:border-b-gray-700`\n }\n }\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {/* 트리거 */}\n <div\n ref={triggerRef}\n onClick={handleTriggerClick}\n className={merge(fullWidth ? \"block w-full\" : \"inline-block\", \"cursor-pointer\")}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n >\n {trigger}\n </div>\n\n {/* 팝오버 */}\n {isOpen && (\n <div\n ref={popoverRef}\n role=\"dialog\"\n className={merge(\n \"bg-popover text-popover-foreground border border-border rounded-lg shadow-lg p-4 min-w-[200px]\",\n getPositionClasses(),\n getAlignmentClasses(),\n contentClassName\n )}\n >\n {/* 화살표 */}\n <div className={getArrowClasses()} />\n \n {/* 내용 */}\n <div className=\"relative z-10\">\n {children}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\nPopover.displayName = \"Popover\"\n\n// 편의 컴포넌트들\nexport const PopoverTrigger = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"inline-block cursor-pointer\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nPopoverTrigger.displayName = \"PopoverTrigger\"\n\nexport const PopoverContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"bg-popover text-popover-foreground border border-border rounded-lg shadow-lg p-4\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nPopoverContent.displayName = \"PopoverContent\"\n\nexport { Popover } "]}