@hua-labs/ui 2.0.0 → 2.0.1

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 (805) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -107
  3. package/dist/advanced-dashboard.js.map +1 -1
  4. package/dist/advanced-dashboard.mjs +33 -1
  5. package/dist/advanced-dashboard.mjs.map +1 -1
  6. package/dist/advanced-emotion.js.map +1 -1
  7. package/dist/advanced-emotion.mjs +1 -1
  8. package/dist/advanced-motion.js.map +1 -1
  9. package/dist/advanced-motion.mjs +1 -1
  10. package/dist/advanced.d.mts +0 -1
  11. package/dist/advanced.d.ts +0 -1
  12. package/dist/advanced.d.ts.map +1 -1
  13. package/dist/advanced.js +22 -59
  14. package/dist/advanced.js.map +1 -1
  15. package/dist/advanced.mjs +1 -1
  16. package/dist/advanced.mjs.map +1 -1
  17. package/dist/{chunk-AQS7NFN2.mjs → chunk-5BMH7223.mjs} +2 -2
  18. package/dist/chunk-5BMH7223.mjs.map +1 -0
  19. package/dist/{chunk-NNC4U7KT.mjs → chunk-6KTHJ3EL.mjs} +3 -3
  20. package/dist/chunk-6KTHJ3EL.mjs.map +1 -0
  21. package/dist/{chunk-PCNBIB66.mjs → chunk-AANHUMJ2.mjs} +2 -2
  22. package/dist/chunk-AANHUMJ2.mjs.map +1 -0
  23. package/dist/{chunk-AD4EMK52.mjs → chunk-C4OACMTB.mjs} +2 -2
  24. package/dist/chunk-C4OACMTB.mjs.map +1 -0
  25. package/dist/{chunk-7IAQLPKT.mjs → chunk-ECLIPN34.mjs} +3 -3
  26. package/dist/chunk-ECLIPN34.mjs.map +1 -0
  27. package/dist/{chunk-YEWJBQ2E.mjs → chunk-FFH4ZFKS.mjs} +2 -2
  28. package/dist/chunk-FFH4ZFKS.mjs.map +1 -0
  29. package/dist/{chunk-ZHBYF6BV.mjs → chunk-FSL373O6.mjs} +2 -2
  30. package/dist/chunk-FSL373O6.mjs.map +1 -0
  31. package/dist/{chunk-WG672NDB.mjs → chunk-GLZKT7JN.mjs} +3 -3
  32. package/dist/chunk-GLZKT7JN.mjs.map +1 -0
  33. package/dist/{chunk-G2ICLURX.mjs → chunk-IFSEJVOR.mjs} +2 -2
  34. package/dist/chunk-IFSEJVOR.mjs.map +1 -0
  35. package/dist/{chunk-UEYZOCTQ.mjs → chunk-IN7RWQCJ.mjs} +2 -2
  36. package/dist/chunk-IN7RWQCJ.mjs.map +1 -0
  37. package/dist/{chunk-3IFKQTIC.mjs → chunk-LH77I6HO.mjs} +2 -2
  38. package/dist/chunk-LH77I6HO.mjs.map +1 -0
  39. package/dist/{chunk-RLRQ67TV.mjs → chunk-LPAG7DCA.mjs} +2 -2
  40. package/dist/chunk-LPAG7DCA.mjs.map +1 -0
  41. package/dist/{chunk-KDBO7G5C.mjs → chunk-MYFMKCYX.mjs} +2 -2
  42. package/dist/chunk-MYFMKCYX.mjs.map +1 -0
  43. package/dist/{chunk-2K6DSTJZ.mjs → chunk-N7M6RIN4.mjs} +3 -3
  44. package/dist/chunk-N7M6RIN4.mjs.map +1 -0
  45. package/dist/{chunk-545N65RJ.mjs → chunk-OI66ZLUB.mjs} +2 -2
  46. package/dist/chunk-OI66ZLUB.mjs.map +1 -0
  47. package/dist/{chunk-LOTQMZ6N.mjs → chunk-OSCMSA2Q.mjs} +2 -2
  48. package/dist/chunk-OSCMSA2Q.mjs.map +1 -0
  49. package/dist/{chunk-NKGJLV7X.mjs → chunk-PAEKNQWW.mjs} +2 -2
  50. package/dist/chunk-PAEKNQWW.mjs.map +1 -0
  51. package/dist/{chunk-PXTWZJBY.mjs → chunk-PQ3DBOMK.mjs} +2 -2
  52. package/dist/chunk-PQ3DBOMK.mjs.map +1 -0
  53. package/dist/{chunk-XUUXGYEP.mjs → chunk-RPUS7G7Q.mjs} +2 -2
  54. package/dist/chunk-RPUS7G7Q.mjs.map +1 -0
  55. package/dist/{chunk-XS2EIAJV.mjs → chunk-SDFHJ4GB.mjs} +2 -2
  56. package/dist/chunk-SDFHJ4GB.mjs.map +1 -0
  57. package/dist/{chunk-B2RDVYH5.mjs → chunk-SGEP3CQE.mjs} +2 -2
  58. package/dist/chunk-SGEP3CQE.mjs.map +1 -0
  59. package/dist/{chunk-FZMCGGWP.mjs → chunk-T3GU5BJ3.mjs} +2 -2
  60. package/dist/chunk-T3GU5BJ3.mjs.map +1 -0
  61. package/dist/{chunk-ZT3N35VA.mjs → chunk-TOANBEPN.mjs} +2 -2
  62. package/dist/chunk-TOANBEPN.mjs.map +1 -0
  63. package/dist/{chunk-KUCVW6VO.mjs → chunk-UUHAXGMO.mjs} +2 -2
  64. package/dist/chunk-UUHAXGMO.mjs.map +1 -0
  65. package/dist/{chunk-DTBZ3WTV.mjs → chunk-VWSBJUNI.mjs} +2 -2
  66. package/dist/chunk-VWSBJUNI.mjs.map +1 -0
  67. package/dist/{chunk-OPHCYXJI.mjs → chunk-X7ZIWYRC.mjs} +2 -2
  68. package/dist/chunk-X7ZIWYRC.mjs.map +1 -0
  69. package/dist/components/Badge.d.ts +1 -1
  70. package/dist/components/Button.variants.d.ts +3 -3
  71. package/dist/components/Icon/Icon.d.ts +3 -3
  72. package/dist/components/Input.d.ts +1 -1
  73. package/dist/components/Link.d.ts +1 -1
  74. package/dist/components/Panel.d.ts +3 -3
  75. package/dist/components/Progress.d.ts +2 -2
  76. package/dist/components/Select.d.ts +1 -1
  77. package/dist/components/Stack.d.ts +2 -2
  78. package/dist/components/Textarea.d.ts +1 -1
  79. package/dist/components/dashboard/QuickActionCard.d.ts +1 -1
  80. package/dist/data.js.map +1 -1
  81. package/dist/data.mjs +1 -1
  82. package/dist/data.mjs.map +1 -1
  83. package/dist/feedback.js.map +1 -1
  84. package/dist/feedback.mjs +1 -1
  85. package/dist/form.js.map +1 -1
  86. package/dist/form.mjs +1 -1
  87. package/dist/form.mjs.map +1 -1
  88. package/dist/iconsax.d.mts +160 -0
  89. package/dist/iconsax.js.map +1 -1
  90. package/dist/iconsax.mjs.map +1 -1
  91. package/dist/index.js.map +1 -1
  92. package/dist/index.mjs +1 -1
  93. package/dist/index.mjs.map +1 -1
  94. package/dist/interactive.js.map +1 -1
  95. package/dist/interactive.mjs +1 -1
  96. package/dist/interactive.mjs.map +1 -1
  97. package/dist/navigation.js.map +1 -1
  98. package/dist/navigation.mjs +1 -1
  99. package/dist/navigation.mjs.map +1 -1
  100. package/dist/overlay.js.map +1 -1
  101. package/dist/overlay.mjs +1 -1
  102. package/dist/overlay.mjs.map +1 -1
  103. package/dist/sdui.js.map +1 -1
  104. package/dist/sdui.mjs +1 -1
  105. package/dist/sdui.mjs.map +1 -1
  106. package/package.json +18 -18
  107. package/src/components/icons/3Dcube.tsx +21 -21
  108. package/src/components/icons/Add.tsx +21 -21
  109. package/src/components/icons/AddCircle.tsx +21 -21
  110. package/src/components/icons/AddSquare.tsx +21 -21
  111. package/src/components/icons/Apple.tsx +23 -23
  112. package/src/components/icons/Archive.tsx +21 -21
  113. package/src/components/icons/ArrangeCircle.tsx +29 -29
  114. package/src/components/icons/ArrangeCircle2.tsx +29 -29
  115. package/src/components/icons/ArrangeSquare.tsx +29 -29
  116. package/src/components/icons/ArrangeSquare2.tsx +29 -29
  117. package/src/components/icons/Arrow2.tsx +21 -21
  118. package/src/components/icons/Arrow3.tsx +21 -21
  119. package/src/components/icons/ArrowBottom.tsx +22 -22
  120. package/src/components/icons/ArrowCircleDown.tsx +29 -29
  121. package/src/components/icons/ArrowCircleLeft.tsx +29 -29
  122. package/src/components/icons/ArrowCircleRight.tsx +29 -29
  123. package/src/components/icons/ArrowDown.tsx +22 -22
  124. package/src/components/icons/ArrowDown1.tsx +22 -22
  125. package/src/components/icons/ArrowDown2.tsx +28 -28
  126. package/src/components/icons/ArrowLeft.tsx +22 -22
  127. package/src/components/icons/ArrowLeft1.tsx +22 -22
  128. package/src/components/icons/ArrowLeft2.tsx +28 -28
  129. package/src/components/icons/ArrowLeft3.tsx +22 -22
  130. package/src/components/icons/ArrowRight.tsx +22 -22
  131. package/src/components/icons/ArrowRight1.tsx +22 -22
  132. package/src/components/icons/ArrowRight2.tsx +28 -28
  133. package/src/components/icons/ArrowRight3.tsx +22 -22
  134. package/src/components/icons/ArrowSquareDown.tsx +28 -28
  135. package/src/components/icons/ArrowSquareLeft.tsx +28 -28
  136. package/src/components/icons/ArrowSquareRight.tsx +28 -28
  137. package/src/components/icons/ArrowSquareUp.tsx +28 -28
  138. package/src/components/icons/ArrowSwapHorizontal.tsx +22 -22
  139. package/src/components/icons/ArrowUp.tsx +22 -22
  140. package/src/components/icons/ArrowUp1.tsx +22 -22
  141. package/src/components/icons/ArrowUp2.tsx +28 -28
  142. package/src/components/icons/ArrowUp3.tsx +22 -22
  143. package/src/components/icons/AttachCircle.tsx +28 -28
  144. package/src/components/icons/AttachSquare.tsx +28 -28
  145. package/src/components/icons/Autobrightness.tsx +34 -34
  146. package/src/components/icons/BackSquare.tsx +36 -36
  147. package/src/components/icons/Backward.tsx +21 -21
  148. package/src/components/icons/Backward10Seconds.tsx +35 -35
  149. package/src/components/icons/Backward15Seconds.tsx +28 -28
  150. package/src/components/icons/Backward5Seconds.tsx +28 -28
  151. package/src/components/icons/BatteryDisable.tsx +21 -21
  152. package/src/components/icons/BatteryFull.tsx +28 -28
  153. package/src/components/icons/Bluetooth.tsx +22 -22
  154. package/src/components/icons/BluetoothCircle.tsx +30 -30
  155. package/src/components/icons/Book.tsx +28 -28
  156. package/src/components/icons/Box.tsx +35 -35
  157. package/src/components/icons/Box2.tsx +21 -21
  158. package/src/components/icons/Briefcase.tsx +30 -30
  159. package/src/components/icons/Broom.tsx +28 -28
  160. package/src/components/icons/Cake.tsx +28 -28
  161. package/src/components/icons/Calculator.tsx +35 -35
  162. package/src/components/icons/Camera.tsx +28 -28
  163. package/src/components/icons/CameraSlash.tsx +28 -28
  164. package/src/components/icons/CardAdd.tsx +35 -35
  165. package/src/components/icons/CardRemove.tsx +35 -35
  166. package/src/components/icons/CardSlash.tsx +29 -29
  167. package/src/components/icons/CardTick.tsx +36 -36
  168. package/src/components/icons/Cards.tsx +44 -44
  169. package/src/components/icons/Cd.tsx +28 -28
  170. package/src/components/icons/Check.tsx +21 -21
  171. package/src/components/icons/Chrome.tsx +35 -35
  172. package/src/components/icons/CloseCircle.tsx +21 -21
  173. package/src/components/icons/CloseSquare.tsx +21 -21
  174. package/src/components/icons/Cloud.tsx +30 -30
  175. package/src/components/icons/CloudAdd.tsx +37 -37
  176. package/src/components/icons/CloudChange.tsx +29 -29
  177. package/src/components/icons/CloudDrizzle.tsx +30 -30
  178. package/src/components/icons/CloudLightning.tsx +30 -30
  179. package/src/components/icons/CloudNotif.tsx +30 -30
  180. package/src/components/icons/CloudRemove.tsx +30 -30
  181. package/src/components/icons/CloudSnow.tsx +37 -37
  182. package/src/components/icons/CloudSunny.tsx +38 -38
  183. package/src/components/icons/Code.tsx +28 -28
  184. package/src/components/icons/Code1.tsx +28 -28
  185. package/src/components/icons/Coin.tsx +35 -35
  186. package/src/components/icons/Computing.tsx +29 -29
  187. package/src/components/icons/Convert.tsx +28 -28
  188. package/src/components/icons/Crown.tsx +21 -21
  189. package/src/components/icons/Crown1.tsx +21 -21
  190. package/src/components/icons/Danger.tsx +28 -28
  191. package/src/components/icons/DirectDown.tsx +21 -21
  192. package/src/components/icons/DirectLeft.tsx +21 -21
  193. package/src/components/icons/DirectRight.tsx +21 -21
  194. package/src/components/icons/DirectUp.tsx +21 -21
  195. package/src/components/icons/Dislike.tsx +27 -27
  196. package/src/components/icons/DollarSquare.tsx +28 -28
  197. package/src/components/icons/Drop.tsx +20 -20
  198. package/src/components/icons/EmojiHappy.tsx +29 -29
  199. package/src/components/icons/EmojiNormal.tsx +29 -29
  200. package/src/components/icons/EmojiSad.tsx +29 -29
  201. package/src/components/icons/EmptyWallet.tsx +28 -28
  202. package/src/components/icons/Eraser.tsx +28 -28
  203. package/src/components/icons/Export.tsx +21 -21
  204. package/src/components/icons/Export1.tsx +22 -22
  205. package/src/components/icons/Export2.tsx +21 -21
  206. package/src/components/icons/Export3.tsx +29 -29
  207. package/src/components/icons/Eye.tsx +28 -28
  208. package/src/components/icons/EyeSlash.tsx +35 -35
  209. package/src/components/icons/Facebook.tsx +28 -28
  210. package/src/components/icons/Figma.tsx +20 -20
  211. package/src/components/icons/Filter.tsx +22 -22
  212. package/src/components/icons/FilterAdd.tsx +30 -30
  213. package/src/components/icons/FilterEdit.tsx +38 -38
  214. package/src/components/icons/FilterRemove.tsx +38 -38
  215. package/src/components/icons/FilterSearch.tsx +29 -29
  216. package/src/components/icons/FilterTick.tsx +37 -37
  217. package/src/components/icons/FingerCricle.tsx +34 -34
  218. package/src/components/icons/Firstline.tsx +21 -21
  219. package/src/components/icons/Flag.tsx +22 -22
  220. package/src/components/icons/Flag2.tsx +22 -22
  221. package/src/components/icons/Flash.tsx +22 -22
  222. package/src/components/icons/FlashCircle.tsx +30 -30
  223. package/src/components/icons/FlashSlash.tsx +29 -29
  224. package/src/components/icons/Folder.tsx +20 -20
  225. package/src/components/icons/Folder2.tsx +28 -28
  226. package/src/components/icons/FolderAdd.tsx +28 -28
  227. package/src/components/icons/FolderCloud.tsx +30 -30
  228. package/src/components/icons/FolderCross.tsx +28 -28
  229. package/src/components/icons/FolderFavorite.tsx +27 -27
  230. package/src/components/icons/FolderMinus.tsx +28 -28
  231. package/src/components/icons/FolderOpen.tsx +28 -28
  232. package/src/components/icons/Forbidden2.tsx +21 -21
  233. package/src/components/icons/Forward.tsx +21 -21
  234. package/src/components/icons/Forward10Seconds.tsx +28 -28
  235. package/src/components/icons/Forward15Seconds.tsx +28 -28
  236. package/src/components/icons/Forward5Seconds.tsx +28 -28
  237. package/src/components/icons/ForwardSquare.tsx +36 -36
  238. package/src/components/icons/Frame.tsx +29 -29
  239. package/src/components/icons/Frame1.tsx +22 -22
  240. package/src/components/icons/Frame2.tsx +28 -28
  241. package/src/components/icons/Gallery.tsx +28 -28
  242. package/src/components/icons/GalleryAdd.tsx +41 -41
  243. package/src/components/icons/GalleryRemove.tsx +41 -41
  244. package/src/components/icons/GallerySlash.tsx +28 -28
  245. package/src/components/icons/Global.tsx +35 -35
  246. package/src/components/icons/Group.tsx +35 -35
  247. package/src/components/icons/Group1.tsx +21 -21
  248. package/src/components/icons/GroupCopy.tsx +21 -21
  249. package/src/components/icons/Heart.tsx +21 -21
  250. package/src/components/icons/Hierarchy.tsx +28 -28
  251. package/src/components/icons/Hierarchy2.tsx +21 -21
  252. package/src/components/icons/Home2.tsx +21 -21
  253. package/src/components/icons/HomeWifi.tsx +35 -35
  254. package/src/components/icons/Html3.tsx +30 -30
  255. package/src/components/icons/Html5.tsx +30 -30
  256. package/src/components/icons/Image.tsx +21 -21
  257. package/src/components/icons/Import.tsx +29 -29
  258. package/src/components/icons/Import1.tsx +28 -28
  259. package/src/components/icons/Import2.tsx +30 -30
  260. package/src/components/icons/InfoCircle.tsx +28 -28
  261. package/src/components/icons/Information.tsx +28 -28
  262. package/src/components/icons/Instagram.tsx +35 -35
  263. package/src/components/icons/JavaScript.tsx +30 -30
  264. package/src/components/icons/LanguageCircle.tsx +35 -35
  265. package/src/components/icons/LanguageSquare.tsx +35 -35
  266. package/src/components/icons/Like.tsx +27 -27
  267. package/src/components/icons/LikeDislike.tsx +40 -40
  268. package/src/components/icons/LikeTag.tsx +35 -35
  269. package/src/components/icons/Link.tsx +28 -28
  270. package/src/components/icons/Link1.tsx +21 -21
  271. package/src/components/icons/Link2.tsx +28 -28
  272. package/src/components/icons/Link21.tsx +28 -28
  273. package/src/components/icons/LinkCircle.tsx +35 -35
  274. package/src/components/icons/LinkSquare.tsx +35 -35
  275. package/src/components/icons/LocationCross.tsx +27 -27
  276. package/src/components/icons/LocationMinus.tsx +25 -25
  277. package/src/components/icons/LocationSlash.tsx +28 -28
  278. package/src/components/icons/LocationTick.tsx +26 -26
  279. package/src/components/icons/Lock.tsx +28 -28
  280. package/src/components/icons/LockSlash.tsx +28 -28
  281. package/src/components/icons/Login.tsx +28 -28
  282. package/src/components/icons/Login1.tsx +30 -30
  283. package/src/components/icons/Logout.tsx +21 -21
  284. package/src/components/icons/Logout1.tsx +22 -22
  285. package/src/components/icons/Map.tsx +21 -21
  286. package/src/components/icons/Math.tsx +21 -21
  287. package/src/components/icons/Maximize.tsx +28 -28
  288. package/src/components/icons/Menu.tsx +20 -20
  289. package/src/components/icons/MessageProgramming.tsx +30 -30
  290. package/src/components/icons/Microphone.tsx +28 -28
  291. package/src/components/icons/Microphone2.tsx +28 -28
  292. package/src/components/icons/MicrophoneSlash.tsx +28 -28
  293. package/src/components/icons/MicrophoneSlash1.tsx +28 -28
  294. package/src/components/icons/Milk.tsx +28 -28
  295. package/src/components/icons/Minus.tsx +21 -21
  296. package/src/components/icons/MinusCirlce.tsx +21 -21
  297. package/src/components/icons/MinusSquare.tsx +21 -21
  298. package/src/components/icons/Monitor.tsx +21 -21
  299. package/src/components/icons/Moon.tsx +21 -21
  300. package/src/components/icons/MoreCircle.tsx +28 -28
  301. package/src/components/icons/MoreSquare.tsx +28 -28
  302. package/src/components/icons/Mouse.tsx +28 -28
  303. package/src/components/icons/MouseCircle.tsx +28 -28
  304. package/src/components/icons/MouseSquare.tsx +28 -28
  305. package/src/components/icons/Next.tsx +21 -21
  306. package/src/components/icons/Paperclip.tsx +21 -21
  307. package/src/components/icons/Paperclip2.tsx +21 -21
  308. package/src/components/icons/PasswordCheck.tsx +28 -28
  309. package/src/components/icons/Pause.tsx +21 -21
  310. package/src/components/icons/PauseCircle.tsx +28 -28
  311. package/src/components/icons/People.tsx +21 -21
  312. package/src/components/icons/Pet.tsx +21 -21
  313. package/src/components/icons/Pharagraphspacing.tsx +21 -21
  314. package/src/components/icons/Play.tsx +22 -22
  315. package/src/components/icons/PlayCircle.tsx +29 -29
  316. package/src/components/icons/Previous.tsx +21 -21
  317. package/src/components/icons/Printer.tsx +30 -30
  318. package/src/components/icons/PrinterSlash.tsx +37 -37
  319. package/src/components/icons/Profile.tsx +21 -21
  320. package/src/components/icons/Profile2User.tsx +21 -21
  321. package/src/components/icons/ProfileAdd.tsx +21 -21
  322. package/src/components/icons/ProfileCircle.tsx +28 -28
  323. package/src/components/icons/ProfileDelete.tsx +21 -21
  324. package/src/components/icons/ProfileRemove.tsx +21 -21
  325. package/src/components/icons/ProfileTick.tsx +21 -21
  326. package/src/components/icons/ProgrammingArrow.tsx +28 -28
  327. package/src/components/icons/QuoteDown.tsx +21 -21
  328. package/src/components/icons/QuoteDownCircle.tsx +28 -28
  329. package/src/components/icons/QuoteDownSquare.tsx +28 -28
  330. package/src/components/icons/QuoteUp.tsx +21 -21
  331. package/src/components/icons/QuoteUpCircle.tsx +28 -28
  332. package/src/components/icons/QuoteUpSquare.tsx +28 -28
  333. package/src/components/icons/Ranking.tsx +37 -37
  334. package/src/components/icons/ReceiptDiscount.tsx +44 -44
  335. package/src/components/icons/ReceiptDisscount.tsx +28 -28
  336. package/src/components/icons/ReceiptItem.tsx +44 -44
  337. package/src/components/icons/ReceiptMinus.tsx +37 -37
  338. package/src/components/icons/ReceiveSquare.tsx +28 -28
  339. package/src/components/icons/ReceiveSquare2.tsx +28 -28
  340. package/src/components/icons/Received.tsx +22 -22
  341. package/src/components/icons/Record.tsx +22 -22
  342. package/src/components/icons/RecordCircle.tsx +29 -29
  343. package/src/components/icons/Redo.tsx +29 -29
  344. package/src/components/icons/Refresh.tsx +29 -29
  345. package/src/components/icons/Refresh2.tsx +21 -21
  346. package/src/components/icons/RefreshCircle.tsx +35 -35
  347. package/src/components/icons/RefreshLeftSquare.tsx +28 -28
  348. package/src/components/icons/RefreshRightSquare.tsx +28 -28
  349. package/src/components/icons/RefreshSquare2.tsx +28 -28
  350. package/src/components/icons/Repeat.tsx +38 -38
  351. package/src/components/icons/RepeatCircle.tsx +46 -46
  352. package/src/components/icons/RepeateMusic.tsx +21 -21
  353. package/src/components/icons/RepeateOne.tsx +28 -28
  354. package/src/components/icons/RotateLeft.tsx +21 -21
  355. package/src/components/icons/RotateRight.tsx +21 -21
  356. package/src/components/icons/SafeHome.tsx +28 -28
  357. package/src/components/icons/Scan.tsx +21 -21
  358. package/src/components/icons/SearchNormal.tsx +21 -21
  359. package/src/components/icons/SearchZoomIn.tsx +21 -21
  360. package/src/components/icons/SearchZoomOut.tsx +21 -21
  361. package/src/components/icons/Send.tsx +22 -22
  362. package/src/components/icons/Send2.tsx +21 -21
  363. package/src/components/icons/SendSqaure2.tsx +28 -28
  364. package/src/components/icons/SendSquare.tsx +28 -28
  365. package/src/components/icons/Shield.tsx +21 -21
  366. package/src/components/icons/ShieldCross.tsx +29 -29
  367. package/src/components/icons/ShieldSecurity.tsx +29 -29
  368. package/src/components/icons/ShieldSlash.tsx +21 -21
  369. package/src/components/icons/ShieldTick.tsx +28 -28
  370. package/src/components/icons/Shuffle.tsx +21 -21
  371. package/src/components/icons/Slack.tsx +22 -22
  372. package/src/components/icons/Slash.tsx +22 -22
  373. package/src/components/icons/Smallcaps.tsx +21 -21
  374. package/src/components/icons/SmartHome.tsx +28 -28
  375. package/src/components/icons/Sort.tsx +20 -20
  376. package/src/components/icons/Sound.tsx +21 -21
  377. package/src/components/icons/Spotify.tsx +30 -30
  378. package/src/components/icons/Star.tsx +21 -21
  379. package/src/components/icons/Sticker.tsx +28 -28
  380. package/src/components/icons/Stop.tsx +21 -21
  381. package/src/components/icons/StopCircle.tsx +28 -28
  382. package/src/components/icons/Story.tsx +21 -21
  383. package/src/components/icons/Sun.tsx +28 -28
  384. package/src/components/icons/TagCross.tsx +27 -27
  385. package/src/components/icons/TagUser.tsx +29 -29
  386. package/src/components/icons/Teacher.tsx +28 -28
  387. package/src/components/icons/Text.tsx +21 -21
  388. package/src/components/icons/TextBlock.tsx +28 -28
  389. package/src/components/icons/TextBold.tsx +21 -21
  390. package/src/components/icons/TextItalic.tsx +21 -21
  391. package/src/components/icons/TextUnderline.tsx +21 -21
  392. package/src/components/icons/TextalignCenter.tsx +21 -21
  393. package/src/components/icons/TextalignJustifycenter.tsx +21 -21
  394. package/src/components/icons/TextalignJustifyleft.tsx +21 -21
  395. package/src/components/icons/TextalignJustifyright.tsx +21 -21
  396. package/src/components/icons/TextalignLeft.tsx +21 -21
  397. package/src/components/icons/TextalignRight.tsx +21 -21
  398. package/src/components/icons/TickCircle.tsx +28 -28
  399. package/src/components/icons/TickSquare.tsx +28 -28
  400. package/src/components/icons/Ticket.tsx +29 -29
  401. package/src/components/icons/TicketDiscount.tsx +28 -28
  402. package/src/components/icons/Translate.tsx +42 -42
  403. package/src/components/icons/Trash.tsx +21 -21
  404. package/src/components/icons/Triangle.tsx +28 -28
  405. package/src/components/icons/Truck.tsx +35 -35
  406. package/src/components/icons/TrushSquare.tsx +28 -28
  407. package/src/components/icons/Undo.tsx +29 -29
  408. package/src/components/icons/Unlimited.tsx +21 -21
  409. package/src/components/icons/Unlock.tsx +28 -28
  410. package/src/components/icons/User.tsx +21 -21
  411. package/src/components/icons/UserAdd.tsx +29 -29
  412. package/src/components/icons/UserCirlceAdd.tsx +36 -36
  413. package/src/components/icons/UserEdit.tsx +44 -44
  414. package/src/components/icons/UserMinus.tsx +29 -29
  415. package/src/components/icons/UserOctagon.tsx +28 -28
  416. package/src/components/icons/UserRemove.tsx +29 -29
  417. package/src/components/icons/UserSearch.tsx +21 -21
  418. package/src/components/icons/UserSquare.tsx +35 -35
  419. package/src/components/icons/UserTag.tsx +29 -29
  420. package/src/components/icons/UserTick.tsx +36 -36
  421. package/src/components/icons/Verify.tsx +28 -28
  422. package/src/components/icons/Video.tsx +28 -28
  423. package/src/components/icons/VideoCircle.tsx +29 -29
  424. package/src/components/icons/VideoPlay.tsx +29 -29
  425. package/src/components/icons/VideoSlash.tsx +21 -21
  426. package/src/components/icons/VideoSquare.tsx +29 -29
  427. package/src/components/icons/VoiceSquare.tsx +21 -21
  428. package/src/components/icons/VolumeCross.tsx +27 -27
  429. package/src/components/icons/VolumeHigh.tsx +26 -26
  430. package/src/components/icons/VolumeLow.tsx +26 -26
  431. package/src/components/icons/VolumeLow1.tsx +26 -26
  432. package/src/components/icons/VolumeMute.tsx +19 -19
  433. package/src/components/icons/VolumeSlash.tsx +21 -21
  434. package/src/components/icons/VolumeUp.tsx +26 -26
  435. package/src/components/icons/Warning2.tsx +28 -28
  436. package/src/components/icons/Whatsapp.tsx +28 -28
  437. package/src/components/icons/Wifi.tsx +21 -21
  438. package/src/components/icons/WifiSquare.tsx +28 -28
  439. package/src/components/icons/Windows.tsx +23 -23
  440. package/src/components/icons/Youtube.tsx +30 -30
  441. package/src/components/icons/index.ts +1014 -1014
  442. package/src/components/icons-bold/3Dcube.tsx +12 -12
  443. package/src/components/icons-bold/Add.tsx +10 -10
  444. package/src/components/icons-bold/AddCircle.tsx +10 -10
  445. package/src/components/icons-bold/AddSquare.tsx +10 -10
  446. package/src/components/icons-bold/Apple.tsx +11 -11
  447. package/src/components/icons-bold/Archive.tsx +10 -10
  448. package/src/components/icons-bold/ArrangeCircle.tsx +10 -10
  449. package/src/components/icons-bold/ArrangeCircle2.tsx +10 -10
  450. package/src/components/icons-bold/ArrangeSquare.tsx +10 -10
  451. package/src/components/icons-bold/ArrangeSquare2.tsx +10 -10
  452. package/src/components/icons-bold/Arrow2.tsx +11 -11
  453. package/src/components/icons-bold/Arrow3.tsx +11 -11
  454. package/src/components/icons-bold/ArrowBottom.tsx +11 -11
  455. package/src/components/icons-bold/ArrowCircleDown.tsx +10 -10
  456. package/src/components/icons-bold/ArrowCircleLeft.tsx +10 -10
  457. package/src/components/icons-bold/ArrowCircleRight.tsx +10 -10
  458. package/src/components/icons-bold/ArrowDown.tsx +10 -10
  459. package/src/components/icons-bold/ArrowDown1.tsx +10 -10
  460. package/src/components/icons-bold/ArrowDown2.tsx +10 -10
  461. package/src/components/icons-bold/ArrowLeft.tsx +11 -11
  462. package/src/components/icons-bold/ArrowLeft1.tsx +10 -10
  463. package/src/components/icons-bold/ArrowLeft2.tsx +10 -10
  464. package/src/components/icons-bold/ArrowLeft3.tsx +10 -10
  465. package/src/components/icons-bold/ArrowRight.tsx +10 -10
  466. package/src/components/icons-bold/ArrowRight1.tsx +11 -11
  467. package/src/components/icons-bold/ArrowRight2.tsx +10 -10
  468. package/src/components/icons-bold/ArrowRight3.tsx +10 -10
  469. package/src/components/icons-bold/ArrowSquareDown.tsx +10 -10
  470. package/src/components/icons-bold/ArrowSquareLeft.tsx +10 -10
  471. package/src/components/icons-bold/ArrowSquareRight.tsx +10 -10
  472. package/src/components/icons-bold/ArrowSquareUp.tsx +10 -10
  473. package/src/components/icons-bold/ArrowSwapHorizontal.tsx +10 -10
  474. package/src/components/icons-bold/ArrowUp.tsx +10 -10
  475. package/src/components/icons-bold/ArrowUp1.tsx +10 -10
  476. package/src/components/icons-bold/ArrowUp2.tsx +11 -11
  477. package/src/components/icons-bold/ArrowUp3.tsx +10 -10
  478. package/src/components/icons-bold/AttachCircle.tsx +10 -10
  479. package/src/components/icons-bold/AttachSquare.tsx +10 -10
  480. package/src/components/icons-bold/Autobrightness.tsx +11 -11
  481. package/src/components/icons-bold/BackSquare.tsx +10 -10
  482. package/src/components/icons-bold/Backward.tsx +11 -11
  483. package/src/components/icons-bold/Backward10Seconds.tsx +12 -12
  484. package/src/components/icons-bold/Backward15Seconds.tsx +12 -12
  485. package/src/components/icons-bold/Backward5Seconds.tsx +11 -11
  486. package/src/components/icons-bold/BatteryDisable.tsx +12 -12
  487. package/src/components/icons-bold/BatteryFull.tsx +11 -11
  488. package/src/components/icons-bold/Bluetooth.tsx +12 -12
  489. package/src/components/icons-bold/BluetoothCircle.tsx +12 -12
  490. package/src/components/icons-bold/Book.tsx +11 -11
  491. package/src/components/icons-bold/Box.tsx +12 -12
  492. package/src/components/icons-bold/Box2.tsx +16 -16
  493. package/src/components/icons-bold/Briefcase.tsx +11 -11
  494. package/src/components/icons-bold/Broom.tsx +11 -11
  495. package/src/components/icons-bold/Cake.tsx +15 -15
  496. package/src/components/icons-bold/Calculator.tsx +10 -10
  497. package/src/components/icons-bold/Camera.tsx +10 -10
  498. package/src/components/icons-bold/CameraSlash.tsx +12 -12
  499. package/src/components/icons-bold/CardAdd.tsx +12 -12
  500. package/src/components/icons-bold/CardRemove.tsx +12 -12
  501. package/src/components/icons-bold/CardSlash.tsx +15 -15
  502. package/src/components/icons-bold/CardTick.tsx +12 -12
  503. package/src/components/icons-bold/Cards.tsx +12 -12
  504. package/src/components/icons-bold/Cd.tsx +10 -10
  505. package/src/components/icons-bold/Check.tsx +12 -12
  506. package/src/components/icons-bold/Chrome.tsx +13 -13
  507. package/src/components/icons-bold/CloseCircle.tsx +10 -10
  508. package/src/components/icons-bold/CloseSquare.tsx +10 -10
  509. package/src/components/icons-bold/Cloud.tsx +10 -10
  510. package/src/components/icons-bold/CloudAdd.tsx +11 -11
  511. package/src/components/icons-bold/CloudChange.tsx +12 -12
  512. package/src/components/icons-bold/CloudDrizzle.tsx +11 -11
  513. package/src/components/icons-bold/CloudLightning.tsx +11 -11
  514. package/src/components/icons-bold/CloudNotif.tsx +11 -11
  515. package/src/components/icons-bold/CloudRemove.tsx +11 -11
  516. package/src/components/icons-bold/CloudSnow.tsx +11 -11
  517. package/src/components/icons-bold/CloudSunny.tsx +11 -11
  518. package/src/components/icons-bold/Code.tsx +11 -11
  519. package/src/components/icons-bold/Code1.tsx +10 -10
  520. package/src/components/icons-bold/Coin.tsx +12 -12
  521. package/src/components/icons-bold/Computing.tsx +11 -11
  522. package/src/components/icons-bold/Convert.tsx +10 -10
  523. package/src/components/icons-bold/Crown.tsx +11 -11
  524. package/src/components/icons-bold/Crown1.tsx +11 -11
  525. package/src/components/icons-bold/Danger.tsx +10 -10
  526. package/src/components/icons-bold/DirectDown.tsx +11 -11
  527. package/src/components/icons-bold/DirectLeft.tsx +11 -11
  528. package/src/components/icons-bold/DirectRight.tsx +11 -11
  529. package/src/components/icons-bold/DirectUp.tsx +11 -11
  530. package/src/components/icons-bold/Dislike.tsx +11 -11
  531. package/src/components/icons-bold/DollarSquare.tsx +12 -12
  532. package/src/components/icons-bold/Drop.tsx +11 -11
  533. package/src/components/icons-bold/EmojiHappy.tsx +10 -10
  534. package/src/components/icons-bold/EmojiNormal.tsx +10 -10
  535. package/src/components/icons-bold/EmojiSad.tsx +10 -10
  536. package/src/components/icons-bold/EmptyWallet.tsx +12 -12
  537. package/src/components/icons-bold/Eraser.tsx +12 -12
  538. package/src/components/icons-bold/Export.tsx +10 -10
  539. package/src/components/icons-bold/Export1.tsx +10 -10
  540. package/src/components/icons-bold/Export2.tsx +11 -11
  541. package/src/components/icons-bold/Export3.tsx +11 -11
  542. package/src/components/icons-bold/Eye.tsx +11 -11
  543. package/src/components/icons-bold/EyeSlash.tsx +14 -14
  544. package/src/components/icons-bold/Facebook.tsx +10 -10
  545. package/src/components/icons-bold/Figma.tsx +14 -14
  546. package/src/components/icons-bold/Filter.tsx +11 -11
  547. package/src/components/icons-bold/FilterAdd.tsx +11 -11
  548. package/src/components/icons-bold/FilterEdit.tsx +11 -11
  549. package/src/components/icons-bold/FilterRemove.tsx +11 -11
  550. package/src/components/icons-bold/FilterSearch.tsx +11 -11
  551. package/src/components/icons-bold/FilterTick.tsx +11 -11
  552. package/src/components/icons-bold/FingerCricle.tsx +11 -11
  553. package/src/components/icons-bold/Firstline.tsx +14 -14
  554. package/src/components/icons-bold/Flag.tsx +10 -10
  555. package/src/components/icons-bold/Flag2.tsx +10 -10
  556. package/src/components/icons-bold/Flash.tsx +10 -10
  557. package/src/components/icons-bold/FlashCircle.tsx +10 -10
  558. package/src/components/icons-bold/FlashSlash.tsx +12 -12
  559. package/src/components/icons-bold/Folder.tsx +11 -11
  560. package/src/components/icons-bold/Folder2.tsx +11 -11
  561. package/src/components/icons-bold/FolderAdd.tsx +11 -11
  562. package/src/components/icons-bold/FolderCloud.tsx +12 -12
  563. package/src/components/icons-bold/FolderCross.tsx +11 -11
  564. package/src/components/icons-bold/FolderFavorite.tsx +11 -11
  565. package/src/components/icons-bold/FolderMinus.tsx +11 -11
  566. package/src/components/icons-bold/FolderOpen.tsx +11 -11
  567. package/src/components/icons-bold/Forbidden2.tsx +10 -10
  568. package/src/components/icons-bold/Forward.tsx +11 -11
  569. package/src/components/icons-bold/Forward10Seconds.tsx +12 -12
  570. package/src/components/icons-bold/Forward15Seconds.tsx +12 -12
  571. package/src/components/icons-bold/Forward5Seconds.tsx +11 -11
  572. package/src/components/icons-bold/ForwardSquare.tsx +10 -10
  573. package/src/components/icons-bold/Frame.tsx +11 -11
  574. package/src/components/icons-bold/Frame1.tsx +12 -12
  575. package/src/components/icons-bold/Gallery.tsx +12 -12
  576. package/src/components/icons-bold/GalleryAdd.tsx +12 -12
  577. package/src/components/icons-bold/GalleryRemove.tsx +12 -12
  578. package/src/components/icons-bold/GallerySlash.tsx +14 -14
  579. package/src/components/icons-bold/Global.tsx +18 -18
  580. package/src/components/icons-bold/Heart.tsx +10 -10
  581. package/src/components/icons-bold/Hierarchy.tsx +13 -13
  582. package/src/components/icons-bold/Hierarchy2.tsx +13 -13
  583. package/src/components/icons-bold/Home2.tsx +10 -10
  584. package/src/components/icons-bold/HomeWifi.tsx +10 -10
  585. package/src/components/icons-bold/Html3.tsx +10 -10
  586. package/src/components/icons-bold/Html5.tsx +10 -10
  587. package/src/components/icons-bold/Image.tsx +11 -11
  588. package/src/components/icons-bold/Import.tsx +10 -10
  589. package/src/components/icons-bold/Import1.tsx +10 -10
  590. package/src/components/icons-bold/Import2.tsx +11 -11
  591. package/src/components/icons-bold/InfoCircle.tsx +10 -10
  592. package/src/components/icons-bold/Information.tsx +10 -10
  593. package/src/components/icons-bold/Instagram.tsx +10 -10
  594. package/src/components/icons-bold/JavaScript.tsx +10 -10
  595. package/src/components/icons-bold/LanguageCircle.tsx +10 -10
  596. package/src/components/icons-bold/LanguageSquare.tsx +10 -10
  597. package/src/components/icons-bold/Like.tsx +10 -10
  598. package/src/components/icons-bold/LikeDislike.tsx +11 -11
  599. package/src/components/icons-bold/LikeTag.tsx +10 -10
  600. package/src/components/icons-bold/Link.tsx +11 -11
  601. package/src/components/icons-bold/Link1.tsx +11 -11
  602. package/src/components/icons-bold/Link2.tsx +12 -12
  603. package/src/components/icons-bold/Link21.tsx +11 -11
  604. package/src/components/icons-bold/LinkCircle.tsx +10 -10
  605. package/src/components/icons-bold/LinkSquare.tsx +10 -10
  606. package/src/components/icons-bold/LocationCross.tsx +10 -10
  607. package/src/components/icons-bold/LocationMinus.tsx +10 -10
  608. package/src/components/icons-bold/LocationSlash.tsx +12 -12
  609. package/src/components/icons-bold/LocationTick.tsx +10 -10
  610. package/src/components/icons-bold/Lock.tsx +11 -11
  611. package/src/components/icons-bold/LockSlash.tsx +12 -12
  612. package/src/components/icons-bold/Login.tsx +11 -11
  613. package/src/components/icons-bold/Login1.tsx +11 -11
  614. package/src/components/icons-bold/Logout.tsx +11 -11
  615. package/src/components/icons-bold/Logout1.tsx +11 -11
  616. package/src/components/icons-bold/Map.tsx +13 -13
  617. package/src/components/icons-bold/Math.tsx +10 -10
  618. package/src/components/icons-bold/Maximize.tsx +10 -10
  619. package/src/components/icons-bold/Menu.tsx +13 -13
  620. package/src/components/icons-bold/MessageProgramming.tsx +10 -10
  621. package/src/components/icons-bold/Microphone.tsx +11 -11
  622. package/src/components/icons-bold/Microphone2.tsx +11 -11
  623. package/src/components/icons-bold/MicrophoneSlash.tsx +13 -13
  624. package/src/components/icons-bold/MicrophoneSlash1.tsx +13 -13
  625. package/src/components/icons-bold/Milk.tsx +11 -11
  626. package/src/components/icons-bold/Minus.tsx +10 -10
  627. package/src/components/icons-bold/MinusCirlce.tsx +10 -10
  628. package/src/components/icons-bold/MinusSquare.tsx +10 -10
  629. package/src/components/icons-bold/Monitor.tsx +10 -10
  630. package/src/components/icons-bold/Moon.tsx +10 -10
  631. package/src/components/icons-bold/MoreCircle.tsx +10 -10
  632. package/src/components/icons-bold/MoreSquare.tsx +10 -10
  633. package/src/components/icons-bold/Mouse.tsx +10 -10
  634. package/src/components/icons-bold/MouseCircle.tsx +11 -11
  635. package/src/components/icons-bold/MouseSquare.tsx +11 -11
  636. package/src/components/icons-bold/Next.tsx +11 -11
  637. package/src/components/icons-bold/Paperclip.tsx +10 -10
  638. package/src/components/icons-bold/Paperclip2.tsx +10 -10
  639. package/src/components/icons-bold/PasswordCheck.tsx +11 -11
  640. package/src/components/icons-bold/Pause.tsx +11 -11
  641. package/src/components/icons-bold/PauseCircle.tsx +10 -10
  642. package/src/components/icons-bold/People.tsx +15 -15
  643. package/src/components/icons-bold/Pet.tsx +14 -14
  644. package/src/components/icons-bold/Pharagraphspacing.tsx +12 -12
  645. package/src/components/icons-bold/Play.tsx +11 -11
  646. package/src/components/icons-bold/PlayCircle.tsx +10 -10
  647. package/src/components/icons-bold/Previous.tsx +11 -11
  648. package/src/components/icons-bold/Printer.tsx +12 -12
  649. package/src/components/icons-bold/PrinterSlash.tsx +15 -15
  650. package/src/components/icons-bold/Profile.tsx +11 -11
  651. package/src/components/icons-bold/Profile2User.tsx +13 -13
  652. package/src/components/icons-bold/ProfileAdd.tsx +11 -11
  653. package/src/components/icons-bold/ProfileCircle.tsx +11 -11
  654. package/src/components/icons-bold/ProfileDelete.tsx +11 -11
  655. package/src/components/icons-bold/ProfileRemove.tsx +11 -11
  656. package/src/components/icons-bold/ProfileTick.tsx +11 -11
  657. package/src/components/icons-bold/ProgrammingArrow.tsx +11 -11
  658. package/src/components/icons-bold/QuoteDown.tsx +11 -11
  659. package/src/components/icons-bold/QuoteDownCircle.tsx +10 -10
  660. package/src/components/icons-bold/QuoteDownSquare.tsx +10 -10
  661. package/src/components/icons-bold/QuoteUp.tsx +11 -11
  662. package/src/components/icons-bold/QuoteUpCircle.tsx +10 -10
  663. package/src/components/icons-bold/QuoteUpSquare.tsx +10 -10
  664. package/src/components/icons-bold/Ranking.tsx +13 -13
  665. package/src/components/icons-bold/ReceiptDiscount.tsx +11 -11
  666. package/src/components/icons-bold/ReceiptDisscount.tsx +10 -10
  667. package/src/components/icons-bold/ReceiptItem.tsx +11 -11
  668. package/src/components/icons-bold/ReceiptMinus.tsx +11 -11
  669. package/src/components/icons-bold/ReceiveSquare.tsx +10 -10
  670. package/src/components/icons-bold/ReceiveSquare2.tsx +10 -10
  671. package/src/components/icons-bold/Received.tsx +11 -11
  672. package/src/components/icons-bold/Record.tsx +11 -11
  673. package/src/components/icons-bold/RecordCircle.tsx +10 -10
  674. package/src/components/icons-bold/Redo.tsx +10 -10
  675. package/src/components/icons-bold/Refresh.tsx +12 -12
  676. package/src/components/icons-bold/Refresh2.tsx +10 -10
  677. package/src/components/icons-bold/RefreshCircle.tsx +10 -10
  678. package/src/components/icons-bold/RefreshLeftSquare.tsx +10 -10
  679. package/src/components/icons-bold/RefreshRightSquare.tsx +10 -10
  680. package/src/components/icons-bold/RefreshSquare2.tsx +10 -10
  681. package/src/components/icons-bold/Repeat.tsx +11 -11
  682. package/src/components/icons-bold/RepeatCircle.tsx +10 -10
  683. package/src/components/icons-bold/RepeateMusic.tsx +12 -12
  684. package/src/components/icons-bold/RepeateOne.tsx +12 -12
  685. package/src/components/icons-bold/RotateLeft.tsx +11 -11
  686. package/src/components/icons-bold/RotateRight.tsx +11 -11
  687. package/src/components/icons-bold/SafeHome.tsx +11 -11
  688. package/src/components/icons-bold/Scan.tsx +16 -16
  689. package/src/components/icons-bold/SearchNormal.tsx +11 -11
  690. package/src/components/icons-bold/SearchZoomIn.tsx +11 -11
  691. package/src/components/icons-bold/SearchZoomOut.tsx +11 -11
  692. package/src/components/icons-bold/Send.tsx +10 -10
  693. package/src/components/icons-bold/Send2.tsx +10 -10
  694. package/src/components/icons-bold/SendSqaure2.tsx +10 -10
  695. package/src/components/icons-bold/SendSquare.tsx +10 -10
  696. package/src/components/icons-bold/Shield.tsx +11 -11
  697. package/src/components/icons-bold/ShieldCross.tsx +10 -10
  698. package/src/components/icons-bold/ShieldSecurity.tsx +10 -10
  699. package/src/components/icons-bold/ShieldSlash.tsx +12 -12
  700. package/src/components/icons-bold/ShieldTick.tsx +10 -10
  701. package/src/components/icons-bold/Shuffle.tsx +12 -12
  702. package/src/components/icons-bold/Slack.tsx +17 -17
  703. package/src/components/icons-bold/Slash.tsx +12 -12
  704. package/src/components/icons-bold/Smallcaps.tsx +10 -10
  705. package/src/components/icons-bold/SmartHome.tsx +10 -10
  706. package/src/components/icons-bold/Sort.tsx +10 -10
  707. package/src/components/icons-bold/Sound.tsx +14 -14
  708. package/src/components/icons-bold/Spotify.tsx +10 -10
  709. package/src/components/icons-bold/Star.tsx +13 -13
  710. package/src/components/icons-bold/Sticker.tsx +11 -11
  711. package/src/components/icons-bold/Stop.tsx +11 -11
  712. package/src/components/icons-bold/StopCircle.tsx +10 -10
  713. package/src/components/icons-bold/Story.tsx +13 -13
  714. package/src/components/icons-bold/Sun.tsx +16 -16
  715. package/src/components/icons-bold/TagCross.tsx +10 -10
  716. package/src/components/icons-bold/TagUser.tsx +10 -10
  717. package/src/components/icons-bold/Teacher.tsx +11 -11
  718. package/src/components/icons-bold/Text.tsx +10 -10
  719. package/src/components/icons-bold/TextBlock.tsx +10 -10
  720. package/src/components/icons-bold/TextBold.tsx +12 -12
  721. package/src/components/icons-bold/TextItalic.tsx +10 -10
  722. package/src/components/icons-bold/TextUnderline.tsx +10 -10
  723. package/src/components/icons-bold/TextalignCenter.tsx +13 -13
  724. package/src/components/icons-bold/TextalignJustifycenter.tsx +13 -13
  725. package/src/components/icons-bold/TextalignJustifyleft.tsx +13 -13
  726. package/src/components/icons-bold/TextalignJustifyright.tsx +13 -13
  727. package/src/components/icons-bold/TextalignLeft.tsx +13 -13
  728. package/src/components/icons-bold/TextalignRight.tsx +13 -13
  729. package/src/components/icons-bold/TickCircle.tsx +10 -10
  730. package/src/components/icons-bold/TickSquare.tsx +10 -10
  731. package/src/components/icons-bold/Ticket.tsx +10 -10
  732. package/src/components/icons-bold/TicketDiscount.tsx +10 -10
  733. package/src/components/icons-bold/Translate.tsx +14 -14
  734. package/src/components/icons-bold/Trash.tsx +11 -11
  735. package/src/components/icons-bold/Triangle.tsx +12 -12
  736. package/src/components/icons-bold/Truck.tsx +14 -14
  737. package/src/components/icons-bold/TrushSquare.tsx +10 -10
  738. package/src/components/icons-bold/Undo.tsx +10 -10
  739. package/src/components/icons-bold/Unlimited.tsx +12 -12
  740. package/src/components/icons-bold/Unlock.tsx +11 -11
  741. package/src/components/icons-bold/User.tsx +11 -11
  742. package/src/components/icons-bold/UserAdd.tsx +11 -11
  743. package/src/components/icons-bold/UserCirlceAdd.tsx +12 -12
  744. package/src/components/icons-bold/UserEdit.tsx +11 -11
  745. package/src/components/icons-bold/UserMinus.tsx +11 -11
  746. package/src/components/icons-bold/UserOctagon.tsx +10 -10
  747. package/src/components/icons-bold/UserRemove.tsx +11 -11
  748. package/src/components/icons-bold/UserSearch.tsx +11 -11
  749. package/src/components/icons-bold/UserSquare.tsx +11 -11
  750. package/src/components/icons-bold/UserTag.tsx +10 -10
  751. package/src/components/icons-bold/UserTick.tsx +11 -11
  752. package/src/components/icons-bold/Verify.tsx +10 -10
  753. package/src/components/icons-bold/Video.tsx +10 -10
  754. package/src/components/icons-bold/VideoCircle.tsx +10 -10
  755. package/src/components/icons-bold/VideoPlay.tsx +13 -13
  756. package/src/components/icons-bold/VideoSlash.tsx +13 -13
  757. package/src/components/icons-bold/VideoSquare.tsx +10 -10
  758. package/src/components/icons-bold/VoiceSquare.tsx +10 -10
  759. package/src/components/icons-bold/VolumeCross.tsx +11 -11
  760. package/src/components/icons-bold/VolumeHigh.tsx +12 -12
  761. package/src/components/icons-bold/VolumeLow.tsx +11 -11
  762. package/src/components/icons-bold/VolumeLow1.tsx +11 -11
  763. package/src/components/icons-bold/VolumeMute.tsx +10 -10
  764. package/src/components/icons-bold/VolumeSlash.tsx +13 -13
  765. package/src/components/icons-bold/VolumeUp.tsx +11 -11
  766. package/src/components/icons-bold/Warning2.tsx +10 -10
  767. package/src/components/icons-bold/Whatsapp.tsx +10 -10
  768. package/src/components/icons-bold/Wifi.tsx +13 -13
  769. package/src/components/icons-bold/WifiSquare.tsx +10 -10
  770. package/src/components/icons-bold/Windows.tsx +13 -13
  771. package/src/components/icons-bold/Youtube.tsx +10 -10
  772. package/src/components/icons-bold/index.ts +1009 -1009
  773. package/src/styles/base.css +3 -3
  774. package/src/styles/codeblock.css +25 -25
  775. package/src/styles/component-vars.css +129 -129
  776. package/src/styles/recommended-theme.css +231 -231
  777. package/src/styles/toast.css +23 -23
  778. package/dist/chunk-2K6DSTJZ.mjs.map +0 -1
  779. package/dist/chunk-3IFKQTIC.mjs.map +0 -1
  780. package/dist/chunk-545N65RJ.mjs.map +0 -1
  781. package/dist/chunk-6OSKJIXU.mjs +0 -35
  782. package/dist/chunk-6OSKJIXU.mjs.map +0 -1
  783. package/dist/chunk-7IAQLPKT.mjs.map +0 -1
  784. package/dist/chunk-AD4EMK52.mjs.map +0 -1
  785. package/dist/chunk-AQS7NFN2.mjs.map +0 -1
  786. package/dist/chunk-B2RDVYH5.mjs.map +0 -1
  787. package/dist/chunk-DTBZ3WTV.mjs.map +0 -1
  788. package/dist/chunk-FZMCGGWP.mjs.map +0 -1
  789. package/dist/chunk-G2ICLURX.mjs.map +0 -1
  790. package/dist/chunk-KDBO7G5C.mjs.map +0 -1
  791. package/dist/chunk-KUCVW6VO.mjs.map +0 -1
  792. package/dist/chunk-LOTQMZ6N.mjs.map +0 -1
  793. package/dist/chunk-NKGJLV7X.mjs.map +0 -1
  794. package/dist/chunk-NNC4U7KT.mjs.map +0 -1
  795. package/dist/chunk-OPHCYXJI.mjs.map +0 -1
  796. package/dist/chunk-PCNBIB66.mjs.map +0 -1
  797. package/dist/chunk-PXTWZJBY.mjs.map +0 -1
  798. package/dist/chunk-RLRQ67TV.mjs.map +0 -1
  799. package/dist/chunk-UEYZOCTQ.mjs.map +0 -1
  800. package/dist/chunk-WG672NDB.mjs.map +0 -1
  801. package/dist/chunk-XS2EIAJV.mjs.map +0 -1
  802. package/dist/chunk-XUUXGYEP.mjs.map +0 -1
  803. package/dist/chunk-YEWJBQ2E.mjs.map +0 -1
  804. package/dist/chunk-ZHBYF6BV.mjs.map +0 -1
  805. package/dist/chunk-ZT3N35VA.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/lib/icons.ts","../src/lib/case-utils.ts","../src/lib/icon-providers.ts","../src/lib/icon-aliases.ts","../src/lib/normalize-icon-name.ts","../src/components/Icon/icon-store.ts","../src/components/Icon/IconProvider.tsx","../src/components/Icon/Icon.tsx","../src/lib/styles/colors.ts","../src/lib/styles/variants.ts","../src/components/dashboard/StatCard.tsx","../src/components/dashboard/QuickActionCard.tsx","../src/components/dashboard/DashboardGrid.tsx","../src/components/dashboard/ActivityFeed.tsx","../src/components/dashboard/ProfileCard.tsx","../src/components/dashboard/MembershipBadge.tsx","../src/components/dashboard/MiniBarChart.tsx","../src/components/dashboard/SummaryCard.tsx","../src/components/dashboard/NotificationCard.tsx","../src/components/dashboard/MetricCard.tsx","../src/components/dashboard/ProgressCard.tsx","../src/components/dashboard/EmptyState.tsx","../src/components/Tooltip.tsx","../src/components/dashboard/DashboardSidebar.tsx","../src/components/Table.tsx","../src/components/Badge.tsx","../src/components/Skeleton.tsx","../src/components/dashboard/TransactionsTable.tsx","../src/components/Button.variants.ts","../src/lib/Slot.tsx","../src/components/Button.tsx","../src/components/Dropdown.tsx","../src/components/dashboard/DashboardToolbar.tsx","../src/components/dashboard/TrendChart.tsx","../src/components/dashboard/BarChart.tsx","../src/components/Drawer.tsx","../src/components/dashboard/TransactionDetailDrawer.tsx","../src/components/dashboard/SettlementTimeline.tsx","../src/components/dashboard/RoutingBreakdownCard.tsx","../src/components/dashboard/MerchantList.tsx","../src/components/dashboard/YearlyHeatmap.tsx","../src/components/dashboard/kanban/KanbanContext.tsx","../src/components/dashboard/kanban/KanbanColumnHeader.tsx","../src/components/dashboard/kanban/KanbanCard.tsx","../src/components/dashboard/kanban/KanbanAddCard.tsx","../src/components/dashboard/kanban/KanbanColumn.tsx","../src/components/dashboard/kanban/KanbanAddColumn.tsx","../src/components/dashboard/kanban/KanbanBoard.tsx","../src/components/dashboard/kanban/KanbanDropIndicator.tsx","../src/components/StatsPanel.tsx","../src/components/SectionHeader.tsx","../src/components/advanced/AdvancedPageTransition.tsx","../src/components/advanced/usePageTransition.ts","../src/components/advanced/usePageTransitionManager.ts","../src/components/advanced/Parallax.tsx","../src/components/advanced/Marquee.tsx","../src/components/advanced/GlowCard.tsx","../src/components/advanced/SpotlightCard.tsx","../src/components/advanced/TextReveal.tsx","../src/components/advanced/AnimatedGradient.tsx","../src/components/advanced/TiltCard.tsx","../src/components/advanced/VideoBackground.tsx","../src/components/advanced/Carousel.tsx","../src/components/Card.tsx","../src/components/advanced/blog-editor/utils/slug.ts","../src/components/advanced/blog-editor/BlogEditorContext.tsx","../src/components/advanced/blog-editor/BlogEditorHeader.tsx","../src/components/advanced/blog-editor/BlogEditorMetadata.tsx","../src/components/advanced/blog-editor/BlogEditorLanguageTabs.tsx","../src/components/advanced/blog-editor/BlogEditorContent.tsx","../src/components/advanced/blog-editor/utils/markdown.ts","../src/components/advanced/blog-editor/BlogEditorToolbar.tsx","../src/components/advanced/blog-editor/BlogEditorPreview.tsx","../src/components/advanced/blog-editor/BlogEditorActions.tsx","../src/components/advanced/blog-editor/BlogEditorTranslate.tsx","../src/components/advanced/blog-editor/BlogEditor.tsx","../src/lib/styles/system/tokens.ts","../src/advanced/Logo.tsx","../src/components/Bookmark.tsx","../src/components/Avatar.tsx","../src/components/ChatMessage.tsx","../src/components/Breadcrumb.tsx","../src/components/ComponentLayout.tsx","../src/components/EmotionMeter.tsx","../src/components/EmotionAnalysis.tsx","../src/components/EmotionButton.tsx","../src/components/EmotionSelector.tsx","../src/components/LanguageToggle.tsx","../src/components/ScrollIndicator.tsx","../src/components/ScrollProgress.tsx","../src/components/scrollbar/scrollbar.tsx","../src/components/FeatureCard.tsx","../src/components/HeroSection.tsx","../src/components/InfoCard.tsx","../src/components/Timeline.tsx"],"names":["merge","inputs","twMerge","clsx","formatRelativeTime","timestamp","locale","date","diff","minutes","hours","days","mergeMap","classMap","classes","condition","className","icons","House","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","ListIcon","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","Clock","Calendar","CalendarPlus","Bell","Heart","Star","Bookmark","Share","Monitor","Sun","Moon","Lightbulb","Brain","Flag","Square","Sparkle","Globe","DeviceMobile","Ticket","Clipboard","WifiHigh","WifiSlash","Cpu","MaskHappy","TextB","TextItalic","TextStrikethrough","TextHOne","Link","Code","FileCode","Quotes","List","ListNumbers","emotionIcons","statusIcons","toCamelCase","str","word","index","PhosphorIcons","LucideIcons","iconsaxResolver","getIconsaxResolver","PROJECT_ICONS","initPhosphorIcons","initLucideIcons","getIconFromProvider","iconName","provider","iconMapping","getIconDirect","mappedName","phosphorName1","phosphorName2","lucideName","camelCaseName","match","getIconNameForProvider","ICON_ALIASES","normalizeIconName","camelCased","aliasTarget","defaultIconConfig","IconContext","createContext","useIconContext","useContext","IconComponent","React","name","size","emotion","status","weight","animated","pulse","spin","bounce","variant","ariaLabel","ariaHidden","ref","_a","_b","config","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","iconsaxVariant","isClient","setIsClient","providerReady","setProviderReady","resolvedIcon","baseName","normalized","providerName","iconsaxIcon","variantClasses","jsx","ResolvedIcon","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","props","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon","colorShades","colorClass","color","shade","prefix","withDarkMode","lightClass","darkClass","defaultColorConfig","gradientConfig","createColorStyles","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","finalConfig","defaultBorder","defaultBg","defaultStyle","gradientFrom","gradientTo","gradientBorder","gradientStyle","outlineBorder","outlineBg","outlineText","outlineStyle","elevatedBorder","elevatedBg","elevatedShadow","elevatedStyle","iconBg","iconText","iconStyle","badgeBg","badgeText","badgeStyle","colorStylesCache","useColorStyles","cacheKey","createVariantStyles","colorStyles","baseClasses","StatCard","title","value","description","icon","trend","loading","emptyState","isGradient","isTextWhite","variantClass","useMemo","baseClass","formatValue","val","jsxs","QuickActionCard","href","onClick","badge","content","Fragment","gapClasses","columnClasses","fixedColumnClasses","DashboardGrid","columns","gap","responsive","children","gridClasses","ActivityFeed","items","emptyMessage","showHeader","maxItems","onViewAll","viewAllLabel","displayItems","hasMore","item","key","tierStyles","tierLabels","ProfileCard","email","avatar","avatarAlt","greeting","memberSince","membershipTier","membershipLabel","onSettingsClick","settingsHref","showAvatar","showMembership","showSettings","formatDate","tier","tierStyle","tierLabel","part","isEmoji","tierConfig","sizeClasses","MembershipBadge","label","showIcon","sizeStyle","displayLabel","getIcon","chartColors","MiniBarChart","data","labels","maxValue","height","showTooltip","showStats","highlightToday","todayIndex","colors","calculatedMax","fixedMax","todayIdx","calculateHeight","total","sum","average","max","chartLabel","isToday","barHeight","barColor","defaultVariantGradients","buttonGradients","SummaryCard","subtitle","footer","showAction","actionLabel","typeStyles","defaultTypeStyles","NotificationCard","showCount","getTypeStyles","type","typeStyle","MetricCard","chartData","chartLabels","showChart","progressColors","sizeStyles","ProgressCard","current","unit","showPercentage","showLabel","sizes","percentage","variantStyles","DashboardEmptyState","actionText","actionHref","actionOnClick","styles","actionButton","Tooltip","position","delay","disabled","isVisible","setIsVisible","coords","setCoords","timeoutRef","tooltipRef","e","rect","_tooltipRect","x","y","hideTooltip","getVariantClasses","getArrowClasses","TooltipLight","TooltipDark","DEFAULT_COLLAPSED","DEFAULT_EXPANDED","DashboardSidebar","logo","productSwitcher","sections","footerActions","isCollapsed","defaultCollapsed","onToggleCollapsed","collapsedWidth","expandedWidth","mobileBreakpoint","overlayBackground","hideToggle","itemClassName","activeClassName","externalMobileOpen","onMobileOpenChange","hideMobileToggle","internalCollapsed","setInternalCollapsed","internalMobileOpen","setInternalMobileOpen","isMobile","setIsMobile","collapsed","isMobileOpen","setIsMobileOpen","open","checkMobile","toggleCollapsed","next","widthStyle","sidebarContent","section","handleItemClick","itemNode","Table","getSizeClasses","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","badgeVariants","cva","Badge","skeletonVariants","Skeleton","width","animation","getAnimationStyle","SkeletonText","SkeletonCircle","SkeletonRectangle","SkeletonRounded","SkeletonCard","SkeletonAvatar","SkeletonImage","SkeletonUserProfile","SkeletonList","_","SkeletonTable","STATUS_STYLES","DEFAULT_COLUMNS","TransactionsTable","rows","isLoading","caption","filters","onRowClick","highlightRow","statusLabels","statusRenderer","amountFormatter","methodFormatter","dateFormatter","defaultCurrency","rowActionLabel","rowActionHint","columnList","hasRows","tableId","rowActionHintId","getRowActionLabel","row","renderStatus","renderAmount","currency","renderMethod","renderDate","renderCell","column","clickable","handleRowKeyDown","event","rowLabel","springTransition","buttonVariants","gradientPresets","composeRefs","refs","node","composeEventHandlers","parentHandler","childHandler","mergeClassName","slotClassName","childClassName","mergeStyle","slotStyle","childStyle","mergeProps","slotProps","childProps","mergedProps","propName","slotValue","childValue","isSlottable","child","Slot","forwardedRef","childArray","childRef","mergedRef","isBrowser","useReducedMotion","reduce","setReduce","mq","onChange","ButtonInner","iconPosition","gradient","customGradient","rounded","shadow","hover","fullWidth","iconOnly","asChild","rest","reduced","gradientClass","base","target","rel","_ariaLabel","anchorClassName","anchorProps","isDisabled","handleAnchorClick","buttonClassName","btnProps","Button","Dropdown","trigger","controlledOpen","onOpenChange","placement","align","offset","showArrow","internalOpen","setInternalOpen","triggerRef","dropdownRef","isControlled","isOpen","handleOpenChange","newOpen","handleTriggerClick","updatePosition","triggerRect","dropdownRect","viewportWidth","viewportHeight","handleClickOutside","getPlacementClasses","DropdownItem","DropdownSeparator","DropdownLabel","DropdownMenu","DropdownGroup","actionAppearance","ToolbarButton","appearance","DashboardToolbar","meta","dateRange","actions","onRefresh","lastUpdated","containerClasses","preset","action","PRESET_PALETTES","TrendChart","series","categories","palette","showLegend","showDots","paletteColors","safeCategories","denominator","points","point","i","pathData","p","areaData","_idx","colorSchemes","BarChart","showValues","showLabels","colorScheme","showGrid","d","hoveredIndex","setHoveredIndex","percent","isHighlighted","Drawer","onClose","side","showBackdrop","backdropClassName","closeOnBackdropClick","closeOnEscape","closable","_isOpen","handleClose","isAnimating","setIsAnimating","timer","handleEscapeKey","sideClasses","transformClasses","DrawerHeader","showCloseButton","DrawerContent","DrawerFooter","formatAmount","amount","parsed","getEventColor","getSettlementBadge","TransactionDetailDrawer","transaction","metadata","settlement","fees","events","summary","statusStyle","idx","fee","STATUS_CONFIG","SettlementTimeline","highlightedId","hasItems","statusConfig","showConnector","itemLabel","DEFAULT_COLORS","STATUS_BADGES","formatPercentage","RoutingBreakdownCard","segments","totalLabel","totalValue","highlightId","formatter","hasSegments","segment","badgeClass","customContent","HEALTH_BADGES","formatPercent","formatVolume","MerchantList","onMerchantSelect","merchant","approval","volume","merchantLabel","colorSteps","YearlyHeatmap","steps","weeks","monthLabels","today","startDate","currentDate","lastMonth","week","weekHasFirstOfMonth","firstOfMonthDate","cellDate","getDateKey","getCellClass","count","c","getTooltip","dateStr","v","wi","ml","m","di","KanbanContext","useKanban","context","KanbanProvider","cards","onColumnsChange","onCardsChange","onCardMove","onColumnMove","onCardAdd","onCardDelete","onCardUpdate","onColumnAdd","onColumnDelete","onColumnUpdate","onCardClick","allowCardDrag","allowColumnDrag","allowAddCard","allowAddColumn","readOnly","dragData","setDragData","dropTargetId","setDropTargetId","dropIndex","setDropIndex","startDrag","useCallback","updateDropTarget","targetId","endDrag","getCardsByColumn","columnId","card","a","b","canDropCard","currentCount","moveCard","cardId","toColumnId","toIndex","cardToMove","fromColumnId","cardsByColumn","col","colCards","targetColumnCards","clampedIndex","movedCard","updatedCards","addCard","newCard","newCards","updateCard","updates","deleteCard","moveColumn","columnIndex","newColumns","removed","addColumn","newColumn","updateColumn","deleteColumn","colorDotClasses","KanbanColumnHeader","cardCount","onTitleChange","onDelete","onToggleCollapse","dragHandleProps","isEditing","setIsEditing","useState","editTitle","setEditTitle","inputRef","useRef","useEffect","handleTitleClick","handleTitleSubmit","handleTitleKeyDown","KEYFRAMES_ID","useCardKeyframes","style","priorityLabels","KanbanCard","isDraggingProp","isOver","attributes","listeners","setNodeRef","transform","transition","isDragging","useSortable","sortableStyle","CSS","handleClick","isDeleting","setIsDeleting","handleDelete","dueText","now","isOverdue","cardStyles","animationStyle","tag","KanbanAddCard","onAdd","onCancel","placeholder","isAdding","setIsAdding","setTitle","handleStartAdding","handleCancel","handleSubmit","trimmedTitle","handleKeyDown","useColumnKeyframes","KanbanColumn","isAtLimit","cardIds","handleTitleChange","handleToggleCollapse","columnStyles","SortableContext","verticalListSortingStrategy","cardIndex","KanbanAddColumn","KanbanBoard","controlledColumns","controlledCards","defaultColumns","defaultCards","onKanbanDragStart","onKanbanDragEnd","columnMinWidth","columnMaxWidth","showDragOverlay","dragOverlayClassName","dragRotation","dragScale","isMounted","setIsMounted","internalColumns","setInternalColumns","internalCards","setInternalCards","activeId","setActiveId","activeType","setActiveType","isDraggingColumn","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","handleColumnsChange","handleCardsChange","getColumnCards","findColumnByCardId","isColumn","id","handleDragStart","active","handleDragOver","over","overId","activeColumnId","overColumnId","activeCards","overCards","overIndex","overColumn","reorderedCards","currentOrder","handleDragEnd","draggedId","draggedType","activeIdStr","oldIndex","newIndex","arrayMove","columnCards","reorderedColumnCards","newOrder","activeCard","activeColumnData","boardStyles","baseStyles","columnIds","cardOverlayStyle","DndContext","closestCenter","horizontalListSortingStrategy","DragOverlay","KanbanDropIndicator","visible","orientation","StatsPanel","baseCardClass","accentStyles","gridCols","SectionHeader","AdvancedPageTransition","duration","easing","autoStart","onStart","onComplete","showProgress","progressClassName","progress","setProgress","_isTransitioning","setIsTransitioning","animationRef","startTimeRef","getEasingFunction","easingType","t","animate","elapsed","easingFunction","currentProgress","startTransition","transitionStyles","FadePageTransition","SlidePageTransition","ScalePageTransition","FlipPageTransition","MorphPageTransition","CubePageTransition","ZoomPageTransition","usePageTransition","initialConfig","state","setState","configRef","prev","start","resolve","reverse","pause","resume","reset","usePageTransitionManager","defaultType","defaultDuration","defaultEasing","enableHistory","_enableProgress","enableDebug","activeTransitionsRef","transitionCounterRef","logDebug","message","updateStats","newTransition","newHistory","transitionId","fullConfig","transitionEvent","completedEvent","cancelTransition","pauseAll","resumeAll","_id","clearHistory","getTransitionStats","transitionHistory","byType","acc","byStatus","activeTransitions","Parallax","speed","direction","scale","opacity","rotate","rotateDirection","innerRef","setTransform","prefersReducedMotion","updateTransform","element","windowHeight","elementCenter","movement","scaleValue","opacityValue","rotateValue","handleScroll","combinedStyle","mergeRefs","setPrefersReducedMotion","mediaQuery","handleChange","Marquee","pauseOnHover","pauseOnClick","gradientColor","gradientWidth","containerRef","contentWidth","setContentWidth","contentHeight","setContentHeight","isPaused","setIsPaused","isHorizontal","isReverse","container","firstChild","updateSize","resizeObserver","GlowCard","glowColor","glowSize","glowOpacity","border","borderColor","cardRef","mousePosition","setMousePosition","isHovered","setIsHovered","handleMouseMove","glowStyle","borderStyle","SpotlightCard","spotlightColor","spotlightSize","spotlightStyle","gradientOverlayStyle","TextReveal","text","revealColor","hiddenColor","threshold","byWord","byChar","updateProgress","end","newProgress","renderText","chars","char","charProgress","isRevealed","words","wordProgress","defaultColors","AnimatedGradient","blur","blurAmount","mounted","setMounted","shouldAnimate","renderGradient","angle","TiltCard","maxTilt","perspective","glare","maxGlare","glarePosition","setGlarePosition","centerX","centerY","mouseX","mouseY","rotateY","rotateX","glareX","glareY","handleMouseEnter","handleMouseLeave","cardStyle","innerStyle","glareStyle","VideoBackground","src","poster","autoPlay","loop","muted","controls","objectFit","overlay","overlayColor","gradientDirection","playbackRate","fadeIn","videoRef","isLoaded","setIsLoaded","isPlaying","setIsPlaying","handleLoadedData","handlePlaying","getYouTubeUrl","videoId","params","getVimeoUrl","renderVideo","objectFitClass","renderGradientOverlay","gradients","hasPositionClass","Carousel","interval","indicators","indicatorPosition","showArrows","arrowPosition","transitionDuration","onSlideChange","showPlayPause","playPausePosition","getInitialIndex","currentIndex","setCurrentIndex","isManuallyPaused","setIsManuallyPaused","isTransitioning","noTransition","setNoTransition","touchStart","setTouchStart","touchEnd","setTouchEnd","slideCount","getActualIndex","goToSlide","actualIndex","nextSlide","prevSlide","togglePlayPause","handleTouchStart","handleTouchMove","handleTouchEnd","distance","renderSlides","renderIndicators","isInside","isTop","indicatorContainerClass","handleIndicatorClick","isActive","renderPlayPause","PauseIcon","PlayIcon","renderArrows","canGoPrev","canGoNext","arrowBaseClass","prevPosition","nextPosition","ChevronLeft","ChevronRight","cardVariants","Card","padding","hoverable","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","generateSlug","isValidSlug","slug","normalizeSlug","input","DEFAULT_LABELS","DEFAULT_FEATURES","DEFAULT_LANGUAGES","createEmptyMultilingualField","languages","field","lang","createInitialData","initialData","BlogEditorContext","useBlogEditor","BlogEditorProvider","isEditMode","defaultLanguage","userLabels","callbacks","userFeatures","autoSaveKey","autoSaveInterval","primaryLanguage","l","initialLanguage","features","formData","setFormData","activeLanguage","setActiveLanguage","showPreview","setShowPreview","submitting","setSubmitting","translating","setTranslating","uploading","setUploading","error","setError","translateSuccess","setTranslateSuccess","slugManuallyEdited","setSlugManuallyEdited","autoSaveStatus","setAutoSaveStatus","autoSaveTimerRef","isInitialMount","storageKey","saved","clearAutoSave","updateField","updateMultilingualField","language","handleSave","publish","primaryTitle","primaryContent","handleTranslate","primaryExcerpt","translations","newTitle","newContent","newExcerpt","langKey","translation","trans","handleUploadImage","file","BlogEditorHeader","onBack","backLink","BlogEditorMetadata","tagInput","setTagInput","fileInputRef","inputClasses","labelClasses","addTag","trimmed","removeTag","tagToRemove","handleTagInputChange","parts","handleTagKeyDown","url","BlogEditorLanguageTabs","isPrimary","BlogEditorContent","textareaRef","isPrimaryLanguage","currentLang","getLangLabel","baseLabel","escapeHtml","parseMarkdown","html","code","stripMarkdown","getMarkdownPreview","maxLength","stripped","insertMarkdown","selectionStart","selectionEnd","before","after","selectedText","beforeText","afterText","newText","cursorPosition","TOOLBAR_ITEMS","BlogEditorToolbar","handleInsert","textarea","currentContent","BlogEditorPreview","renderMarkdown","renderedContent","BlogEditorActions","cancelLink","BlogEditorTranslate","hint","canTranslate","BlogEditorRoot","translateHint","maxWidth","contentContainerClasses","BlogEditor","BlogEditorCompound","defaultTokens","EMBLEM_PATH","WORDMARK_PATH","getSizeInRem","Logo","sizeInRem","styleId","existingStyle","wordmarkRatio","defaultBookmarked","onBookmarkChange","isBookmarked","setIsBookmarked","savedBookmarks","bookmarks","toggleBookmark","newBookmarked","avatarVariants","Avatar","alt","fallbackText","imgError","setImgError","getFallbackContent","showImage","AvatarImage","AvatarFallback","ChatMessage","user","assistant","showTimestamp","showEmotion","theme","isUser","getEmotionColor","formatTime","Breadcrumb","showHomeIcon","homeLabel","separator","renderedItems","firstItem","lastItems","isCurrent","BreadcrumbItem","itemsCount","ComponentLayout","prevPage","nextPage","breadcrumbItems","EmotionMeter","emotionColors","EmotionAnalysis","primaryEmotion","emotionDistribution","keywords","intensity","positivity","energy","showMeter","showDistribution","showKeywords","showMetrics","layout","getIntensityLabel","getPositivityLabel","getEnergyLabel","keyword","EmotionButton","isSelected","defaultEmotions","EmotionSelector","selectedEmotion","onEmotionSelect","showIntensity","onIntensityChange","emotions","handleEmotionClick","emotionKey","renderEmotionItem","layoutClasses","LanguageToggle","currentLanguage","onLanguageChange","_ref","setIsOpen","handleLanguageChange","languageCode","renderIcon","nextIndex","ScrollIndicator","autoHide","hideThreshold","scrollTop","scrollToTarget","targetElement","currentSection","nextSection","positionClasses","ScrollProgress","_animated","docHeight","Scrollbar","smooth","getOrientationClasses","FeatureCard","getGradientClass","hoverClasses","HeroSection","primaryAction","secondaryAction","slides","indicator","showControls","background","customBackground","fullBleed","currentSlide","setCurrentSlide","isSlideMode","titleSizeClasses","subtitleSizeClasses","descriptionSizeClasses","currentBg","backgroundContent","renderIndicator","line","arr","toneClasses","InfoCard","tone","SIZE_CONFIG","Timeline","sizeConfig","showLine","isAlternateRight","isRight","itemContent"],"mappings":"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","file":"advanced.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\r\nimport { twMerge } from \"tailwind-merge\"\r\n\r\n/**\r\n * HUA UI의 스마트 클래스 병합 유틸리티\r\n * clsx와 tailwind-merge를 결합하여 중복 클래스를 자동으로 해결합니다.\r\n * \r\n * @param inputs - 병합할 클래스 값들\r\n * @returns 병합된 클래스 문자열\r\n * \r\n * @example\r\n * ```tsx\r\n * merge(\"px-2 py-1\", \"px-4\") // \"py-1 px-4\"\r\n * merge(\"text-red-500\", \"text-blue-500\") // \"text-blue-500\"\r\n * merge(\"bg-white\", \"dark:bg-slate-900\") // \"bg-white dark:bg-slate-900\"\r\n * ```\r\n */\r\nexport function merge(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}\r\n\r\n/**\r\n * 조건부 클래스 병합 유틸리티\r\n * 조건에 따라 클래스를 선택적으로 병합합니다.\r\n * \r\n * @param condition - 클래스를 적용할 조건\r\n * @param trueClass - 조건이 true일 때 적용할 클래스\r\n * @param falseClass - 조건이 false일 때 적용할 클래스 (선택사항)\r\n * @returns 병합된 클래스 문자열\r\n * \r\n * @example\r\n * ```tsx\r\n * mergeIf(isActive, \"bg-blue-500\", \"bg-gray-200\")\r\n * mergeIf(isLoading, \"opacity-50 cursor-not-allowed\")\r\n * ```\r\n */\r\nexport function mergeIf(\r\n condition: boolean,\r\n trueClass: ClassValue,\r\n falseClass?: ClassValue\r\n) {\r\n return merge(condition ? trueClass : falseClass || \"\")\r\n}\r\n\r\n/**\r\n * 상대 시간 포맷팅 유틸리티\r\n * \r\n * 날짜를 상대 시간 형식으로 포맷팅합니다 (예: \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\r\n * 7일 이상 경과한 경우 절대 날짜를 반환합니다.\r\n * \r\n * Formats a date as relative time (e.g., \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\r\n * Returns absolute date for dates older than 7 days.\r\n * \r\n * @param timestamp - 포맷팅할 날짜 (Date 객체 또는 ISO 문자열) / Date to format (Date object or ISO string)\r\n * @param locale - 로케일 (기본값: \"ko-KR\") / Locale (default: \"ko-KR\")\r\n * @returns 포맷팅된 상대 시간 문자열 / Formatted relative time string\r\n * \r\n * @example\r\n * ```tsx\r\n * formatRelativeTime(new Date()) // \"방금 전\"\r\n * formatRelativeTime(new Date(Date.now() - 5 * 60000)) // \"5분 전\"\r\n * formatRelativeTime(new Date(Date.now() - 2 * 3600000)) // \"2시간 전\"\r\n * formatRelativeTime(new Date(Date.now() - 3 * 86400000)) // \"3일 전\"\r\n * formatRelativeTime(new Date(\"2024-01-01\")) // \"2024. 1. 1.\" (7일 이상 경과)\r\n * ```\r\n */\r\nexport function formatRelativeTime(timestamp: Date | string, locale = \"ko-KR\"): string {\r\n const date = typeof timestamp === \"string\" ? new Date(timestamp) : timestamp;\r\n const now = new Date();\r\n const diff = now.getTime() - date.getTime();\r\n const minutes = Math.floor(diff / 60000);\r\n const hours = Math.floor(diff / 3600000);\r\n const days = Math.floor(diff / 86400000);\r\n\r\n if (minutes < 1) return locale === \"ko-KR\" ? \"방금 전\" : \"just now\";\r\n if (minutes < 60) return locale === \"ko-KR\" ? `${minutes}분 전` : `${minutes}m ago`;\r\n if (hours < 24) return locale === \"ko-KR\" ? `${hours}시간 전` : `${hours}h ago`;\r\n if (days < 7) return locale === \"ko-KR\" ? `${days}일 전` : `${days}d ago`;\r\n return date.toLocaleDateString(locale);\r\n}\r\n\r\n/**\r\n * 객체 기반 클래스 병합 유틸리티\r\n * 객체의 키-값 쌍을 기반으로 조건부 클래스를 병합합니다.\r\n * \r\n * @param classMap - 클래스 맵 객체\r\n * @returns 병합된 클래스 문자열\r\n * \r\n * @example\r\n * ```tsx\r\n * mergeMap({\r\n * \"bg-blue-500\": isPrimary,\r\n * \"bg-gray-500\": !isPrimary,\r\n * \"text-white\": true,\r\n * \"opacity-50\": isDisabled\r\n * })\r\n * ```\r\n */\r\nexport function mergeMap(classMap: Record<string, boolean | undefined | null>) {\r\n const classes = Object.entries(classMap)\r\n .filter(([, condition]) => condition)\r\n .map(([className]) => className)\r\n \r\n return merge(...classes)\r\n}\r\n\r\n// 하위 호환성을 위해 cn도 export (점진적 마이그레이션 지원)\r\nexport const cn = merge ","/**\r\n * Core Icons (Phosphor Icons)\r\n *\r\n * 핵심 아이콘만 포함하여 번들 크기를 최적화합니다.\r\n * 나머지 아이콘은 동적 fallback으로 처리됩니다.\r\n *\r\n * 포함 기준:\r\n * 1. sum-diary에서 실제 사용 중인 아이콘\r\n * 2. UI 컴포넌트에서 자주 사용되는 아이콘\r\n * 3. 각 카테고리의 대표 아이콘\r\n *\r\n * 새로운 아이콘이 필요하면 동적 fallback이 자동으로 처리합니다.\r\n */\r\n\r\nimport {\r\n // Navigation\r\n House,\r\n ArrowLeft,\r\n ArrowRight,\r\n ArrowUp,\r\n ArrowDown,\r\n List as ListIcon,\r\n X,\r\n MagnifyingGlass,\r\n Gear,\r\n ArrowSquareOut,\r\n CaretLeft,\r\n CaretRight,\r\n CaretDown,\r\n CaretUp,\r\n\r\n // Actions\r\n Pencil,\r\n Trash,\r\n Plus,\r\n Minus,\r\n Download,\r\n Upload,\r\n ArrowClockwise,\r\n FloppyDisk,\r\n Copy,\r\n\r\n // Text Formatting (Markdown Toolbar)\r\n TextB,\r\n TextItalic,\r\n TextStrikethrough,\r\n TextHOne,\r\n Link,\r\n Code,\r\n FileCode,\r\n Quotes,\r\n List,\r\n ListNumbers,\r\n\r\n // Status & Feedback\r\n SpinnerGap,\r\n CheckCircle,\r\n XCircle,\r\n WarningCircle,\r\n Info,\r\n Check,\r\n Circle,\r\n Question,\r\n\r\n // User & Auth\r\n User,\r\n Users,\r\n UserPlus,\r\n SignIn,\r\n SignOut,\r\n Eye,\r\n EyeSlash,\r\n\r\n // Data & Analytics\r\n ChartBar,\r\n TrendUp,\r\n Pulse,\r\n Database,\r\n Lightning,\r\n\r\n // Files & Content\r\n FileText,\r\n File,\r\n Folder,\r\n Book,\r\n BookOpen,\r\n\r\n // Communication\r\n Envelope,\r\n ChatCircle,\r\n Phone,\r\n\r\n // Media\r\n Image,\r\n Video,\r\n Camera,\r\n\r\n // Emotions\r\n Smiley,\r\n SmileySad,\r\n SmileyMeh,\r\n\r\n // Security\r\n Lock,\r\n LockOpen,\r\n Shield,\r\n Wallet,\r\n Key,\r\n\r\n // Time & Date\r\n Clock,\r\n Calendar,\r\n CalendarPlus,\r\n\r\n // UI Elements\r\n Bell,\r\n Heart,\r\n Star,\r\n Bookmark,\r\n Share,\r\n\r\n // Theme\r\n Monitor,\r\n Sun,\r\n Moon,\r\n\r\n // Additional\r\n Lightbulb,\r\n Brain,\r\n Flag,\r\n Square,\r\n Sparkle,\r\n Globe,\r\n DeviceMobile,\r\n Ticket,\r\n Clipboard,\r\n WifiHigh,\r\n WifiSlash,\r\n Cpu,\r\n MaskHappy,\r\n} from '@phosphor-icons/react/dist/ssr'\r\n\r\n// 핵심 아이콘 객체 (키는 기존과 동일, 값만 Phosphor로 교체)\r\nexport const icons = {\r\n // Navigation\r\n home: House,\r\n arrowLeft: ArrowLeft,\r\n arrowRight: ArrowRight,\r\n arrowUp: ArrowUp,\r\n arrowDown: ArrowDown,\r\n menu: ListIcon,\r\n close: X,\r\n search: MagnifyingGlass,\r\n settings: Gear,\r\n externalLink: ArrowSquareOut,\r\n chevronLeft: CaretLeft,\r\n chevronRight: CaretRight,\r\n chevronDown: CaretDown,\r\n chevronUp: CaretUp,\r\n\r\n // Actions\r\n edit: Pencil,\r\n delete: Trash,\r\n add: Plus,\r\n remove: Minus,\r\n download: Download,\r\n upload: Upload,\r\n refresh: ArrowClockwise,\r\n save: FloppyDisk,\r\n copy: Copy,\r\n\r\n // Status & Feedback\r\n loader: SpinnerGap,\r\n success: CheckCircle,\r\n error: XCircle,\r\n alertCircle: WarningCircle,\r\n warning: WarningCircle,\r\n info: Info,\r\n check: Check,\r\n circle: Circle,\r\n helpCircle: Question,\r\n\r\n // User & Auth\r\n user: User,\r\n users: Users,\r\n userPlus: UserPlus,\r\n logIn: SignIn,\r\n logOut: SignOut,\r\n eye: Eye,\r\n eyeOff: EyeSlash,\r\n\r\n // Data & Analytics\r\n chart: ChartBar,\r\n barChart: ChartBar,\r\n trendingUp: TrendUp,\r\n activity: Pulse,\r\n database: Database,\r\n zap: Lightning,\r\n\r\n // Files & Content\r\n fileText: FileText,\r\n file: File,\r\n folder: Folder,\r\n book: Book,\r\n bookOpen: BookOpen,\r\n\r\n // Communication\r\n mail: Envelope,\r\n message: ChatCircle,\r\n phone: Phone,\r\n\r\n // Media\r\n image: Image,\r\n video: Video,\r\n camera: Camera,\r\n\r\n // Emotions\r\n smile: Smiley,\r\n frown: SmileySad,\r\n meh: SmileyMeh,\r\n\r\n // Security\r\n lock: Lock,\r\n unlock: LockOpen,\r\n shield: Shield,\r\n wallet: Wallet,\r\n key: Key,\r\n\r\n // Time & Date\r\n clock: Clock,\r\n calendar: Calendar,\r\n calendarPlus: CalendarPlus,\r\n\r\n // UI Elements\r\n bell: Bell,\r\n heart: Heart,\r\n star: Star,\r\n bookmark: Bookmark,\r\n share: Share,\r\n\r\n // Theme\r\n monitor: Monitor,\r\n sun: Sun,\r\n moon: Moon,\r\n\r\n // Additional\r\n lightbulb: Lightbulb,\r\n brain: Brain,\r\n flag: Flag,\r\n square: Square,\r\n sparkle: Sparkle,\r\n sparkles: Sparkle,\r\n globe: Globe,\r\n smartphone: DeviceMobile,\r\n deviceMobile: DeviceMobile,\r\n floppyDisk: FloppyDisk,\r\n\r\n // Connectivity\r\n ticket: Ticket,\r\n clipboard: Clipboard,\r\n wifi: WifiHigh,\r\n wifiOff: WifiSlash,\r\n cpu: Cpu,\r\n mask: MaskHappy,\r\n\r\n // Text Formatting (Markdown Toolbar)\r\n bold: TextB,\r\n italic: TextItalic,\r\n strikethrough: TextStrikethrough,\r\n heading: TextHOne,\r\n link: Link,\r\n code: Code,\r\n fileCode: FileCode,\r\n quote: Quotes,\r\n list: List,\r\n listOrdered: ListNumbers,\r\n minus: Minus,\r\n} as const\r\n\r\n// 아이콘 이름 타입\r\nexport type IconName = keyof typeof icons\r\n\r\n// 감정별 아이콘 매핑\r\nexport const emotionIcons = {\r\n happy: 'smile',\r\n sad: 'frown',\r\n neutral: 'meh',\r\n excited: 'smile',\r\n angry: 'frown',\r\n love: 'heart',\r\n like: 'heart',\r\n dislike: 'frown',\r\n} as const\r\n\r\n// 상태별 아이콘 매핑\r\nexport const statusIcons = {\r\n loading: 'loader',\r\n success: 'success',\r\n error: 'error',\r\n warning: 'warning',\r\n info: 'info',\r\n locked: 'lock',\r\n unlocked: 'unlock',\r\n visible: 'eye',\r\n hidden: 'eyeOff',\r\n} as const\r\n\r\n// 아이콘 카테고리별 그룹화 (참고용)\r\nexport const iconCategories = {\r\n navigation: ['home', 'arrowLeft', 'arrowRight', 'arrowUp', 'arrowDown', 'menu', 'close', 'search', 'settings', 'externalLink', 'chevronLeft', 'chevronRight', 'chevronDown', 'chevronUp'],\r\n actions: ['edit', 'delete', 'add', 'remove', 'download', 'upload', 'refresh', 'save', 'copy'],\r\n status: ['loader', 'success', 'error', 'alertCircle', 'warning', 'info', 'check', 'circle'],\r\n user: ['user', 'users', 'userPlus', 'logIn', 'logOut', 'eye', 'eyeOff'],\r\n data: ['chart', 'barChart', 'trendingUp', 'activity', 'database', 'zap'],\r\n files: ['fileText', 'file', 'folder', 'book'],\r\n communication: ['mail', 'message', 'phone'],\r\n media: ['image', 'video', 'camera'],\r\n emotions: ['smile', 'frown', 'meh'],\r\n security: ['lock', 'unlock', 'shield'],\r\n time: ['clock', 'calendar'],\r\n ui: ['bell', 'heart', 'star', 'bookmark', 'share'],\r\n theme: ['monitor', 'sun', 'moon'],\r\n} as const\r\n","/**\r\n * Case Conversion Utilities\r\n *\r\n * 문자열 케이스 변환 유틸리티 함수들입니다.\r\n * Utility functions for string case conversion.\r\n */\r\n\r\n/**\r\n * 문자열을 camelCase로 변환합니다.\r\n * Converts a string to camelCase.\r\n *\r\n * @param str - 변환할 문자열 / String to convert\r\n * @returns camelCase 문자열 / camelCase string\r\n *\r\n * @example\r\n * toCamelCase('arrow-left') // 'arrowLeft'\r\n * toCamelCase('arrow_left') // 'arrowLeft'\r\n * toCamelCase('ArrowLeft') // 'arrowLeft'\r\n * toCamelCase('arrowLeft') // 'arrowLeft'\r\n * toCamelCase('HEART') // 'heart'\r\n */\r\nexport function toCamelCase(str: string): string {\r\n if (!str) return str\r\n\r\n // 이미 camelCase인지 확인 (kebab/snake가 아니고 첫 글자가 소문자)\r\n if (!/[-_]/.test(str) && /^[a-z]/.test(str)) {\r\n return str\r\n }\r\n\r\n // 전체가 대문자인 경우 (HEART, USER 등) → 전체 소문자로\r\n if (/^[A-Z]+$/.test(str)) {\r\n return str.toLowerCase()\r\n }\r\n\r\n // PascalCase를 camelCase로 변환 (ArrowLeft → arrowLeft)\r\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\r\n return str.charAt(0).toLowerCase() + str.slice(1)\r\n }\r\n\r\n // kebab-case 또는 snake_case를 camelCase로 변환\r\n return str\r\n .split(/[-_]/)\r\n .map((word, index) => {\r\n if (index === 0) {\r\n return word.toLowerCase()\r\n }\r\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\r\n })\r\n .join('')\r\n}\r\n\r\n/**\r\n * 문자열을 PascalCase로 변환합니다.\r\n * Converts a string to PascalCase.\r\n *\r\n * @param str - 변환할 문자열 / String to convert\r\n * @returns PascalCase 문자열 / PascalCase string\r\n *\r\n * @example\r\n * toPascalCase('arrow-left') // 'ArrowLeft'\r\n * toPascalCase('arrow_left') // 'ArrowLeft'\r\n * toPascalCase('arrowLeft') // 'ArrowLeft'\r\n * toPascalCase('ArrowLeft') // 'ArrowLeft'\r\n */\r\nexport function toPascalCase(str: string): string {\r\n if (!str) return str\r\n\r\n // 이미 PascalCase인지 확인\r\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\r\n return str\r\n }\r\n\r\n // kebab-case 또는 snake_case가 포함된 경우\r\n if (/[-_]/.test(str)) {\r\n return str\r\n .split(/[-_]/)\r\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\r\n .join('')\r\n }\r\n\r\n // camelCase를 PascalCase로 변환\r\n return str.charAt(0).toUpperCase() + str.slice(1)\r\n}\r\n","/**\r\n * Icon Provider System\r\n *\r\n * 각 프로바이더별 로딩 전략 / Loading strategies per provider:\r\n *\r\n * 1. Phosphor Icons (https://phosphoricons.com) - default\r\n * - Official package: @phosphor-icons/react (MIT License)\r\n * - icons.ts에서 정적 import (SSR-safe /dist/ssr)\r\n * - PROJECT_ICONS 매핑으로 통합 이름 지원\r\n * - 폴백: initPhosphorIcons()로 동적 namespace 조회\r\n *\r\n * 2. Lucide Icons (https://lucide.dev) - deprecated, backward compat\r\n * - initLucideIcons() 호출 시에만 로드 / Lazy loaded on demand\r\n * - 향후 제거 예정 / Will be removed in future\r\n *\r\n * 3. Iconsax Icons (https://iconsax.io) - separate entry\r\n * - '@hua-labs/ui/iconsax'에서 import 시 자동 등록\r\n * - 코어 번들에 포함되지 않음 / Not in core bundle\r\n * - registerIconsaxResolver()로 lazy 연결\r\n */\r\n\r\nimport { toPascalCase } from './case-utils'\r\n\r\n// Phosphor Icons - lazy loaded (전체 namespace import 방지, createContext SSR 이슈)\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nlet PhosphorIcons: any = null\r\n\r\n// Lucide Icons - lazy loaded (하위호환, deprecated)\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nlet LucideIcons: any = null\r\n\r\n// Iconsax resolver - registered lazily when iconsax entry is loaded\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nlet iconsaxResolver: ((name: string, variant?: string) => any) | null = null\r\n\r\n/**\r\n * Register iconsax resolver (called from iconsax entry point).\r\n * Allows the core Icon component to resolve iconsax icons\r\n * without statically importing the iconsax bundle.\r\n */\r\nexport function registerIconsaxResolver(resolver: typeof iconsaxResolver) {\r\n iconsaxResolver = resolver\r\n}\r\n\r\n/**\r\n * Get registered iconsax resolver\r\n */\r\nexport function getIconsaxResolver() {\r\n return iconsaxResolver\r\n}\r\n\r\n// Icon Provider Type\r\nexport type IconProvider = 'lucide' | 'phosphor' | 'iconsax'\r\n\r\n// Icon Provider Configuration\r\nexport interface IconProviderConfig {\r\n provider: IconProvider\r\n prefix?: string\r\n}\r\n\r\n/**\r\n * Project-specific icon list\r\n * These are the icons actually used in SumUp project\r\n * Only these icons will be loaded for optimal bundle size\r\n */\r\nexport const PROJECT_ICONS = {\r\n // Navigation & Layout\r\n 'home': { lucide: 'Home', phosphor: 'House', iconsax: 'Home2' },\r\n 'layout-dashboard': { lucide: 'LayoutDashboard', phosphor: 'SquaresFour' },\r\n 'folder': { lucide: 'Folder', phosphor: 'Folder', iconsax: 'Folder' },\r\n 'alert-circle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\r\n 'alertCircle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\r\n 'columns': { lucide: 'Columns', phosphor: 'Columns' },\r\n 'users': { lucide: 'Users', phosphor: 'Users', iconsax: 'People' },\r\n 'settings': { lucide: 'Settings', phosphor: 'Gear' },\r\n 'menu': { lucide: 'Menu', phosphor: 'List', iconsax: 'Menu' },\r\n 'close': { lucide: 'X', phosphor: 'X', iconsax: 'CloseCircle' },\r\n 'chevronLeft': { lucide: 'ChevronLeft', phosphor: 'CaretLeft', iconsax: 'ArrowLeft2' },\r\n 'chevronRight': { lucide: 'ChevronRight', phosphor: 'CaretRight', iconsax: 'ArrowRight2' },\r\n 'chevronDown': { lucide: 'ChevronDown', phosphor: 'CaretDown', iconsax: 'ArrowDown2' },\r\n 'chevronUp': { lucide: 'ChevronUp', phosphor: 'CaretUp', iconsax: 'ArrowUp2' },\r\n 'arrowLeft': { lucide: 'ArrowLeft', phosphor: 'ArrowLeft', iconsax: 'ArrowLeft' },\r\n 'arrowRight': { lucide: 'ArrowRight', phosphor: 'ArrowRight', iconsax: 'ArrowRight' },\r\n 'arrowUp': { lucide: 'ArrowUp', phosphor: 'ArrowUp', iconsax: 'ArrowUp' },\r\n 'arrowDown': { lucide: 'ArrowDown', phosphor: 'ArrowDown', iconsax: 'ArrowDown' },\r\n\r\n // Actions\r\n 'add': { lucide: 'Plus', phosphor: 'Plus', iconsax: 'Add' },\r\n 'edit': { lucide: 'Edit', phosphor: 'Pencil' },\r\n 'pencil': { lucide: 'Pencil', phosphor: 'Pencil' },\r\n 'delete': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\r\n 'trash': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\r\n 'upload': { lucide: 'Upload', phosphor: 'Upload', iconsax: 'Upload' },\r\n 'download': { lucide: 'Download', phosphor: 'Download', iconsax: 'Download' },\r\n 'x': { lucide: 'X', phosphor: 'X' },\r\n 'check': { lucide: 'Check', phosphor: 'Check', iconsax: 'Check' },\r\n 'search': { lucide: 'Search', phosphor: 'MagnifyingGlass', iconsax: 'SearchNormal' },\r\n 'share': { lucide: 'Share', phosphor: 'Share' },\r\n 'copy': { lucide: 'Copy', phosphor: 'Copy' },\r\n 'save': { lucide: 'Save', phosphor: 'FloppyDisk' },\r\n\r\n // Status & Feedback\r\n 'loader': { lucide: 'Loader2', phosphor: 'Spinner' },\r\n 'loader2': { lucide: 'Loader2', phosphor: 'Spinner' },\r\n 'check-circle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\r\n 'checkCircle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\r\n 'success': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\r\n 'error': { lucide: 'XCircle', phosphor: 'XCircle', iconsax: 'CloseCircle' },\r\n 'warning': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Warning2' },\r\n 'info': { lucide: 'Info', phosphor: 'Info', iconsax: 'InfoCircle' },\r\n 'refresh': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\r\n 'refreshCw': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\r\n 'bell': { lucide: 'Bell', phosphor: 'Bell', iconsax: 'Bell' },\r\n 'heart': { lucide: 'Heart', phosphor: 'Heart', iconsax: 'Heart' },\r\n 'star': { lucide: 'Star', phosphor: 'Star', iconsax: 'Star' },\r\n 'bookmark': { lucide: 'Bookmark', phosphor: 'Bookmark' },\r\n\r\n // User & Auth\r\n 'user': { lucide: 'User', phosphor: 'User', iconsax: 'User' },\r\n 'userPlus': { lucide: 'UserPlus', phosphor: 'UserPlus', iconsax: 'UserAdd' },\r\n 'logIn': { lucide: 'LogIn', phosphor: 'SignIn', iconsax: 'Login' },\r\n 'logOut': { lucide: 'LogOut', phosphor: 'SignOut', iconsax: 'Logout' },\r\n 'chrome': { lucide: 'Chrome', phosphor: 'ChromeLogo', iconsax: 'Chrome' },\r\n 'github': { lucide: 'Github', phosphor: 'GithubLogo' },\r\n 'message': { lucide: 'MessageCircle', phosphor: 'ChatCircle' },\r\n\r\n // Content\r\n 'messageSquare': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\r\n 'message-square': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\r\n 'inbox': { lucide: 'Inbox', phosphor: 'Inbox' },\r\n 'calendar': { lucide: 'Calendar', phosphor: 'Calendar' },\r\n 'calendarPlus': { lucide: 'CalendarPlus', phosphor: 'CalendarPlus' },\r\n 'checkSquare': { lucide: 'CheckSquare', phosphor: 'CheckSquare', iconsax: 'TickSquare' },\r\n 'clock': { lucide: 'Clock', phosphor: 'Clock' },\r\n 'book': { lucide: 'Book', phosphor: 'Book', iconsax: 'Book' },\r\n 'bookOpen': { lucide: 'BookOpen', phosphor: 'BookOpen', iconsax: 'Book' },\r\n\r\n // Theme & UI\r\n 'monitor': { lucide: 'Monitor', phosphor: 'Monitor', iconsax: 'Monitor' },\r\n 'sun': { lucide: 'Sun', phosphor: 'Sun', iconsax: 'Sun' },\r\n 'moon': { lucide: 'Moon', phosphor: 'Moon', iconsax: 'Moon' },\r\n\r\n // AI & Features\r\n 'sparkle': { lucide: 'Sparkle', phosphor: 'Sparkle' },\r\n 'sparkles': { lucide: 'Sparkles', phosphor: 'Sparkle' },\r\n 'lightbulb': { lucide: 'Lightbulb', phosphor: 'Lightbulb' },\r\n 'brain': { lucide: 'Brain', phosphor: 'Brain' },\r\n 'zap': { lucide: 'Zap', phosphor: 'Lightning' },\r\n\r\n // Device & Platform\r\n 'globe': { lucide: 'Globe', phosphor: 'Globe', iconsax: 'Global' },\r\n 'deviceMobile': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\r\n 'smartphone': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\r\n 'floppyDisk': { lucide: 'Save', phosphor: 'FloppyDisk' },\r\n\r\n // Data & Analytics\r\n 'chart': { lucide: 'BarChart3', phosphor: 'ChartBar' },\r\n 'barChart': { lucide: 'BarChart', phosphor: 'ChartBar' },\r\n 'trendingUp': { lucide: 'TrendingUp', phosphor: 'TrendUp' },\r\n 'trendingDown': { lucide: 'TrendingDown', phosphor: 'TrendDown' },\r\n 'activity': { lucide: 'Activity', phosphor: 'Pulse' },\r\n 'database': { lucide: 'Database', phosphor: 'Database' },\r\n 'dollarSign': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\r\n 'dollar': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\r\n 'currency': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\r\n\r\n 'layers': { lucide: 'Layers', phosphor: 'Stack' },\r\n 'ban': { lucide: 'Ban', phosphor: 'Prohibit' },\r\n\r\n // Security\r\n 'lock': { lucide: 'Lock', phosphor: 'Lock', iconsax: 'Lock' },\r\n 'unlock': { lucide: 'Unlock', phosphor: 'LockOpen', iconsax: 'Unlock' },\r\n 'shield': { lucide: 'Shield', phosphor: 'Shield', iconsax: 'Shield' },\r\n 'key': { lucide: 'Key', phosphor: 'Key' },\r\n\r\n // Media\r\n 'play': { lucide: 'Play', phosphor: 'Play', iconsax: 'Play' },\r\n 'pause': { lucide: 'Pause', phosphor: 'Pause', iconsax: 'Pause' },\r\n 'image': { lucide: 'Image', phosphor: 'Image', iconsax: 'Image' },\r\n 'video': { lucide: 'Video', phosphor: 'Video', iconsax: 'Video' },\r\n 'camera': { lucide: 'Camera', phosphor: 'Camera', iconsax: 'Camera' },\r\n\r\n // Files\r\n 'fileText': { lucide: 'FileText', phosphor: 'FileText' },\r\n 'file': { lucide: 'File', phosphor: 'File' },\r\n\r\n // Navigation\r\n 'externalLink': { lucide: 'ExternalLink', phosphor: 'ArrowSquareOut' },\r\n 'link': { lucide: 'Link', phosphor: 'Link', iconsax: 'Link' },\r\n 'moreHorizontal': { lucide: 'MoreHorizontal', phosphor: 'DotsThreeOutline' },\r\n 'moreVertical': { lucide: 'MoreVertical', phosphor: 'DotsThreeVertical' },\r\n\r\n // Priority\r\n 'remove': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\r\n\r\n // Eye (password)\r\n 'eye': { lucide: 'Eye', phosphor: 'Eye', iconsax: 'Eye' },\r\n 'eyeOff': { lucide: 'EyeOff', phosphor: 'EyeSlash', iconsax: 'EyeSlash' },\r\n\r\n // Emotions\r\n 'smile': { lucide: 'Smile', phosphor: 'Smiley', iconsax: 'EmojiHappy' },\r\n 'frown': { lucide: 'Frown', phosphor: 'SmileySad', iconsax: 'EmojiSad' },\r\n 'meh': { lucide: 'Meh', phosphor: 'SmileyMeh', iconsax: 'EmojiNormal' },\r\n\r\n // Social\r\n 'mail': { lucide: 'Mail', phosphor: 'Envelope' },\r\n 'phone': { lucide: 'Phone', phosphor: 'Phone' },\r\n\r\n // Additional\r\n 'flag': { lucide: 'Flag', phosphor: 'Flag', iconsax: 'Flag' },\r\n 'rocket': { lucide: 'Rocket', phosphor: 'Rocket', iconsax: 'Rocket' },\r\n\r\n // Connectivity & Misc\r\n 'ticket': { lucide: 'Ticket', phosphor: 'Ticket', iconsax: 'Ticket' },\r\n 'clipboard': { lucide: 'ClipboardList', phosphor: 'Clipboard', iconsax: 'Sticker' },\r\n 'wifi': { lucide: 'Wifi', phosphor: 'WifiHigh', iconsax: 'Wifi' },\r\n 'wifiOff': { lucide: 'WifiOff', phosphor: 'WifiSlash' },\r\n 'cpu': { lucide: 'Cpu', phosphor: 'Cpu', iconsax: 'Computing' },\r\n 'mask': { lucide: 'Drama', phosphor: 'MaskHappy', iconsax: 'EmojiHappy' },\r\n\r\n // Text Formatting (Markdown Toolbar)\r\n 'bold': { lucide: 'Bold', phosphor: 'TextB' },\r\n 'italic': { lucide: 'Italic', phosphor: 'TextItalic' },\r\n 'strikethrough': { lucide: 'Strikethrough', phosphor: 'TextStrikethrough' },\r\n 'heading': { lucide: 'Heading', phosphor: 'TextHOne' },\r\n 'code': { lucide: 'Code', phosphor: 'Code', iconsax: 'Code' },\r\n 'fileCode': { lucide: 'FileCode', phosphor: 'FileCode' },\r\n 'quote': { lucide: 'Quote', phosphor: 'Quotes', iconsax: 'QuoteUp' },\r\n 'list': { lucide: 'List', phosphor: 'List' },\r\n 'listOrdered': { lucide: 'ListOrdered', phosphor: 'ListNumbers' },\r\n 'minus': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\r\n} as const\r\n\r\n/**\r\n * Initialize Phosphor Icons (lazy load for fallback/dynamic lookup)\r\n * icons.ts의 개별 import와 별개로, PROJECT_ICONS fallback용\r\n */\r\nexport async function initPhosphorIcons() {\r\n if (typeof window === 'undefined') return null\r\n\r\n if (!PhosphorIcons) {\r\n try {\r\n const phosphorModule = await import('@phosphor-icons/react')\r\n PhosphorIcons = phosphorModule\r\n } catch {\r\n console.warn('Phosphor Icons not available. Install @phosphor-icons/react to use.')\r\n return null\r\n }\r\n }\r\n return PhosphorIcons\r\n}\r\n\r\n/**\r\n * Initialize Lucide Icons (lazy load)\r\n */\r\nexport async function initLucideIcons() {\r\n if (typeof window === 'undefined') return null\r\n\r\n if (!LucideIcons) {\r\n try {\r\n const lucideModule = await import('lucide-react')\r\n LucideIcons = lucideModule\r\n } catch {\r\n console.warn('Lucide Icons not available. Install lucide-react to use lucide provider.')\r\n return null\r\n }\r\n }\r\n return LucideIcons\r\n}\r\n\r\n/**\r\n * Get icon from provider\r\n * Only resolves icons that are in PROJECT_ICONS for optimal bundle size\r\n *\r\n * @param iconName - 아이콘 이름 / Icon name\r\n * @param provider - 아이콘 프로바이더 / Icon provider\r\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\r\n */\r\nexport function getIconFromProvider(\r\n iconName: string,\r\n provider: IconProvider = 'phosphor'\r\n): React.ComponentType<Record<string, unknown>> | null {\r\n // Check if icon is in project icon list\r\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\r\n\r\n if (!iconMapping) {\r\n // Fallback to direct lookup for backward compatibility\r\n return getIconDirect(iconName, provider)\r\n }\r\n\r\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\r\n\r\n switch (provider) {\r\n case 'phosphor':\r\n if (!mappedName || !PhosphorIcons) return null\r\n return PhosphorIcons?.[mappedName] || null\r\n\r\n case 'lucide':\r\n if (!mappedName || !LucideIcons) {\r\n return null\r\n }\r\n return LucideIcons?.[mappedName] || null\r\n\r\n case 'iconsax': {\r\n if (!iconsaxResolver) return null\r\n const iconsaxName = mappedName || toPascalCase(iconName)\r\n return iconsaxResolver(iconsaxName) || null\r\n }\r\n\r\n default:\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Direct icon lookup (fallback for icons not in PROJECT_ICONS)\r\n *\r\n * @param iconName - 아이콘 이름 / Icon name\r\n * @param provider - 아이콘 프로바이더 / Icon provider\r\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\r\n */\r\nfunction getIconDirect(\r\n iconName: string,\r\n provider: IconProvider\r\n): React.ComponentType<Record<string, unknown>> | null {\r\n switch (provider) {\r\n case 'phosphor': {\r\n if (!PhosphorIcons) return null\r\n const phosphorName1 = iconName.charAt(0).toUpperCase() + iconName.slice(1)\r\n const phosphorName2 = iconName\r\n .split(/(?=[A-Z])/)\r\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\r\n .join('')\r\n return PhosphorIcons?.[phosphorName1] ||\r\n PhosphorIcons?.[phosphorName2] ||\r\n PhosphorIcons?.[iconName] ||\r\n null\r\n }\r\n\r\n case 'lucide': {\r\n if (!LucideIcons) {\r\n return null\r\n }\r\n const lucideName = iconName.charAt(0).toUpperCase() + iconName.slice(1)\r\n const camelCaseName = iconName.replace(/([A-Z])/g, (match) =>\r\n match === iconName[0] ? match.toLowerCase() : match\r\n )\r\n return LucideIcons?.[lucideName] ||\r\n LucideIcons?.[iconName] ||\r\n LucideIcons?.[camelCaseName] ||\r\n null\r\n }\r\n\r\n case 'iconsax': {\r\n if (!iconsaxResolver) return null\r\n const iconsaxName = toPascalCase(iconName)\r\n return iconsaxResolver(iconsaxName) || null\r\n }\r\n\r\n default:\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Get icon name for provider\r\n *\r\n * @param iconName - 아이콘 이름 / Icon name\r\n * @param provider - 아이콘 프로바이더 / Icon provider\r\n * @returns 프로바이더별 아이콘 이름 / Icon name for provider\r\n */\r\nexport function getIconNameForProvider(\r\n iconName: string,\r\n provider: IconProvider\r\n): string {\r\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\r\n if (iconMapping) {\r\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\r\n if (mappedName) {\r\n return mappedName\r\n }\r\n }\r\n return iconName\r\n}\r\n\r\n/**\r\n * Get all project icon names\r\n */\r\nexport function getProjectIconNames(): string[] {\r\n return Object.keys(PROJECT_ICONS)\r\n}\r\n","/**\r\n * Icon Aliases\r\n * \r\n * 여러 이름이 같은 아이콘을 가리키도록 하는 alias 시스템\r\n * DX 향상을 위해 직관적인 이름들을 지원합니다.\r\n */\r\n\r\nexport const ICON_ALIASES: Record<string, string> = {\r\n // kebab-case → camelCase mappings (자동 변환 지원)\r\n 'arrow-left': 'arrowLeft',\r\n 'arrow-right': 'arrowRight',\r\n 'arrow-up': 'arrowUp',\r\n 'arrow-down': 'arrowDown',\r\n 'chevron-left': 'chevronLeft',\r\n 'chevron-right': 'chevronRight',\r\n 'chevron-up': 'chevronUp',\r\n 'chevron-down': 'chevronDown',\r\n 'external-link': 'externalLink',\r\n 'more-horizontal': 'moreHorizontal',\r\n 'more-vertical': 'moreVertical',\r\n 'user-plus': 'userPlus',\r\n 'log-in': 'logIn',\r\n 'log-out': 'logOut',\r\n 'check-circle': 'checkCircle',\r\n 'check-square': 'checkSquare',\r\n 'alert-circle': 'alertCircle',\r\n 'eye-off': 'eyeOff',\r\n 'file-text': 'fileText',\r\n 'book-open': 'bookOpen',\r\n 'bar-chart': 'barChart',\r\n 'trending-up': 'trendingUp',\r\n 'trending-down': 'trendingDown',\r\n 'message-square': 'messageSquare',\r\n 'calendar-plus': 'calendarPlus',\r\n 'refresh-cw': 'refreshCw',\r\n 'dollar-sign': 'dollarSign',\r\n 'layout-dashboard': 'layoutDashboard',\r\n 'device-mobile': 'deviceMobile',\r\n 'floppy-disk': 'floppyDisk',\r\n\r\n // Navigation aliases\r\n 'back': 'arrowLeft',\r\n 'prev': 'arrowLeft',\r\n 'previous': 'arrowLeft',\r\n 'forward': 'arrowRight',\r\n 'next': 'arrowRight',\r\n \r\n // Close aliases\r\n 'close': 'x',\r\n 'cancel': 'x',\r\n \r\n // Delete aliases\r\n 'remove': 'delete',\r\n 'trash': 'delete',\r\n \r\n // Add aliases\r\n 'plus': 'add',\r\n 'new': 'add',\r\n \r\n // Edit aliases\r\n 'pencil': 'edit',\r\n 'modify': 'edit',\r\n \r\n // Save aliases\r\n 'store': 'save',\r\n 'floppy': 'save',\r\n \r\n // Search aliases\r\n 'magnify': 'search',\r\n \r\n // User aliases\r\n 'person': 'user',\r\n 'account': 'user',\r\n 'profile': 'user',\r\n \r\n // Settings aliases\r\n 'gear': 'settings',\r\n 'config': 'settings',\r\n 'preferences': 'settings',\r\n \r\n // Home aliases\r\n 'house': 'home',\r\n 'main': 'home',\r\n \r\n // Check aliases\r\n 'done': 'check',\r\n 'complete': 'check',\r\n 'tick': 'check',\r\n \r\n // Info aliases\r\n 'information': 'info',\r\n 'help': 'info',\r\n \r\n // Warning aliases\r\n 'alert': 'warning',\r\n 'caution': 'warning',\r\n \r\n // Success aliases\r\n 'checkmark': 'success',\r\n 'checkCircle': 'success',\r\n \r\n // Error aliases\r\n 'fail': 'error',\r\n 'cross': 'error',\r\n 'xCircle': 'error',\r\n \r\n // Loading aliases\r\n 'spinner': 'loader',\r\n 'loading': 'loader',\r\n 'wait': 'loader',\r\n \r\n // Refresh aliases\r\n 'reload': 'refresh',\r\n 'update': 'refresh',\r\n 'sync': 'refresh',\r\n \r\n // Eye aliases\r\n 'show': 'eye',\r\n 'view': 'eye',\r\n 'hide': 'eyeOff',\r\n 'hidden': 'eyeOff',\r\n \r\n // Lock aliases\r\n 'secure': 'lock',\r\n 'locked': 'lock',\r\n 'unsecure': 'unlock',\r\n 'unlocked': 'unlock',\r\n \r\n // Download aliases\r\n 'get': 'download',\r\n 'fetch': 'download',\r\n \r\n // Upload aliases\r\n 'post': 'upload',\r\n \r\n // Share aliases\r\n 'send': 'share',\r\n 'export': 'share',\r\n \r\n // Copy aliases\r\n 'duplicate': 'copy',\r\n 'clone': 'copy',\r\n \r\n // Mail aliases\r\n 'email': 'mail',\r\n 'envelope': 'mail',\r\n \r\n // Message aliases\r\n 'chat': 'message',\r\n 'comment': 'message',\r\n 'talk': 'message',\r\n \r\n // Calendar aliases\r\n 'date': 'calendar',\r\n 'schedule': 'calendar',\r\n \r\n // Clock aliases\r\n 'time': 'clock',\r\n 'watch': 'clock',\r\n \r\n // File aliases\r\n 'document': 'fileText',\r\n 'doc': 'fileText',\r\n 'text': 'fileText',\r\n \r\n // Folder aliases\r\n 'directory': 'folder',\r\n 'dir': 'folder',\r\n \r\n // Image aliases\r\n 'picture': 'image',\r\n 'img': 'image',\r\n \r\n // Video aliases\r\n 'movie': 'video',\r\n 'film': 'video',\r\n \r\n // Camera aliases\r\n 'photo': 'camera',\r\n 'capture': 'camera',\r\n \r\n // Play aliases\r\n 'start': 'play',\r\n 'run': 'play',\r\n \r\n // Pause aliases\r\n 'stop': 'pause',\r\n 'halt': 'pause',\r\n \r\n // Heart aliases\r\n 'like': 'heart',\r\n 'love': 'heart',\r\n \r\n // Star aliases\r\n 'favorite': 'star',\r\n \r\n // Bookmark aliases\r\n 'saveBookmark': 'bookmark',\r\n \r\n // Bell aliases\r\n 'notification': 'bell',\r\n 'notify': 'bell',\r\n 'alarm': 'bell',\r\n \r\n // Settings aliases\r\n 'prefs': 'settings',\r\n \r\n // Search aliases (duplicate removed - see line 37)\r\n 'lookup': 'search',\r\n \r\n // More aliases\r\n 'dots': 'moreHorizontal',\r\n 'moreMenu': 'moreHorizontal',\r\n 'moreOptions': 'moreVertical',\r\n \r\n // External link aliases\r\n 'external': 'externalLink',\r\n 'outbound': 'externalLink',\r\n 'open': 'externalLink',\r\n \r\n // Link aliases\r\n 'url': 'link',\r\n 'hyperlink': 'link',\r\n \r\n // Chart aliases\r\n 'graph': 'barChart',\r\n 'stats': 'barChart',\r\n 'analytics': 'barChart',\r\n \r\n // Database aliases\r\n 'db': 'database',\r\n 'storage': 'database',\r\n \r\n // Activity aliases\r\n 'pulse': 'activity',\r\n 'monitor': 'activity',\r\n \r\n // Trending aliases\r\n 'up': 'trendingUp',\r\n 'down': 'trendingDown',\r\n \r\n // Zap aliases\r\n 'lightning': 'zap',\r\n 'bolt': 'zap',\r\n 'flash': 'zap',\r\n \r\n // Shield aliases\r\n 'security': 'shield',\r\n 'protect': 'shield',\r\n \r\n // Key aliases\r\n 'password': 'key',\r\n 'secret': 'key',\r\n \r\n // Log in aliases\r\n 'signin': 'logIn',\r\n 'login': 'logIn',\r\n 'enter': 'logIn',\r\n \r\n // Log out aliases\r\n 'signout': 'logOut',\r\n 'logout': 'logOut',\r\n 'exit': 'logOut',\r\n \r\n // Users aliases\r\n 'people': 'users',\r\n 'group': 'users',\r\n 'team': 'users',\r\n \r\n // User plus aliases\r\n 'addUser': 'userPlus',\r\n 'invite': 'userPlus',\r\n \r\n // Book aliases\r\n 'read': 'book',\r\n 'library': 'book',\r\n \r\n // Book open aliases\r\n 'reading': 'bookOpen',\r\n 'openBook': 'bookOpen',\r\n \r\n // Sun aliases\r\n 'light': 'sun',\r\n 'day': 'sun',\r\n \r\n // Moon aliases\r\n 'dark': 'moon',\r\n 'night': 'moon',\r\n \r\n // Monitor aliases\r\n 'screen': 'monitor',\r\n 'display': 'monitor',\r\n \r\n // Brain aliases\r\n 'ai': 'brain',\r\n 'intelligence': 'brain',\r\n 'think': 'brain',\r\n \r\n // Lightbulb aliases\r\n 'idea': 'lightbulb',\r\n 'bulb': 'lightbulb',\r\n 'inspiration': 'lightbulb',\r\n \r\n // Sparkles aliases\r\n 'magic': 'sparkles',\r\n 'stars': 'sparkles',\r\n 'glitter': 'sparkles',\r\n} as const\r\n\r\n/**\r\n * Resolve icon alias to actual icon name\r\n * \r\n * @param iconName - 아이콘 이름 또는 별칭 / Icon name or alias\r\n * @returns 실제 아이콘 이름 / Actual icon name\r\n * @throws {TypeError} iconName이 문자열이 아닌 경우\r\n */\r\nexport function resolveIconAlias(iconName: string): string {\r\n if (typeof iconName !== 'string') {\r\n throw new TypeError('iconName must be a string');\r\n }\r\n return ICON_ALIASES[iconName] || iconName;\r\n}\r\n\r\n/**\r\n * Get all aliases for an icon name\r\n * \r\n * @param iconName - 아이콘 이름 / Icon name\r\n * @returns 해당 아이콘의 모든 별칭 배열 / Array of all aliases for the icon\r\n * @throws {TypeError} iconName이 문자열이 아닌 경우\r\n */\r\nexport function getIconAliases(iconName: string): string[] {\r\n if (typeof iconName !== 'string') {\r\n throw new TypeError('iconName must be a string');\r\n }\r\n return Object.entries(ICON_ALIASES)\r\n .filter(([_, target]) => target === iconName)\r\n .map(([alias]) => alias);\r\n}\r\n\r\n\r\n","/**\r\n * Icon Name Normalization System\r\n *\r\n * 아이콘 이름 정규화를 위한 통합 시스템입니다.\r\n *\r\n * Features:\r\n * - kebab-case → camelCase conversion\r\n * - snake_case → camelCase conversion\r\n * - PascalCase → camelCase conversion\r\n * - Alias resolution\r\n * - Provider-specific name mapping\r\n */\r\n\r\nimport { ICON_ALIASES } from './icon-aliases'\r\nimport { toCamelCase, toPascalCase } from './case-utils'\r\n\r\n// Re-export case utils for backward compatibility\r\nexport { toCamelCase, toPascalCase } from './case-utils'\r\n\r\n// IconProvider type (avoid circular dependency with icon-providers.ts)\r\nexport type IconProviderType = 'lucide' | 'phosphor' | 'iconsax'\r\n\r\n/**\r\n * 정규화 결과 인터페이스\r\n */\r\nexport interface NormalizeResult {\r\n /** 정규화된 아이콘 이름 (camelCase) */\r\n normalized: string\r\n /** 원본 이름이 alias였는지 여부 */\r\n wasAlias: boolean\r\n /** 원본 alias 이름 (alias였던 경우) */\r\n originalAlias?: string\r\n}\r\n\r\n/**\r\n * 아이콘 이름을 정규화합니다.\r\n *\r\n * @example\r\n * normalizeIconName('arrow-left') // { normalized: 'arrowLeft', wasAlias: false }\r\n * normalizeIconName('back') // { normalized: 'arrowLeft', wasAlias: true, originalAlias: 'back' }\r\n * normalizeIconName('ArrowLeft') // { normalized: 'arrowLeft', wasAlias: false }\r\n */\r\nexport function normalizeIconName(iconName: string): NormalizeResult {\r\n if (!iconName || typeof iconName !== 'string') {\r\n return { normalized: iconName || '', wasAlias: false }\r\n }\r\n\r\n const camelCased = toCamelCase(iconName)\r\n const aliasTarget = ICON_ALIASES[iconName] || ICON_ALIASES[camelCased]\r\n\r\n if (aliasTarget) {\r\n return {\r\n normalized: aliasTarget,\r\n wasAlias: true,\r\n originalAlias: iconName\r\n }\r\n }\r\n\r\n return {\r\n normalized: camelCased,\r\n wasAlias: false\r\n }\r\n}\r\n\r\n/**\r\n * 프로바이더별 아이콘 이름을 반환합니다.\r\n *\r\n * @example\r\n * getProviderIconName('arrowLeft', 'lucide') // 'ArrowLeft'\r\n * getProviderIconName('heart', 'iconsax') // 'Heart'\r\n */\r\nexport function getProviderIconName(\r\n normalizedName: string,\r\n provider: IconProviderType\r\n): string {\r\n switch (provider) {\r\n case 'lucide':\r\n case 'phosphor':\r\n case 'iconsax':\r\n return toPascalCase(normalizedName)\r\n default:\r\n return normalizedName\r\n }\r\n}\r\n","/**\r\n * Icon Config Types\r\n *\r\n * Icon 시스템의 설정 타입 정의\r\n * 상태관리는 서비스 레벨에서 관리 (Zustand 등)\r\n */\r\n\r\nexport type IconSet = 'lucide' | 'phosphor' | 'iconsax'\r\n\r\nexport type PhosphorWeight = 'thin' | 'light' | 'regular' | 'bold' | 'duotone' | 'fill'\r\n\r\nexport type IconsaxVariant = 'line' | 'bold'\r\n\r\nexport interface IconConfig {\r\n set: IconSet\r\n weight: PhosphorWeight\r\n size: number\r\n color: string\r\n strokeWidth?: number // Lucide용\r\n iconsaxVariant?: IconsaxVariant // Iconsax용 (line | bold)\r\n}\r\n\r\nexport const defaultIconConfig: IconConfig = {\r\n set: 'lucide',\r\n weight: 'regular',\r\n size: 20,\r\n color: 'currentColor',\r\n strokeWidth: 1.25,\r\n iconsaxVariant: 'line',\r\n}\r\n\r\n/**\r\n * 세트별 기본 strokeWidth\r\n */\r\nexport const getDefaultStrokeWidth = (set: IconSet): number => {\r\n switch (set) {\r\n case 'lucide':\r\n return 1.25\r\n case 'phosphor':\r\n return 1.25 // Phosphor는 weight 사용\r\n case 'iconsax':\r\n return 1.5\r\n default:\r\n return 1.25\r\n }\r\n}\r\n","'use client'\r\n\r\n/**\r\n * IconProvider - Icon 시스템 전역 설정 Provider\r\n *\r\n * React Context를 사용하여 전역 아이콘 설정을 제공합니다.\r\n *\r\n * @example\r\n * ```tsx\r\n * <IconProvider set=\"phosphor\" weight=\"regular\" size={20}>\r\n * <App />\r\n * </IconProvider>\r\n * ```\r\n */\r\n\r\nimport React, { createContext, useContext } from 'react'\r\nimport { type IconConfig, type IconSet, type PhosphorWeight, type IconsaxVariant, defaultIconConfig } from './icon-store'\r\n\r\n/**\r\n * IconProvider 컴포넌트 Props\r\n */\r\nexport interface IconProviderProps {\r\n /** 아이콘 세트 (lucide, phosphor, iconsax) */\r\n set?: IconSet\r\n /** Phosphor 아이콘 weight */\r\n weight?: PhosphorWeight\r\n /** Iconsax 아이콘 변형 (line, bold) */\r\n iconsaxVariant?: IconsaxVariant\r\n /** 기본 아이콘 크기 */\r\n size?: number\r\n /** 기본 아이콘 색상 */\r\n color?: string\r\n /** Lucide/Iconsax 아이콘 stroke width */\r\n strokeWidth?: number\r\n /** 자식 컴포넌트 */\r\n children: React.ReactNode\r\n}\r\n\r\ninterface IconContextValue extends IconConfig {}\r\n\r\nconst IconContext = createContext<IconContextValue>(defaultIconConfig)\r\n\r\nexport function IconProvider({\r\n set = defaultIconConfig.set,\r\n weight = defaultIconConfig.weight,\r\n iconsaxVariant = defaultIconConfig.iconsaxVariant,\r\n size = defaultIconConfig.size,\r\n color = defaultIconConfig.color,\r\n strokeWidth = defaultIconConfig.strokeWidth,\r\n children,\r\n}: IconProviderProps) {\r\n const value: IconContextValue = {\r\n set,\r\n weight,\r\n iconsaxVariant,\r\n size,\r\n color,\r\n strokeWidth,\r\n }\r\n\r\n return (\r\n <IconContext.Provider value={value}>\r\n {children}\r\n </IconContext.Provider>\r\n )\r\n}\r\n\r\nexport function useIconContext(): IconContextValue {\r\n return useContext(IconContext)\r\n}\r\n\r\n// Re-export types for convenience\r\nexport type { IconSet, PhosphorWeight, IconsaxVariant, IconConfig } from './icon-store'\r\nexport { defaultIconConfig, getDefaultStrokeWidth } from './icon-store'\r\n","import React from 'react'\r\nimport type { IconProps as PhosphorIconProps } from '@phosphor-icons/react'\r\nimport { merge, mergeMap } from '../../lib/utils'\r\nimport { icons, IconName, emotionIcons, statusIcons } from '../../lib/icons'\r\nimport { getIconFromProvider, getIconsaxResolver, initPhosphorIcons, initLucideIcons, getIconNameForProvider } from '../../lib/icon-providers'\r\nimport { normalizeIconName } from '../../lib/normalize-icon-name'\r\nimport { useIconContext, type IconSet } from './IconProvider'\r\nimport { type PhosphorWeight } from './icon-store'\r\nimport type { AllIconName } from '../../lib/icon-names'\r\n\r\n/**\r\n * Icon 컴포넌트 Props\r\n */\r\nexport interface IconProps {\r\n /** 아이콘 이름 / Icon name */\r\n name: AllIconName\r\n /** 아이콘 크기 (숫자 또는 문자열) / Icon size (number or string) */\r\n size?: number | string\r\n /** 추가 CSS 클래스 / Additional CSS classes */\r\n className?: string\r\n /** 감정 아이콘 타입 / Emotion icon type */\r\n emotion?: keyof typeof emotionIcons\r\n /** 상태 아이콘 타입 / Status icon type */\r\n status?: keyof typeof statusIcons\r\n /** 아이콘 프로바이더 오버라이드 / Icon provider override */\r\n provider?: IconSet\r\n /** 부드러운 애니메이션 효과 / Smooth animation effect */\r\n animated?: boolean\r\n /** 펄스 애니메이션 / Pulse animation */\r\n pulse?: boolean\r\n /** 회전 애니메이션 / Spin animation */\r\n spin?: boolean\r\n /** 바운스 애니메이션 / Bounce animation */\r\n bounce?: boolean\r\n /** 색상 변형 / Color variant */\r\n variant?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'muted' | 'inherit'\r\n /** Phosphor 아이콘 weight 오버라이드 / Phosphor icon weight override */\r\n weight?: PhosphorWeight\r\n /** 스크린 리더용 라벨 / Screen reader label */\r\n 'aria-label'?: string\r\n /** 장식용 아이콘 / Decorative icon (hidden from screen readers) */\r\n 'aria-hidden'?: boolean\r\n}\r\n\r\n/**\r\n * Icon 컴포넌트\r\n *\r\n * 다중 아이콘 라이브러리(Phosphor, Lucide, Iconsax)를 지원하는 통합 아이콘 컴포넌트.\r\n * IconProvider를 통해 전역 설정을 관리하며, 개별 아이콘에서도 오버라이드 가능.\r\n *\r\n * Iconsax는 별도 entry('@hua-labs/ui/iconsax')를 import해야 동작합니다.\r\n *\r\n * @example\r\n * ```tsx\r\n * <Icon name=\"heart\" />\r\n * <Icon name=\"user\" size={24} />\r\n * <Icon name=\"check\" variant=\"success\" />\r\n * <Icon name=\"loader\" spin />\r\n * ```\r\n */\r\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(({\r\n name,\r\n size,\r\n className,\r\n emotion,\r\n status,\r\n provider,\r\n weight,\r\n animated = false,\r\n pulse = false,\r\n spin = false,\r\n bounce = false,\r\n variant = 'default',\r\n 'aria-label': ariaLabel,\r\n 'aria-hidden': ariaHidden\r\n}, ref) => {\r\n const config = useIconContext()\r\n\r\n const iconSet = provider || config.set\r\n const iconSize = size ?? config.size\r\n const iconWeight = weight || config.weight\r\n const iconColor = config.color\r\n const iconStrokeWidth = config.strokeWidth ?? 1.25\r\n const iconsaxVariant = config.iconsaxVariant ?? 'line'\r\n\r\n const [isClient, setIsClient] = React.useState(false)\r\n const [providerReady, setProviderReady] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n setIsClient(true)\r\n\r\n // Provider별 lazy load 초기화\r\n if (iconSet === 'lucide') {\r\n initLucideIcons().then(() => setProviderReady(true))\r\n } else if (iconSet === 'phosphor') {\r\n initPhosphorIcons().then(() => setProviderReady(true))\r\n } else {\r\n setProviderReady(true)\r\n }\r\n }, [iconSet])\r\n\r\n // 통합 정규화\r\n const resolvedIcon = React.useMemo(() => {\r\n const baseName = emotion ? emotionIcons[emotion] :\r\n status ? statusIcons[status] : name\r\n const { normalized } = normalizeIconName(baseName)\r\n const providerName = getIconNameForProvider(normalized, iconSet)\r\n return { normalized, providerName }\r\n }, [name, emotion, status, iconSet])\r\n\r\n const iconName = resolvedIcon.normalized as AllIconName\r\n\r\n // Iconsax: resolver를 통해 가져오기 (iconsax entry import 시 자동 등록됨)\r\n const iconsaxIcon = React.useMemo(() => {\r\n if (iconSet === 'iconsax' && isClient) {\r\n const resolver = getIconsaxResolver()\r\n if (resolver) {\r\n return resolver(resolvedIcon.providerName, iconsaxVariant)\r\n }\r\n }\r\n return null\r\n }, [iconSet, resolvedIcon.providerName, isClient, iconsaxVariant])\r\n\r\n // 색상 변형 클래스\r\n const variantClasses = mergeMap({\r\n 'text-current': variant === 'default',\r\n 'text-primary': variant === 'primary',\r\n 'text-muted-foreground': variant === 'secondary' || variant === 'muted',\r\n 'text-green-600 dark:text-green-400': variant === 'success',\r\n 'text-yellow-600 dark:text-yellow-400': variant === 'warning',\r\n 'text-destructive': variant === 'error',\r\n })\r\n\r\n // 서버사이드에서는 빈 span 반환\r\n if (!isClient) {\r\n return (\r\n <span\r\n style={{ width: iconSize, height: iconSize }}\r\n className={merge(variantClasses, className)}\r\n aria-hidden={ariaHidden !== undefined ? ariaHidden : true}\r\n aria-label={ariaLabel}\r\n />\r\n )\r\n }\r\n\r\n // Provider에 따라 아이콘 가져오기\r\n type IconComponentType = React.ComponentType<PhosphorIconProps | React.SVGProps<SVGSVGElement> | Record<string, unknown>>\r\n let ResolvedIcon: IconComponentType | null = null\r\n\r\n if (iconSet === 'phosphor') {\r\n // 1. icons.ts에서 먼저 찾기 (Phosphor 아이콘이 기본, 정적 import)\r\n ResolvedIcon = (icons[iconName as IconName] || null) as IconComponentType | null\r\n // 2. 없으면 동적으로 Phosphor namespace에서 가져오기 (fallback, providerReady 필요)\r\n if (!ResolvedIcon && providerReady) {\r\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\r\n }\r\n } else if (iconSet === 'iconsax') {\r\n ResolvedIcon = iconsaxIcon as IconComponentType | null\r\n if (!ResolvedIcon) {\r\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\r\n }\r\n } else {\r\n // Lucide나 다른 provider\r\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\r\n }\r\n\r\n if (!ResolvedIcon) {\r\n // iconsax resolver 미등록 시 조용히 처리\r\n if (iconSet !== 'iconsax' || getIconsaxResolver()) {\r\n console.warn(`Icon \"${iconName}\" not found for provider \"${iconSet}\"`)\r\n }\r\n return (\r\n <span\r\n ref={ref}\r\n className={merge(\r\n 'inline-flex items-center justify-center rounded-full border-2 border-dashed border-border',\r\n variantClasses,\r\n className\r\n )}\r\n style={{ width: iconSize, height: iconSize }}\r\n aria-label={ariaLabel || `아이콘을 찾을 수 없음: ${iconName}`}\r\n title={`Icon not found: ${iconName}`}\r\n >\r\n <span className=\"text-xs text-muted-foreground\" aria-hidden=\"true\">\r\n ?\r\n </span>\r\n </span>\r\n )\r\n }\r\n\r\n // 세트별 props 준비\r\n type IconPropsType = PhosphorIconProps & {\r\n size?: number\r\n width?: number | string\r\n height?: number | string\r\n color?: string\r\n weight?: PhosphorWeight\r\n strokeWidth?: number\r\n }\r\n\r\n const iconProps: IconPropsType = {\r\n size: typeof iconSize === 'number' ? iconSize : undefined,\r\n width: typeof iconSize === 'string' ? iconSize : iconSize,\r\n height: typeof iconSize === 'string' ? iconSize : iconSize,\r\n color: iconColor,\r\n } as IconPropsType\r\n\r\n if (iconSet === 'phosphor') {\r\n iconProps.weight = iconWeight\r\n } else {\r\n iconProps.strokeWidth = iconStrokeWidth\r\n }\r\n\r\n const animationClasses = mergeMap({\r\n 'animate-pulse': pulse,\r\n 'animate-spin': spin,\r\n 'animate-bounce': bounce,\r\n 'transition-all duration-200 ease-in-out': animated,\r\n })\r\n\r\n const accessibilityProps: React.AriaAttributes = {}\r\n\r\n if (ariaLabel) {\r\n accessibilityProps['aria-label'] = ariaLabel\r\n accessibilityProps['aria-hidden'] = false\r\n } else if (ariaHidden !== undefined) {\r\n accessibilityProps['aria-hidden'] = ariaHidden\r\n } else {\r\n accessibilityProps['aria-hidden'] = true\r\n }\r\n\r\n return (\r\n <span\r\n ref={ref}\r\n className={merge(\r\n 'inline-flex items-center justify-center',\r\n animationClasses,\r\n variantClasses,\r\n className\r\n )}\r\n style={{ width: iconSize, height: iconSize }}\r\n {...accessibilityProps}\r\n >\r\n {ResolvedIcon && React.createElement(ResolvedIcon, {\r\n ...iconProps,\r\n className: variantClasses,\r\n 'aria-hidden': true\r\n } as React.ComponentProps<typeof ResolvedIcon>)}\r\n </span>\r\n )\r\n})\r\n\r\nIconComponent.displayName = 'Icon'\r\n\r\nconst MemoizedIcon = React.memo(IconComponent, (prevProps, nextProps) => {\r\n return (\r\n prevProps.name === nextProps.name &&\r\n prevProps.size === nextProps.size &&\r\n prevProps.className === nextProps.className &&\r\n prevProps.emotion === nextProps.emotion &&\r\n prevProps.status === nextProps.status &&\r\n prevProps.provider === nextProps.provider &&\r\n prevProps.animated === nextProps.animated &&\r\n prevProps.pulse === nextProps.pulse &&\r\n prevProps.spin === nextProps.spin &&\r\n prevProps.bounce === nextProps.bounce &&\r\n prevProps.variant === nextProps.variant &&\r\n prevProps.weight === nextProps.weight &&\r\n prevProps['aria-label'] === nextProps['aria-label'] &&\r\n prevProps['aria-hidden'] === nextProps['aria-hidden']\r\n )\r\n})\r\n\r\nexport const Icon = MemoizedIcon as typeof IconComponent\r\nIcon.displayName = 'Icon'\r\n\r\nexport const EmotionIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { emotion: keyof typeof emotionIcons }>(\r\n (props, ref) => <Icon ref={ref} name=\"smile\" {...props} />\r\n)\r\nEmotionIcon.displayName = 'EmotionIcon'\r\n\r\nexport const StatusIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { status: keyof typeof statusIcons }>(\r\n (props, ref) => <Icon ref={ref} name=\"info\" {...props} />\r\n)\r\nStatusIcon.displayName = 'StatusIcon'\r\n\r\nexport const LoadingIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\r\n (props, ref) => (\r\n <Icon ref={ref} name=\"loader\" status=\"loading\" spin aria-label=\"로딩 중\" {...props} />\r\n )\r\n)\r\nLoadingIcon.displayName = 'LoadingIcon'\r\n\r\nexport const SuccessIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\r\n (props, ref) => (\r\n <Icon ref={ref} name=\"check\" status=\"success\" variant=\"success\" aria-label=\"성공\" {...props} />\r\n )\r\n)\r\nSuccessIcon.displayName = 'SuccessIcon'\r\n\r\nexport const ErrorIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\r\n (props, ref) => (\r\n <Icon ref={ref} name=\"alertCircle\" status=\"error\" variant=\"error\" aria-label=\"오류\" {...props} />\r\n )\r\n)\r\nErrorIcon.displayName = 'ErrorIcon'\r\n","/**\r\n * HUA UI 공통 색상 시스템\r\n * 중앙화된 색상 팔레트와 스타일 생성 유틸리티\r\n */\r\n\r\nimport type { Color } from \"../types/common\";\r\nimport { merge } from \"../utils\";\r\n\r\n/**\r\n * Tailwind CSS 색상 클래스 매핑\r\n * 각 색상의 50-900 단계를 정의합니다.\r\n */\r\nconst colorShades = {\r\n 50: \"50\",\r\n 100: \"100\",\r\n 200: \"200\",\r\n 300: \"300\",\r\n 400: \"400\",\r\n 500: \"500\",\r\n 600: \"600\",\r\n 700: \"700\",\r\n 800: \"800\",\r\n 900: \"900\",\r\n} as const;\r\n\r\ntype ColorShade = keyof typeof colorShades;\r\n\r\n/**\r\n * 색상별 클래스 생성 헬퍼\r\n */\r\nfunction colorClass(color: Color, shade: ColorShade, prefix: string = \"\"): string {\r\n return `${prefix}${color}-${colorShades[shade]}`;\r\n}\r\n\r\n/**\r\n * 다크 모드 지원 클래스 생성\r\n */\r\nfunction withDarkMode(lightClass: string, darkClass: string): string {\r\n return `${lightClass} dark:${darkClass}`;\r\n}\r\n\r\n/**\r\n * 색상 스타일 설정 인터페이스\r\n */\r\nexport interface ColorStyleConfig {\r\n /** 기본 variant 스타일 */\r\n default?: {\r\n border?: { light: ColorShade; dark?: ColorShade };\r\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\r\n };\r\n /** 그라데이션 variant 스타일 */\r\n gradient?: {\r\n from?: ColorShade;\r\n to?: ColorShade;\r\n border?: { light: ColorShade; dark?: ColorShade };\r\n };\r\n /** 아웃라인 variant 스타일 */\r\n outline?: {\r\n border?: { light: ColorShade; dark?: ColorShade };\r\n background?: string;\r\n text?: { light: ColorShade; dark?: ColorShade };\r\n };\r\n /** Elevated variant 스타일 */\r\n elevated?: {\r\n border?: { light: ColorShade; dark?: ColorShade };\r\n background?: { light: string; dark: string };\r\n shadow?: string;\r\n };\r\n /** 아이콘 스타일 */\r\n icon?: {\r\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\r\n text?: { light: ColorShade; dark?: ColorShade };\r\n };\r\n /** 배지 스타일 */\r\n badge?: {\r\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\r\n text?: { light: ColorShade; dark?: ColorShade };\r\n };\r\n}\r\n\r\n/**\r\n * 생성된 색상 스타일 인터페이스\r\n */\r\nexport interface ColorStyles {\r\n default: string;\r\n gradient: string;\r\n outline: string;\r\n elevated: string;\r\n icon: string;\r\n badge: string;\r\n}\r\n\r\n/**\r\n * 기본 색상 스타일 설정\r\n * 각 색상에 대한 기본 스타일 템플릿\r\n */\r\nconst defaultColorConfig: Omit<ColorStyleConfig, \"gradient\"> = {\r\n default: {\r\n border: { light: 200, dark: 700 },\r\n background: { light: 50, dark: 900, opacity: \"50\" },\r\n },\r\n outline: {\r\n border: { light: 300, dark: 600 },\r\n background: \"transparent\",\r\n text: { light: 600, dark: 400 },\r\n },\r\n elevated: {\r\n border: { light: 200, dark: 700 },\r\n background: { light: \"white\", dark: \"gray-800\" },\r\n shadow: \"lg\",\r\n },\r\n icon: {\r\n background: { light: 100, dark: 900, opacity: \"30\" },\r\n text: { light: 600, dark: 400 },\r\n },\r\n badge: {\r\n background: { light: 50, dark: 900, opacity: \"30\" },\r\n text: { light: 700, dark: 300 },\r\n },\r\n};\r\n\r\n/**\r\n * 그라데이션 스타일 설정\r\n */\r\nconst gradientConfig: ColorStyleConfig[\"gradient\"] = {\r\n from: 500,\r\n to: 600,\r\n border: { light: 400, dark: 500 },\r\n};\r\n\r\n/**\r\n * 색상 스타일 생성 함수\r\n * \r\n * @param color - 색상 이름\r\n * @param config - 커스텀 스타일 설정 (선택사항)\r\n * @returns 생성된 색상 스타일 객체\r\n * \r\n * @example\r\n * ```tsx\r\n * const styles = createColorStyles(\"blue\");\r\n * // styles.default, styles.gradient, styles.outline 등 사용 가능\r\n * ```\r\n */\r\nexport function createColorStyles(\r\n color: Color,\r\n config?: Partial<ColorStyleConfig>\r\n): ColorStyles {\r\n const finalConfig: ColorStyleConfig = {\r\n default: config?.default || defaultColorConfig.default,\r\n gradient: config?.gradient || gradientConfig,\r\n outline: config?.outline || defaultColorConfig.outline,\r\n elevated: config?.elevated || defaultColorConfig.elevated,\r\n icon: config?.icon || defaultColorConfig.icon,\r\n badge: config?.badge || defaultColorConfig.badge,\r\n };\r\n\r\n // Default variant\r\n const defaultBorder = finalConfig.default?.border\r\n ? withDarkMode(\r\n `border-${colorClass(color, finalConfig.default.border.light)}`,\r\n `border-${colorClass(color, finalConfig.default.border.dark || finalConfig.default.border.light)}`\r\n )\r\n : \"\";\r\n \r\n const defaultBg = finalConfig.default?.background\r\n ? withDarkMode(\r\n `bg-${colorClass(color, finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`,\r\n `bg-${colorClass(color, finalConfig.default.background.dark || finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`\r\n )\r\n : \"\";\r\n\r\n const defaultStyle = merge(defaultBorder, defaultBg);\r\n\r\n // Gradient variant\r\n const gradientFrom = finalConfig.gradient?.from\r\n ? `from-${colorClass(color, finalConfig.gradient.from)}`\r\n : \"\";\r\n const gradientTo = finalConfig.gradient?.to\r\n ? `to-${colorClass(color, finalConfig.gradient.to)}`\r\n : \"\";\r\n const gradientBorder = finalConfig.gradient?.border\r\n ? withDarkMode(\r\n `border-${colorClass(color, finalConfig.gradient.border.light)}`,\r\n `border-${colorClass(color, finalConfig.gradient.border.dark || finalConfig.gradient.border.light)}`\r\n )\r\n : \"\";\r\n \r\n const gradientStyle = merge(\r\n \"bg-gradient-to-br\",\r\n gradientFrom,\r\n gradientTo,\r\n gradientBorder\r\n );\r\n\r\n // Outline variant\r\n const outlineBorder = finalConfig.outline?.border\r\n ? `border-2 ${withDarkMode(\r\n `border-${colorClass(color, finalConfig.outline.border.light)}`,\r\n `border-${colorClass(color, finalConfig.outline.border.dark || finalConfig.outline.border.light)}`\r\n )}`\r\n : \"\";\r\n const outlineBg = finalConfig.outline?.background || \"bg-transparent\";\r\n const outlineText = finalConfig.outline?.text\r\n ? withDarkMode(\r\n `text-${colorClass(color, finalConfig.outline.text.light)}`,\r\n `text-${colorClass(color, finalConfig.outline.text.dark || finalConfig.outline.text.light)}`\r\n )\r\n : \"\";\r\n \r\n const outlineStyle = merge(outlineBorder, outlineBg, outlineText);\r\n\r\n // Elevated variant\r\n const elevatedBorder = finalConfig.elevated?.border\r\n ? withDarkMode(\r\n `border-${colorClass(color, finalConfig.elevated.border.light)}`,\r\n `border-${colorClass(color, finalConfig.elevated.border.dark || finalConfig.elevated.border.light)}`\r\n )\r\n : \"\";\r\n const elevatedBg = finalConfig.elevated?.background\r\n ? withDarkMode(\r\n `bg-${finalConfig.elevated.background.light}`,\r\n `bg-${finalConfig.elevated.background.dark}`\r\n )\r\n : \"\";\r\n const elevatedShadow = finalConfig.elevated?.shadow\r\n ? `shadow-${finalConfig.elevated.shadow}`\r\n : \"\";\r\n \r\n const elevatedStyle = merge(elevatedBorder, elevatedBg, elevatedShadow);\r\n\r\n // Icon style\r\n const iconBg = finalConfig.icon?.background\r\n ? withDarkMode(\r\n `bg-${colorClass(color, finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`,\r\n `bg-${colorClass(color, finalConfig.icon.background.dark || finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`\r\n )\r\n : \"\";\r\n const iconText = finalConfig.icon?.text\r\n ? withDarkMode(\r\n `text-${colorClass(color, finalConfig.icon.text.light)}`,\r\n `text-${colorClass(color, finalConfig.icon.text.dark || finalConfig.icon.text.light)}`\r\n )\r\n : \"\";\r\n \r\n const iconStyle = merge(iconBg, iconText);\r\n\r\n // Badge style\r\n const badgeBg = finalConfig.badge?.background\r\n ? withDarkMode(\r\n `bg-${colorClass(color, finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`,\r\n `bg-${colorClass(color, finalConfig.badge.background.dark || finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`\r\n )\r\n : \"\";\r\n const badgeText = finalConfig.badge?.text\r\n ? withDarkMode(\r\n `text-${colorClass(color, finalConfig.badge.text.light)}`,\r\n `text-${colorClass(color, finalConfig.badge.text.dark || finalConfig.badge.text.light)}`\r\n )\r\n : \"\";\r\n \r\n const badgeStyle = merge(badgeBg, badgeText);\r\n\r\n return {\r\n default: defaultStyle,\r\n gradient: gradientStyle,\r\n outline: outlineStyle,\r\n elevated: elevatedStyle,\r\n icon: iconStyle,\r\n badge: badgeStyle,\r\n };\r\n}\r\n\r\n/**\r\n * 색상 스타일 캐시\r\n * 동일한 색상과 설정에 대해 재사용하여 성능 최적화\r\n */\r\nconst colorStylesCache = new Map<string, ColorStyles>();\r\n\r\n/**\r\n * 메모이제이션된 색상 스타일 생성 함수\r\n * \r\n * @param color - 색상 이름\r\n * @param config - 커스텀 스타일 설정 (선택사항)\r\n * @returns 생성된 색상 스타일 객체\r\n */\r\nexport function useColorStyles(\r\n color: Color,\r\n config?: Partial<ColorStyleConfig>\r\n): ColorStyles {\r\n const cacheKey = `${color}-${JSON.stringify(config || {})}`;\r\n \r\n if (!colorStylesCache.has(cacheKey)) {\r\n colorStylesCache.set(cacheKey, createColorStyles(color, config));\r\n }\r\n \r\n return colorStylesCache.get(cacheKey)!;\r\n}\r\n\r\n","/**\r\n * HUA UI 공통 Variant 시스템\r\n * 컴포넌트 variant 스타일 생성 유틸리티\r\n */\r\n\r\nimport type { ExtendedVariant, Size } from \"../types/common\";\r\nimport type { ColorStyles } from \"./colors\";\r\nimport { merge } from \"../utils\";\r\n\r\n/**\r\n * Variant 스타일 생성 함수\r\n * \r\n * @param variant - Variant 타입\r\n * @param colorStyles - 색상 스타일 객체\r\n * @returns 생성된 variant 클래스 문자열\r\n * \r\n * @example\r\n * ```tsx\r\n * const colorStyles = useColorStyles(\"blue\");\r\n * const variantClass = createVariantStyles(\"elevated\", colorStyles);\r\n * ```\r\n */\r\nexport function createVariantStyles(\r\n variant: ExtendedVariant,\r\n colorStyles: ColorStyles\r\n): string {\r\n const baseClasses = \"rounded-2xl border transition-all duration-200\";\r\n \r\n switch (variant) {\r\n case \"default\":\r\n return merge(baseClasses, colorStyles.default);\r\n \r\n case \"gradient\":\r\n return merge(baseClasses, \"text-white\", colorStyles.gradient);\r\n \r\n case \"outline\":\r\n return merge(baseClasses, colorStyles.outline);\r\n \r\n case \"elevated\":\r\n return merge(baseClasses, colorStyles.elevated);\r\n \r\n default:\r\n return baseClasses;\r\n }\r\n}\r\n\r\n/**\r\n * Size 스타일 설정 인터페이스\r\n */\r\nexport interface SizeStyles {\r\n container: string;\r\n icon: string;\r\n iconContainer: string;\r\n text: string;\r\n title: string;\r\n description: string;\r\n}\r\n\r\n/**\r\n * Size 스타일 생성 함수\r\n * \r\n * @param size - 크기 타입\r\n * @returns 생성된 size 스타일 객체\r\n * \r\n * @example\r\n * ```tsx\r\n * const sizeStyles = createSizeStyles(\"md\");\r\n * // sizeStyles.container, sizeStyles.icon 등 사용 가능\r\n * ```\r\n */\r\nexport function createSizeStyles(size: Size = \"md\"): SizeStyles {\r\n const sizeMap: Record<Size, SizeStyles> = {\r\n sm: {\r\n container: \"p-4\",\r\n icon: \"h-4 w-4\",\r\n iconContainer: \"w-8 h-8\",\r\n text: \"text-xs\",\r\n title: \"text-xs\",\r\n description: \"text-xs\",\r\n },\r\n md: {\r\n container: \"p-6\",\r\n icon: \"h-6 w-6\",\r\n iconContainer: \"w-12 h-12\",\r\n text: \"text-base\",\r\n title: \"text-sm\",\r\n description: \"text-sm\",\r\n },\r\n lg: {\r\n container: \"p-8\",\r\n icon: \"h-8 w-8\",\r\n iconContainer: \"w-16 h-16\",\r\n text: \"text-lg\",\r\n title: \"text-base\",\r\n description: \"text-base\",\r\n },\r\n xl: {\r\n container: \"p-10\",\r\n icon: \"h-10 w-10\",\r\n iconContainer: \"w-20 h-20\",\r\n text: \"text-xl\",\r\n title: \"text-lg\",\r\n description: \"text-lg\",\r\n },\r\n };\r\n \r\n return sizeMap[size];\r\n}\r\n\r\n/**\r\n * Rounded 스타일 타입\r\n */\r\nexport type Rounded = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\" | \"none\";\r\n\r\n/**\r\n * Rounded 스타일 생성 함수\r\n * \r\n * @param rounded - Rounded 타입\r\n * @returns 생성된 rounded 클래스 문자열\r\n */\r\nexport function createRoundedStyles(rounded: Rounded = \"md\"): string {\r\n const roundedMap: Record<Rounded, string> = {\r\n sm: \"rounded\",\r\n md: \"rounded-md\",\r\n lg: \"rounded-lg\",\r\n xl: \"rounded-xl\",\r\n full: \"rounded-full\",\r\n none: \"rounded-none\",\r\n };\r\n \r\n return roundedMap[rounded];\r\n}\r\n\r\n/**\r\n * Shadow 스타일 타입\r\n */\r\nexport type Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\r\n\r\n/**\r\n * Shadow 스타일 생성 함수\r\n * \r\n * @param shadow - Shadow 타입\r\n * @returns 생성된 shadow 클래스 문자열\r\n */\r\nexport function createShadowStyles(shadow: Shadow = \"md\"): string {\r\n if (shadow === \"none\") return \"\";\r\n \r\n return `shadow-${shadow}`;\r\n}\r\n\r\n/**\r\n * Hover 효과 타입\r\n */\r\nexport type HoverEffect = \"scale\" | \"glow\" | \"slide\" | \"springy\" | \"none\";\r\n\r\n/**\r\n * HUA-UI 스프링 이징\r\n * 공 튕기듯 아주 미세한 반동 - cubic-bezier(0.34, 1.56, 0.64, 1)\r\n */\r\nexport const HUA_SPRING_EASING = \"cubic-bezier(0.34, 1.56, 0.64, 1)\";\r\n\r\n/**\r\n * Hover 효과 스타일 생성 함수\r\n *\r\n * @param hover - Hover 효과 타입\r\n * @param reducedMotion - 애니메이션 축소 설정 여부\r\n * @returns 생성된 hover 클래스 문자열\r\n *\r\n * @description\r\n * HUA-UI 시그니처: \"스륵 부드럽고 아주 미세하게 쫀득\"\r\n * - 스프링 이징으로 미세한 반동 효과\r\n * - 1.5% 스케일 변화로 자연스러운 피드백\r\n */\r\nexport function createHoverStyles(\r\n hover: HoverEffect = \"springy\",\r\n reducedMotion: boolean = false\r\n): string {\r\n if (reducedMotion || hover === \"none\") return \"\";\r\n\r\n // 스프링 이징 스타일 (Tailwind arbitrary value)\r\n // HUA-UI 시그니처: 아주 미세한 스프링 반동 (쫀득한 느낌)\r\n const springTransition = \"[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]\";\r\n\r\n const hoverMap: Record<HoverEffect, string> = {\r\n // HUA-UI 시그니처 스프링 효과 (기본값)\r\n // scale 1.5% + 미세한 shadow 추가로 입체감\r\n springy: `hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${springTransition} transform-gpu`,\r\n // scale만 (스프링 없음)\r\n scale: \"hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu\",\r\n // 글로우 효과 - shadow 강화\r\n glow: \"hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200\",\r\n // 슬라이드 효과 - 위로 살짝 뜨는 느낌 + shadow\r\n slide: `hover:-translate-y-0.5 hover:shadow-md ${springTransition} transform-gpu`,\r\n none: \"\",\r\n };\r\n\r\n return hoverMap[hover];\r\n}\r\n\r\n","\"use client\";\r\n\r\nimport React, { useMemo } from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport { Icon } from \"../Icon\";\r\nimport type { IconName } from \"../../lib/icons\";\r\nimport { useColorStyles } from \"../../lib/styles/colors\";\r\nimport { createVariantStyles } from \"../../lib/styles/variants\";\r\nimport type { Color } from \"../../lib/types/common\";\r\n\r\n/**\r\n * StatCard 컴포넌트의 props / StatCard component props\r\n * @typedef {Object} StatCardProps\r\n * @property {string} title - 카드 제목 / Card title\r\n * @property {string | number | null | undefined} value - 통계 값 / Statistic value\r\n * @property {string} [description] - 카드 설명 / Card description\r\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\r\n * @property {Object} [trend] - 추세 정보 / Trend information\r\n * @property {number} trend.value - 추세 값 / Trend value\r\n * @property {string} trend.label - 추세 라벨 / Trend label\r\n * @property {boolean} [trend.positive] - 긍정적 추세 여부 / Positive trend\r\n * @property {\"default\" | \"gradient\" | \"outline\" | \"elevated\"} [variant=\"default\"] - 카드 스타일 변형 / Card style variant\r\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color] - 카드 색상 / Card color\r\n * @property {boolean} [loading] - 로딩 상태 / Loading state\r\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface StatCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n title: string;\r\n value: string | number | null | undefined;\r\n description?: string;\r\n icon?: IconName | React.ReactNode;\r\n trend?: {\r\n value: number;\r\n label: string;\r\n positive?: boolean;\r\n };\r\n variant?: \"default\" | \"gradient\" | \"outline\" | \"elevated\";\r\n color?: Color;\r\n loading?: boolean;\r\n emptyState?: React.ReactNode;\r\n}\r\n\r\n\r\n/**\r\n * StatCard 컴포넌트 / StatCard component\r\n * \r\n * 통계 정보를 표시하는 카드 컴포넌트입니다.\r\n * 제목, 값, 설명, 아이콘, 추세 정보를 포함할 수 있습니다.\r\n * \r\n * Card component that displays statistic information.\r\n * Can include title, value, description, icon, and trend information.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <StatCard\r\n * title=\"총 사용자\"\r\n * value=\"1,234\"\r\n * description=\"지난 달 대비\"\r\n * icon=\"users\"\r\n * />\r\n * \r\n * @example\r\n * // 추세 정보 포함 / With trend information\r\n * <StatCard\r\n * title=\"매출\"\r\n * value=\"₩1,000,000\"\r\n * trend={{ value: 12.5, label: \"전월 대비\", positive: true }}\r\n * color=\"green\"\r\n * variant=\"gradient\"\r\n * />\r\n * \r\n * @param {StatCardProps} props - StatCard 컴포넌트의 props / StatCard component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} StatCard 컴포넌트 / StatCard component\r\n */\r\nexport const StatCard = React.forwardRef<HTMLDivElement, StatCardProps>(\r\n (\r\n {\r\n title,\r\n value,\r\n description,\r\n icon,\r\n trend,\r\n variant = \"elevated\",\r\n color = \"blue\",\r\n loading = false,\r\n emptyState,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n // 공통 색상 시스템 사용\r\n const colorStyles = useColorStyles(color);\r\n const isGradient = variant === \"gradient\";\r\n const isTextWhite = isGradient;\r\n\r\n // Variant 스타일 생성 (elevated는 rounded-3xl로 커스터마이징)\r\n const variantClass = useMemo(() => {\r\n const baseClass = createVariantStyles(variant, colorStyles);\r\n // elevated variant는 rounded-3xl 사용\r\n if (variant === \"elevated\") {\r\n return baseClass.replace(\"rounded-2xl\", \"rounded-3xl\");\r\n }\r\n return baseClass;\r\n }, [variant, colorStyles]);\r\n\r\n const formatValue = (val: string | number): string => {\r\n if (typeof val === \"number\") {\r\n return val.toLocaleString();\r\n }\r\n return val;\r\n };\r\n\r\n if (!loading && (value === null || value === undefined || value === \"\")) {\r\n return emptyState ? (\r\n <div className={className} {...props}>\r\n {emptyState}\r\n </div>\r\n ) : (\r\n <div className={merge(\"rounded-2xl border border-slate-100 dark:border-slate-800 p-6\", className)} {...props}>\r\n <h3 className=\"text-sm font-medium text-slate-500 dark:text-slate-400\">{title}</h3>\r\n <p className=\"mt-2 text-sm text-slate-400\">데이터가 없습니다.</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"p-6 transition-all duration-200 hover:shadow-xl\",\r\n variantClass,\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div className=\"flex items-start justify-between mb-4\">\r\n {/* 아이콘 */}\r\n {icon && (\r\n <div className={merge(\r\n \"w-12 h-12 rounded-lg flex items-center justify-center flex-shrink-0\",\r\n isGradient ? \"bg-white/20\" : colorStyles.icon\r\n )}>\r\n {typeof icon === \"string\" ? (\r\n <Icon\r\n name={icon as IconName}\r\n className={merge(\r\n \"w-6 h-6\",\r\n isTextWhite ? \"text-white\" : \"\"\r\n )}\r\n />\r\n ) : (\r\n icon\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 배지 */}\r\n {title && (\r\n <span className={merge(\r\n \"text-sm px-3 py-1 rounded-full font-medium\",\r\n isGradient ? \"bg-white/20 text-white\" : colorStyles.badge\r\n )}>\r\n {title}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* 값 */}\r\n {loading ? (\r\n <div className=\"h-10 bg-gray-200 dark:bg-gray-700 rounded animate-pulse mb-2\" />\r\n ) : (\r\n <h3 className={merge(\r\n \"text-3xl font-bold mb-1\",\r\n isTextWhite ? \"text-white\" : \"text-gray-800 dark:text-white\"\r\n )}>\r\n {formatValue(value ?? 0)}\r\n </h3>\r\n )}\r\n\r\n {/* 설명 */}\r\n {description && (\r\n <p className={merge(\r\n \"text-sm\",\r\n isTextWhite ? \"text-white/90\" : \"text-gray-600 dark:text-gray-300\"\r\n )}>\r\n {description}\r\n </p>\r\n )}\r\n\r\n {/* 트렌드 */}\r\n {trend && !loading && (\r\n <div className=\"mt-3 flex items-center gap-1\">\r\n <span\r\n className={merge(\r\n \"text-xs font-medium\",\r\n trend.positive !== false\r\n ? \"text-green-600 dark:text-green-400\"\r\n : \"text-red-600 dark:text-red-400\"\r\n )}\r\n >\r\n {trend.positive !== false ? \"↑\" : \"↓\"} {Math.abs(trend.value)}%\r\n </span>\r\n <span className={merge(\r\n \"text-xs\",\r\n isTextWhite ? \"text-white/70\" : \"text-gray-500 dark:text-gray-400\"\r\n )}>\r\n {trend.label}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nStatCard.displayName = \"StatCard\";\r\n\r\n","\"use client\";\r\n\r\nimport React, { useMemo } from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport { Icon } from \"../Icon\";\r\nimport type { IconName } from \"../../lib/icons\";\r\nimport { useColorStyles } from \"../../lib/styles/colors\";\r\nimport type { Color } from \"../../lib/types/common\";\r\n\r\n/**\r\n * QuickActionCard 컴포넌트의 props / QuickActionCard component props\r\n * @typedef {Object} QuickActionCardProps\r\n * @property {string} title - 카드 제목 / Card title\r\n * @property {string} [description] - 카드 설명 / Card description\r\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\r\n * @property {string} [href] - 링크 URL / Link URL\r\n * @property {() => void} [onClick] - 클릭 핸들러 / Click handler\r\n * @property {\"gradient\" | \"outline\" | \"solid\"} [variant=\"gradient\"] - 카드 스타일 변형 / Card style variant\r\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color=\"blue\"] - 카드 색상 / Card color\r\n * @property {boolean} [loading] - 로딩 상태 / Loading state\r\n * @extends {React.HTMLAttributes<HTMLAnchorElement | HTMLButtonElement>}\r\n */\r\nexport interface QuickActionCardProps extends React.HTMLAttributes<HTMLAnchorElement | HTMLButtonElement> {\r\n title: string;\r\n description?: string;\r\n icon?: IconName | React.ReactNode;\r\n href?: string;\r\n onClick?: () => void;\r\n variant?: \"gradient\" | \"outline\" | \"solid\";\r\n color?: Color;\r\n loading?: boolean;\r\n /** 우측 상단 뱃지 텍스트 (예: \"준비중\", \"Coming Soon\") */\r\n badge?: string;\r\n}\r\n\r\n\r\n/**\r\n * QuickActionCard 컴포넌트 / QuickActionCard component\r\n * \r\n * 빠른 액션을 수행하는 카드 컴포넌트입니다.\r\n * 링크나 버튼으로 동작하며, 클릭 가능한 액션 카드로 사용됩니다.\r\n * \r\n * Card component for quick actions.\r\n * Works as a link or button, used as a clickable action card.\r\n * \r\n * @component\r\n * @example\r\n * // 링크 카드 / Link card\r\n * <QuickActionCard\r\n * title=\"새 주문 생성\"\r\n * description=\"주문을 빠르게 생성하세요\"\r\n * icon=\"plus\"\r\n * href=\"/orders/new\"\r\n * color=\"blue\"\r\n * />\r\n * \r\n * @example\r\n * // 버튼 카드 / Button card\r\n * <QuickActionCard\r\n * title=\"리포트 다운로드\"\r\n * description=\"최신 리포트를 다운로드하세요\"\r\n * icon=\"download\"\r\n * onClick={handleDownload}\r\n * variant=\"outline\"\r\n * color=\"green\"\r\n * />\r\n * \r\n * @param {QuickActionCardProps} props - QuickActionCard 컴포넌트의 props / QuickActionCard component props\r\n * @param {React.Ref<HTMLAnchorElement | HTMLButtonElement>} ref - anchor 또는 button 요소 ref / anchor or button element ref\r\n * @returns {JSX.Element} QuickActionCard 컴포넌트 / QuickActionCard component\r\n */\r\nexport const QuickActionCard = React.forwardRef<\r\n HTMLAnchorElement | HTMLButtonElement,\r\n QuickActionCardProps\r\n>(\r\n (\r\n {\r\n title,\r\n description,\r\n icon,\r\n href,\r\n onClick,\r\n variant = \"gradient\",\r\n color = \"blue\",\r\n loading = false,\r\n badge,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n // 공통 색상 시스템 사용\r\n const colorStyles = useColorStyles(color);\r\n const isGradient = variant === \"gradient\";\r\n const isTextWhite = isGradient || variant === \"solid\";\r\n\r\n // Variant 스타일 생성 (QuickActionCard는 gradient, outline, solid만 사용)\r\n const variantClass = useMemo(() => {\r\n if (variant === \"gradient\") {\r\n // gradient는 공통 시스템 사용\r\n return `text-white ${colorStyles.gradient}`;\r\n } else if (variant === \"outline\") {\r\n // outline은 공통 시스템 사용\r\n return colorStyles.outline;\r\n } else {\r\n // solid는 별도 처리 (정적 클래스 사용)\r\n const solidClasses: Record<Color, string> = {\r\n blue: \"text-white bg-primary hover:bg-primary/90\",\r\n purple: \"text-white bg-purple-600 hover:bg-purple-700\",\r\n green: \"text-white bg-green-600 hover:bg-green-700\",\r\n orange: \"text-white bg-orange-600 hover:bg-orange-700\",\r\n red: \"text-white bg-red-600 hover:bg-red-700\",\r\n indigo: \"text-white bg-indigo-600 hover:bg-indigo-700\",\r\n pink: \"text-white bg-pink-600 hover:bg-pink-700\",\r\n gray: \"text-white bg-gray-600 hover:bg-gray-700\",\r\n cyan: \"text-white bg-cyan-600 hover:bg-cyan-700\",\r\n };\r\n return solidClasses[color];\r\n }\r\n }, [variant, colorStyles, color]);\r\n\r\n const baseClasses = merge(\r\n \"rounded-2xl p-6 transition-all shadow-lg hover:shadow-xl text-center\",\r\n badge && \"relative\",\r\n variantClass,\r\n className\r\n );\r\n\r\n const content = (\r\n <>\r\n {/* 뱃지 */}\r\n {badge && (\r\n <span className=\"absolute top-2 right-2 text-[10px] font-medium bg-gray-200 dark:bg-gray-700 text-gray-500 dark:text-gray-400 px-1.5 py-0.5 rounded-full\">\r\n {badge}\r\n </span>\r\n )}\r\n\r\n {/* 아이콘 */}\r\n {icon && (\r\n <div className={merge(\r\n \"w-12 h-12 rounded-lg flex items-center justify-center mx-auto mb-2\",\r\n isGradient || variant === \"solid\"\r\n ? \"bg-white/20\"\r\n : variant === \"outline\"\r\n ? colorStyles.icon\r\n : \"\"\r\n )}>\r\n {typeof icon === \"string\" ? (\r\n <Icon\r\n name={icon as IconName}\r\n className={merge(\r\n \"w-6 h-6\",\r\n isTextWhite ? \"text-white\" : \"\"\r\n )}\r\n />\r\n ) : (\r\n icon\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 제목 */}\r\n <h3 className={merge(\r\n \"text-xl font-semibold mb-1\",\r\n isTextWhite ? \"text-white\" : \"\"\r\n )}>\r\n {title}\r\n </h3>\r\n\r\n {/* 설명 */}\r\n {description && (\r\n <p className={merge(\r\n \"text-sm\",\r\n isTextWhite ? \"text-white/90\" : \"text-gray-600 dark:text-gray-300\"\r\n )}>\r\n {description}\r\n </p>\r\n )}\r\n\r\n {loading && (\r\n <div className=\"mt-2 h-4 bg-white/20 rounded animate-pulse\" />\r\n )}\r\n </>\r\n );\r\n\r\n if (href) {\r\n return (\r\n <a\r\n ref={ref as React.Ref<HTMLAnchorElement>}\r\n href={href}\r\n className={baseClasses}\r\n {...(props as React.AnchorHTMLAttributes<HTMLAnchorElement>)}\r\n >\r\n {content}\r\n </a>\r\n );\r\n }\r\n\r\n return (\r\n <button\r\n ref={ref as React.Ref<HTMLButtonElement>}\r\n onClick={onClick}\r\n className={baseClasses}\r\n {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}\r\n >\r\n {content}\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nQuickActionCard.displayName = \"QuickActionCard\";\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\n\r\n/**\r\n * DashboardGrid 컴포넌트의 props\r\n * @typedef {Object} DashboardGridProps\r\n * @property {1 | 2 | 3 | 4 | 5 | 6} [columns=4] - 그리드 컬럼 수\r\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\"} [gap=\"md\"] - 그리드 간격\r\n * @property {boolean} [responsive=true] - 반응형 여부\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface DashboardGridProps extends React.HTMLAttributes<HTMLDivElement> {\r\n columns?: 1 | 2 | 3 | 4 | 5 | 6;\r\n gap?: \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n responsive?: boolean;\r\n}\r\n\r\nconst gapClasses = {\r\n sm: \"gap-3\",\r\n md: \"gap-6\",\r\n lg: \"gap-8\",\r\n xl: \"gap-12\",\r\n};\r\n\r\nconst columnClasses = {\r\n 1: \"grid-cols-1\",\r\n 2: \"grid-cols-1 md:grid-cols-2\",\r\n 3: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-3\",\r\n 4: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-4\",\r\n 5: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5\",\r\n 6: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6\",\r\n};\r\n\r\n// 비반응형용 고정 클래스 (Tailwind 동적 클래스 생성 문제 해결)\r\nconst fixedColumnClasses: Record<1 | 2 | 3 | 4 | 5 | 6, string> = {\r\n 1: \"grid-cols-1\",\r\n 2: \"grid-cols-2\",\r\n 3: \"grid-cols-3\",\r\n 4: \"grid-cols-4\",\r\n 5: \"grid-cols-5\",\r\n 6: \"grid-cols-6\",\r\n};\r\n\r\n/**\r\n * DashboardGrid 컴포넌트\r\n * \r\n * 대시보드 그리드 레이아웃을 제공하는 컴포넌트입니다.\r\n * 반응형 그리드를 지원하며, 다양한 컬럼 수와 간격을 설정할 수 있습니다.\r\n * \r\n * Dashboard grid layout component.\r\n * Supports responsive grid with configurable column count and gap sizes.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <DashboardGrid columns={4}>\r\n * <StatCard title=\"항목 1\" value=\"100\" />\r\n * <StatCard title=\"항목 2\" value=\"200\" />\r\n * </DashboardGrid>\r\n * \r\n * @example\r\n * // 반응형 그리드 / Responsive grid\r\n * <DashboardGrid columns={3} gap=\"lg\" responsive>\r\n * <MetricCard title=\"메트릭 1\" value=\"1,000\" />\r\n * <MetricCard title=\"메트릭 2\" value=\"2,000\" />\r\n * </DashboardGrid>\r\n * \r\n * @param {DashboardGridProps} props - DashboardGrid 컴포넌트의 props / DashboardGrid component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} DashboardGrid 컴포넌트 / DashboardGrid component\r\n */\r\nexport const DashboardGrid = React.forwardRef<HTMLDivElement, DashboardGridProps>(\r\n (\r\n {\r\n columns = 4,\r\n gap = \"md\",\r\n responsive = true,\r\n className,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const gridClasses = responsive\r\n ? columnClasses[columns]\r\n : fixedColumnClasses[columns];\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"grid\",\r\n gridClasses,\r\n gapClasses[gap],\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nDashboardGrid.displayName = \"DashboardGrid\";\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge, formatRelativeTime } from \"../../lib/utils\";\r\nimport { Icon } from \"../Icon\";\r\nimport type { IconName } from \"../../lib/icons\";\r\n\r\n/**\r\n * ActivityItem 인터페이스 / ActivityItem interface\r\n * @typedef {Object} ActivityItem\r\n * @property {string} id - 활동 항목 고유 ID / Activity item unique ID\r\n * @property {string} title - 활동 제목 / Activity title\r\n * @property {string} [description] - 활동 설명 / Activity description\r\n * @property {Date | string} timestamp - 활동 타임스탬프 / Activity timestamp\r\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\r\n * @property {string | React.ReactNode} [badge] - 배지 / Badge\r\n * @property {() => void} [onClick] - 클릭 핸들러 / Click handler\r\n * @property {Record<string, unknown>} [metadata] - 추가 메타데이터 / Additional metadata\r\n */\r\nexport interface ActivityItem {\r\n id: string;\r\n title: string;\r\n description?: string;\r\n timestamp: Date | string;\r\n icon?: IconName | React.ReactNode;\r\n badge?: string | React.ReactNode;\r\n onClick?: () => void;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * ActivityFeed 컴포넌트의 props / ActivityFeed component props\r\n * @typedef {Object} ActivityFeedProps\r\n * @property {string} [title] - 피드 제목 / Feed title\r\n * @property {ActivityItem[]} items - 활동 항목 배열 / Activity items array\r\n * @property {string} [emptyMessage=\"활동 내역이 없습니다.\"] - 빈 상태 메시지 / Empty state message\r\n * @property {boolean} [showHeader=true] - 헤더 표시 여부 / Show header\r\n * @property {number} [maxItems] - 최대 표시 항목 수 / Maximum items to display\r\n * @property {() => void} [onViewAll] - 전체 보기 핸들러 / View all handler\r\n * @property {string} [viewAllLabel=\"전체 보기\"] - 전체 보기 라벨 / View all label\r\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface ActivityFeedProps extends React.HTMLAttributes<HTMLDivElement> {\r\n title?: string;\r\n items: ActivityItem[];\r\n emptyMessage?: string;\r\n showHeader?: boolean;\r\n maxItems?: number;\r\n onViewAll?: () => void;\r\n viewAllLabel?: string;\r\n emptyState?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * ActivityFeed 컴포넌트 / ActivityFeed component\r\n * \r\n * 활동 내역을 표시하는 피드 컴포넌트입니다.\r\n * 타임스탬프를 상대 시간으로 표시하며, 최대 항목 수 제한을 지원합니다.\r\n * \r\n * Feed component that displays activity history.\r\n * Shows timestamps as relative time and supports maximum items limit.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <ActivityFeed\r\n * title=\"최근 활동\"\r\n * items={[\r\n * {\r\n * id: \"1\",\r\n * title: \"새 주문 생성\",\r\n * description: \"주문 #1234\",\r\n * timestamp: new Date(),\r\n * icon: \"shoppingCart\"\r\n * }\r\n * ]}\r\n * />\r\n * \r\n * @example\r\n * // 최대 항목 수 제한 / Maximum items limit\r\n * <ActivityFeed\r\n * title=\"활동 내역\"\r\n * items={activities}\r\n * maxItems={10}\r\n * onViewAll={() => navigate(\"/activities\")}\r\n * />\r\n * \r\n * @param {ActivityFeedProps} props - ActivityFeed 컴포넌트의 props / ActivityFeed component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} ActivityFeed 컴포넌트 / ActivityFeed component\r\n */\r\nexport const ActivityFeed = React.forwardRef<HTMLDivElement, ActivityFeedProps>(\r\n (\r\n {\r\n title,\r\n items,\r\n emptyMessage = \"활동 내역이 없습니다.\",\r\n showHeader = true,\r\n maxItems,\r\n onViewAll,\r\n viewAllLabel = \"전체 보기\",\r\n emptyState,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const displayItems = maxItems ? items.slice(0, maxItems) : items;\r\n const hasMore = maxItems && items.length > maxItems;\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"bg-white dark:bg-gray-800 rounded-2xl shadow-lg border border-gray-200 dark:border-gray-700\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {/* 헤더 */}\r\n {showHeader && title && (\r\n <div className=\"flex items-center justify-between p-6 border-b border-gray-200 dark:border-gray-700\">\r\n <h2 className=\"text-xl font-bold text-gray-800 dark:text-white flex items-center\">\r\n {title}\r\n </h2>\r\n {onViewAll && (\r\n <button\r\n onClick={onViewAll}\r\n aria-label={`${viewAllLabel} - ${title || \"활동 내역\"}`}\r\n className=\"text-purple-600 dark:text-purple-400 hover:text-purple-700 dark:hover:text-purple-300 font-medium text-sm transition-colors\"\r\n >\r\n {viewAllLabel} →\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 활동 목록 */}\r\n {displayItems.length > 0 ? (\r\n <div className=\"divide-y divide-gray-200 dark:divide-gray-700\">\r\n {displayItems.map((item) => (\r\n <div\r\n key={item.id}\r\n onClick={item.onClick}\r\n className={merge(\r\n \"p-4 transition-colors\",\r\n item.onClick && \"hover:bg-gray-50 dark:hover:bg-gray-700/50 cursor-pointer group\"\r\n )}\r\n >\r\n <div className=\"flex items-start justify-between mb-2\">\r\n <div className=\"flex-1 min-w-0\">\r\n {/* 아이콘과 제목 */}\r\n <div className=\"flex items-start gap-3\">\r\n {item.icon && (\r\n <div className=\"w-8 h-8 rounded-lg bg-purple-100 dark:bg-purple-900/30 flex items-center justify-center flex-shrink-0 mt-0.5\">\r\n {typeof item.icon === \"string\" ? (\r\n <Icon\r\n name={item.icon as IconName}\r\n className=\"w-4 h-4 text-purple-600 dark:text-purple-400\"\r\n />\r\n ) : (\r\n item.icon\r\n )}\r\n </div>\r\n )}\r\n <div className=\"flex-1 min-w-0\">\r\n <h3 className=\"text-base font-semibold text-gray-800 dark:text-white mb-1 truncate\">\r\n {item.title}\r\n </h3>\r\n {item.description && (\r\n <p className=\"text-sm text-gray-600 dark:text-gray-300 line-clamp-2\">\r\n {item.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* 배지 */}\r\n {item.badge && (\r\n <div className=\"ml-2 flex-shrink-0\">\r\n {typeof item.badge === \"string\" ? (\r\n <span className=\"px-2 py-1 rounded-full text-xs font-medium bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300\">\r\n {item.badge}\r\n </span>\r\n ) : (\r\n item.badge\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* 메타데이터 */}\r\n {item.metadata && Object.keys(item.metadata).length > 0 && (\r\n <div className=\"flex items-center gap-1 flex-wrap mt-2\">\r\n {Object.entries(item.metadata).map(([key, value]) => (\r\n <span\r\n key={key}\r\n className=\"text-xs bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 px-2 py-0.5 rounded\"\r\n >\r\n {key}: {String(value)}\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* 타임스탬프 */}\r\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-2\">\r\n <time dateTime={item.timestamp instanceof Date ? item.timestamp.toISOString() : typeof item.timestamp === 'string' ? item.timestamp : undefined}>\r\n {formatRelativeTime(item.timestamp)}\r\n </time>\r\n </p>\r\n </div>\r\n ))}\r\n\r\n {/* 더 보기 */}\r\n {hasMore && (\r\n <div className=\"p-4 text-center border-t border-gray-200 dark:border-gray-700\">\r\n <button\r\n onClick={onViewAll}\r\n aria-label={`더 많은 활동 보기 - ${items.length - (maxItems || 0)}개 더`}\r\n className=\"inline-flex items-center text-sm text-purple-600 dark:text-purple-400 hover:text-purple-700 dark:hover:text-purple-300 font-medium transition-colors\"\r\n >\r\n <span>더 많은 활동 보기</span>\r\n <span className=\"ml-1\">({items.length - (maxItems || 0)}개 더)</span>\r\n <span className=\"ml-1\">→</span>\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n ) : emptyState ? (\r\n emptyState\r\n ) : (\r\n <div className=\"text-center py-8\">\r\n <span className=\"text-4xl mb-3 block\">📭</span>\r\n <p className=\"text-gray-500 dark:text-gray-400 text-sm\">{emptyMessage}</p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nActivityFeed.displayName = \"ActivityFeed\";\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport { Icon } from \"../Icon\";\r\n\r\n/**\r\n * 멤버십 등급 인터페이스\r\n * @typedef {Object} MembershipTier\r\n * @property {\"basic\" | \"pro\" | \"premium\" | \"admin\"} tier - 등급\r\n * @property {string} label - 등급 라벨\r\n */\r\nexport interface MembershipTier {\r\n tier: \"basic\" | \"pro\" | \"premium\" | \"admin\";\r\n label: string;\r\n}\r\n\r\n/**\r\n * ProfileCard 컴포넌트의 props / ProfileCard component props\r\n * @typedef {Object} ProfileCardProps\r\n * @property {string} name - 사용자 이름 / User name\r\n * @property {string} [email] - 이메일 / Email\r\n * @property {string} [avatar] - 아바타 이미지 URL / Avatar image URL\r\n * @property {string} [avatarAlt] - 아바타 대체 텍스트 / Avatar alt text\r\n * @property {string} [greeting] - 인사말 / Greeting\r\n * @property {Date | string} [memberSince] - 가입일 / Member since date\r\n * @property {MembershipTier[\"tier\"]} [membershipTier] - 멤버십 등급 / Membership tier\r\n * @property {string} [membershipLabel] - 멤버십 라벨 / Membership label\r\n * @property {() => void} [onSettingsClick] - 설정 클릭 핸들러 / Settings click handler\r\n * @property {string} [settingsHref] - 설정 링크 URL / Settings link URL\r\n * @property {\"default\" | \"gradient\" | \"minimal\"} [variant=\"default\"] - 스타일 변형 / Style variant\r\n * @property {boolean} [showAvatar=true] - 아바타 표시 여부 / Show avatar\r\n * @property {boolean} [showMembership=true] - 멤버십 표시 여부 / Show membership\r\n * @property {boolean} [showSettings=true] - 설정 버튼 표시 여부 / Show settings button\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface ProfileCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n name: string;\r\n email?: string;\r\n avatar?: string;\r\n avatarAlt?: string;\r\n greeting?: string;\r\n memberSince?: Date | string;\r\n membershipTier?: MembershipTier[\"tier\"];\r\n membershipLabel?: string;\r\n onSettingsClick?: () => void;\r\n settingsHref?: string;\r\n variant?: \"default\" | \"gradient\" | \"minimal\";\r\n showAvatar?: boolean;\r\n showMembership?: boolean;\r\n showSettings?: boolean;\r\n}\r\n\r\nconst tierStyles = {\r\n basic: {\r\n badge: \"bg-gradient-to-r from-indigo-500 to-cyan-500 text-white\",\r\n icon: \"text-indigo-600 dark:text-indigo-400\",\r\n },\r\n pro: {\r\n badge: \"bg-gradient-to-r from-purple-500 to-pink-500 text-white\",\r\n icon: \"text-purple-600 dark:text-purple-400\",\r\n },\r\n premium: {\r\n badge: \"bg-gradient-to-r from-yellow-400 to-orange-500 text-white\",\r\n icon: \"text-yellow-600 dark:text-yellow-400\",\r\n },\r\n admin: {\r\n badge: \"bg-gradient-to-r from-red-500 to-pink-500 text-white\",\r\n icon: \"text-red-600 dark:text-red-400\",\r\n },\r\n};\r\n\r\nconst tierLabels = {\r\n basic: \"Basic\",\r\n pro: \"Pro\",\r\n premium: \"Premium\",\r\n admin: \"Admin\",\r\n};\r\n\r\n/**\r\n * ProfileCard 컴포넌트\r\n * \r\n * 사용자 프로필 정보를 표시하는 카드 컴포넌트입니다.\r\n * 아바타, 이름, 이메일, 멤버십 등급 등을 표시할 수 있습니다.\r\n * \r\n * Card component that displays user profile information.\r\n * Can show avatar, name, email, membership tier, and more.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <ProfileCard\r\n * name=\"홍길동\"\r\n * email=\"hong@example.com\"\r\n * avatar=\"/avatar.jpg\"\r\n * membershipTier=\"premium\"\r\n * memberSince={new Date(\"2024-01-01\")}\r\n * />\r\n * \r\n * @example\r\n * // 그라디언트 스타일 / Gradient style\r\n * <ProfileCard\r\n * name=\"김철수\"\r\n * greeting=\"안녕하세요\"\r\n * variant=\"gradient\"\r\n * membershipTier=\"pro\"\r\n * onSettingsClick={() => navigate(\"/settings\")}\r\n * />\r\n * \r\n * @param {ProfileCardProps} props - ProfileCard 컴포넌트의 props / ProfileCard component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} ProfileCard 컴포넌트 / ProfileCard component\r\n */\r\nexport const ProfileCard = React.forwardRef<HTMLDivElement, ProfileCardProps>(\r\n (\r\n {\r\n name,\r\n email,\r\n avatar,\r\n avatarAlt,\r\n greeting,\r\n memberSince,\r\n membershipTier,\r\n membershipLabel,\r\n onSettingsClick,\r\n settingsHref,\r\n variant = \"default\",\r\n showAvatar = true,\r\n showMembership = true,\r\n showSettings = true,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const formatDate = (date: Date | string): string => {\r\n const d = typeof date === \"string\" ? new Date(date) : date;\r\n return d.toLocaleDateString(\"ko-KR\", {\r\n year: \"numeric\",\r\n month: \"long\",\r\n day: \"numeric\",\r\n });\r\n };\r\n\r\n const tier = membershipTier || \"basic\";\r\n const tierStyle = tierStyles[tier];\r\n const tierLabel = membershipLabel || tierLabels[tier];\r\n\r\n const variantClasses = {\r\n default: \"bg-white dark:bg-gray-800 rounded-2xl shadow-lg border border-gray-200 dark:border-gray-700\",\r\n gradient: \"bg-gradient-to-br from-indigo-50 via-purple-50 to-pink-50 dark:from-gray-800 dark:via-gray-800 dark:to-gray-900 rounded-2xl shadow-xl border border-white/20 dark:border-gray-700/20\",\r\n minimal: \"bg-transparent\",\r\n };\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"relative overflow-hidden p-6\",\r\n variantClasses[variant],\r\n className\r\n )}\r\n {...props}\r\n >\r\n {/* 그라데이션 배경 장식 (gradient variant일 때) */}\r\n {variant === \"gradient\" && (\r\n <>\r\n <div className=\"absolute inset-0 bg-gradient-to-br from-indigo-500 via-purple-500 to-pink-500 opacity-10 dark:opacity-20\"></div>\r\n <div className=\"absolute inset-0 bg-gradient-to-tr from-cyan-400 via-indigo-500 to-purple-600 opacity-5 dark:opacity-15\"></div>\r\n </>\r\n )}\r\n\r\n <div className=\"relative flex items-start gap-6\">\r\n {/* 설정 아이콘 */}\r\n {showSettings && (onSettingsClick || settingsHref) && (\r\n <div className=\"absolute top-0 right-0\">\r\n {settingsHref ? (\r\n <a\r\n href={settingsHref}\r\n className=\"p-2 text-gray-400 dark:text-gray-300 hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors\"\r\n title=\"설정\"\r\n >\r\n <Icon name=\"settings\" className=\"w-6 h-6\" />\r\n </a>\r\n ) : (\r\n <button\r\n onClick={onSettingsClick}\r\n className=\"p-2 text-gray-400 dark:text-gray-300 hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors\"\r\n title=\"설정\"\r\n >\r\n <Icon name=\"settings\" className=\"w-6 h-6\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 아바타 */}\r\n {showAvatar && (\r\n <div className=\"relative flex-shrink-0\">\r\n {avatar ? (\r\n <img\r\n src={avatar}\r\n alt={avatarAlt || name}\r\n className=\"w-20 h-20 rounded-full border-4 border-white dark:border-gray-700 shadow-lg object-cover\"\r\n />\r\n ) : (\r\n <div className=\"w-20 h-20 rounded-full bg-gradient-to-br from-indigo-500 to-purple-600 flex items-center justify-center border-4 border-white dark:border-gray-700 shadow-lg\">\r\n <span className=\"text-2xl font-bold text-white\">\r\n {name.charAt(0).toUpperCase()}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 정보 */}\r\n <div className=\"flex-1 min-w-0\">\r\n {/* 인사말 */}\r\n {greeting && (\r\n <div className=\"text-lg sm:text-xl font-semibold mb-2\">\r\n {greeting.split(\" \").map((part, index) => {\r\n const isEmoji = /[\\u{1F600}-\\u{1F64F}]|[\\u{1F300}-\\u{1F5FF}]|[\\u{1F680}-\\u{1F6FF}]|[\\u{1F1E0}-\\u{1F1FF}]|[\\u{2600}-\\u{26FF}]|[\\u{2700}-\\u{27BF}]/u.test(part);\r\n return (\r\n <span key={index}>\r\n {isEmoji ? (\r\n <span className=\"text-gray-900 dark:text-white\">{part}</span>\r\n ) : (\r\n <span className=\"text-xl sm:text-2xl font-bold bg-gradient-to-r from-indigo-500 to-purple-500 bg-clip-text text-transparent\">\r\n {part}\r\n </span>\r\n )}\r\n {index < greeting.split(\" \").length - 1 && \" \"}\r\n </span>\r\n );\r\n })}\r\n </div>\r\n )}\r\n\r\n {/* 이름과 멤버십 뱃지 */}\r\n <div className=\"flex flex-wrap items-center gap-2 sm:gap-3 mb-2\">\r\n <span className=\"text-xl sm:text-2xl font-bold text-gray-900 dark:text-white truncate\">\r\n {name}!\r\n </span>\r\n {showMembership && membershipTier && (\r\n <span\r\n className={merge(\r\n \"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold shadow-lg\",\r\n tierStyle.badge\r\n )}\r\n >\r\n <svg className=\"w-3 h-3 mr-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n {tier === \"premium\" ? (\r\n <path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z\" />\r\n ) : tier === \"admin\" ? (\r\n <path fillRule=\"evenodd\" d=\"M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z\" clipRule=\"evenodd\" />\r\n ) : (\r\n <path fillRule=\"evenodd\" d=\"M6.267 3.455a3.066 3.066 0 001.745-.723 3.066 3.066 0 013.976 0 3.066 3.066 0 001.745.723 3.066 3.066 0 012.812 2.812c.051.643.304 1.254.723 1.745a3.066 3.066 0 010 3.976 3.066 3.066 0 00-.723 1.745 3.066 3.066 0 01-2.812 2.812 3.066 3.066 0 00-1.745.723 3.066 3.066 0 01-3.976 0 3.066 3.066 0 00-1.745-.723 3.066 3.066 0 01-2.812-2.812 3.066 3.066 0 00-.723-1.745 3.066 3.066 0 010-3.976 3.066 3.066 0 00.723-1.745 3.066 3.066 0 012.812-2.812zm7.44 5.252a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" />\r\n )}\r\n </svg>\r\n {tierLabel}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* 이메일 */}\r\n {email && (\r\n <div className=\"text-gray-600 dark:text-gray-400 text-sm mb-1 truncate\">\r\n {email}\r\n </div>\r\n )}\r\n\r\n {/* 가입일 */}\r\n {memberSince && (\r\n <div className=\"text-gray-400 text-xs flex items-center gap-1\">\r\n <Icon name=\"clock\" className=\"w-3 h-3\" />\r\n 가입일 {formatDate(memberSince)}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nProfileCard.displayName = \"ProfileCard\";\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\n\r\n/**\r\n * MembershipBadge 컴포넌트의 props / MembershipBadge component props\r\n * @typedef {Object} MembershipBadgeProps\r\n * @property {\"basic\" | \"pro\" | \"premium\" | \"admin\"} tier - 멤버십 등급 / Membership tier\r\n * @property {string} [label] - 커스텀 라벨 (기본값: 등급별 라벨) / Custom label (default: tier-specific label)\r\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 배지 크기 / Badge size\r\n * @property {boolean} [showIcon=true] - 아이콘 표시 여부 / Show icon\r\n * @extends {React.HTMLAttributes<HTMLSpanElement>}\r\n */\r\nexport interface MembershipBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\r\n tier: \"basic\" | \"pro\" | \"premium\" | \"admin\";\r\n label?: string;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n showIcon?: boolean;\r\n}\r\n\r\nconst tierConfig = {\r\n basic: {\r\n gradient: \"bg-gradient-to-r from-indigo-500 to-cyan-500\",\r\n label: \"Basic\",\r\n },\r\n pro: {\r\n gradient: \"bg-gradient-to-r from-purple-500 to-pink-500\",\r\n label: \"Pro\",\r\n },\r\n premium: {\r\n gradient: \"bg-gradient-to-r from-yellow-400 to-orange-500\",\r\n label: \"Premium\",\r\n },\r\n admin: {\r\n gradient: \"bg-gradient-to-r from-red-500 to-pink-500\",\r\n label: \"Admin\",\r\n },\r\n};\r\n\r\nconst sizeClasses = {\r\n sm: {\r\n container: \"px-2 py-0.5 text-xs\",\r\n icon: \"w-2.5 h-2.5\",\r\n },\r\n md: {\r\n container: \"px-3 py-1 text-xs\",\r\n icon: \"w-3 h-3\",\r\n },\r\n lg: {\r\n container: \"px-4 py-1.5 text-sm\",\r\n icon: \"w-4 h-4\",\r\n },\r\n};\r\n\r\n/**\r\n * MembershipBadge 컴포넌트\r\n * \r\n * 멤버십 등급을 표시하는 배지 컴포넌트입니다.\r\n * 등급별로 다른 그라디언트 색상과 아이콘을 제공합니다.\r\n * \r\n * Badge component that displays membership tier.\r\n * Provides different gradient colors and icons for each tier.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <MembershipBadge tier=\"premium\" />\r\n * \r\n * @example\r\n * // 커스텀 라벨과 크기 / Custom label and size\r\n * <MembershipBadge\r\n * tier=\"pro\"\r\n * label=\"프로 플랜\"\r\n * size=\"lg\"\r\n * showIcon={false}\r\n * />\r\n * \r\n * @param {MembershipBadgeProps} props - MembershipBadge 컴포넌트의 props / MembershipBadge component props\r\n * @param {React.Ref<HTMLSpanElement>} ref - span 요소 ref / span element ref\r\n * @returns {JSX.Element} MembershipBadge 컴포넌트 / MembershipBadge component\r\n */\r\nexport const MembershipBadge = React.forwardRef<HTMLSpanElement, MembershipBadgeProps>(\r\n (\r\n {\r\n tier,\r\n label,\r\n size = \"md\",\r\n showIcon = true,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const config = tierConfig[tier];\r\n const sizeStyle = sizeClasses[size];\r\n const displayLabel = label || config.label;\r\n\r\n const getIcon = () => {\r\n if (!showIcon) return null;\r\n\r\n if (tier === \"premium\") {\r\n return (\r\n <svg className={sizeStyle.icon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z\" />\r\n </svg>\r\n );\r\n }\r\n\r\n if (tier === \"admin\") {\r\n return (\r\n <svg className={sizeStyle.icon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path fillRule=\"evenodd\" d=\"M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z\" clipRule=\"evenodd\" />\r\n </svg>\r\n );\r\n }\r\n\r\n return (\r\n <svg className={sizeStyle.icon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path fillRule=\"evenodd\" d=\"M6.267 3.455a3.066 3.066 0 001.745-.723 3.066 3.066 0 013.976 0 3.066 3.066 0 001.745.723 3.066 3.066 0 012.812 2.812c.051.643.304 1.254.723 1.745a3.066 3.066 0 010 3.976 3.066 3.066 0 00-.723 1.745 3.066 3.066 0 01-2.812 2.812 3.066 3.066 0 00-1.745.723 3.066 3.066 0 01-3.976 0 3.066 3.066 0 00-1.745-.723 3.066 3.066 0 01-2.812-2.812 3.066 3.066 0 00-.723-1.745 3.066 3.066 0 010-3.976 3.066 3.066 0 00.723-1.745 3.066 3.066 0 012.812-2.812zm7.44 5.252a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" />\r\n </svg>\r\n );\r\n };\r\n\r\n return (\r\n <span\r\n ref={ref}\r\n className={merge(\r\n \"inline-flex items-center rounded-full font-semibold text-white shadow-lg\",\r\n config.gradient,\r\n sizeStyle.container,\r\n className\r\n )}\r\n {...props}\r\n >\r\n {showIcon && <span className=\"mr-1\">{getIcon()}</span>}\r\n {displayLabel}\r\n </span>\r\n );\r\n }\r\n);\r\n\r\nMembershipBadge.displayName = \"MembershipBadge\";\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport type { Color } from \"../../lib/types/common\";\r\n\r\n/**\r\n * MiniBarChart 컴포넌트의 props\r\n * @typedef {Object} MiniBarChartProps\r\n * @property {number[]} data - 차트 데이터 배열\r\n * @property {string[]} [labels] - 라벨 배열\r\n * @property {number} [maxValue] - 최대값 (자동 계산 시 생략)\r\n * @property {number} [height=160] - 차트 높이 (px)\r\n * @property {boolean} [showTooltip=true] - 툴팁 표시 여부\r\n * @property {boolean} [showStats=true] - 통계 정보 표시 여부\r\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color=\"blue\"] - 색상\r\n * @property {boolean} [highlightToday=true] - 오늘 항목 강조 여부\r\n * @property {number} [todayIndex] - 오늘 인덱스 (기본값: 마지막 항목)\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface MiniBarChartProps extends React.HTMLAttributes<HTMLDivElement> {\r\n data: number[];\r\n labels?: string[];\r\n maxValue?: number;\r\n height?: number;\r\n showTooltip?: boolean;\r\n showStats?: boolean;\r\n color?: Color;\r\n highlightToday?: boolean;\r\n todayIndex?: number;\r\n}\r\n\r\n// 차트 전용 색상 (막대 그래프용 그라데이션)\r\nconst chartColors: Record<Color, { default: string; highlight: string }> = {\r\n blue: {\r\n default: \"bg-gradient-to-t from-indigo-500 to-cyan-400\",\r\n highlight: \"bg-gradient-to-t from-cyan-600 to-cyan-500 shadow-lg\",\r\n },\r\n purple: {\r\n default: \"bg-gradient-to-t from-purple-500 to-purple-400\",\r\n highlight: \"bg-gradient-to-t from-purple-600 to-purple-500 shadow-lg\",\r\n },\r\n green: {\r\n default: \"bg-gradient-to-t from-green-500 to-green-400\",\r\n highlight: \"bg-gradient-to-t from-green-600 to-green-500 shadow-lg\",\r\n },\r\n orange: {\r\n default: \"bg-gradient-to-t from-orange-500 to-orange-400\",\r\n highlight: \"bg-gradient-to-t from-orange-600 to-orange-500 shadow-lg\",\r\n },\r\n red: {\r\n default: \"bg-gradient-to-t from-red-500 to-red-400\",\r\n highlight: \"bg-gradient-to-t from-red-600 to-red-500 shadow-lg\",\r\n },\r\n indigo: {\r\n default: \"bg-gradient-to-t from-indigo-500 to-indigo-400\",\r\n highlight: \"bg-gradient-to-t from-indigo-600 to-indigo-500 shadow-lg\",\r\n },\r\n pink: {\r\n default: \"bg-gradient-to-t from-pink-500 to-pink-400\",\r\n highlight: \"bg-gradient-to-t from-pink-600 to-pink-500 shadow-lg\",\r\n },\r\n gray: {\r\n default: \"bg-gradient-to-t from-gray-500 to-gray-400\",\r\n highlight: \"bg-gradient-to-t from-gray-600 to-gray-500 shadow-lg\",\r\n },\r\n cyan: {\r\n default: \"bg-gradient-to-t from-cyan-500 to-cyan-400\",\r\n highlight: \"bg-gradient-to-t from-cyan-600 to-cyan-500 shadow-lg\",\r\n },\r\n};\r\n\r\n/**\r\n * MiniBarChart 컴포넌트\r\n * \r\n * 작은 막대 그래프 차트 컴포넌트입니다.\r\n * 간단한 데이터 시각화에 적합하며, 오늘 항목 강조 기능을 제공합니다.\r\n * \r\n * Small bar chart component for simple data visualization.\r\n * Suitable for compact displays with today's item highlight feature.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <MiniBarChart\r\n * data={[10, 20, 15, 30, 25, 40, 35]}\r\n * labels={[\"월\", \"화\", \"수\", \"목\", \"금\", \"토\", \"일\"]}\r\n * />\r\n * \r\n * @example\r\n * // 커스텀 색상과 통계 / Custom color and stats\r\n * <MiniBarChart\r\n * data={dailyData}\r\n * color=\"purple\"\r\n * showStats={true}\r\n * highlightToday={true}\r\n * todayIndex={6}\r\n * />\r\n * \r\n * @param {MiniBarChartProps} props - MiniBarChart 컴포넌트의 props / MiniBarChart component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} MiniBarChart 컴포넌트 / MiniBarChart component\r\n */\r\nexport const MiniBarChart = React.forwardRef<HTMLDivElement, MiniBarChartProps>(\r\n (\r\n {\r\n data,\r\n labels,\r\n maxValue,\r\n height = 160,\r\n showTooltip = true,\r\n showStats = true,\r\n color = \"blue\",\r\n highlightToday = true,\r\n todayIndex,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const colors = chartColors[color];\r\n const calculatedMax = maxValue || Math.max(...data, 1);\r\n const fixedMax = Math.max(calculatedMax, 10);\r\n const todayIdx = todayIndex !== undefined ? todayIndex : data.length - 1;\r\n\r\n const calculateHeight = (value: number): number => {\r\n if (fixedMax === 0) return 8;\r\n return Math.max((value / fixedMax) * height, 8);\r\n };\r\n\r\n const total = data.reduce((sum, val) => sum + val, 0);\r\n const average = data.length > 0 ? Math.round(total / data.length) : 0;\r\n const max = Math.max(...data);\r\n\r\n const _chartId = React.useId();\r\n const chartLabel = labels && labels.length > 0\r\n ? `미니 막대 그래프 - ${labels.length}개 항목, 최대값 ${max.toLocaleString()}, 평균 ${average.toLocaleString()}`\r\n : `미니 막대 그래프 - ${data.length}개 항목, 최대값 ${max.toLocaleString()}, 평균 ${average.toLocaleString()}`;\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n role=\"img\"\r\n aria-label={chartLabel}\r\n className={merge(\"w-full\", className)}\r\n {...props}\r\n >\r\n {/* 그래프 영역 */}\r\n <div\r\n className=\"flex items-end justify-between gap-2 px-2 relative\"\r\n style={{ height: `${height + 40}px` }}\r\n >\r\n {/* 기준선 */}\r\n <div className=\"absolute inset-x-2 bottom-8 border-t border-gray-200 dark:border-gray-700 opacity-50\"></div>\r\n\r\n {data.map((value, index) => {\r\n const isToday = highlightToday && index === todayIdx;\r\n const barHeight = calculateHeight(value);\r\n const barColor = isToday ? colors.highlight : colors.default;\r\n\r\n return (\r\n <div\r\n key={index}\r\n className=\"flex flex-col items-center flex-1 group relative\"\r\n >\r\n {/* 툴팁 */}\r\n {showTooltip && (\r\n <div className=\"absolute bottom-full left-1/2 transform -translate-x-1/2 mb-2 px-2 py-1 bg-gray-900 dark:bg-gray-700 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none whitespace-nowrap z-10\">\r\n {value}개\r\n <div className=\"absolute top-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-l-4 border-r-4 border-t-4 border-transparent border-t-gray-900 dark:border-t-gray-700\"></div>\r\n </div>\r\n )}\r\n\r\n {/* 값 표시 (호버 시) */}\r\n <div className=\"text-xs font-medium text-gray-700 dark:text-gray-300 mb-1 opacity-0 group-hover:opacity-100 transition-opacity duration-200\">\r\n {value}\r\n </div>\r\n\r\n {/* 막대 */}\r\n <div className=\"relative w-full flex-1 flex items-end\">\r\n <div\r\n className={merge(\r\n \"w-full rounded-t-lg transition-all duration-500 ease-out group-hover:scale-105\",\r\n barColor\r\n )}\r\n style={{\r\n height: `${barHeight}px`,\r\n minHeight: \"8px\",\r\n }}\r\n >\r\n {/* 막대 위 점 */}\r\n {value > 0 && (\r\n <div className=\"absolute -top-1 left-1/2 transform -translate-x-1/2 w-2 h-2 bg-white dark:bg-gray-800 rounded-full shadow-sm\"></div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* 라벨 */}\r\n {labels && labels[index] && (\r\n <div\r\n className={merge(\r\n \"text-xs font-medium mt-2 transition-colors duration-200\",\r\n isToday\r\n ? \"text-purple-600 dark:text-purple-400\"\r\n : \"text-gray-500 dark:text-gray-400\"\r\n )}\r\n >\r\n {labels[index]}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* 통계 정보 */}\r\n {showStats && (\r\n <div className=\"mt-4 flex justify-between items-center text-xs text-gray-500 dark:text-gray-400 px-2\">\r\n <div>\r\n 총: {total}\r\n </div>\r\n <div>\r\n 평균: {average}\r\n </div>\r\n <div>\r\n 최고: {max}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nMiniBarChart.displayName = \"MiniBarChart\";\r\n\r\n","\"use client\";\r\n\r\nimport React, { useMemo } from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport { Icon } from \"../Icon\";\r\nimport type { IconName } from \"../../lib/icons\";\r\nimport { useColorStyles } from \"../../lib/styles/colors\";\r\nimport type { Color } from \"../../lib/types/common\";\r\n\r\n/**\r\n * SummaryCard 컴포넌트의 props\r\n * @typedef {Object} SummaryCardProps\r\n * @property {string} title - 카드 제목\r\n * @property {string | number} value - 요약 값\r\n * @property {string} [subtitle] - 부제목\r\n * @property {IconName | React.ReactNode} [icon] - 아이콘\r\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color] - 카드 색상\r\n * @property {\"default\" | \"gradient\" | \"outline\"} [variant=\"default\"] - 카드 스타일 변형\r\n * @property {string} [href] - 링크 URL\r\n * @property {() => void} [onClick] - 클릭 핸들러\r\n * @property {boolean} [loading] - 로딩 상태\r\n * @property {string | React.ReactNode} [badge] - 배지\r\n * @property {React.ReactNode} [footer] - 푸터 콘텐츠\r\n * @property {boolean} [showAction] - 액션 버튼 표시 여부\r\n * @property {string} [actionLabel] - 액션 버튼 라벨\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface SummaryCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n title: string;\r\n value: string | number;\r\n subtitle?: string;\r\n icon?: IconName | React.ReactNode;\r\n color?: Color;\r\n variant?: \"default\" | \"gradient\" | \"outline\";\r\n href?: string;\r\n onClick?: () => void;\r\n loading?: boolean;\r\n badge?: string | React.ReactNode;\r\n footer?: React.ReactNode;\r\n showAction?: boolean;\r\n actionLabel?: string;\r\n}\r\n\r\n// SummaryCard는 default variant가 특별한 그라데이션을 사용하므로 별도 처리\r\nconst defaultVariantGradients: Record<Color, string> = {\r\n blue: \"bg-gradient-to-br from-indigo-50 to-indigo-100 dark:from-indigo-900/20 dark:to-indigo-900/20\",\r\n purple: \"bg-gradient-to-br from-purple-50 to-pink-100 dark:from-purple-900/20 dark:to-pink-900/20\",\r\n green: \"bg-gradient-to-br from-green-50 to-emerald-100 dark:from-green-900/20 dark:to-emerald-900/20\",\r\n orange: \"bg-gradient-to-br from-orange-50 to-amber-100 dark:from-orange-900/20 dark:to-amber-900/20\",\r\n red: \"bg-gradient-to-br from-red-50 to-rose-100 dark:from-red-900/20 dark:to-rose-900/20\",\r\n indigo: \"bg-gradient-to-br from-indigo-50 to-indigo-100 dark:from-indigo-900/20 dark:to-indigo-900/20\",\r\n pink: \"bg-gradient-to-br from-pink-50 to-rose-100 dark:from-pink-900/20 dark:to-rose-900/20\",\r\n gray: \"bg-gradient-to-br from-gray-50 to-gray-100 dark:from-gray-900/20 dark:to-gray-800/20\",\r\n cyan: \"bg-gradient-to-br from-cyan-50 to-cyan-100 dark:from-cyan-900/20 dark:to-cyan-900/20\",\r\n};\r\n\r\nconst buttonGradients: Record<Color, string> = {\r\n blue: \"bg-gradient-to-r from-cyan-600 to-indigo-600 hover:from-cyan-700 hover:to-indigo-700\",\r\n purple: \"bg-gradient-to-r from-purple-600 to-pink-600 hover:from-purple-700 hover:to-pink-700\",\r\n green: \"bg-gradient-to-r from-green-600 to-emerald-600 hover:from-green-700 hover:to-emerald-700\",\r\n orange: \"bg-gradient-to-r from-orange-600 to-amber-600 hover:from-orange-700 hover:to-amber-700\",\r\n red: \"bg-gradient-to-r from-red-600 to-rose-600 hover:from-red-700 hover:to-rose-700\",\r\n indigo: \"bg-gradient-to-r from-indigo-600 to-cyan-600 hover:from-indigo-700 hover:to-cyan-700\",\r\n pink: \"bg-gradient-to-r from-pink-600 to-rose-600 hover:from-pink-700 hover:to-rose-700\",\r\n gray: \"bg-gradient-to-r from-gray-600 to-gray-700 hover:from-gray-700 hover:to-gray-800\",\r\n cyan: \"bg-gradient-to-r from-cyan-600 to-teal-600 hover:from-cyan-700 hover:to-teal-700\",\r\n};\r\n\r\n/**\r\n * SummaryCard 컴포넌트 / SummaryCard component\r\n * \r\n * 요약 정보를 표시하는 카드 컴포넌트입니다.\r\n * 제목, 값, 부제목, 아이콘을 포함하며, 클릭 가능한 링크나 액션 버튼을 지원합니다.\r\n * \r\n * Card component that displays summary information.\r\n * Includes title, value, subtitle, icon, and supports clickable links or action buttons.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <SummaryCard\r\n * title=\"총 매출\"\r\n * value=\"₩10,000,000\"\r\n * subtitle=\"이번 달\"\r\n * icon=\"dollarSign\"\r\n * />\r\n * \r\n * @example\r\n * // 클릭 가능한 카드 / Clickable card\r\n * <SummaryCard\r\n * title=\"주문\"\r\n * value=\"1,234\"\r\n * href=\"/orders\"\r\n * showAction\r\n * actionLabel=\"자세히 보기\"\r\n * color=\"blue\"\r\n * variant=\"gradient\"\r\n * />\r\n * \r\n * @param {SummaryCardProps} props - SummaryCard 컴포넌트의 props / SummaryCard component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} SummaryCard 컴포넌트 / SummaryCard component\r\n */\r\nexport const SummaryCard = React.forwardRef<HTMLDivElement, SummaryCardProps>(\r\n (\r\n {\r\n title,\r\n value,\r\n subtitle,\r\n icon,\r\n color = \"blue\",\r\n variant = \"default\",\r\n href,\r\n onClick,\r\n loading = false,\r\n badge,\r\n footer,\r\n showAction = true,\r\n actionLabel = \"자세히 보기\",\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n // 공통 색상 시스템 사용\r\n const colorStyles = useColorStyles(color);\r\n const isGradient = variant === \"gradient\";\r\n const isTextWhite = isGradient;\r\n\r\n // Variant 스타일 생성 (default는 특별한 그라데이션 사용)\r\n const variantClass = useMemo(() => {\r\n if (variant === \"default\") {\r\n return `rounded-xl shadow-lg ${defaultVariantGradients[color]}`;\r\n } else if (variant === \"gradient\") {\r\n return `rounded-xl shadow-xl text-white ${colorStyles.gradient}`;\r\n } else {\r\n return `rounded-xl ${colorStyles.outline}`;\r\n }\r\n }, [variant, colorStyles, color]);\r\n\r\n const formatValue = (val: string | number): string => {\r\n if (typeof val === \"number\") {\r\n return val.toLocaleString();\r\n }\r\n return val;\r\n };\r\n\r\n const content = (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"p-6 flex flex-col min-h-[220px] relative overflow-hidden group hover:shadow-xl transition-all duration-300\",\r\n variantClass,\r\n className\r\n )}\r\n {...props}\r\n >\r\n {/* 배경 장식 */}\r\n {/* 배경 장식 - 정적 클래스 사용 */}\r\n <div className={merge(\r\n \"absolute top-0 right-0 w-32 h-32 bg-gradient-to-bl to-transparent rounded-full -translate-y-16 translate-x-16\",\r\n color === \"blue\" ? \"from-cyan-400/10\" :\r\n color === \"purple\" ? \"from-purple-400/10\" :\r\n color === \"green\" ? \"from-green-400/10\" :\r\n color === \"orange\" ? \"from-orange-400/10\" :\r\n color === \"red\" ? \"from-red-400/10\" :\r\n color === \"indigo\" ? \"from-indigo-400/10\" :\r\n color === \"pink\" ? \"from-pink-400/10\" :\r\n \"from-gray-400/10\"\r\n )}></div>\r\n <div className={merge(\r\n \"absolute bottom-0 left-0 w-24 h-24 bg-gradient-to-tr to-transparent rounded-full translate-y-12 -translate-x-12\",\r\n color === \"blue\" ? \"from-cyan-400/10\" :\r\n color === \"purple\" ? \"from-purple-400/10\" :\r\n color === \"green\" ? \"from-green-400/10\" :\r\n color === \"orange\" ? \"from-orange-400/10\" :\r\n color === \"red\" ? \"from-red-400/10\" :\r\n color === \"indigo\" ? \"from-indigo-400/10\" :\r\n color === \"pink\" ? \"from-pink-400/10\" :\r\n \"from-gray-400/10\"\r\n )}></div>\r\n\r\n {/* 헤더 */}\r\n <div className=\"flex items-center justify-between mb-4 relative z-10\">\r\n <div className=\"flex items-center\">\r\n {icon && (\r\n <div className={merge(\r\n \"p-2 rounded-lg\",\r\n isGradient ? \"bg-white/20\" : colorStyles.icon\r\n )}>\r\n {typeof icon === \"string\" ? (\r\n <Icon\r\n name={icon as IconName}\r\n className={merge(\r\n \"w-6 h-6\",\r\n isTextWhite ? \"text-white\" : \"\"\r\n )}\r\n />\r\n ) : (\r\n icon\r\n )}\r\n </div>\r\n )}\r\n <span className={merge(\r\n \"text-lg font-semibold ml-3\",\r\n isTextWhite ? \"text-white\" : \"text-gray-900 dark:text-white\"\r\n )}>\r\n {title}\r\n </span>\r\n </div>\r\n {badge && (\r\n <div className=\"text-xs font-medium\">\r\n {typeof badge === \"string\" ? (\r\n <span className={merge(\r\n \"px-2 py-1 rounded-full\",\r\n isGradient ? \"bg-white/20 text-white\" : \"bg-white/50 dark:bg-gray-800/50 text-gray-700 dark:text-gray-300\"\r\n )}>\r\n {badge}\r\n </span>\r\n ) : (\r\n badge\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* 값 */}\r\n <div className=\"flex-1 flex flex-col justify-center relative z-10\">\r\n {loading ? (\r\n <div className=\"h-10 bg-gray-200 dark:bg-gray-700 rounded animate-pulse mb-2\" />\r\n ) : (\r\n <>\r\n <div className={merge(\r\n \"text-3xl font-bold mb-2\",\r\n isTextWhite ? \"text-white\" : \"text-gray-900 dark:text-white\"\r\n )}>\r\n {formatValue(value)}\r\n </div>\r\n {subtitle && (\r\n <div className={merge(\r\n \"text-sm mb-4\",\r\n isTextWhite ? \"text-white/90\" : \"text-gray-600 dark:text-gray-400\"\r\n )}>\r\n {subtitle}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* 푸터 */}\r\n {footer && (\r\n <div className=\"relative z-10 mb-4\">\r\n {footer}\r\n </div>\r\n )}\r\n\r\n {/* 액션 버튼 */}\r\n {showAction && (href || onClick) && (\r\n <div className=\"relative z-10\">\r\n {href ? (\r\n <a\r\n href={href}\r\n className={merge(\r\n \"block w-full text-center py-3 rounded-lg font-semibold text-white hover:shadow-lg transition-all duration-200 group-hover:scale-[1.02]\",\r\n buttonGradients[color]\r\n )}\r\n >\r\n {actionLabel}\r\n </a>\r\n ) : (\r\n <button\r\n onClick={onClick}\r\n className={merge(\r\n \"block w-full text-center py-3 rounded-lg font-semibold text-white hover:shadow-lg transition-all duration-200 group-hover:scale-[1.02]\",\r\n buttonGradients[color]\r\n )}\r\n >\r\n {actionLabel}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n return content;\r\n }\r\n);\r\n\r\nSummaryCard.displayName = \"SummaryCard\";\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge, formatRelativeTime } from \"../../lib/utils\";\r\nimport { Icon } from \"../Icon\";\r\nimport type { IconName } from \"../../lib/icons\";\r\n\r\n/**\r\n * NotificationItem 인터페이스\r\n * @typedef {Object} NotificationItem\r\n * @property {string} id - 알림 고유 ID\r\n * @property {string} title - 알림 제목\r\n * @property {string} message - 알림 메시지\r\n * @property {Date | string} timestamp - 알림 타임스탬프\r\n * @property {\"info\" | \"warning\" | \"error\" | \"success\"} [type] - 알림 타입\r\n * @property {IconName | React.ReactNode} [icon] - 아이콘\r\n * @property {() => void} [onClick] - 클릭 핸들러\r\n * @property {string} [href] - 링크 URL\r\n */\r\nexport interface NotificationItem {\r\n id: string;\r\n title: string;\r\n message: string;\r\n timestamp: Date | string;\r\n type?: \"info\" | \"warning\" | \"error\" | \"success\";\r\n icon?: IconName | React.ReactNode;\r\n onClick?: () => void;\r\n href?: string;\r\n}\r\n\r\n/**\r\n * NotificationCard 컴포넌트의 props / NotificationCard component props\r\n * @typedef {Object} NotificationCardProps\r\n * @property {string} [title=\"알림 및 공지\"] - 카드 제목 / Card title\r\n * @property {NotificationItem[]} items - 알림 항목 배열 / Notification items array\r\n * @property {string} [emptyMessage=\"알림이 없습니다.\"] - 빈 상태 메시지 / Empty state message\r\n * @property {number} [maxItems] - 최대 표시 항목 수 / Maximum items to display\r\n * @property {() => void} [onViewAll] - 전체 보기 핸들러 / View all handler\r\n * @property {string} [viewAllLabel=\"모든 알림 보기\"] - 전체 보기 라벨 / View all label\r\n * @property {boolean} [showHeader=true] - 헤더 표시 여부 / Show header\r\n * @property {boolean} [showCount=true] - 개수 표시 여부 / Show count\r\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface NotificationCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n title?: string;\r\n items: NotificationItem[];\r\n emptyMessage?: string;\r\n maxItems?: number;\r\n onViewAll?: () => void;\r\n viewAllLabel?: string;\r\n showHeader?: boolean;\r\n showCount?: boolean;\r\n emptyState?: React.ReactNode;\r\n}\r\n\r\nconst typeStyles = {\r\n info: {\r\n container: \"bg-gradient-to-r from-indigo-50 to-indigo-50 dark:from-indigo-900/20 dark:to-indigo-900/20\",\r\n border: \"border-indigo-200/50 dark:border-indigo-700/30\",\r\n dot: \"bg-primary\",\r\n },\r\n warning: {\r\n container: \"bg-gradient-to-r from-orange-50 to-red-50 dark:from-orange-900/20 dark:to-red-900/20\",\r\n border: \"border-orange-200/50 dark:border-orange-700/30\",\r\n dot: \"bg-red-500\",\r\n },\r\n error: {\r\n container: \"bg-gradient-to-r from-red-50 to-rose-50 dark:from-red-900/20 dark:to-rose-900/20\",\r\n border: \"border-red-200/50 dark:border-red-700/30\",\r\n dot: \"bg-red-600\",\r\n },\r\n success: {\r\n container: \"bg-gradient-to-r from-green-50 to-emerald-50 dark:from-green-900/20 dark:to-emerald-900/20\",\r\n border: \"border-green-200/50 dark:border-green-700/30\",\r\n dot: \"bg-green-500\",\r\n },\r\n};\r\n\r\nconst defaultTypeStyles = {\r\n container: \"bg-gradient-to-r from-gray-50 to-gray-100 dark:from-gray-900/20 dark:to-gray-800/20\",\r\n border: \"border-gray-200/50 dark:border-gray-700/30\",\r\n dot: \"bg-gray-500\",\r\n};\r\n\r\n/**\r\n * NotificationCard 컴포넌트 / NotificationCard component\r\n * \r\n * 알림 목록을 표시하는 카드 컴포넌트입니다.\r\n * 여러 알림 항목을 표시하며, 타입별로 다른 스타일을 적용할 수 있습니다.\r\n * \r\n * Card component that displays a list of notifications.\r\n * Shows multiple notification items and can apply different styles by type.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <NotificationCard\r\n * items={[\r\n * {\r\n * id: \"1\",\r\n * title: \"새 주문\",\r\n * message: \"주문 #1234가 생성되었습니다\",\r\n * timestamp: new Date(),\r\n * type: \"success\"\r\n * }\r\n * ]}\r\n * />\r\n * \r\n * @example\r\n * // 최대 항목 수 제한 / Maximum items limit\r\n * <NotificationCard\r\n * title=\"최근 알림\"\r\n * items={notifications}\r\n * maxItems={5}\r\n * onViewAll={() => navigate(\"/notifications\")}\r\n * showCount\r\n * />\r\n * \r\n * @param {NotificationCardProps} props - NotificationCard 컴포넌트의 props / NotificationCard component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} NotificationCard 컴포넌트 / NotificationCard component\r\n */\r\nexport const NotificationCard = React.forwardRef<HTMLDivElement, NotificationCardProps>(\r\n (\r\n {\r\n title = \"알림 및 공지\",\r\n items,\r\n emptyMessage = \"알림이 없습니다.\",\r\n maxItems,\r\n onViewAll,\r\n viewAllLabel = \"모든 알림 보기\",\r\n showHeader = true,\r\n showCount = true,\r\n emptyState,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const displayItems = maxItems ? items.slice(0, maxItems) : items;\r\n const hasMore = maxItems && items.length > maxItems;\r\n\r\n\r\n const getTypeStyles = (type?: NotificationItem[\"type\"]) => {\r\n if (!type) return defaultTypeStyles;\r\n return typeStyles[type];\r\n };\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"bg-white dark:bg-gray-800 rounded-xl shadow p-6\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {/* 헤더 */}\r\n {showHeader && (\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <div className=\"flex items-center\">\r\n <div className=\"p-2 bg-orange-500/10 rounded-lg mr-3\">\r\n <Icon name=\"bell\" className=\"w-6 h-6 text-orange-600 dark:text-orange-400\" />\r\n </div>\r\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\r\n {title}\r\n </h3>\r\n </div>\r\n {showCount && items.length > 0 && (\r\n <span className=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300\">\r\n {items.length}개\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 알림 목록 */}\r\n {displayItems.length > 0 ? (\r\n <div className=\"space-y-3\">\r\n {displayItems.map((item) => {\r\n const typeStyle = getTypeStyles(item.type);\r\n const content = (\r\n <div\r\n className={merge(\r\n \"p-3 rounded-lg border\",\r\n typeStyle.container,\r\n typeStyle.border,\r\n (item.onClick || item.href) && \"cursor-pointer hover:shadow-md transition-all duration-200\"\r\n )}\r\n >\r\n <div className=\"flex items-start\">\r\n <div className={merge(\r\n \"w-2 h-2 rounded-full mt-2 mr-3 flex-shrink-0\",\r\n typeStyle.dot\r\n )}></div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center justify-between mb-1\">\r\n <span className=\"text-sm font-semibold text-gray-900 dark:text-white\">\r\n {item.title}\r\n </span>\r\n <time \r\n dateTime={item.timestamp instanceof Date ? item.timestamp.toISOString() : typeof item.timestamp === 'string' ? item.timestamp : undefined}\r\n className=\"text-xs text-gray-500 dark:text-gray-400 ml-2 flex-shrink-0\"\r\n >\r\n {formatRelativeTime(item.timestamp)}\r\n </time>\r\n </div>\r\n <p className=\"text-xs text-gray-600 dark:text-gray-400\">\r\n {item.message}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n if (item.href) {\r\n return (\r\n <a key={item.id} href={item.href}>\r\n {content}\r\n </a>\r\n );\r\n }\r\n\r\n if (item.onClick) {\r\n return (\r\n <div key={item.id} onClick={item.onClick}>\r\n {content}\r\n </div>\r\n );\r\n }\r\n\r\n return <div key={item.id}>{content}</div>;\r\n })}\r\n </div>\r\n ) : emptyState ? (\r\n emptyState\r\n ) : (\r\n <div className=\"text-center py-8\">\r\n <Icon name=\"bell\" className=\"w-12 h-12 text-gray-400 dark:text-gray-500 mx-auto mb-3\" />\r\n <p className=\"text-gray-500 dark:text-gray-400 text-sm\">{emptyMessage}</p>\r\n </div>\r\n )}\r\n\r\n {/* 더 보기 */}\r\n {hasMore && onViewAll && (\r\n <div className=\"mt-4 text-center\">\r\n <button\r\n onClick={onViewAll}\r\n className=\"text-sm text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 font-medium transition-colors\"\r\n >\r\n {viewAllLabel} ({items.length - (maxItems || 0)}개 더)\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nNotificationCard.displayName = \"NotificationCard\";\r\n\r\n","\"use client\";\r\n\r\nimport React, { useMemo } from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport { Icon } from \"../Icon\";\r\nimport type { IconName } from \"../../lib/icons\";\r\nimport { MiniBarChart } from \"./MiniBarChart\";\r\nimport { useColorStyles } from \"../../lib/styles/colors\";\r\nimport { createVariantStyles } from \"../../lib/styles/variants\";\r\nimport type { Color } from \"../../lib/types/common\";\r\n\r\n/**\r\n * MetricCard 컴포넌트의 props / MetricCard component props\r\n * @typedef {Object} MetricCardProps\r\n * @property {string} title - 카드 제목 / Card title\r\n * @property {string | number} value - 메트릭 값 / Metric value\r\n * @property {string} [description] - 카드 설명 / Card description\r\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\r\n * @property {Object} [trend] - 추세 정보 / Trend information\r\n * @property {number} trend.value - 추세 값 / Trend value\r\n * @property {string} trend.label - 추세 라벨 / Trend label\r\n * @property {boolean} [trend.positive] - 긍정적 추세 여부 / Positive trend\r\n * @property {number[]} [chartData] - 차트 데이터 / Chart data\r\n * @property {string[]} [chartLabels] - 차트 라벨 / Chart labels\r\n * @property {\"default\" | \"gradient\" | \"outline\" | \"elevated\"} [variant=\"default\"] - 카드 스타일 변형 / Card style variant\r\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color] - 카드 색상 / Card color\r\n * @property {boolean} [loading] - 로딩 상태 / Loading state\r\n * @property {boolean} [showChart] - 차트 표시 여부 / Show chart\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface MetricCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n title: string;\r\n value: string | number;\r\n description?: string;\r\n icon?: IconName | React.ReactNode;\r\n trend?: {\r\n value: number;\r\n label: string;\r\n positive?: boolean;\r\n };\r\n chartData?: number[];\r\n chartLabels?: string[];\r\n variant?: \"default\" | \"gradient\" | \"outline\" | \"elevated\";\r\n color?: Color;\r\n loading?: boolean;\r\n showChart?: boolean;\r\n}\r\n\r\n\r\n/**\r\n * MetricCard 컴포넌트 / MetricCard component\r\n * \r\n * 메트릭 정보를 표시하는 카드 컴포넌트입니다.\r\n * StatCard와 유사하지만 차트 데이터를 포함할 수 있습니다.\r\n * \r\n * Card component that displays metric information.\r\n * Similar to StatCard but can include chart data.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <MetricCard\r\n * title=\"페이지뷰\"\r\n * value=\"10,234\"\r\n * description=\"오늘\"\r\n * icon=\"eye\"\r\n * />\r\n * \r\n * @example\r\n * // 차트 포함 / With chart\r\n * <MetricCard\r\n * title=\"방문자\"\r\n * value=\"5,678\"\r\n * chartData={[100, 200, 150, 300, 250]}\r\n * chartLabels={[\"월\", \"화\", \"수\", \"목\", \"금\"]}\r\n * showChart\r\n * color=\"blue\"\r\n * />\r\n * \r\n * @param {MetricCardProps} props - MetricCard 컴포넌트의 props / MetricCard component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} MetricCard 컴포넌트 / MetricCard component\r\n */\r\nexport const MetricCard = React.forwardRef<HTMLDivElement, MetricCardProps>(\r\n (\r\n {\r\n title,\r\n value,\r\n description,\r\n icon,\r\n trend,\r\n chartData,\r\n chartLabels,\r\n variant = \"elevated\",\r\n color = \"blue\",\r\n loading = false,\r\n showChart = false,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n // 공통 색상 시스템 사용\r\n const colorStyles = useColorStyles(color);\r\n const isGradient = variant === \"gradient\";\r\n const isTextWhite = isGradient;\r\n\r\n // Variant 스타일 생성 (elevated는 rounded-3xl로 커스터마이징)\r\n const variantClass = useMemo(() => {\r\n const baseClass = createVariantStyles(variant, colorStyles);\r\n // elevated variant는 rounded-3xl 사용\r\n if (variant === \"elevated\") {\r\n return baseClass.replace(\"rounded-2xl\", \"rounded-3xl\");\r\n }\r\n return baseClass;\r\n }, [variant, colorStyles]);\r\n\r\n const formatValue = (val: string | number): string => {\r\n if (typeof val === \"number\") {\r\n return val.toLocaleString();\r\n }\r\n return val;\r\n };\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"p-6 transition-all duration-200 hover:shadow-xl\",\r\n variantClass,\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div className=\"flex items-start justify-between mb-4\">\r\n {/* 아이콘 */}\r\n {icon && (\r\n <div className={merge(\r\n \"w-12 h-12 rounded-lg flex items-center justify-center flex-shrink-0\",\r\n isGradient ? \"bg-white/20\" : colorStyles.icon\r\n )}>\r\n {typeof icon === \"string\" ? (\r\n <Icon\r\n name={icon as IconName}\r\n className={merge(\r\n \"w-6 h-6\",\r\n isTextWhite ? \"text-white\" : \"\"\r\n )}\r\n />\r\n ) : (\r\n icon\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 배지 */}\r\n {title && (\r\n <span className={merge(\r\n \"text-sm px-3 py-1 rounded-full font-medium\",\r\n isGradient ? \"bg-white/20 text-white\" : colorStyles.badge\r\n )}>\r\n {title}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* 값 */}\r\n {loading ? (\r\n <div className=\"h-10 bg-gray-200 dark:bg-gray-700 rounded animate-pulse mb-2\" />\r\n ) : (\r\n <h3 className={merge(\r\n \"text-3xl font-bold mb-1\",\r\n isTextWhite ? \"text-white\" : \"text-gray-800 dark:text-white\"\r\n )}>\r\n {formatValue(value)}\r\n </h3>\r\n )}\r\n\r\n {/* 설명 */}\r\n {description && (\r\n <p className={merge(\r\n \"text-sm mb-3\",\r\n isTextWhite ? \"text-white/90\" : \"text-gray-600 dark:text-gray-300\"\r\n )}>\r\n {description}\r\n </p>\r\n )}\r\n\r\n {/* 차트 */}\r\n {showChart && chartData && chartData.length > 0 && (\r\n <div className=\"mt-4 mb-3\">\r\n <MiniBarChart\r\n data={chartData}\r\n labels={chartLabels}\r\n color={color}\r\n height={100}\r\n showStats={false}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* 트렌드 */}\r\n {trend && !loading && (\r\n <div className=\"mt-3 flex items-center gap-1\">\r\n <span\r\n className={merge(\r\n \"text-xs font-medium\",\r\n trend.positive !== false\r\n ? \"text-green-600 dark:text-green-400\"\r\n : \"text-red-600 dark:text-red-400\"\r\n )}\r\n >\r\n {trend.positive !== false ? \"↑\" : \"↓\"} {Math.abs(trend.value)}%\r\n </span>\r\n <span className={merge(\r\n \"text-xs\",\r\n isTextWhite ? \"text-white/70\" : \"text-gray-500 dark:text-gray-400\"\r\n )}>\r\n {trend.label}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nMetricCard.displayName = \"MetricCard\";\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport { Icon } from \"../Icon\";\r\nimport type { IconName } from \"../../lib/icons\";\r\nimport { useColorStyles } from \"../../lib/styles/colors\";\r\nimport type { Color } from \"../../lib/types/common\";\r\n\r\n/**\r\n * ProgressCard 컴포넌트의 props / ProgressCard component props\r\n * @typedef {Object} ProgressCardProps\r\n * @property {string} title - 카드 제목 / Card title\r\n * @property {number} current - 현재 값 / Current value\r\n * @property {number} total - 전체 값 / Total value\r\n * @property {string} [unit] - 단위 / Unit\r\n * @property {string} [description] - 카드 설명 / Card description\r\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\r\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color] - 카드 색상 / Card color\r\n * @property {\"default\" | \"gradient\" | \"outline\" | \"elevated\"} [variant=\"default\"] - 카드 스타일 변형 / Card style variant\r\n * @property {boolean} [showPercentage] - 퍼센트 표시 여부 / Show percentage\r\n * @property {boolean} [showLabel] - 라벨 표시 여부 / Show label\r\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 카드 크기 / Card size\r\n * @property {boolean} [loading] - 로딩 상태 / Loading state\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface ProgressCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n title: string;\r\n current: number;\r\n total: number;\r\n unit?: string;\r\n description?: string;\r\n icon?: IconName | React.ReactNode;\r\n color?: Color;\r\n variant?: \"default\" | \"gradient\" | \"outline\" | \"elevated\";\r\n showPercentage?: boolean;\r\n showLabel?: boolean;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n loading?: boolean;\r\n}\r\n\r\n// Progress bar 색상은 별도 처리\r\nconst progressColors: Record<Color, string> = {\r\n blue: \"bg-indigo-500\",\r\n purple: \"bg-purple-500\",\r\n green: \"bg-green-500\",\r\n orange: \"bg-orange-500\",\r\n red: \"bg-red-500\",\r\n indigo: \"bg-indigo-500\",\r\n pink: \"bg-pink-500\",\r\n gray: \"bg-gray-500\",\r\n cyan: \"bg-cyan-500\",\r\n};\r\n\r\nconst sizeStyles = {\r\n sm: {\r\n container: \"p-4\",\r\n icon: \"w-8 h-8\",\r\n iconSize: \"w-4 h-4\",\r\n title: \"text-sm\",\r\n value: \"text-xl\",\r\n progress: \"h-1.5\",\r\n },\r\n md: {\r\n container: \"p-6\",\r\n icon: \"w-12 h-12\",\r\n iconSize: \"w-6 h-6\",\r\n title: \"text-base\",\r\n value: \"text-2xl\",\r\n progress: \"h-2\",\r\n },\r\n lg: {\r\n container: \"p-8\",\r\n icon: \"w-16 h-16\",\r\n iconSize: \"w-8 h-8\",\r\n title: \"text-lg\",\r\n value: \"text-3xl\",\r\n progress: \"h-3\",\r\n },\r\n};\r\n\r\n/**\r\n * ProgressCard 컴포넌트 / ProgressCard component\r\n * \r\n * 진행률을 표시하는 카드 컴포넌트입니다.\r\n * 현재 값과 전체 값을 비교하여 진행률을 시각적으로 표시합니다.\r\n * \r\n * Card component that displays progress.\r\n * Compares current value with total value to visually display progress.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <ProgressCard\r\n * title=\"목표 달성률\"\r\n * current={75}\r\n * total={100}\r\n * unit=\"%\"\r\n * description=\"이번 달 목표\"\r\n * />\r\n * \r\n * @example\r\n * // 퍼센트 표시 / Show percentage\r\n * <ProgressCard\r\n * title=\"판매 진행률\"\r\n * current={150}\r\n * total={200}\r\n * showPercentage\r\n * color=\"green\"\r\n * variant=\"gradient\"\r\n * />\r\n * \r\n * @param {ProgressCardProps} props - ProgressCard 컴포넌트의 props / ProgressCard component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} ProgressCard 컴포넌트 / ProgressCard component\r\n */\r\nexport const ProgressCard = React.forwardRef<HTMLDivElement, ProgressCardProps>(\r\n (\r\n {\r\n title,\r\n current,\r\n total,\r\n unit = \"\",\r\n description,\r\n icon,\r\n color = \"blue\",\r\n variant = \"elevated\",\r\n showPercentage = true,\r\n showLabel = true,\r\n size = \"md\",\r\n loading = false,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const colorStyles = useColorStyles(color);\r\n const sizes = sizeStyles[size];\r\n const percentage = total > 0 ? Math.min(Math.max((current / total) * 100, 0), 100) : 0;\r\n const isGradient = variant === \"gradient\";\r\n\r\n const variantClasses = {\r\n default: `rounded-2xl border ${colorStyles.default}`,\r\n gradient: `rounded-2xl border text-white ${colorStyles.gradient}`,\r\n outline: `rounded-2xl border-2 ${colorStyles.outline}`,\r\n elevated: `rounded-3xl border ${colorStyles.elevated}`,\r\n };\r\n\r\n const variantClass = variantClasses[variant];\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"transition-all duration-200 hover:shadow-xl\",\r\n variantClass,\r\n sizes.container,\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div className=\"flex items-start justify-between mb-4\">\r\n {/* 아이콘 */}\r\n {icon && (\r\n <div\r\n className={merge(\r\n \"rounded-lg flex items-center justify-center flex-shrink-0\",\r\n sizes.icon,\r\n isGradient ? \"bg-white/20\" : colorStyles.icon\r\n )}\r\n >\r\n {typeof icon === \"string\" ? (\r\n <Icon\r\n name={icon as IconName}\r\n className={merge(\r\n sizes.iconSize,\r\n isGradient ? \"text-white\" : \"\"\r\n )}\r\n />\r\n ) : (\r\n icon\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 제목 */}\r\n <div className=\"flex-1 ml-4\">\r\n <h3\r\n className={merge(\r\n \"font-semibold mb-1\",\r\n sizes.title,\r\n isGradient ? \"text-white\" : \"text-gray-800 dark:text-white\"\r\n )}\r\n >\r\n {title}\r\n </h3>\r\n {description && (\r\n <p\r\n className={merge(\r\n \"text-sm\",\r\n isGradient ? \"text-white/90\" : \"text-gray-600 dark:text-gray-400\"\r\n )}\r\n >\r\n {description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* 진행률 표시 */}\r\n {loading ? (\r\n <div className=\"space-y-2\">\r\n <div className=\"h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse\" />\r\n <div className=\"h-2 bg-gray-200 dark:bg-gray-700 rounded animate-pulse\" />\r\n </div>\r\n ) : (\r\n <>\r\n {/* 값 표시 */}\r\n <div className=\"flex items-baseline justify-between mb-2\">\r\n <span\r\n className={merge(\r\n \"font-bold\",\r\n sizes.value,\r\n isGradient ? \"text-white\" : `text-${color}-600 dark:text-${color}-400`\r\n )}\r\n >\r\n {current.toLocaleString()}\r\n {unit && <span className=\"text-sm ml-1\">{unit}</span>}\r\n </span>\r\n {showLabel && (\r\n <span\r\n className={merge(\r\n \"text-sm\",\r\n isGradient ? \"text-white/80\" : \"text-gray-600 dark:text-gray-400\"\r\n )}\r\n >\r\n / {total.toLocaleString()}\r\n {unit && <span className=\"ml-1\">{unit}</span>}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* 진행률 바 */}\r\n <div className=\"w-full bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden\">\r\n <div\r\n className={merge(\r\n \"rounded-full transition-all duration-500\",\r\n sizes.progress,\r\n isGradient\r\n ? `bg-gradient-to-r ${colorStyles.gradient.replace(\"bg-gradient-to-br\", \"bg-gradient-to-r\").trim()}`\r\n : progressColors[color]\r\n )}\r\n style={{ width: `${percentage}%` }}\r\n />\r\n </div>\r\n\r\n {/* 퍼센트 표시 */}\r\n {showPercentage && (\r\n <div className=\"mt-2 flex justify-end\">\r\n <span\r\n className={merge(\r\n \"text-xs font-semibold\",\r\n isGradient ? \"text-white/90\" : `text-${color}-600 dark:text-${color}-400`\r\n )}\r\n >\r\n {percentage.toFixed(1)}%\r\n </span>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nProgressCard.displayName = \"ProgressCard\";\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport { Icon } from \"../Icon\";\r\nimport type { IconName } from \"../../lib/icons\";\r\n\r\n/**\r\n * DashboardEmptyState 컴포넌트의 props / DashboardEmptyState component props\r\n * @typedef {Object} DashboardEmptyStateProps\r\n * @property {IconName | React.ReactNode} [icon=\"inbox\"] - 아이콘 / Icon\r\n * @property {string} title - 제목 / Title\r\n * @property {string} [description] - 설명 / Description\r\n * @property {string} [actionText] - 액션 버튼 텍스트 / Action button text\r\n * @property {string} [actionHref] - 액션 버튼 링크 URL / Action button link URL\r\n * @property {() => void} [actionOnClick] - 액션 버튼 클릭 핸들러 / Action button click handler\r\n * @property {\"default\" | \"warning\" | \"info\" | \"error\" | \"success\"} [variant=\"default\"] - 스타일 변형 / Style variant\r\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface DashboardEmptyStateProps extends React.HTMLAttributes<HTMLDivElement> {\r\n icon?: IconName | React.ReactNode;\r\n title: string;\r\n description?: string;\r\n actionText?: string;\r\n actionHref?: string;\r\n actionOnClick?: () => void;\r\n variant?: \"default\" | \"warning\" | \"info\" | \"error\" | \"success\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\nconst variantStyles = {\r\n default: {\r\n icon: \"text-gray-400 dark:text-gray-500\",\r\n title: \"text-gray-900 dark:text-white\",\r\n description: \"text-gray-600 dark:text-gray-400\",\r\n },\r\n warning: {\r\n icon: \"text-yellow-500 dark:text-yellow-400\",\r\n title: \"text-gray-900 dark:text-white\",\r\n description: \"text-gray-600 dark:text-gray-400\",\r\n },\r\n info: {\r\n icon: \"text-indigo-500 dark:text-indigo-400\",\r\n title: \"text-gray-900 dark:text-white\",\r\n description: \"text-gray-600 dark:text-gray-400\",\r\n },\r\n error: {\r\n icon: \"text-red-500 dark:text-red-400\",\r\n title: \"text-gray-900 dark:text-white\",\r\n description: \"text-gray-600 dark:text-gray-400\",\r\n },\r\n success: {\r\n icon: \"text-green-500 dark:text-green-400\",\r\n title: \"text-gray-900 dark:text-white\",\r\n description: \"text-gray-600 dark:text-gray-400\",\r\n },\r\n};\r\n\r\nconst sizeStyles = {\r\n sm: {\r\n container: \"py-8\",\r\n icon: \"w-8 h-8 mb-3\",\r\n title: \"text-base\",\r\n description: \"text-sm\",\r\n button: \"text-sm px-4 py-2\",\r\n },\r\n md: {\r\n container: \"py-12\",\r\n icon: \"w-12 h-12 mb-4\",\r\n title: \"text-lg\",\r\n description: \"text-sm\",\r\n button: \"text-sm px-6 py-2\",\r\n },\r\n lg: {\r\n container: \"py-16\",\r\n icon: \"w-16 h-16 mb-6\",\r\n title: \"text-xl\",\r\n description: \"text-base\",\r\n button: \"text-base px-8 py-3\",\r\n },\r\n};\r\n\r\n/**\r\n * DashboardEmptyState 컴포넌트\r\n * \r\n * 대시보드에서 빈 상태를 표시하는 컴포넌트입니다.\r\n * 데이터가 없을 때 사용자에게 안내 메시지와 액션을 제공합니다.\r\n * \r\n * Empty state component for dashboards.\r\n * Displays a message and action when there is no data to show.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <DashboardEmptyState\r\n * icon=\"inbox\"\r\n * title=\"데이터가 없습니다\"\r\n * description=\"새로운 데이터를 추가해보세요\"\r\n * actionText=\"데이터 추가\"\r\n * actionOnClick={handleAdd}\r\n * />\r\n * \r\n * @example\r\n * // 경고 스타일 / Warning style\r\n * <DashboardEmptyState\r\n * icon=\"warning\"\r\n * title=\"오류가 발생했습니다\"\r\n * description=\"잠시 후 다시 시도해주세요\"\r\n * variant=\"warning\"\r\n * size=\"lg\"\r\n * />\r\n * \r\n * @param {DashboardEmptyStateProps} props - DashboardEmptyState 컴포넌트의 props / DashboardEmptyState component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} DashboardEmptyState 컴포넌트 / DashboardEmptyState component\r\n */\r\nexport const DashboardEmptyState = React.forwardRef<HTMLDivElement, DashboardEmptyStateProps>(\r\n (\r\n {\r\n icon = \"inbox\",\r\n title,\r\n description,\r\n actionText,\r\n actionHref,\r\n actionOnClick,\r\n variant = \"default\",\r\n size = \"md\",\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const styles = variantStyles[variant];\r\n const sizes = sizeStyles[size];\r\n\r\n const actionButton = actionText && (actionHref || actionOnClick) && (\r\n <div className=\"mt-6\">\r\n {actionHref ? (\r\n <a\r\n href={actionHref}\r\n aria-label={actionText}\r\n className={merge(\r\n \"inline-flex items-center justify-center rounded-lg font-medium bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 border border-gray-300 dark:border-gray-600 transition-colors duration-200\",\r\n sizes.button\r\n )}\r\n >\r\n {actionText}\r\n </a>\r\n ) : (\r\n <button\r\n onClick={actionOnClick}\r\n aria-label={actionText}\r\n className={merge(\r\n \"inline-flex items-center justify-center rounded-lg font-medium bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 border border-gray-300 dark:border-gray-600 transition-colors duration-200\",\r\n sizes.button\r\n )}\r\n >\r\n {actionText}\r\n </button>\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"text-center\",\r\n sizes.container,\r\n className\r\n )}\r\n {...props}\r\n >\r\n {/* 아이콘 */}\r\n {icon && (\r\n <div className={merge(\"mx-auto\", styles.icon)}>\r\n {typeof icon === \"string\" ? (\r\n <Icon name={icon as IconName} className={merge(\"w-full h-full\", styles.icon)} />\r\n ) : (\r\n icon\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 제목 */}\r\n <h3 className={merge(\"font-semibold mb-2\", styles.title, sizes.title)}>\r\n {title}\r\n </h3>\r\n\r\n {/* 설명 */}\r\n {description && (\r\n <p className={merge(\"mb-4\", styles.description, sizes.description)}>\r\n {description}\r\n </p>\r\n )}\r\n\r\n {/* 액션 버튼 */}\r\n {actionButton}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nDashboardEmptyState.displayName = \"DashboardEmptyState\";\r\n\r\n","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\n\r\n/**\r\n * Tooltip 컴포넌트의 props / Tooltip component props\r\n * @typedef {Object} TooltipProps\r\n * @property {string} content - Tooltip 내용 / Tooltip content\r\n * @property {React.ReactNode} children - Tooltip이 연결될 요소 / Element to attach tooltip to\r\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [position=\"top\"] - Tooltip 표시 위치 / Tooltip display position\r\n * @property {\"default\" | \"light\" | \"dark\"} [variant=\"default\"] - Tooltip 스타일 변형 / Tooltip style variant\r\n * @property {number} [delay=300] - Tooltip 표시 지연 시간(ms) / Tooltip display delay (ms)\r\n * @property {boolean} [disabled=false] - Tooltip 비활성화 여부 / Disable tooltip\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {\r\n content: string\r\n children: React.ReactNode\r\n position?: \"top\" | \"bottom\" | \"left\" | \"right\"\r\n variant?: \"default\" | \"light\" | \"dark\"\r\n delay?: number\r\n disabled?: boolean\r\n}\r\n\r\n/**\r\n * Tooltip 컴포넌트 / Tooltip component\r\n * \r\n * 호버 시 추가 정보를 표시하는 툴팁 컴포넌트입니다.\r\n * 마우스 호버 시 지연 시간 후 표시됩니다.\r\n * \r\n * Tooltip component that displays additional information on hover.\r\n * Appears after a delay when the mouse hovers over the element.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <Tooltip content=\"이것은 도움말입니다\">\r\n * <Button>호버하세요</Button>\r\n * </Tooltip>\r\n * \r\n * @example\r\n * // 다양한 위치 / Different positions\r\n * <Tooltip content=\"위치 변경\" position=\"bottom\">\r\n * <Icon name=\"info\" />\r\n * </Tooltip>\r\n * \r\n * @example\r\n * // 커스텀 스타일 / Custom styles\r\n * <Tooltip content=\"라이트 스타일\" variant=\"light\" delay={500}>\r\n * <span>호버</span>\r\n * </Tooltip>\r\n * \r\n * @param {TooltipProps} props - Tooltip 컴포넌트의 props / Tooltip component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} Tooltip 컴포넌트 / Tooltip component\r\n * \r\n * @todo 접근성 개선: role=\"tooltip\" 추가 필요 / Accessibility: Add role=\"tooltip\"\r\n * @todo 접근성 개선: aria-describedby 연결 필요 / Accessibility: Connect aria-describedby\r\n * @todo 접근성 개선: 키보드 포커스 시 Tooltip 표시 필요 / Accessibility: Show tooltip on keyboard focus\r\n */\r\nconst Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\r\n ({ \r\n className, \r\n content,\r\n children,\r\n position = \"top\",\r\n variant = \"default\",\r\n delay = 300,\r\n disabled = false,\r\n ...props \r\n }, ref) => {\r\n const [isVisible, setIsVisible] = React.useState(false)\r\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\r\n const timeoutRef = React.useRef<number | undefined>(undefined)\r\n const tooltipRef = React.useRef<HTMLDivElement>(null)\r\n\r\n const showTooltip = (e: React.MouseEvent) => {\r\n if (disabled) return\r\n \r\n const rect = e.currentTarget.getBoundingClientRect()\r\n const _tooltipRect = tooltipRef.current?.getBoundingClientRect()\r\n \r\n let x = 0\r\n let y = 0\r\n \r\n switch (position) {\r\n case \"top\":\r\n x = rect.left + rect.width / 2\r\n y = rect.top - 8 // 8px 간격\r\n break\r\n case \"bottom\":\r\n x = rect.left + rect.width / 2\r\n y = rect.bottom + 8 // 8px 간격\r\n break\r\n case \"left\":\r\n x = rect.left - 8 // 8px 간격\r\n y = rect.top + rect.height / 2\r\n break\r\n case \"right\":\r\n x = rect.right + 8 // 8px 간격\r\n y = rect.top + rect.height / 2\r\n break\r\n }\r\n \r\n setCoords({ x, y })\r\n \r\n timeoutRef.current = window.setTimeout(() => {\r\n setIsVisible(true)\r\n }, delay)\r\n }\r\n\r\n const hideTooltip = () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current)\r\n }\r\n setIsVisible(false)\r\n }\r\n\r\n React.useEffect(() => {\r\n return () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current)\r\n }\r\n }\r\n }, [])\r\n\r\n const getVariantClasses = () => {\r\n switch (variant) {\r\n case \"light\":\r\n return \"bg-popover text-popover-foreground border border-border shadow-lg\"\r\n case \"dark\":\r\n return \"bg-gray-900 text-white shadow-lg\"\r\n default:\r\n return \"bg-gray-800 text-white shadow-lg\"\r\n }\r\n }\r\n\r\n const _getPositionClasses = () => {\r\n switch (position) {\r\n case \"top\":\r\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\" // 8px 간격\r\n case \"bottom\":\r\n return \"top-full left-1/2 -translate-x-1/2 mt-2\" // 8px 간격\r\n case \"left\":\r\n return \"right-full top-1/2 -translate-y-1/2 mr-2\" // 8px 간격\r\n case \"right\":\r\n return \"left-full top-1/2 -translate-y-1/2 ml-2\" // 8px 간격\r\n default:\r\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\"\r\n }\r\n }\r\n\r\n const getArrowClasses = () => {\r\n switch (position) {\r\n case \"top\":\r\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\r\n case \"bottom\":\r\n return \"bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800\"\r\n case \"left\":\r\n return \"left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800\"\r\n case \"right\":\r\n return \"right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800\"\r\n default:\r\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\"relative inline-block\", className)}\r\n onMouseEnter={showTooltip}\r\n onMouseLeave={hideTooltip}\r\n {...props}\r\n >\r\n {children}\r\n \r\n {isVisible && (\r\n <div\r\n ref={tooltipRef}\r\n className={merge(\r\n \"fixed z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none\", // 12px, 8px 패딩\r\n getVariantClasses()\r\n )}\r\n style={{\r\n left: `${coords.x}px`,\r\n top: `${coords.y}px`,\r\n transform: 'translate(-50%, -50%)'\r\n }}\r\n >\r\n {content}\r\n {/* 화살표 */}\r\n <div\r\n className={merge(\r\n \"absolute w-0 h-0 border-4 border-transparent\",\r\n getArrowClasses()\r\n )}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n)\r\nTooltip.displayName = \"Tooltip\"\r\n\r\n// 편의 컴포넌트들\r\nexport const TooltipLight = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\r\n ({ className, ...props }, ref) => (\r\n <Tooltip ref={ref} variant=\"light\" className={className} {...props} />\r\n )\r\n)\r\nTooltipLight.displayName = \"TooltipLight\"\r\n\r\nexport const TooltipDark = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\r\n ({ className, ...props }, ref) => (\r\n <Tooltip ref={ref} variant=\"dark\" className={className} {...props} />\r\n )\r\n)\r\nTooltipDark.displayName = \"TooltipDark\"\r\n\r\nexport { Tooltip } ","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport { Icon } from \"../Icon\";\r\nimport type { IconName } from \"../../lib/icons\";\r\nimport { Tooltip } from \"../Tooltip\";\r\n\r\n/**\r\n * 사이드바 네비게이션 아이템 인터페이스 / SidebarNavItem interface\r\n * @typedef {Object} SidebarNavItem\r\n * @property {string} id - 아이템 고유 ID / Item unique ID\r\n * @property {string} label - 아이템 라벨 / Item label\r\n * @property {string} [href] - 링크 URL / Link URL\r\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\r\n * @property {React.ReactNode} [badge] - 배지 / Badge\r\n * @property {boolean} [active] - 활성 상태 / Active state\r\n * @property {() => void} [onClick] - 클릭 핸들러 / Click handler\r\n */\r\nexport interface SidebarNavItem {\r\n id: string;\r\n label: string;\r\n href?: string;\r\n icon?: IconName | React.ReactNode;\r\n badge?: React.ReactNode;\r\n active?: boolean;\r\n onClick?: () => void;\r\n}\r\n\r\n/**\r\n * 사이드바 섹션 인터페이스 / SidebarSection interface\r\n * @typedef {Object} SidebarSection\r\n * @property {string} id - 섹션 고유 ID / Section unique ID\r\n * @property {string} [label] - 섹션 라벨 / Section label\r\n * @property {SidebarNavItem[]} items - 섹션 내 아이템 배열 / Items array in section\r\n */\r\nexport interface SidebarSection {\r\n id: string;\r\n label?: string;\r\n items: SidebarNavItem[];\r\n}\r\n\r\n/**\r\n * DashboardSidebar 컴포넌트의 props / DashboardSidebar component props\r\n * @typedef {Object} DashboardSidebarProps\r\n * @property {React.ReactNode} [logo] - 로고 컴포넌트 / Logo component\r\n * @property {React.ReactNode} [productSwitcher] - 제품 전환 컴포넌트 / Product switcher component\r\n * @property {SidebarSection[]} sections - 사이드바 섹션 배열 / Sidebar sections array\r\n * @property {React.ReactNode} [footerActions] - 푸터 액션 컴포넌트 / Footer actions component\r\n * @property {boolean} [isCollapsed] - 접힘 상태 (제어) / Collapsed state (controlled)\r\n * @property {boolean} [defaultCollapsed=false] - 기본 접힘 상태 / Default collapsed state\r\n * @property {(collapsed: boolean) => void} [onToggleCollapsed] - 접힘 상태 변경 핸들러 / Collapsed state change handler\r\n * @property {number} [collapsedWidth=72] - 접힘 상태 너비 (px) / Collapsed width (px)\r\n * @property {number} [expandedWidth=264] - 펼침 상태 너비 (px) / Expanded width (px)\r\n * @property {number} [mobileBreakpoint=1024] - 모바일 브레이크포인트 (px) / Mobile breakpoint (px)\r\n * @property {string} [overlayBackground] - 모바일 오버레이 배경색 / Mobile overlay background color\r\n * @extends {React.HTMLAttributes<HTMLElement>}\r\n */\r\nexport interface DashboardSidebarProps extends React.HTMLAttributes<HTMLElement> {\r\n logo?: React.ReactNode;\r\n productSwitcher?: React.ReactNode;\r\n sections: SidebarSection[];\r\n footerActions?: React.ReactNode;\r\n isCollapsed?: boolean;\r\n defaultCollapsed?: boolean;\r\n onToggleCollapsed?: (collapsed: boolean) => void;\r\n collapsedWidth?: number;\r\n expandedWidth?: number;\r\n mobileBreakpoint?: number;\r\n overlayBackground?: string;\r\n /** 사이드바 스타일 변형 / Sidebar style variant */\r\n variant?: \"default\" | \"transparent\";\r\n /** 토글 버튼 숨기기 / Hide collapse toggle button */\r\n hideToggle?: boolean;\r\n /** 아이템 기본 클래스 오버라이드 / Item base class override */\r\n itemClassName?: string;\r\n /** 활성 아이템 클래스 오버라이드 / Active item class override */\r\n activeClassName?: string;\r\n /** 모바일 열림 상태 (제어) / Mobile open state (controlled) */\r\n isMobileOpen?: boolean;\r\n /** 모바일 열림 상태 변경 핸들러 / Mobile open state change handler */\r\n onMobileOpenChange?: (open: boolean) => void;\r\n /** 모바일 토글 버튼 숨기기 (외부에서 제어할 때) / Hide mobile toggle button (when controlled externally) */\r\n hideMobileToggle?: boolean;\r\n}\r\n\r\nconst DEFAULT_COLLAPSED = 72;\r\nconst DEFAULT_EXPANDED = 264;\r\n\r\n/**\r\n * DashboardSidebar 컴포넌트\r\n * \r\n * 대시보드용 사이드바 네비게이션 컴포넌트입니다.\r\n * 접기/펼치기 기능과 모바일 반응형을 지원하며, 섹션별로 네비게이션 아이템을 구성할 수 있습니다.\r\n * \r\n * Sidebar navigation component for dashboards.\r\n * Supports collapse/expand functionality and mobile responsiveness, with section-based navigation items.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <DashboardSidebar\r\n * logo={<Logo />}\r\n * sections={[\r\n * {\r\n * id: \"main\",\r\n * label: \"메인\",\r\n * items: [\r\n * { id: \"dashboard\", label: \"대시보드\", href: \"/dashboard\", icon: \"layout\" },\r\n * { id: \"transactions\", label: \"거래\", href: \"/transactions\", icon: \"creditCard\" }\r\n * ]\r\n * }\r\n * ]}\r\n * />\r\n * \r\n * @example\r\n * // 접힘 상태 제어 / Collapse state control\r\n * <DashboardSidebar\r\n * sections={sections}\r\n * isCollapsed={collapsed}\r\n * onToggleCollapsed={setCollapsed}\r\n * collapsedWidth={80}\r\n * expandedWidth={280}\r\n * />\r\n * \r\n * @param {DashboardSidebarProps} props - DashboardSidebar 컴포넌트의 props / DashboardSidebar component props\r\n * @param {React.Ref<HTMLElement>} ref - aside 요소 ref / aside element ref\r\n * @returns {JSX.Element} DashboardSidebar 컴포넌트 / DashboardSidebar component\r\n */\r\nexport const DashboardSidebar = React.forwardRef<HTMLElement, DashboardSidebarProps>(\r\n (\r\n {\r\n logo,\r\n productSwitcher,\r\n sections,\r\n footerActions,\r\n isCollapsed,\r\n defaultCollapsed = false,\r\n onToggleCollapsed,\r\n collapsedWidth = DEFAULT_COLLAPSED,\r\n expandedWidth = DEFAULT_EXPANDED,\r\n mobileBreakpoint = 1024,\r\n overlayBackground = \"rgba(15, 23, 42, 0.45)\",\r\n variant = \"default\",\r\n hideToggle = false,\r\n itemClassName,\r\n activeClassName,\r\n isMobileOpen: externalMobileOpen,\r\n onMobileOpenChange,\r\n hideMobileToggle = false,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\r\n const [internalMobileOpen, setInternalMobileOpen] = React.useState(false);\r\n const [isMobile, setIsMobile] = React.useState(false);\r\n const collapsed = typeof isCollapsed === \"boolean\" ? isCollapsed : internalCollapsed;\r\n\r\n const isMobileOpen = typeof externalMobileOpen === \"boolean\" ? externalMobileOpen : internalMobileOpen;\r\n const setIsMobileOpen = (open: boolean) => {\r\n onMobileOpenChange?.(open);\r\n if (typeof externalMobileOpen !== \"boolean\") setInternalMobileOpen(open);\r\n };\r\n\r\n React.useEffect(() => {\r\n const checkMobile = () => setIsMobile(window.innerWidth <= mobileBreakpoint);\r\n checkMobile();\r\n window.addEventListener(\"resize\", checkMobile);\r\n return () => window.removeEventListener(\"resize\", checkMobile);\r\n }, [mobileBreakpoint]);\r\n\r\n const toggleCollapsed = () => {\r\n const next = !collapsed;\r\n setInternalCollapsed(next);\r\n onToggleCollapsed?.(next);\r\n };\r\n\r\n const widthStyle = collapsed ? collapsedWidth : expandedWidth;\r\n\r\n const sidebarContent = (\r\n <aside\r\n ref={ref}\r\n role=\"navigation\"\r\n aria-label=\"대시보드 네비게이션\"\r\n className={merge(\r\n \"flex h-full flex-col overflow-hidden px-3 py-4 transition-[width] duration-200\",\r\n variant === \"transparent\"\r\n ? \"border-r border-slate-200/40 dark:border-slate-800/60\"\r\n : \"border-r border-slate-200/60 bg-white/95 shadow-sm dark:border-slate-800 dark:bg-slate-950/80 backdrop-blur\",\r\n className\r\n )}\r\n style={{ width: widthStyle, minWidth: widthStyle }}\r\n {...props}\r\n >\r\n <div className=\"mb-6 flex items-center justify-between gap-2 px-1\">\r\n <div className=\"flex items-center gap-2\">\r\n {logo}\r\n {!collapsed && productSwitcher}\r\n </div>\r\n {!hideToggle && <button\r\n type=\"button\"\r\n onClick={toggleCollapsed}\r\n aria-label={collapsed ? \"사이드바 펼치기\" : \"사이드바 접기\"}\r\n aria-expanded={!collapsed}\r\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-full border border-slate-200 text-slate-500 transition-colors hover:bg-slate-100 dark:border-slate-700 dark:text-slate-300 dark:hover:bg-slate-800\"\r\n >\r\n <Icon name={collapsed ? \"chevronRight\" : \"chevronLeft\"} className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">사이드바 토글</span>\r\n </button>}\r\n </div>\r\n\r\n <div className=\"flex-1 space-y-6 overflow-y-auto\">\r\n {sections.map((section) => (\r\n <div key={section.id} className=\"space-y-2\">\r\n {!collapsed && section.label && (\r\n <div className=\"px-3 text-xs font-medium uppercase tracking-wide text-slate-400 dark:text-slate-500\" role=\"heading\" aria-level={2}>\r\n {section.label}\r\n </div>\r\n )}\r\n <nav className=\"space-y-1\" aria-label={section.label || \"네비게이션\"}>\r\n {section.items.map((item) => {\r\n const defaultActive = \"bg-indigo-50 text-indigo-700 dark:bg-indigo-500/20 dark:text-indigo-100\";\r\n const defaultItem = \"text-slate-600 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-slate-800\";\r\n const baseClasses = merge(\r\n \"group flex w-full items-center rounded-lg px-3 py-2 text-sm font-medium transition focus:outline-none focus-visible:ring-1 focus-visible:ring-ring/50\",\r\n item.active\r\n ? (activeClassName || defaultActive)\r\n : (itemClassName || defaultItem)\r\n );\r\n\r\n const content = (\r\n <>\r\n {item.icon && (\r\n <span className=\"mr-3\">\r\n {typeof item.icon === \"string\" ? (\r\n <Icon name={item.icon as IconName} className=\"h-5 w-5\" variant=\"inherit\" />\r\n ) : (\r\n item.icon\r\n )}\r\n </span>\r\n )}\r\n {!collapsed && (\r\n <>\r\n <span className=\"flex-1 text-left\">{item.label}</span>\r\n {item.badge && <span className=\"text-xs text-slate-400\">{item.badge}</span>}\r\n </>\r\n )}\r\n </>\r\n );\r\n\r\n const handleItemClick = () => {\r\n if (isMobile) setIsMobileOpen(false);\r\n };\r\n\r\n const itemNode = item.href ? (\r\n <a\r\n key={item.id}\r\n href={item.href}\r\n className={baseClasses}\r\n aria-current={item.active ? \"page\" : undefined}\r\n onClick={handleItemClick}\r\n >\r\n {content}\r\n </a>\r\n ) : (\r\n <button\r\n key={item.id}\r\n type=\"button\"\r\n onClick={() => {\r\n item.onClick?.();\r\n handleItemClick();\r\n }}\r\n className={baseClasses}\r\n aria-pressed={item.active}\r\n >\r\n {content}\r\n </button>\r\n );\r\n\r\n if (collapsed) {\r\n return (\r\n <Tooltip key={item.id} content={item.label}>\r\n {itemNode}\r\n </Tooltip>\r\n );\r\n }\r\n\r\n return itemNode;\r\n })}\r\n </nav>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <div className=\"mt-4 border-t border-slate-100 pt-4 dark:border-slate-800\">\r\n {footerActions}\r\n <div className=\"mt-2 hidden text-xs text-slate-400 lg:block\">\r\n <span>ⓒ HUA Labs</span>\r\n </div>\r\n </div>\r\n\r\n </aside>\r\n );\r\n\r\n return (\r\n <>\r\n {isMobile ? (\r\n <>\r\n {!hideMobileToggle && (\r\n <button\r\n className=\"fixed top-3 left-3 z-30 inline-flex h-10 w-10 items-center justify-center rounded-xl border border-slate-200 bg-white shadow-md dark:border-slate-700 dark:bg-slate-900 dark:text-slate-200\"\r\n onClick={() => setIsMobileOpen(true)}\r\n >\r\n <Icon name=\"menu\" className=\"h-5 w-5\" />\r\n </button>\r\n )}\r\n {isMobileOpen && (\r\n <div className=\"fixed inset-0 z-40 flex\">\r\n <div\r\n className=\"absolute inset-0\"\r\n style={{ backgroundColor: overlayBackground }}\r\n onClick={() => setIsMobileOpen(false)}\r\n />\r\n <div className=\"relative z-50 h-full bg-white dark:bg-slate-950\">\r\n {sidebarContent}\r\n <button\r\n className=\"absolute top-4 right-4 inline-flex h-10 w-10 items-center justify-center rounded-xl text-slate-500 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-slate-800 transition-colors\"\r\n onClick={() => setIsMobileOpen(false)}\r\n >\r\n <Icon name=\"close\" className=\"h-5 w-5\" />\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n ) : (\r\n sidebarContent\r\n )}\r\n </>\r\n );\r\n }\r\n);\r\n\r\nDashboardSidebar.displayName = \"DashboardSidebar\";\r\n","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\n\r\n/**\r\n * Table 컴포넌트의 props / Table component props\r\n * @typedef {Object} TableProps\r\n * @property {React.ReactNode} children - TableHeader, TableBody, TableFooter 등 / TableHeader, TableBody, TableFooter, etc.\r\n * @property {\"default\" | \"bordered\" | \"striped\"} [variant=\"default\"] - Table 스타일 변형 / Table style variant\r\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Table 크기 / Table size\r\n * @extends {React.HTMLAttributes<HTMLTableElement>}\r\n */\r\nexport interface TableProps extends React.HTMLAttributes<HTMLTableElement> {\r\n children: React.ReactNode\r\n variant?: \"default\" | \"bordered\" | \"striped\"\r\n size?: \"sm\" | \"md\" | \"lg\"\r\n}\r\n\r\n/**\r\n * TableHeader 컴포넌트의 props / TableHeader component props\r\n * @typedef {Object} TableHeaderProps\r\n * @property {React.ReactNode} children - TableHead 컴포넌트들 / TableHead components\r\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\r\n */\r\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * TableBody 컴포넌트의 props / TableBody component props\r\n * @typedef {Object} TableBodyProps\r\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\r\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\r\n */\r\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * TableFooter 컴포넌트의 props / TableFooter component props\r\n * @typedef {Object} TableFooterProps\r\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\r\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\r\n */\r\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * TableRow 컴포넌트의 props / TableRow component props\r\n * @typedef {Object} TableRowProps\r\n * @property {React.ReactNode} children - TableHead 또는 TableCell 컴포넌트들 / TableHead or TableCell components\r\n * @property {\"default\" | \"hover\"} [variant=\"default\"] - Row 스타일 변형 / Row style variant\r\n * @extends {React.HTMLAttributes<HTMLTableRowElement>}\r\n */\r\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\r\n children: React.ReactNode\r\n variant?: \"default\" | \"hover\"\r\n}\r\n\r\n/**\r\n * TableHead 컴포넌트의 props / TableHead component props\r\n * @typedef {Object} TableHeadProps\r\n * @property {React.ReactNode} children - 헤더 셀 내용 / Header cell content\r\n * @extends {React.ThHTMLAttributes<HTMLTableCellElement>}\r\n */\r\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * TableCell 컴포넌트의 props / TableCell component props\r\n * @typedef {Object} TableCellProps\r\n * @property {React.ReactNode} children - 셀 내용 / Cell content\r\n * @extends {React.TdHTMLAttributes<HTMLTableCellElement>}\r\n */\r\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * Table 컴포넌트 / Table component\r\n * \r\n * 데이터를 표 형태로 표시하는 테이블 컴포넌트입니다.\r\n * TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell과 함께 사용합니다.\r\n * \r\n * Table component that displays data in tabular format.\r\n * Used with TableHeader, TableBody, TableFooter, TableRow, TableHead, and TableCell.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <Table>\r\n * <TableHeader>\r\n * <TableRow>\r\n * <TableHead>이름</TableHead>\r\n * <TableHead>나이</TableHead>\r\n * </TableRow>\r\n * </TableHeader>\r\n * <TableBody>\r\n * <TableRow>\r\n * <TableCell>홍길동</TableCell>\r\n * <TableCell>30</TableCell>\r\n * </TableRow>\r\n * </TableBody>\r\n * </Table>\r\n * \r\n * @example\r\n * // Bordered 스타일 / Bordered style\r\n * <Table variant=\"bordered\">\r\n * <TableHeader>\r\n * <TableRow>\r\n * <TableHead>항목</TableHead>\r\n * </TableRow>\r\n * </TableHeader>\r\n * <TableBody>\r\n * <TableRow>\r\n * <TableCell>값</TableCell>\r\n * </TableRow>\r\n * </TableBody>\r\n * </Table>\r\n * \r\n * @example\r\n * // Striped 스타일, 호버 효과 / Striped style with hover effect\r\n * <Table variant=\"striped\">\r\n * <TableBody>\r\n * <TableRow variant=\"hover\">\r\n * <TableCell>데이터</TableCell>\r\n * </TableRow>\r\n * </TableBody>\r\n * </Table>\r\n * \r\n * @param {TableProps} props - Table 컴포넌트의 props / Table component props\r\n * @param {React.Ref<HTMLTableElement>} ref - table 요소 ref / table element ref\r\n * @returns {JSX.Element} Table 컴포넌트 / Table component\r\n */\r\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\r\n ({ className, variant = \"default\", size = \"md\", ...props }, ref) => {\r\n const getVariantClasses = () => {\r\n switch (variant) {\r\n case \"bordered\":\r\n return \"border border-border divide-x divide-border\"\r\n case \"striped\":\r\n return \"divide-y divide-border\"\r\n default:\r\n return \"\"\r\n }\r\n }\r\n\r\n const getSizeClasses = () => {\r\n switch (size) {\r\n case \"sm\":\r\n return \"text-sm\"\r\n case \"lg\":\r\n return \"text-base\"\r\n default:\r\n return \"text-sm\"\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"w-full overflow-auto\">\r\n <table\r\n ref={ref}\r\n className={merge(\r\n \"w-full caption-bottom\",\r\n getVariantClasses(),\r\n getSizeClasses(),\r\n className\r\n )}\r\n {...props}\r\n />\r\n </div>\r\n )\r\n }\r\n)\r\nTable.displayName = \"Table\"\r\n\r\n/**\r\n * TableHeader 컴포넌트 / TableHeader component\r\n * 테이블의 헤더 영역을 표시합니다.\r\n * Displays the header area of a table.\r\n * \r\n * @component\r\n * @param {TableHeaderProps} props - TableHeader 컴포넌트의 props / TableHeader component props\r\n * @param {React.Ref<HTMLTableSectionElement>} ref - thead 요소 ref / thead element ref\r\n * @returns {JSX.Element} TableHeader 컴포넌트 / TableHeader component\r\n */\r\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\r\n ({ className, ...props }, ref) => (\r\n <thead ref={ref} className={merge(\"[&_tr]:border-b\", className)} {...props} />\r\n )\r\n)\r\nTableHeader.displayName = \"TableHeader\"\r\n\r\n/**\r\n * TableBody 컴포넌트 / TableBody component\r\n * 테이블의 본문 영역을 표시합니다.\r\n * Displays the body area of a table.\r\n * \r\n * @component\r\n * @param {TableBodyProps} props - TableBody 컴포넌트의 props / TableBody component props\r\n * @param {React.Ref<HTMLTableSectionElement>} ref - tbody 요소 ref / tbody element ref\r\n * @returns {JSX.Element} TableBody 컴포넌트 / TableBody component\r\n */\r\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\r\n ({ className, ...props }, ref) => (\r\n <tbody\r\n ref={ref}\r\n className={merge(\"[&_tr:last-child]:border-0\", className)}\r\n {...props}\r\n />\r\n )\r\n)\r\nTableBody.displayName = \"TableBody\"\r\n\r\n/**\r\n * TableFooter 컴포넌트 / TableFooter component\r\n * 테이블의 푸터 영역을 표시합니다.\r\n * Displays the footer area of a table.\r\n * \r\n * @component\r\n * @param {TableFooterProps} props - TableFooter 컴포넌트의 props / TableFooter component props\r\n * @param {React.Ref<HTMLTableSectionElement>} ref - tfoot 요소 ref / tfoot element ref\r\n * @returns {JSX.Element} TableFooter 컴포넌트 / TableFooter component\r\n */\r\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\r\n ({ className, ...props }, ref) => (\r\n <tfoot\r\n ref={ref}\r\n className={merge(\r\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n)\r\nTableFooter.displayName = \"TableFooter\"\r\n\r\n/**\r\n * TableRow 컴포넌트 / TableRow component\r\n * 테이블의 행을 표시합니다.\r\n * Displays a table row.\r\n * \r\n * @component\r\n * @param {TableRowProps} props - TableRow 컴포넌트의 props / TableRow component props\r\n * @param {React.Ref<HTMLTableRowElement>} ref - tr 요소 ref / tr element ref\r\n * @returns {JSX.Element} TableRow 컴포넌트 / TableRow component\r\n */\r\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\r\n ({ className, variant = \"default\", ...props }, ref) => {\r\n const getVariantClasses = () => {\r\n switch (variant) {\r\n case \"hover\":\r\n return \"hover:bg-muted/50\"\r\n default:\r\n return \"\"\r\n }\r\n }\r\n\r\n return (\r\n <tr\r\n ref={ref}\r\n className={merge(\r\n \"border-b transition-colors data-[state=selected]:bg-muted/50\",\r\n getVariantClasses(),\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nTableRow.displayName = \"TableRow\"\r\n\r\n/**\r\n * TableHead 컴포넌트 / TableHead component\r\n * 테이블의 헤더 셀을 표시합니다.\r\n * Displays a table header cell.\r\n * \r\n * @component\r\n * @param {TableHeadProps} props - TableHead 컴포넌트의 props / TableHead component props\r\n * @param {React.Ref<HTMLTableCellElement>} ref - th 요소 ref / th element ref\r\n * @returns {JSX.Element} TableHead 컴포넌트 / TableHead component\r\n */\r\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\r\n ({ className, ...props }, ref) => (\r\n <th\r\n ref={ref}\r\n className={merge(\r\n \"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n)\r\nTableHead.displayName = \"TableHead\"\r\n\r\n/**\r\n * TableCell 컴포넌트 / TableCell component\r\n * 테이블의 데이터 셀을 표시합니다.\r\n * Displays a table data cell.\r\n * \r\n * @component\r\n * @param {TableCellProps} props - TableCell 컴포넌트의 props / TableCell component props\r\n * @param {React.Ref<HTMLTableCellElement>} ref - td 요소 ref / td element ref\r\n * @returns {JSX.Element} TableCell 컴포넌트 / TableCell component\r\n */\r\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\r\n ({ className, ...props }, ref) => (\r\n <td\r\n ref={ref}\r\n className={merge(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\r\n {...props}\r\n />\r\n )\r\n)\r\nTableCell.displayName = \"TableCell\"\r\n\r\n/**\r\n * TableCaption 컴포넌트 / TableCaption component\r\n * 테이블의 캡션을 표시합니다.\r\n * Displays a table caption.\r\n * \r\n * @component\r\n * @param {React.HTMLAttributes<HTMLTableCaptionElement>} props - TableCaption 컴포넌트의 props / TableCaption component props\r\n * @param {React.Ref<HTMLTableCaptionElement>} ref - caption 요소 ref / caption element ref\r\n * @returns {JSX.Element} TableCaption 컴포넌트 / TableCaption component\r\n */\r\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\r\n ({ className, ...props }, ref) => (\r\n <caption\r\n ref={ref}\r\n className={merge(\"mt-4 text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n)\r\nTableCaption.displayName = \"TableCaption\"\r\n\r\nexport {\r\n Table,\r\n TableHeader,\r\n TableBody,\r\n TableFooter,\r\n TableHead,\r\n TableRow,\r\n TableCell,\r\n TableCaption,\r\n} ","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { cva } from \"class-variance-authority\"\r\nimport { merge } from \"../lib/utils\"\r\n\r\nexport const badgeVariants = cva(\r\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80\",\r\n secondary: \"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80\",\r\n destructive: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\r\n error: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\r\n outline: \"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]\",\r\n glass: \"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n },\r\n }\r\n)\r\n\r\n/**\r\n * Badge 컴포넌트의 props / Badge component props\r\n */\r\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\r\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\r\n}\r\n\r\n/**\r\n * Badge 컴포넌트 / Badge component\r\n *\r\n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\r\n *\r\n * @example\r\n * <Badge>New</Badge>\r\n * <Badge variant=\"destructive\">완료</Badge>\r\n * <Badge variant=\"outline\">대기</Badge>\r\n */\r\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\r\n ({ className, variant = \"default\", ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(badgeVariants({ variant }), className)}\r\n {...props}\r\n />\r\n )\r\n }\r\n))\r\nBadge.displayName = \"Badge\"\r\n\r\nexport { Badge }\r\n","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { cva } from \"class-variance-authority\"\r\nimport { merge } from \"../lib/utils\"\r\n\r\nexport const skeletonVariants = cva(\r\n \"block\",\r\n {\r\n variants: {\r\n variant: {\r\n text: \"rounded w-full h-4\",\r\n circular: \"rounded-full w-10 h-10\",\r\n rounded: \"rounded-lg w-full h-[200px]\",\r\n rectangular: \"rounded-none w-full h-[200px]\",\r\n },\r\n animation: {\r\n pulse: \"animate-pulse bg-muted\",\r\n wave: \"bg-muted\",\r\n shimmer: \"bg-muted\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"text\",\r\n animation: \"pulse\",\r\n },\r\n }\r\n)\r\n\r\n/**\r\n * Skeleton 컴포넌트의 props\r\n */\r\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\r\n variant?: \"text\" | \"circular\" | \"rectangular\" | \"rounded\"\r\n width?: string | number\r\n height?: string | number\r\n animation?: \"pulse\" | \"wave\" | \"shimmer\"\r\n className?: string\r\n}\r\n\r\n/**\r\n * Skeleton 컴포넌트 / Skeleton component\r\n *\r\n * 로딩 중 콘텐츠의 플레이스홀더를 표시하는 스켈레톤 컴포넌트입니다.\r\n *\r\n * @example\r\n * <Skeleton />\r\n * <Skeleton variant=\"circular\" width={40} height={40} />\r\n * <Skeleton variant=\"rounded\" width=\"100%\" height={200} animation=\"wave\" />\r\n */\r\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\r\n ({\r\n className,\r\n variant = \"text\",\r\n width,\r\n height,\r\n animation = \"pulse\",\r\n ...props\r\n }, ref) => {\r\n const getAnimationStyle = (): React.CSSProperties => {\r\n if (animation === \"wave\" || animation === \"shimmer\") {\r\n return {\r\n background: \"linear-gradient(90deg, hsl(var(--muted)) 0%, hsl(var(--muted-foreground) / 0.2) 50%, hsl(var(--muted)) 100%)\",\r\n backgroundSize: \"200% 100%\",\r\n animation: \"shimmer 1.5s ease-in-out infinite\",\r\n }\r\n }\r\n return {}\r\n }\r\n\r\n return (\r\n <>\r\n {(animation === \"wave\" || animation === \"shimmer\") && (\r\n <style>{`\r\n @keyframes shimmer {\r\n 0% { background-position: 200% 0; }\r\n 100% { background-position: -200% 0; }\r\n }\r\n `}</style>\r\n )}\r\n <div\r\n ref={ref}\r\n className={merge(\r\n skeletonVariants({ variant, animation }),\r\n className\r\n )}\r\n style={{\r\n ...(width != null ? { width: typeof width === \"number\" ? `${width}px` : width } : {}),\r\n ...(height != null ? { height: typeof height === \"number\" ? `${height}px` : height } : {}),\r\n ...getAnimationStyle(),\r\n }}\r\n {...props}\r\n />\r\n </>\r\n )\r\n }\r\n)\r\nSkeleton.displayName = \"Skeleton\"\r\n\r\n// 편의 컴포넌트들\r\nexport const SkeletonText = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\r\n ({ className, ...props }, ref) => (\r\n <Skeleton ref={ref} variant=\"text\" className={className} {...props} />\r\n )\r\n)\r\nSkeletonText.displayName = \"SkeletonText\"\r\n\r\nexport const SkeletonCircle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\r\n ({ className, ...props }, ref) => (\r\n <Skeleton ref={ref} variant=\"circular\" className={className} {...props} />\r\n )\r\n)\r\nSkeletonCircle.displayName = \"SkeletonCircle\"\r\n\r\nexport const SkeletonRectangle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\r\n ({ className, ...props }, ref) => (\r\n <Skeleton ref={ref} variant=\"rectangular\" className={className} {...props} />\r\n )\r\n)\r\nSkeletonRectangle.displayName = \"SkeletonRectangle\"\r\n\r\nexport const SkeletonRounded = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\r\n ({ className, ...props }, ref) => (\r\n <Skeleton ref={ref} variant=\"rounded\" className={className} {...props} />\r\n )\r\n)\r\nSkeletonRounded.displayName = \"SkeletonRounded\"\r\n\r\n// 복합 스켈레톤 컴포넌트들\r\nexport const SkeletonCard = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\r\n ({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={merge(\"space-y-4 p-6\", className)} // 16px 간격, 24px 패딩\r\n {...props}\r\n >\r\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\r\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\r\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\r\n <SkeletonText className=\"h-4 w-3/4\" /> {/* 16px 높이, 75% 너비 */}\r\n <SkeletonText className=\"h-3 w-1/2\" /> {/* 12px 높이, 50% 너비 */}\r\n </div>\r\n </div>\r\n <SkeletonRounded className=\"w-full h-32\" /> {/* 128px 높이 */}\r\n <div className=\"space-y-2\"> {/* 8px 간격 */}\r\n <SkeletonText className=\"h-4 w-full\" />\r\n <SkeletonText className=\"h-4 w-5/6\" />\r\n <SkeletonText className=\"h-4 w-4/6\" />\r\n </div>\r\n </div>\r\n )\r\n)\r\nSkeletonCard.displayName = \"SkeletonCard\"\r\n\r\nexport const SkeletonAvatar = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\r\n ({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={merge(\"flex items-center space-x-4\", className)} // 16px 간격\r\n {...props}\r\n >\r\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\r\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\r\n <SkeletonText className=\"h-4 w-3/4\" />\r\n <SkeletonText className=\"h-3 w-1/2\" />\r\n </div>\r\n </div>\r\n )\r\n)\r\nSkeletonAvatar.displayName = \"SkeletonAvatar\"\r\n\r\nexport const SkeletonImage = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\r\n ({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={merge(\"space-y-2\", className)} // 8px 간격\r\n {...props}\r\n >\r\n <SkeletonRounded className=\"w-full h-48\" /> {/* 192px 높이 */}\r\n <SkeletonText className=\"h-4 w-1/2\" />\r\n </div>\r\n )\r\n)\r\nSkeletonImage.displayName = \"SkeletonImage\"\r\n\r\nexport const SkeletonUserProfile = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\r\n ({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={merge(\"space-y-4\", className)} // 16px 간격\r\n {...props}\r\n >\r\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\r\n <SkeletonCircle className=\"w-16 h-16\" /> {/* 64px 크기 */}\r\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\r\n <SkeletonText className=\"h-5 w-1/2\" />\r\n <SkeletonText className=\"h-3 w-1/3\" />\r\n </div>\r\n </div>\r\n <div className=\"space-y-2\"> {/* 8px 간격 */}\r\n <SkeletonText className=\"h-4 w-full\" />\r\n <SkeletonText className=\"h-4 w-5/6\" />\r\n </div>\r\n </div>\r\n )\r\n)\r\nSkeletonUserProfile.displayName = \"SkeletonUserProfile\"\r\n\r\nexport const SkeletonList = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\r\n ({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={merge(\"space-y-4\", className)} // 16px 간격\r\n {...props}\r\n >\r\n {Array.from({ length: 3 }).map((_, index) => (\r\n <div key={index} className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\r\n <SkeletonCircle className=\"w-10 h-10\" /> {/* 40px 크기 */}\r\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\r\n <SkeletonText className=\"h-4 w-3/4\" />\r\n <SkeletonText className=\"h-3 w-1/2\" />\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n)\r\nSkeletonList.displayName = \"SkeletonList\"\r\n\r\nexport const SkeletonTable = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\r\n ({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={merge(\"space-y-4\", className)} // 16px 간격\r\n {...props}\r\n >\r\n {/* 헤더 */}\r\n <div className=\"flex space-x-4\"> {/* 16px 간격 */}\r\n <SkeletonText className=\"h-4 w-1/4\" />\r\n <SkeletonText className=\"h-4 w-1/4\" />\r\n <SkeletonText className=\"h-4 w-1/4\" />\r\n <SkeletonText className=\"h-4 w-1/4\" />\r\n </div>\r\n {/* 행들 */}\r\n {Array.from({ length: 5 }).map((_, index) => (\r\n <div key={index} className=\"flex space-x-4\"> {/* 16px 간격 */}\r\n <SkeletonText className=\"h-4 w-1/4\" />\r\n <SkeletonText className=\"h-4 w-1/4\" />\r\n <SkeletonText className=\"h-4 w-1/4\" />\r\n <SkeletonText className=\"h-4 w-1/4\" />\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n)\r\nSkeletonTable.displayName = \"SkeletonTable\"\r\n\r\nexport { Skeleton } ","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n TableCaption,\r\n} from \"../Table\";\r\nimport { Badge } from \"../Badge\";\r\nimport { SkeletonTable } from \"../Skeleton\";\r\nimport { DashboardEmptyState } from \"./EmptyState\";\r\n\r\nexport type TransactionStatus =\r\n | \"approved\"\r\n | \"pending\"\r\n | \"failed\"\r\n | \"refunded\"\r\n | \"cancelled\"\r\n | \"review\";\r\n\r\nexport type TransactionColumnKey =\r\n | \"id\"\r\n | \"merchant\"\r\n | \"amount\"\r\n | \"status\"\r\n | \"method\"\r\n | \"date\"\r\n | \"fee\"\r\n | \"customer\";\r\n\r\n/**\r\n * 거래 테이블 행 인터페이스\r\n * @typedef {Object} TransactionRow\r\n * @property {string} id - 거래 ID\r\n * @property {string} merchant - 가맹점\r\n * @property {number} amount - 거래 금액\r\n * @property {string} [currency] - 통화\r\n * @property {TransactionStatus} status - 거래 상태\r\n * @property {string} [method] - 결제수단\r\n * @property {string | Date} date - 거래 일시\r\n * @property {string} [customer] - 고객 정보\r\n * @property {number} [fee] - 수수료\r\n * @property {string} [reference] - 참조 번호\r\n */\r\nexport interface TransactionRow {\r\n id: string;\r\n merchant: string;\r\n amount: number;\r\n currency?: string;\r\n status: TransactionStatus;\r\n method?: string;\r\n date: string | Date;\r\n customer?: string;\r\n fee?: number;\r\n reference?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * 거래 테이블 컬럼 설정 인터페이스\r\n * @typedef {Object} TransactionColumnConfig\r\n * @property {TransactionColumnKey} key - 컬럼 키\r\n * @property {string} [label] - 컬럼 라벨\r\n * @property {\"left\" | \"center\" | \"right\"} [align] - 정렬\r\n * @property {string} [width] - 컬럼 너비\r\n * @property {(row: TransactionRow) => React.ReactNode} [render] - 커스텀 렌더러\r\n */\r\nexport interface TransactionColumnConfig {\r\n key: TransactionColumnKey;\r\n label?: string;\r\n align?: \"left\" | \"center\" | \"right\";\r\n width?: string;\r\n render?: (row: TransactionRow) => React.ReactNode;\r\n}\r\n\r\n/**\r\n * TransactionsTable 컴포넌트의 props\r\n * @typedef {Object} TransactionsTableProps\r\n * @property {TransactionRow[]} rows - 거래 행 배열\r\n * @property {TransactionColumnConfig[]} [columns] - 컬럼 설정 배열\r\n * @property {boolean} [isLoading=false] - 로딩 상태\r\n * @property {number} [loadingRows] - 로딩 행 수\r\n * @property {React.ReactNode} [caption] - 테이블 캡션\r\n * @property {React.ReactNode} [filters] - 필터 컴포넌트\r\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트\r\n * @property {(row: TransactionRow) => void} [onRowClick] - 행 클릭 핸들러\r\n * @property {(row: TransactionRow) => boolean} [highlightRow] - 행 강조 조건\r\n * @property {Partial<Record<TransactionStatus, string>>} [statusLabels] - 상태 라벨 커스터마이징\r\n * @property {(status: TransactionStatus, row: TransactionRow) => React.ReactNode} [statusRenderer] - 상태 커스텀 렌더러\r\n * @property {(row: TransactionRow) => React.ReactNode} [amountFormatter] - 금액 커스텀 포맷터\r\n * @property {(row: TransactionRow) => React.ReactNode} [methodFormatter] - 결제수단 커스텀 포맷터\r\n * @property {(row: TransactionRow) => React.ReactNode} [dateFormatter] - 날짜 커스텀 포맷터\r\n * @property {string} [locale=\"ko-KR\"] - 로케일\r\n * @property {string} [defaultCurrency=\"KRW\"] - 기본 통화\r\n * @property {string} [className] - 추가 클래스명\r\n * @property {React.ReactNode} [footer] - 푸터 컴포넌트\r\n * @property {(row: TransactionRow) => string} [rowActionLabel] - 행 액션 라벨 생성 함수\r\n * @property {string} [rowActionHint] - 행 액션 힌트 텍스트\r\n */\r\nexport interface TransactionsTableProps {\r\n rows: TransactionRow[];\r\n columns?: TransactionColumnConfig[];\r\n isLoading?: boolean;\r\n loadingRows?: number;\r\n caption?: React.ReactNode;\r\n filters?: React.ReactNode;\r\n emptyState?: React.ReactNode;\r\n onRowClick?: (row: TransactionRow) => void;\r\n highlightRow?: (row: TransactionRow) => boolean;\r\n statusLabels?: Partial<Record<TransactionStatus, string>>;\r\n statusRenderer?: (status: TransactionStatus, row: TransactionRow) => React.ReactNode;\r\n amountFormatter?: (row: TransactionRow) => React.ReactNode;\r\n methodFormatter?: (row: TransactionRow) => React.ReactNode;\r\n dateFormatter?: (row: TransactionRow) => React.ReactNode;\r\n locale?: string;\r\n defaultCurrency?: string;\r\n className?: string;\r\n footer?: React.ReactNode;\r\n rowActionLabel?: (row: TransactionRow) => string;\r\n rowActionHint?: string;\r\n}\r\n\r\nconst STATUS_STYLES: Record<TransactionStatus, { label: string; badge: string }> = {\r\n approved: {\r\n label: \"승인\",\r\n badge: \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-200\",\r\n },\r\n pending: {\r\n label: \"대기\",\r\n badge: \"bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-200\",\r\n },\r\n failed: {\r\n label: \"실패\",\r\n badge: \"bg-rose-100 text-rose-700 dark:bg-rose-500/15 dark:text-rose-200\",\r\n },\r\n refunded: {\r\n label: \"환불\",\r\n badge: \"bg-sky-100 text-sky-700 dark:bg-sky-500/15 dark:text-sky-200\",\r\n },\r\n cancelled: {\r\n label: \"취소\",\r\n badge: \"bg-slate-100 text-slate-700 dark:bg-slate-500/15 dark:text-slate-200\",\r\n },\r\n review: {\r\n label: \"검토중\",\r\n badge: \"bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-200\",\r\n },\r\n};\r\n\r\nconst DEFAULT_COLUMNS: TransactionColumnConfig[] = [\r\n { key: \"id\", label: \"거래 ID\", width: \"160px\" },\r\n { key: \"merchant\", label: \"가맹점\" },\r\n { key: \"amount\", label: \"금액\", align: \"right\", width: \"140px\" },\r\n { key: \"status\", label: \"상태\", width: \"120px\" },\r\n { key: \"method\", label: \"결제수단\", width: \"120px\" },\r\n { key: \"date\", label: \"거래 일시\", width: \"180px\" },\r\n];\r\n\r\n/**\r\n * TransactionsTable 컴포넌트\r\n * \r\n * 거래 목록을 테이블 형태로 표시하는 컴포넌트입니다.\r\n * 정렬, 필터링, 커스텀 렌더링 등을 지원합니다.\r\n * \r\n * Table component that displays transaction list.\r\n * Supports sorting, filtering, and custom rendering.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <TransactionsTable\r\n * rows={[\r\n * {\r\n * id: \"tx_123\",\r\n * merchant: \"가맹점 A\",\r\n * amount: 100000,\r\n * status: \"approved\",\r\n * method: \"카드\",\r\n * date: new Date()\r\n * }\r\n * ]}\r\n * onRowClick={(row) => console.log(row)}\r\n * />\r\n * \r\n * @example\r\n * // 커스텀 컬럼과 포맷터 / Custom columns and formatters\r\n * <TransactionsTable\r\n * rows={transactions}\r\n * columns={[\r\n * { key: \"id\", label: \"ID\" },\r\n * { key: \"amount\", label: \"금액\", align: \"right\" },\r\n * { key: \"status\", label: \"상태\" }\r\n * ]}\r\n * amountFormatter={(row) => `₩${row.amount.toLocaleString()}`}\r\n * statusRenderer={(status) => <CustomBadge status={status} />}\r\n * isLoading={loading}\r\n * />\r\n * \r\n * @param {TransactionsTableProps} props - TransactionsTable 컴포넌트의 props / TransactionsTable component props\r\n * @returns {JSX.Element} TransactionsTable 컴포넌트 / TransactionsTable component\r\n */\r\nexport const TransactionsTable: React.FC<TransactionsTableProps> = ({\r\n rows,\r\n columns = DEFAULT_COLUMNS,\r\n isLoading = false,\r\n caption,\r\n filters,\r\n emptyState,\r\n onRowClick,\r\n highlightRow,\r\n statusLabels,\r\n statusRenderer,\r\n amountFormatter,\r\n methodFormatter,\r\n dateFormatter,\r\n locale = \"ko-KR\",\r\n defaultCurrency = \"KRW\",\r\n className,\r\n footer,\r\n rowActionLabel,\r\n rowActionHint,\r\n}) => {\r\n const columnList = columns.length > 0 ? columns : DEFAULT_COLUMNS;\r\n const hasRows = rows.length > 0;\r\n const tableId = React.useId();\r\n const rowActionHintId = rowActionHint ? `${tableId}-row-action-hint` : undefined;\r\n\r\n const getRowActionLabel = React.useCallback(\r\n (row: TransactionRow) => {\r\n if (rowActionLabel) return rowActionLabel(row);\r\n const baseLabel = row.id ? `거래 ${row.id}` : \"거래 행\";\r\n return `${baseLabel} 상세 보기`;\r\n },\r\n [rowActionLabel]\r\n );\r\n\r\n const renderStatus = (status: TransactionStatus, row: TransactionRow) => {\r\n if (statusRenderer) return statusRenderer(status, row);\r\n const config = STATUS_STYLES[status] || STATUS_STYLES.pending;\r\n const label = statusLabels?.[status] ?? config.label;\r\n return (\r\n <Badge className={merge(\"font-medium px-3 py-1 rounded-full text-xs\", config.badge)}>\r\n {label}\r\n </Badge>\r\n );\r\n };\r\n\r\n const renderAmount = (row: TransactionRow) => {\r\n if (amountFormatter) return amountFormatter(row);\r\n const currency = row.currency || defaultCurrency;\r\n try {\r\n return (\r\n <span className=\"font-semibold text-slate-900 dark:text-slate-100\">\r\n {new Intl.NumberFormat(locale, {\r\n style: \"currency\",\r\n currency,\r\n maximumFractionDigits: 2,\r\n }).format(row.amount)}\r\n </span>\r\n );\r\n } catch {\r\n return `${row.amount.toLocaleString(locale)} ${currency}`;\r\n }\r\n };\r\n\r\n const renderMethod = (row: TransactionRow) => {\r\n if (methodFormatter) return methodFormatter(row);\r\n return row.method ?? \"-\";\r\n };\r\n\r\n const renderDate = (row: TransactionRow) => {\r\n if (dateFormatter) return dateFormatter(row);\r\n const dateObj = row.date instanceof Date ? row.date : new Date(row.date);\r\n return dateObj.toLocaleString(locale, { dateStyle: \"medium\", timeStyle: \"short\" });\r\n };\r\n\r\n const renderCell = (column: TransactionColumnConfig, row: TransactionRow) => {\r\n if (column.render) return column.render(row);\r\n\r\n switch (column.key) {\r\n case \"id\":\r\n return (\r\n <div className=\"flex flex-col\">\r\n <span className=\"font-medium text-slate-900 dark:text-slate-100\">{row.id}</span>\r\n {row.reference && (\r\n <span className=\"text-xs text-slate-500 dark:text-slate-400\">{row.reference}</span>\r\n )}\r\n </div>\r\n );\r\n case \"merchant\":\r\n return (\r\n <div className=\"flex flex-col\">\r\n <span className=\"font-medium text-slate-900 dark:text-slate-100\">{row.merchant}</span>\r\n {row.customer && (\r\n <span className=\"text-xs text-slate-500 dark:text-slate-400\">{row.customer}</span>\r\n )}\r\n </div>\r\n );\r\n case \"amount\":\r\n return (\r\n <div className=\"flex flex-col items-end\">\r\n {renderAmount(row)}\r\n {typeof row.fee === \"number\" && (\r\n <span className=\"text-xs text-slate-500 dark:text-slate-400\">\r\n 수수료 {row.fee.toLocaleString(locale)}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n case \"status\":\r\n return renderStatus(row.status, row);\r\n case \"method\":\r\n return <span className=\"text-slate-700 dark:text-slate-300\">{renderMethod(row)}</span>;\r\n case \"date\":\r\n return <span className=\"text-slate-700 dark:text-slate-300\">{renderDate(row)}</span>;\r\n case \"customer\":\r\n return row.customer ?? \"-\";\r\n case \"fee\":\r\n return typeof row.fee === \"number\" ? row.fee.toLocaleString(locale) : \"-\";\r\n default:\r\n return \"-\";\r\n }\r\n };\r\n\r\n return (\r\n <div className={merge(\"rounded-2xl border border-slate-200/60 dark:border-slate-800 bg-white dark:bg-slate-900\", className)}>\r\n {filters && (\r\n <div className=\"border-b border-slate-100 dark:border-slate-800 px-4 sm:px-6 py-4\">{filters}</div>\r\n )}\r\n <div className=\"p-4 sm:p-6\">\r\n <div className=\"rounded-xl border border-slate-100 dark:border-slate-800 overflow-hidden\">\r\n <Table\r\n role=\"table\"\r\n aria-label={caption ? (typeof caption === \"string\" ? caption : \"거래 목록 테이블\") : \"거래 목록 테이블\"}\r\n >\r\n {caption && <TableCaption>{caption}</TableCaption>}\r\n <TableHeader className=\"bg-slate-50/60 dark:bg-slate-900/40\">\r\n <TableRow className=\"text-xs uppercase tracking-wide text-slate-500 dark:text-slate-400\">\r\n {columnList.map((column) => (\r\n <TableHead\r\n key={column.key}\r\n style={{ width: column.width }}\r\n className={merge(\r\n column.align === \"right\"\r\n ? \"text-right\"\r\n : column.align === \"center\"\r\n ? \"text-center\"\r\n : \"text-left\",\r\n \"text-xs font-semibold\"\r\n )}\r\n >\r\n {column.label}\r\n </TableHead>\r\n ))}\r\n </TableRow>\r\n </TableHeader>\r\n <TableBody>\r\n {isLoading && (\r\n <TableRow>\r\n <TableCell colSpan={columnList.length}>\r\n <SkeletonTable className=\"py-4\" />\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n {!isLoading && !hasRows && (\r\n <TableRow>\r\n <TableCell colSpan={columnList.length}>\r\n {emptyState || (\r\n <DashboardEmptyState\r\n title=\"거래 데이터가 없습니다\"\r\n description=\"필터를 조정하거나 날짜 범위를 변경해보세요.\"\r\n icon=\"database-backup\"\r\n size=\"md\"\r\n />\r\n )}\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n {!isLoading &&\r\n rows.map((row) => {\r\n const clickable = Boolean(onRowClick);\r\n const handleRowKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\r\n if (!onRowClick) return;\r\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"Spacebar\") {\r\n event.preventDefault();\r\n onRowClick(row);\r\n }\r\n };\r\n const rowLabel = clickable ? getRowActionLabel(row) : undefined;\r\n return (\r\n <TableRow\r\n key={row.id}\r\n tabIndex={clickable ? 0 : undefined}\r\n role={clickable ? \"button\" : undefined}\r\n onKeyDown={clickable ? handleRowKeyDown : undefined}\r\n onClick={onRowClick ? () => onRowClick(row) : undefined}\r\n aria-label={rowLabel}\r\n aria-describedby={clickable && rowActionHintId ? rowActionHintId : undefined}\r\n className={merge(\r\n \"text-sm focus:outline-none focus-visible:ring-1 focus-visible:ring-cyan-500/70\",\r\n clickable && \"cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-800/60\",\r\n highlightRow?.(row) && \"bg-indigo-50/60 dark:bg-indigo-900/20\"\r\n )}\r\n >\r\n {columnList.map((column) => (\r\n <TableCell\r\n key={column.key}\r\n className={merge(\r\n column.align === \"right\"\r\n ? \"text-right\"\r\n : column.align === \"center\"\r\n ? \"text-center\"\r\n : \"text-left\",\r\n \"align-middle\"\r\n )}\r\n >\r\n {renderCell(column, row)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n );\r\n })}\r\n </TableBody>\r\n </Table>\r\n {!isLoading && hasRows && footer && (\r\n <div className=\"border-t border-slate-100 dark:border-slate-800 bg-slate-50/50 dark:bg-slate-900/50 px-4 py-3 text-sm text-slate-600 dark:text-slate-300\">\r\n {footer}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n {rowActionHint && (\r\n <p id={rowActionHintId} className=\"sr-only\">\r\n {rowActionHint}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nTransactionsTable.displayName = \"TransactionsTable\";\r\n\r\n","import { cva } from 'class-variance-authority'\r\n\r\n/**\r\n * HUA Spring Easing transition — 시그니처 \"쫀득한\" 느낌\r\n * cubic-bezier(0.34, 1.56, 0.64, 1)\r\n */\r\nconst springTransition =\r\n '[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]'\r\n\r\nexport const buttonVariants = cva(\r\n // ── base ──\r\n 'inline-flex items-center justify-center whitespace-nowrap font-medium transition-all duration-200 disabled:pointer-events-none disabled:opacity-50 min-w-fit focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--color-background)]',\r\n {\r\n variants: {\r\n /** 스타일 변형 */\r\n variant: {\r\n default:\r\n 'bg-[var(--color-primary)] text-[var(--color-primary-foreground)] hover:opacity-90',\r\n destructive:\r\n 'bg-[var(--color-destructive)] text-[var(--color-destructive-foreground)] hover:opacity-90 focus-visible:ring-[var(--color-destructive)]',\r\n outline:\r\n 'border-2 border-[var(--color-border)] bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0',\r\n secondary:\r\n 'bg-[var(--color-secondary)] text-[var(--color-secondary-foreground)] hover:opacity-80',\r\n ghost:\r\n 'bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0',\r\n link:\r\n 'bg-transparent text-[var(--color-primary)] underline hover:opacity-80 focus-visible:ring-offset-0',\r\n gradient:\r\n 'bg-gradient-to-r from-[var(--btn-gradient-from,theme(colors.teal.500))] to-[var(--btn-gradient-to,theme(colors.cyan.500))] text-white hover:shadow-lg',\r\n neon:\r\n 'bg-slate-900 dark:bg-slate-950 text-teal-400 border border-teal-500/50 shadow-lg shadow-[var(--btn-neon-glow,theme(colors.teal.500/20%))] hover:shadow-[var(--btn-neon-glow,theme(colors.teal.500/40%))] hover:border-teal-400',\r\n glass:\r\n 'bg-white/50 dark:bg-slate-900/50 backdrop-blur-md border border-slate-200/50 dark:border-slate-700/50 text-slate-900 dark:text-slate-100 hover:bg-white/70 dark:hover:bg-slate-900/70',\r\n },\r\n /** 크기 */\r\n size: {\r\n sm: 'h-8 px-4 py-2 text-sm',\r\n md: 'h-10 px-6 py-2 text-base',\r\n lg: 'h-12 px-8 py-3 text-lg',\r\n xl: 'h-14 px-10 py-4 text-xl',\r\n icon: 'h-10 w-10 p-0',\r\n },\r\n /** 모서리 둥글기 */\r\n rounded: {\r\n sm: 'rounded',\r\n md: 'rounded-md',\r\n lg: 'rounded-lg',\r\n full: 'rounded-full',\r\n },\r\n /** 그림자 */\r\n shadow: {\r\n none: '',\r\n sm: 'shadow-sm',\r\n md: 'shadow-md',\r\n lg: 'shadow-lg',\r\n xl: 'shadow-xl',\r\n },\r\n /** 호버 효과 — springy가 HUA-UI 시그니처 */\r\n hover: {\r\n springy: `hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${springTransition} transform-gpu`,\r\n scale:\r\n 'hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu',\r\n glow: 'hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200',\r\n slide: `hover:-translate-y-0.5 hover:shadow-md ${springTransition} transform-gpu`,\r\n none: '',\r\n },\r\n /** 전체 너비 */\r\n fullWidth: {\r\n true: 'w-full',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'md',\r\n rounded: 'md',\r\n shadow: 'md',\r\n hover: 'springy',\r\n fullWidth: false,\r\n },\r\n }\r\n)\r\n\r\n/** Gradient 프리셋 */\r\nexport const gradientPresets: Record<string, string> = {\r\n blue: 'from-teal-500 to-cyan-500',\r\n purple: 'from-purple-500 to-pink-500',\r\n green: 'from-green-500 to-emerald-500 dark:from-green-400 dark:to-emerald-400',\r\n orange: 'from-orange-500 to-red-500 dark:from-orange-300 dark:to-red-300',\r\n pink: 'from-pink-500 to-rose-500',\r\n}\r\n\r\nexport type { VariantProps } from 'class-variance-authority'\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { clsx } from \"clsx\";\r\n\r\n/**\r\n * Slot 컴포넌트\r\n *\r\n * Radix UI의 asChild 패턴을 구현합니다.\r\n * 자식 요소의 props와 ref를 병합하여 하나의 요소로 렌더링합니다.\r\n *\r\n * @example\r\n * // Button에서 asChild 사용\r\n * <Button asChild>\r\n * <Link href=\"/home\">홈으로</Link>\r\n * </Button>\r\n *\r\n * @see https://www.radix-ui.com/primitives/docs/utilities/slot\r\n */\r\n\r\ntype SlotProps = React.HTMLAttributes<HTMLElement> & {\r\n children?: React.ReactNode;\r\n};\r\n\r\n/**\r\n * 여러 ref를 하나로 합칩니다\r\n */\r\nfunction composeRefs<T>(\r\n ...refs: (React.Ref<T> | undefined)[]\r\n): React.RefCallback<T> {\r\n return (node) => {\r\n refs.forEach((ref) => {\r\n if (typeof ref === \"function\") {\r\n ref(node);\r\n } else if (ref != null) {\r\n (ref as React.MutableRefObject<T | null>).current = node;\r\n }\r\n });\r\n };\r\n}\r\n\r\n/**\r\n * 이벤트 핸들러를 합성합니다\r\n * \r\n * 부모(slot) 핸들러를 먼저 실행하고, 그 다음 자식 핸들러를 실행합니다.\r\n * defaultPrevented가 true이면 자식 핸들러는 실행하지 않습니다.\r\n */\r\nfunction composeEventHandlers<E>(\r\n parentHandler?: (event: E) => void,\r\n childHandler?: (event: E) => void\r\n): (event: E) => void {\r\n return (event) => {\r\n parentHandler?.(event);\r\n if (!(event as unknown as { defaultPrevented: boolean }).defaultPrevented) {\r\n childHandler?.(event);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * className을 병합합니다\r\n */\r\nfunction mergeClassName(\r\n slotClassName?: string,\r\n childClassName?: string\r\n): string | undefined {\r\n if (!slotClassName && !childClassName) return undefined;\r\n return clsx(slotClassName, childClassName);\r\n}\r\n\r\n/**\r\n * style을 병합합니다\r\n */\r\nfunction mergeStyle(\r\n slotStyle?: React.CSSProperties,\r\n childStyle?: React.CSSProperties\r\n): React.CSSProperties | undefined {\r\n if (!slotStyle && !childStyle) return undefined;\r\n return { ...slotStyle, ...childStyle };\r\n}\r\n\r\n/**\r\n * props를 병합합니다 (이벤트 핸들러, className, style 등)\r\n */\r\nfunction mergeProps(\r\n slotProps: Record<string, unknown>,\r\n childProps: Record<string, unknown>\r\n): Record<string, unknown> {\r\n const mergedProps: Record<string, unknown> = { ...slotProps };\r\n\r\n for (const propName in childProps) {\r\n const slotValue = slotProps[propName];\r\n const childValue = childProps[propName];\r\n\r\n // 이벤트 핸들러 병합 (부모(slot) → 자식 순서)\r\n if (/^on[A-Z]/.test(propName)) {\r\n if (slotValue && childValue) {\r\n mergedProps[propName] = composeEventHandlers(\r\n slotValue as (event: unknown) => void,\r\n childValue as (event: unknown) => void\r\n );\r\n } else {\r\n mergedProps[propName] = childValue || slotValue;\r\n }\r\n }\r\n // className 병합\r\n else if (propName === \"className\") {\r\n mergedProps[propName] = mergeClassName(\r\n slotValue as string | undefined,\r\n childValue as string | undefined\r\n );\r\n }\r\n // style 병합\r\n else if (propName === \"style\") {\r\n mergedProps[propName] = mergeStyle(\r\n slotValue as React.CSSProperties | undefined,\r\n childValue as React.CSSProperties | undefined\r\n );\r\n }\r\n // 그 외: 자식 값 우선\r\n else {\r\n mergedProps[propName] = childValue !== undefined ? childValue : slotValue;\r\n }\r\n }\r\n\r\n return mergedProps;\r\n}\r\n\r\n/**\r\n * 유효한 단일 React 요소인지 확인\r\n */\r\nfunction isSlottable(child: React.ReactNode): child is React.ReactElement {\r\n return React.isValidElement(child);\r\n}\r\n\r\n/**\r\n * Slot 컴포넌트\r\n *\r\n * 자식 요소에 부모의 props를 주입합니다.\r\n * asChild 패턴을 구현할 때 사용합니다.\r\n */\r\nconst Slot = React.forwardRef<HTMLElement, SlotProps>(\r\n ({ children, ...slotProps }, forwardedRef) => {\r\n const childArray = React.Children.toArray(children);\r\n\r\n // 유효한 단일 자식이 있는지 확인\r\n if (childArray.length !== 1) {\r\n if (process.env.NODE_ENV !== \"production\") {\r\n console.warn(\r\n \"[Slot] asChild는 정확히 하나의 자식 요소가 필요합니다.\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n const child = childArray[0];\r\n\r\n if (!isSlottable(child)) {\r\n if (process.env.NODE_ENV !== \"production\") {\r\n console.warn(\"[Slot] 자식은 유효한 React 요소여야 합니다.\");\r\n }\r\n return null;\r\n }\r\n\r\n // 자식 요소의 props와 ref 추출\r\n const childProps = child.props as Record<string, unknown>;\r\n const childRef = (child as unknown as { ref?: React.Ref<HTMLElement> }).ref;\r\n\r\n // props와 ref 병합\r\n const mergedProps = mergeProps(slotProps, childProps);\r\n const mergedRef = composeRefs(forwardedRef, childRef);\r\n\r\n return React.cloneElement(child, {\r\n ...mergedProps,\r\n ref: mergedRef,\r\n } as React.Attributes);\r\n }\r\n);\r\n\r\nSlot.displayName = \"Slot\";\r\n\r\nexport { Slot, composeRefs, mergeProps };\r\nexport type { SlotProps };\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../lib/utils\";\r\nimport { buttonVariants, gradientPresets } from \"./Button.variants\";\r\nimport { Slot } from \"../lib/Slot\";\r\n\r\n/**\r\n * 버튼 스타일 변형 / Button style variant\r\n */\r\ntype Variant =\r\n | \"default\" | \"destructive\" | \"outline\" | \"secondary\"\r\n | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\";\r\n\r\n/**\r\n * 버튼 크기 / Button size\r\n */\r\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\";\r\n\r\n/**\r\n * 버튼 모서리 둥글기 / Button border radius\r\n */\r\ntype Rounded = \"sm\" | \"md\" | \"lg\" | \"full\";\r\n\r\n/**\r\n * 버튼 그림자 / Button shadow\r\n */\r\ntype Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n\r\n/**\r\n * 버튼 호버 효과 / Button hover effect\r\n * \"springy\"가 HUA-UI 시그니처 - 공 튕기듯 미세한 반동\r\n */\r\ntype Hover = \"springy\" | \"scale\" | \"glow\" | \"slide\" | \"none\";\r\n\r\n/**\r\n * 그라디언트 색상 이름 / Gradient color name\r\n */\r\ntype GradientName = \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\";\r\n\r\n/**\r\n * Button 컴포넌트의 공통 props / Common props for Button component\r\n */\r\ntype CommonProps = {\r\n variant?: Variant;\r\n size?: Size;\r\n loading?: boolean;\r\n icon?: React.ReactNode;\r\n iconPosition?: \"left\" | \"right\";\r\n gradient?: GradientName;\r\n customGradient?: string;\r\n rounded?: Rounded;\r\n shadow?: Shadow;\r\n hover?: Hover;\r\n fullWidth?: boolean;\r\n iconOnly?: boolean;\r\n \"aria-label\"?: string;\r\n className?: string;\r\n disabled?: boolean;\r\n asChild?: boolean;\r\n};\r\n\r\ntype AnchorProps = CommonProps &\r\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"className\"> & {\r\n href: string;\r\n };\r\n\r\ntype NativeButtonProps = CommonProps &\r\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"className\" | \"type\"> & {\r\n href?: undefined;\r\n };\r\n\r\n/**\r\n * Button 컴포넌트의 props 타입 / Button component props type\r\n * href가 제공되면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\r\n */\r\nexport type ButtonProps = AnchorProps | NativeButtonProps;\r\n\r\ntype AnchorOrButton = HTMLAnchorElement | HTMLButtonElement;\r\n\r\nconst isBrowser = typeof window !== \"undefined\";\r\nfunction useReducedMotion() {\r\n const [reduce, setReduce] = React.useState(false);\r\n React.useEffect(() => {\r\n if (!isBrowser || !(\"matchMedia\" in window)) return;\r\n const mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\r\n const onChange = () => setReduce(!!mq.matches);\r\n onChange();\r\n mq.addEventListener?.(\"change\", onChange);\r\n return () => mq.removeEventListener?.(\"change\", onChange);\r\n }, []);\r\n return reduce;\r\n}\r\n\r\n/**\r\n * Button 컴포넌트 / Button component\r\n *\r\n * 다양한 스타일과 크기를 지원하는 범용 버튼 컴포넌트입니다.\r\n * href prop을 제공하면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\r\n *\r\n * @example\r\n * <Button onClick={() => console.log('클릭')}>클릭하세요</Button>\r\n * <Button variant=\"destructive\" size=\"lg\">삭제</Button>\r\n * <Button variant=\"gradient\" gradient=\"purple\">그라디언트</Button>\r\n * <Button href=\"/about\" variant=\"link\">자세히 보기</Button>\r\n */\r\nconst ButtonInner = React.forwardRef<AnchorOrButton, ButtonProps>(function ButtonInner(\r\n {\r\n variant = \"default\",\r\n size = \"md\",\r\n loading = false,\r\n icon,\r\n iconPosition = \"left\",\r\n gradient = \"blue\",\r\n customGradient,\r\n rounded = \"md\",\r\n shadow = \"md\",\r\n hover = \"springy\",\r\n fullWidth,\r\n iconOnly,\r\n className,\r\n children,\r\n disabled,\r\n asChild = false,\r\n ...rest\r\n },\r\n ref\r\n) {\r\n const reduced = useReducedMotion();\r\n\r\n // gradient variant: 커스텀 그라디언트 클래스 처리\r\n const gradientClass =\r\n variant === \"gradient\"\r\n ? customGradient\r\n ? `bg-gradient-to-r ${customGradient}`\r\n : `bg-gradient-to-r ${gradientPresets[gradient] || gradientPresets.blue}`\r\n : undefined;\r\n\r\n const base = merge(\r\n buttonVariants({\r\n variant,\r\n size,\r\n rounded,\r\n shadow,\r\n hover: reduced ? \"none\" : hover,\r\n fullWidth: fullWidth ?? false,\r\n }),\r\n gradientClass,\r\n className\r\n );\r\n\r\n const Spinner = (\r\n <span role=\"status\" aria-live=\"polite\" className=\"-ml-1 mr-2 inline-flex\">\r\n <svg className=\"animate-spin h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\r\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\r\n </svg>\r\n <span className=\"sr-only\">로딩 중</span>\r\n </span>\r\n );\r\n\r\n const content = (\r\n <>\r\n {loading && Spinner}\r\n {!loading && icon && iconPosition === \"left\" && <span className=\"mr-2\">{icon}</span>}\r\n {children}\r\n {!loading && icon && iconPosition === \"right\" && <span className=\"ml-2\">{icon}</span>}\r\n </>\r\n );\r\n\r\n if (iconOnly && !(\"aria-label\" in rest) && process.env.NODE_ENV !== \"production\") {\r\n console.warn(\"[Button] iconOnly 사용 시 aria-label을 제공하세요.\");\r\n }\r\n\r\n // asChild 모드: Slot을 사용하여 자식 요소에 props 병합\r\n if (asChild) {\r\n const slotProps = {\r\n className: base,\r\n ref,\r\n disabled: disabled || loading,\r\n \"aria-busy\": loading || undefined,\r\n \"aria-disabled\": (disabled || loading) || undefined,\r\n ...rest,\r\n };\r\n return <Slot {...slotProps}>{children}</Slot>;\r\n }\r\n\r\n // 앵커 모드\r\n if (\"href\" in rest && rest.href) {\r\n const { onClick, target, rel, href, \"aria-label\": _ariaLabel, className: anchorClassName, ...anchorProps } = rest as AnchorProps;\r\n const isDisabled = !!disabled || loading;\r\n\r\n const handleAnchorClick: React.MouseEventHandler<HTMLAnchorElement> = (e) => {\r\n if (isDisabled) { e.preventDefault(); e.stopPropagation(); return; }\r\n onClick?.(e);\r\n };\r\n\r\n return (\r\n <a\r\n ref={ref as React.Ref<HTMLAnchorElement>}\r\n href={href}\r\n className={merge(base, anchorClassName)}\r\n onClick={handleAnchorClick}\r\n aria-busy={loading || undefined}\r\n aria-disabled={isDisabled || undefined}\r\n tabIndex={isDisabled ? -1 : anchorProps.tabIndex}\r\n target={target}\r\n rel={target === \"_blank\" ? rel ?? \"noopener noreferrer\" : rel}\r\n {...anchorProps}\r\n >\r\n {content}\r\n </a>\r\n );\r\n }\r\n\r\n // 버튼 모드\r\n const { className: buttonClassName, ...btnProps } = rest as NativeButtonProps;\r\n const isDisabled = !!disabled || loading;\r\n return (\r\n <button\r\n ref={ref as React.Ref<HTMLButtonElement>}\r\n className={merge(base, buttonClassName)}\r\n type=\"button\"\r\n disabled={isDisabled}\r\n aria-busy={loading || undefined}\r\n aria-disabled={isDisabled || undefined}\r\n {...btnProps}\r\n >\r\n {content}\r\n </button>\r\n );\r\n});\r\n\r\nButtonInner.displayName = \"Button\";\r\n\r\nexport const Button = ButtonInner;\r\n","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\n\r\n/**\r\n * Dropdown 컴포넌트의 props / Dropdown component props\r\n * @typedef {Object} DropdownProps\r\n * @property {React.ReactNode} trigger - Dropdown을 열기 위한 트리거 요소 / Trigger element to open dropdown\r\n * @property {React.ReactNode} children - Dropdown 내용 / Dropdown content\r\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\r\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\r\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [placement=\"bottom\"] - Dropdown 표시 위치 / Dropdown display position\r\n * @property {\"start\" | \"center\" | \"end\"} [align=\"start\"] - Dropdown 정렬 / Dropdown alignment\r\n * @property {number} [offset=8] - 트리거와 Dropdown 사이 간격 (px) / Spacing between trigger and dropdown (px)\r\n * @property {boolean} [disabled=false] - Dropdown 비활성화 여부 / Disable dropdown\r\n * @property {boolean} [showArrow=true] - 화살표 표시 여부 / Show arrow\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {\r\n trigger: React.ReactNode\r\n children: React.ReactNode\r\n open?: boolean\r\n onOpenChange?: (open: boolean) => void\r\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\"\r\n align?: \"start\" | \"center\" | \"end\"\r\n offset?: number\r\n disabled?: boolean\r\n showArrow?: boolean\r\n}\r\n\r\n/**\r\n * Dropdown 컴포넌트 / Dropdown component\r\n * \r\n * 트리거 요소를 클릭하면 표시되는 드롭다운 메뉴 컴포넌트입니다.\r\n * 외부 클릭 시 자동으로 닫히며, 뷰포트 경계를 자동으로 감지하여 위치를 조정합니다.\r\n * \r\n * Dropdown menu component that appears when the trigger element is clicked.\r\n * Automatically closes on outside click and adjusts position by detecting viewport boundaries.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <Dropdown trigger={<Button>메뉴</Button>}>\r\n * <Menu>\r\n * <MenuItem>항목 1</MenuItem>\r\n * <MenuItem>항목 2</MenuItem>\r\n * </Menu>\r\n * </Dropdown>\r\n * \r\n * @example\r\n * // 제어 모드, 화살표 없음 / Controlled mode, no arrow\r\n * const [open, setOpen] = useState(false)\r\n * <Dropdown \r\n * open={open}\r\n * onOpenChange={setOpen}\r\n * trigger={<Button>제어 모드</Button>}\r\n * placement=\"top\"\r\n * showArrow={false}\r\n * >\r\n * <div className=\"p-4\">내용</div>\r\n * </Dropdown>\r\n * \r\n * @param {DropdownProps} props - Dropdown 컴포넌트의 props / Dropdown component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} Dropdown 컴포넌트 / Dropdown component\r\n */\r\nconst Dropdown = React.forwardRef<HTMLDivElement, DropdownProps>(\r\n ({ \r\n className, \r\n trigger,\r\n children,\r\n open: controlledOpen,\r\n onOpenChange,\r\n placement = \"bottom\",\r\n align = \"start\",\r\n offset = 8,\r\n disabled = false,\r\n showArrow = true,\r\n ...props \r\n }, ref) => {\r\n const [internalOpen, setInternalOpen] = React.useState(false)\r\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\r\n const triggerRef = React.useRef<HTMLDivElement>(null)\r\n const dropdownRef = React.useRef<HTMLDivElement>(null)\r\n const isControlled = controlledOpen !== undefined\r\n const isOpen = isControlled ? controlledOpen : internalOpen\r\n\r\n const handleOpenChange = React.useCallback((newOpen: boolean) => {\r\n if (disabled) return\r\n\r\n if (!isControlled) {\r\n setInternalOpen(newOpen)\r\n }\r\n onOpenChange?.(newOpen)\r\n }, [disabled, isControlled, onOpenChange])\r\n\r\n const handleTriggerClick = () => {\r\n handleOpenChange(!isOpen)\r\n }\r\n\r\n const updatePosition = React.useCallback(() => {\r\n if (!triggerRef.current || !dropdownRef.current) return\r\n\r\n const triggerRect = triggerRef.current.getBoundingClientRect()\r\n const dropdownRect = dropdownRef.current.getBoundingClientRect()\r\n const viewportWidth = window.innerWidth\r\n const viewportHeight = window.innerHeight\r\n\r\n let x = 0\r\n let y = 0\r\n\r\n // 기본 위치 계산\r\n switch (placement) {\r\n case \"top\":\r\n x = triggerRect.left\r\n y = triggerRect.top - offset\r\n break\r\n case \"bottom\":\r\n x = triggerRect.left\r\n y = triggerRect.bottom + offset\r\n break\r\n case \"left\":\r\n x = triggerRect.left - offset\r\n y = triggerRect.top\r\n break\r\n case \"right\":\r\n x = triggerRect.right + offset\r\n y = triggerRect.top\r\n break\r\n }\r\n\r\n // 정렬 조정\r\n switch (align) {\r\n case \"center\":\r\n if (placement === \"top\" || placement === \"bottom\") {\r\n x = triggerRect.left + triggerRect.width / 2 - dropdownRect.width / 2\r\n } else {\r\n y = triggerRect.top + triggerRect.height / 2 - dropdownRect.height / 2\r\n }\r\n break\r\n case \"end\":\r\n if (placement === \"top\" || placement === \"bottom\") {\r\n x = triggerRect.right - dropdownRect.width\r\n } else {\r\n y = triggerRect.bottom - dropdownRect.height\r\n }\r\n break\r\n case \"start\":\r\n default:\r\n // 기본값은 이미 start 정렬\r\n break\r\n }\r\n\r\n // 뷰포트 경계 확인 및 조정\r\n if (x < 8) x = 8 // 8px 여백\r\n if (x + dropdownRect.width > viewportWidth - 8) {\r\n x = viewportWidth - dropdownRect.width - 8 // 8px 여백\r\n }\r\n if (y < 8) y = 8 // 8px 여백\r\n if (y + dropdownRect.height > viewportHeight - 8) {\r\n y = viewportHeight - dropdownRect.height - 8 // 8px 여백\r\n }\r\n\r\n setCoords({ x, y })\r\n }, [placement, align, offset])\r\n\r\n React.useEffect(() => {\r\n if (isOpen) {\r\n updatePosition()\r\n window.addEventListener('resize', updatePosition)\r\n window.addEventListener('scroll', updatePosition)\r\n \r\n return () => {\r\n window.removeEventListener('resize', updatePosition)\r\n window.removeEventListener('scroll', updatePosition)\r\n }\r\n }\r\n }, [isOpen, updatePosition])\r\n\r\n React.useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n triggerRef.current &&\r\n dropdownRef.current &&\r\n !triggerRef.current.contains(event.target as Node) &&\r\n !dropdownRef.current.contains(event.target as Node)\r\n ) {\r\n handleOpenChange(false)\r\n }\r\n }\r\n\r\n if (isOpen) {\r\n document.addEventListener('mousedown', handleClickOutside)\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside)\r\n }\r\n }\r\n }, [isOpen, handleOpenChange])\r\n\r\n const getPlacementClasses = () => {\r\n switch (placement) {\r\n case \"top\":\r\n return \"bottom-full left-0 mb-2\" // 8px 간격\r\n case \"bottom\":\r\n return \"top-full left-0 mt-2\" // 8px 간격\r\n case \"left\":\r\n return \"right-full top-0 mr-2\" // 8px 간격\r\n case \"right\":\r\n return \"left-full top-0 ml-2\" // 8px 간격\r\n default:\r\n return \"top-full left-0 mt-2\"\r\n }\r\n }\r\n\r\n const getArrowClasses = () => {\r\n switch (placement) {\r\n case \"top\":\r\n return \"top-full left-4 -translate-x-1/2 border-t-gray-100 dark:border-t-gray-800\"\r\n case \"bottom\":\r\n return \"bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800\"\r\n case \"left\":\r\n return \"left-full top-4 -translate-y-1/2 border-l-gray-100 dark:border-l-gray-800\"\r\n case \"right\":\r\n return \"right-full top-4 -translate-y-1/2 border-r-gray-100 dark:border-r-gray-800\"\r\n default:\r\n return \"bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800\"\r\n }\r\n }\r\n\r\n return (\r\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\r\n {/* 트리거 */}\r\n <div\r\n ref={triggerRef}\r\n onClick={handleTriggerClick}\r\n className=\"inline-block cursor-pointer\"\r\n >\r\n {trigger}\r\n </div>\r\n\r\n {/* 드롭다운 */}\r\n {/* CSS 변수 기반 배경색 (Tailwind v4 dark: + bg-* 충돌 우회) */}\r\n {isOpen && (\r\n <div\r\n ref={dropdownRef}\r\n className={merge(\r\n \"absolute z-50 bg-[var(--dropdown-bg)] rounded-lg shadow-xl backdrop-blur-sm\",\r\n \"min-w-[200px] py-2\",\r\n getPlacementClasses()\r\n )}\r\n style={{\r\n transform: `translate(${coords.x}px, ${coords.y}px)`,\r\n boxShadow: \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\r\n }}\r\n >\r\n {/* 화살표 */}\r\n {showArrow && (\r\n <div\r\n className={merge(\r\n \"absolute w-0 h-0 border-4 border-transparent\",\r\n getArrowClasses()\r\n )}\r\n />\r\n )}\r\n \r\n {/* 내용 */}\r\n <div className=\"relative z-10\">\r\n {children}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n)\r\nDropdown.displayName = \"Dropdown\"\r\n\r\n// 드롭다운 아이템 컴포넌트들\r\nexport interface DropdownItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n icon?: React.ReactNode\r\n variant?: \"default\" | \"destructive\" | \"disabled\"\r\n}\r\n\r\nconst DropdownItem = React.forwardRef<HTMLButtonElement, DropdownItemProps>(\r\n ({ \r\n className, \r\n icon,\r\n variant = \"default\",\r\n children,\r\n disabled,\r\n ...props \r\n }, ref) => {\r\n const getVariantClasses = () => {\r\n switch (variant) {\r\n case \"destructive\":\r\n return \"text-destructive hover:bg-destructive/10\"\r\n case \"disabled\":\r\n return \"text-muted-foreground cursor-not-allowed\"\r\n default:\r\n return \"text-foreground hover:bg-muted\"\r\n }\r\n }\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n className={merge(\r\n \"w-full flex items-center gap-3 px-4 py-3 text-sm font-medium transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:bg-muted\", // 16px, 12px 패딩\r\n getVariantClasses(),\r\n className\r\n )}\r\n disabled={disabled || variant === \"disabled\"}\r\n {...props}\r\n >\r\n {icon && (\r\n <div className=\"flex-shrink-0 w-4 h-4\">\r\n {icon}\r\n </div>\r\n )}\r\n <span className=\"flex-1 text-left\">{children}</span>\r\n </button>\r\n )\r\n }\r\n)\r\nDropdownItem.displayName = \"DropdownItem\"\r\n\r\nexport interface DropdownSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\r\n\r\nconst DropdownSeparator = React.forwardRef<HTMLDivElement, DropdownSeparatorProps>(\r\n ({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={merge(\"h-px bg-border my-2\", className)} // 8px 여백\r\n {...props}\r\n />\r\n )\r\n)\r\nDropdownSeparator.displayName = \"DropdownSeparator\"\r\n\r\nexport interface DropdownLabelProps extends React.HTMLAttributes<HTMLDivElement> {}\r\n\r\nconst DropdownLabel = React.forwardRef<HTMLDivElement, DropdownLabelProps>(\r\n ({ className, children, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={merge(\"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\", className)} // 16px, 8px 패딩\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n)\r\nDropdownLabel.displayName = \"DropdownLabel\"\r\n\r\n// 편의 컴포넌트들\r\nconst DropdownMenu = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\r\n ({ className, children, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={merge(\"py-1\", className)} // 4px 패딩\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n)\r\nDropdownMenu.displayName = \"DropdownMenu\"\r\n\r\nconst DropdownGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\r\n ({ className, children, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={merge(\"space-y-1\", className)} // 4px 간격\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n)\r\nDropdownGroup.displayName = \"DropdownGroup\"\r\n\r\nexport { Dropdown, DropdownItem, DropdownSeparator, DropdownLabel, DropdownMenu, DropdownGroup } ","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport { Button } from \"../Button\";\r\nimport { Dropdown, DropdownItem, DropdownMenu } from \"../Dropdown\";\r\nimport { Icon } from \"../Icon\";\r\nimport type { IconName } from \"../../lib/icons\";\r\n\r\ntype ToolbarVariant = \"plain\" | \"cards\";\r\n\r\n/**\r\n * 툴바 액션 인터페이스 / ToolbarAction interface\r\n * @typedef {Object} ToolbarAction\r\n * @property {string} label - 액션 라벨 / Action label\r\n * @property {() => void} [onClick] - 클릭 핸들러 / Click handler\r\n * @property {string} [href] - 링크 URL / Link URL\r\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\r\n * @property {\"primary\" | \"secondary\" | \"ghost\"} [appearance=\"secondary\"] - 액션 스타일 / Action style\r\n * @property {boolean} [loading] - 로딩 상태 / Loading state\r\n */\r\nexport interface ToolbarAction {\r\n label: string;\r\n onClick?: () => void;\r\n href?: string;\r\n icon?: IconName | React.ReactNode;\r\n appearance?: \"primary\" | \"secondary\" | \"ghost\";\r\n loading?: boolean;\r\n}\r\n\r\n/**\r\n * 날짜 프리셋 인터페이스 / DatePreset interface\r\n * @typedef {Object} DatePreset\r\n * @property {string} label - 프리셋 라벨 / Preset label\r\n * @property {string} value - 프리셋 값 / Preset value\r\n */\r\nexport interface DatePreset {\r\n label: string;\r\n value: string;\r\n}\r\n\r\n/**\r\n * 날짜 범위 설정 인터페이스 / DateRangeConfig interface\r\n * @typedef {Object} DateRangeConfig\r\n * @property {{ from: Date; to: Date } | null} value - 날짜 범위 값 / Date range value\r\n * @property {DatePreset[]} [presets] - 날짜 프리셋 배열 / Date preset array\r\n * @property {(preset: DatePreset) => void} [onSelectPreset] - 프리셋 선택 핸들러 / Preset selection handler\r\n * @property {() => void} [onCustomRange] - 커스텀 범위 선택 핸들러 / Custom range selection handler\r\n * @property {string} [display] - 표시 텍스트 / Display text\r\n */\r\nexport interface DateRangeConfig {\r\n value: { from: Date; to: Date } | null;\r\n presets?: DatePreset[];\r\n onSelectPreset?: (preset: DatePreset) => void;\r\n onCustomRange?: () => void;\r\n display?: string;\r\n}\r\n\r\n/**\r\n * DashboardToolbar 컴포넌트의 props / DashboardToolbar component props\r\n * @typedef {Object} DashboardToolbarProps\r\n * @property {React.ReactNode} [title] - 툴바 제목 / Toolbar title\r\n * @property {React.ReactNode} [description] - 툴바 설명 / Toolbar description\r\n * @property {React.ReactNode} [meta] - 메타 정보 / Meta information\r\n * @property {\"plain\" | \"cards\"} [variant=\"cards\"] - 툴바 스타일 변형 / Toolbar style variant\r\n * @property {DateRangeConfig} [dateRange] - 날짜 범위 설정 / Date range configuration\r\n * @property {React.ReactNode} [filters] - 필터 컴포넌트 / Filter component\r\n * @property {ToolbarAction[]} [actions] - 액션 버튼 배열 / Action buttons array\r\n * @property {() => void} [onRefresh] - 새로고침 핸들러 / Refresh handler\r\n * @property {string} [lastUpdated] - 마지막 업데이트 시간 / Last updated time\r\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, \"title\">}\r\n */\r\nexport interface DashboardToolbarProps\r\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\r\n title?: React.ReactNode;\r\n description?: React.ReactNode;\r\n meta?: React.ReactNode;\r\n variant?: ToolbarVariant;\r\n dateRange?: DateRangeConfig;\r\n filters?: React.ReactNode;\r\n actions?: ToolbarAction[];\r\n onRefresh?: () => void;\r\n lastUpdated?: string;\r\n}\r\n\r\nconst actionAppearance = {\r\n primary: \"bg-primary text-white hover:bg-primary/90\",\r\n secondary:\r\n \"border border-slate-200 text-slate-800 hover:bg-slate-50 dark:border-slate-700 dark:text-white dark:hover:bg-slate-800\",\r\n ghost: \"text-slate-600 hover:text-slate-900 dark:text-slate-300 dark:hover:text-white\",\r\n};\r\n\r\nconst ToolbarButton: React.FC<ToolbarAction> = ({\r\n label,\r\n onClick,\r\n href,\r\n icon,\r\n appearance = \"secondary\",\r\n loading,\r\n}) => {\r\n const content = (\r\n <>\r\n {icon &&\r\n (typeof icon === \"string\" ? (\r\n <Icon name={icon as IconName} className=\"h-4 w-4\" />\r\n ) : (\r\n icon\r\n ))}\r\n <span>{label}</span>\r\n </>\r\n );\r\n\r\n const className = merge(\r\n \"inline-flex items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-colors\",\r\n actionAppearance[appearance]\r\n );\r\n\r\n if (href) {\r\n return (\r\n <a className={className} href={href}>\r\n {content}\r\n </a>\r\n );\r\n }\r\n\r\n return (\r\n <button className={className} onClick={onClick} disabled={loading}>\r\n {content}\r\n </button>\r\n );\r\n};\r\n\r\n/**\r\n * DashboardToolbar 컴포넌트\r\n * \r\n * 대시보드 상단 툴바 컴포넌트입니다.\r\n * 제목, 설명, 필터, 날짜 범위 선택, 액션 버튼 등을 포함할 수 있습니다.\r\n * \r\n * Top toolbar component for dashboards.\r\n * Can include title, description, filters, date range selection, and action buttons.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <DashboardToolbar\r\n * title=\"거래 대시보드\"\r\n * description=\"전체 거래 현황을 확인하세요\"\r\n * actions={[\r\n * { label: \"내보내기\", icon: \"download\", onClick: handleExport },\r\n * { label: \"필터\", icon: \"funnel\", onClick: handleFilter }\r\n * ]}\r\n * onRefresh={handleRefresh}\r\n * />\r\n * \r\n * @example\r\n * // 날짜 범위 포함 / With date range\r\n * <DashboardToolbar\r\n * title=\"매출 분석\"\r\n * dateRange={{\r\n * value: { from: new Date(\"2024-01-01\"), to: new Date(\"2024-12-31\") },\r\n * presets: [\r\n * { label: \"오늘\", value: \"today\" },\r\n * { label: \"이번 주\", value: \"thisWeek\" },\r\n * { label: \"이번 달\", value: \"thisMonth\" }\r\n * ],\r\n * onSelectPreset: handlePresetSelect,\r\n * onCustomRange: handleCustomRange\r\n * }}\r\n * />\r\n * \r\n * @param {DashboardToolbarProps} props - DashboardToolbar 컴포넌트의 props / DashboardToolbar component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} DashboardToolbar 컴포넌트 / DashboardToolbar component\r\n */\r\nexport const DashboardToolbar = React.forwardRef<HTMLDivElement, DashboardToolbarProps>(\r\n (\r\n {\r\n title,\r\n description,\r\n meta,\r\n variant = \"cards\",\r\n dateRange,\r\n filters,\r\n actions,\r\n onRefresh,\r\n lastUpdated,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const containerClasses = merge(\r\n \"w-full\",\r\n variant === \"cards\"\r\n ? \"rounded-2xl border border-slate-200/70 dark:border-slate-800 bg-white dark:bg-slate-900 shadow-sm\"\r\n : \"\"\r\n );\r\n\r\n return (\r\n <div ref={ref} className={merge(containerClasses, className)} {...props}>\r\n <div className=\"flex flex-col gap-4 px-4 py-4 sm:px-6 sm:py-5\">\r\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\r\n <div>\r\n {title && (\r\n <div className=\"text-xl font-semibold text-slate-900 dark:text-slate-50\">\r\n {title}\r\n </div>\r\n )}\r\n {description && (\r\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">{description}</p>\r\n )}\r\n </div>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {dateRange && (\r\n <Dropdown\r\n trigger={\r\n <Button \r\n variant=\"outline\" \r\n size=\"sm\" \r\n className=\"gap-2\"\r\n aria-label={`날짜 범위 선택: ${dateRange.display || \"날짜 범위\"}`}\r\n >\r\n <Icon name=\"calendar\" className=\"h-4 w-4\" />\r\n {dateRange.display || \"날짜 범위\"}\r\n </Button>\r\n }\r\n >\r\n <DropdownMenu className=\"max-h-64 overflow-auto\">\r\n {dateRange.presets?.map((preset) => (\r\n <DropdownItem\r\n key={preset.value}\r\n onClick={() => dateRange.onSelectPreset?.(preset)}\r\n >\r\n {preset.label}\r\n </DropdownItem>\r\n ))}\r\n {dateRange.onCustomRange && (\r\n <DropdownItem onClick={dateRange.onCustomRange}>\r\n 사용자 지정...\r\n </DropdownItem>\r\n )}\r\n </DropdownMenu>\r\n </Dropdown>\r\n )}\r\n {onRefresh && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"gap-2 text-slate-500 hover:text-slate-900 dark:text-slate-400 dark:hover:text-white\"\r\n onClick={onRefresh}\r\n aria-label=\"데이터 새로고침\"\r\n >\r\n <Icon name=\"refresh\" className=\"h-4 w-4\" />\r\n 새로고침\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {(filters || meta || lastUpdated) && (\r\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between border-t border-slate-100 dark:border-slate-800 pt-3\">\r\n <div className=\"flex flex-wrap items-center gap-3 text-sm text-slate-600 dark:text-slate-300\">\r\n {filters}\r\n {meta}\r\n </div>\r\n {lastUpdated && (\r\n <span className=\"text-xs text-slate-400\">업데이트: {lastUpdated}</span>\r\n )}\r\n </div>\r\n )}\r\n\r\n {actions && actions.length > 0 && (\r\n <div className=\"flex flex-wrap justify-end gap-2 border-t border-slate-100 dark:border-slate-800 pt-4\">\r\n {actions.map((action) => (\r\n <ToolbarButton key={action.label} {...action} />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nDashboardToolbar.displayName = \"DashboardToolbar\";\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\n\r\nexport type TrendSeriesPalette = \"approval\" | \"settlement\" | \"custom\";\r\n\r\n/**\r\n * 트렌드 시리즈 인터페이스\r\n * @typedef {Object} TrendSeries\r\n * @property {string} label - 시리즈 라벨\r\n * @property {number[]} data - 데이터 배열\r\n * @property {string} [color] - 커스텀 색상\r\n * @property {boolean} [area] - 영역 채우기 여부\r\n */\r\nexport interface TrendSeries {\r\n label: string;\r\n data: number[];\r\n color?: string;\r\n area?: boolean;\r\n}\r\n\r\n/**\r\n * TrendChart 컴포넌트의 props / TrendChart component props\r\n * @typedef {Object} TrendChartProps\r\n * @property {TrendSeries[]} series - 시리즈 배열 / Series array\r\n * @property {string[]} categories - 카테고리 배열 / Categories array\r\n * @property {TrendSeriesPalette} [palette=\"approval\"] - 색상 팔레트 / Color palette\r\n * @property {number} [height=200] - 차트 높이 (px) / Chart height (px)\r\n * @property {boolean} [showLegend=true] - 범례 표시 여부 / Show legend\r\n * @property {boolean} [showDots=true] - 점 표시 여부 / Show dots\r\n * @property {boolean} [showTooltip=false] - 툴팁 표시 여부 / Show tooltip\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface TrendChartProps extends React.HTMLAttributes<HTMLDivElement> {\r\n series: TrendSeries[];\r\n categories: string[];\r\n palette?: TrendSeriesPalette;\r\n height?: number;\r\n showLegend?: boolean;\r\n showDots?: boolean;\r\n showTooltip?: boolean;\r\n}\r\n\r\nconst PRESET_PALETTES: Record<TrendSeriesPalette, string[]> = {\r\n approval: [\"#22c55e\", \"#f97316\", \"#ef4444\"],\r\n settlement: [\"#6366f1\", \"#0ea5e9\", \"#14b8a6\"],\r\n custom: [\"#0ea5e9\"],\r\n};\r\n\r\n/**\r\n * TrendChart 컴포넌트\r\n * \r\n * 트렌드 데이터를 선 그래프로 표시하는 컴포넌트입니다.\r\n * 여러 시리즈를 동시에 표시할 수 있으며, 영역 채우기 옵션을 제공합니다.\r\n * \r\n * Line chart component that displays trend data.\r\n * Can display multiple series simultaneously with area fill option.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <TrendChart\r\n * series={[\r\n * { label: \"승인\", data: [10, 20, 15, 30, 25] },\r\n * { label: \"거부\", data: [5, 10, 8, 15, 12] }\r\n * ]}\r\n * categories={[\"월\", \"화\", \"수\", \"목\", \"금\"]}\r\n * palette=\"approval\"\r\n * />\r\n * \r\n * @example\r\n * // 영역 채우기와 커스텀 색상 / Area fill and custom color\r\n * <TrendChart\r\n * series={[\r\n * { label: \"정산\", data: [100, 200, 150], area: true, color: \"#6366f1\" }\r\n * ]}\r\n * categories={[\"1월\", \"2월\", \"3월\"]}\r\n * palette=\"settlement\"\r\n * showDots={true}\r\n * showTooltip={true}\r\n * />\r\n * \r\n * @param {TrendChartProps} props - TrendChart 컴포넌트의 props / TrendChart component props\r\n * @returns {JSX.Element} TrendChart 컴포넌트 / TrendChart component\r\n */\r\nexport const TrendChart: React.FC<TrendChartProps> = ({\r\n series,\r\n categories,\r\n palette = \"approval\",\r\n height = 200,\r\n showLegend = true,\r\n showDots = true,\r\n showTooltip = false,\r\n className,\r\n ...props\r\n}) => {\r\n const paletteColors = PRESET_PALETTES[palette] || PRESET_PALETTES.approval;\r\n const safeCategories = categories.length > 0 ? categories : [\"—\"];\r\n const denominator = Math.max(safeCategories.length - 1, 1);\r\n\r\n const maxValue = Math.max(...series.flatMap((s) => s.data), 10);\r\n\r\n const _chartId = React.useId();\r\n const chartLabel = series.length > 0\r\n ? `트렌드 차트 - ${series.length}개 시리즈, ${safeCategories.length}개 카테고리, 최대값 ${maxValue.toLocaleString()}`\r\n : `트렌드 차트 - ${safeCategories.length}개 카테고리`;\r\n\r\n return (\r\n <div\r\n role=\"img\"\r\n aria-label={chartLabel}\r\n className={merge(\r\n \"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900 p-4\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div className=\"relative\" style={{ height }}>\r\n {series.map((s, index) => {\r\n const color = s.color || paletteColors[index % paletteColors.length];\r\n const points = s.data.map((point, i) => ({\r\n x: (i / denominator) * 100,\r\n y: 100 - (point / maxValue) * 100,\r\n value: point,\r\n label: safeCategories[i] ?? safeCategories[safeCategories.length - 1] ?? \"\",\r\n }));\r\n\r\n if (points.length === 0) {\r\n return null;\r\n }\r\n\r\n const pathData = points\r\n .map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${p.x},${p.y}`)\r\n .join(\" \");\r\n\r\n const areaData = `${pathData} L 100,100 L 0,100 Z`;\r\n\r\n return (\r\n <svg\r\n key={s.label}\r\n viewBox=\"0 0 100 100\"\r\n preserveAspectRatio=\"none\"\r\n className=\"absolute inset-0 h-full w-full\"\r\n >\r\n {s.area && (\r\n <path\r\n d={areaData}\r\n fill={color}\r\n opacity={0.08}\r\n stroke=\"none\"\r\n />\r\n )}\r\n <path\r\n d={pathData}\r\n fill=\"none\"\r\n stroke={color}\r\n strokeWidth={2}\r\n strokeLinejoin=\"round\"\r\n strokeLinecap=\"round\"\r\n />\r\n {showDots &&\r\n points.map((p, i) => (\r\n <circle\r\n key={`${s.label}-${i}`}\r\n cx={p.x}\r\n cy={p.y}\r\n r={1.2}\r\n fill=\"#fff\"\r\n stroke={color}\r\n strokeWidth={0.8}\r\n >\r\n {showTooltip && (\r\n <title>\r\n {s.label} · {p.label}: {p.value.toLocaleString()}\r\n </title>\r\n )}\r\n </circle>\r\n ))}\r\n </svg>\r\n );\r\n })}\r\n <div className=\"absolute inset-x-0 bottom-0 flex text-[10px] text-slate-400\">\r\n {safeCategories.map((label, _idx) => (\r\n <div key={label} className=\"flex-1 text-center\">\r\n {label}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {showLegend && (\r\n <div \r\n className=\"mt-4 flex flex-wrap gap-4 text-sm text-slate-600 dark:text-slate-300\"\r\n role=\"list\"\r\n aria-label=\"차트 범례\"\r\n >\r\n {series.map((s, index) => {\r\n const color = s.color || paletteColors[index % paletteColors.length];\r\n return (\r\n <div \r\n key={s.label} \r\n role=\"listitem\"\r\n className=\"flex items-center gap-2\"\r\n tabIndex={0}\r\n aria-label={`${s.label} 시리즈`}\r\n onKeyDown={(e) => {\r\n // 키보드 네비게이션 지원\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n // 범례 클릭 시 해당 시리즈 강조 등의 기능 추가 가능\r\n }\r\n }}\r\n >\r\n <span\r\n className=\"inline-block h-2 w-2 rounded-full\"\r\n style={{ backgroundColor: color }}\r\n aria-hidden=\"true\"\r\n />\r\n <span>{s.label}</span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nTrendChart.displayName = \"TrendChart\";\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\n\r\n/**\r\n * BarChartData 인터페이스 / BarChartData interface\r\n * @typedef {Object} BarChartData\r\n * @property {string} label - 막대 라벨 / Bar label\r\n * @property {number} value - 막대 값 / Bar value\r\n * @property {string} [color] - 커스텀 색상 / Custom color\r\n * @property {boolean} [highlight] - 강조 표시 여부 / Highlight display\r\n */\r\nexport interface BarChartData {\r\n label: string;\r\n value: number;\r\n color?: string;\r\n highlight?: boolean;\r\n}\r\n\r\n/**\r\n * BarChart 컴포넌트의 props / BarChart component props\r\n * @typedef {Object} BarChartProps\r\n * @property {BarChartData[]} data - 차트 데이터 배열 / Chart data array\r\n * @property {string} [title] - 차트 제목 / Chart title\r\n * @property {number} [height=200] - 차트 높이 (px) / Chart height (px)\r\n * @property {boolean} [showValues=true] - 값 표시 여부 / Show values\r\n * @property {boolean} [showLabels=true] - 라벨 표시 여부 / Show labels\r\n * @property {number} [maxValue] - 최대값 (자동 계산 시 생략) / Maximum value (omit for auto-calculation)\r\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [colorScheme=\"blue\"] - 색상 스킴 / Color scheme\r\n * @property {\"default\" | \"gradient\"} [variant=\"gradient\"] - 차트 스타일 변형 / Chart style variant\r\n * @property {boolean} [showGrid=true] - 그리드 표시 여부 / Show grid\r\n * @property {boolean} [showTooltip] - 툴팁 표시 여부 / Show tooltip\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface BarChartProps extends React.HTMLAttributes<HTMLDivElement> {\r\n data: BarChartData[];\r\n title?: string;\r\n height?: number;\r\n showValues?: boolean;\r\n showLabels?: boolean;\r\n maxValue?: number;\r\n colorScheme?: \"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\";\r\n variant?: \"default\" | \"gradient\";\r\n showGrid?: boolean;\r\n showTooltip?: boolean;\r\n}\r\n\r\nconst colorSchemes = {\r\n blue: {\r\n default: \"bg-indigo-500\",\r\n gradient: \"from-indigo-500 to-cyan-600\",\r\n highlight: \"from-cyan-600 to-cyan-700\",\r\n },\r\n purple: {\r\n default: \"bg-purple-500\",\r\n gradient: \"from-purple-500 to-purple-600\",\r\n highlight: \"from-purple-600 to-purple-700\",\r\n },\r\n green: {\r\n default: \"bg-green-500\",\r\n gradient: \"from-green-500 to-green-600\",\r\n highlight: \"from-green-600 to-green-700\",\r\n },\r\n orange: {\r\n default: \"bg-orange-500\",\r\n gradient: \"from-orange-500 to-orange-600\",\r\n highlight: \"from-orange-600 to-orange-700\",\r\n },\r\n red: {\r\n default: \"bg-red-500\",\r\n gradient: \"from-red-500 to-red-600\",\r\n highlight: \"from-red-600 to-red-700\",\r\n },\r\n indigo: {\r\n default: \"bg-indigo-500\",\r\n gradient: \"from-indigo-500 to-indigo-600\",\r\n highlight: \"from-indigo-600 to-indigo-700\",\r\n },\r\n pink: {\r\n default: \"bg-pink-500\",\r\n gradient: \"from-pink-500 to-pink-600\",\r\n highlight: \"from-pink-600 to-pink-700\",\r\n },\r\n gray: {\r\n default: \"bg-gray-500\",\r\n gradient: \"from-gray-500 to-gray-600\",\r\n highlight: \"from-gray-600 to-gray-700\",\r\n },\r\n};\r\n\r\n/**\r\n * BarChart 컴포넌트\r\n * \r\n * 막대 차트를 표시하는 컴포넌트입니다.\r\n * 다양한 색상 스킴과 그라디언트 스타일을 지원합니다.\r\n * \r\n * Bar chart component that displays data in bar format.\r\n * Supports various color schemes and gradient styles.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <BarChart\r\n * data={[\r\n * { label: \"월\", value: 100 },\r\n * { label: \"화\", value: 200 },\r\n * { label: \"수\", value: 150 }\r\n * ]}\r\n * title=\"주간 매출\"\r\n * />\r\n * \r\n * @example\r\n * // 커스텀 색상 및 강조 / Custom color and highlight\r\n * <BarChart\r\n * data={[\r\n * { label: \"1월\", value: 1000, highlight: true },\r\n * { label: \"2월\", value: 1200 },\r\n * { label: \"3월\", value: 1500 }\r\n * ]}\r\n * colorScheme=\"green\"\r\n * variant=\"gradient\"\r\n * showTooltip\r\n * />\r\n * \r\n * @param {BarChartProps} props - BarChart 컴포넌트의 props / BarChart component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} BarChart 컴포넌트 / BarChart component\r\n */\r\nexport const BarChart = React.forwardRef<HTMLDivElement, BarChartProps>(\r\n (\r\n {\r\n data,\r\n title,\r\n height = 200,\r\n showValues = true,\r\n showLabels = true,\r\n maxValue,\r\n colorScheme = \"blue\",\r\n variant = \"gradient\",\r\n showGrid = true,\r\n showTooltip = true,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const colors = colorSchemes[colorScheme];\r\n \r\n // 성능 최적화: max 값 계산을 useMemo로 메모이제이션\r\n // Performance optimization: Memoize max value calculation with useMemo\r\n const max = React.useMemo(() => {\r\n return maxValue || Math.max(...data.map((d) => d.value), 1);\r\n }, [maxValue, data]);\r\n \r\n // 성능 최적화: chartLabel 계산을 useMemo로 메모이제이션\r\n // Performance optimization: Memoize chartLabel calculation with useMemo\r\n const chartLabel = React.useMemo(() => {\r\n return title \r\n ? `${title} 차트 - 총 ${data.length}개 항목, 최대값 ${max.toLocaleString()}`\r\n : `막대 그래프 차트 - 총 ${data.length}개 항목, 최대값 ${max.toLocaleString()}`;\r\n }, [title, data.length, max]);\r\n \r\n const [hoveredIndex, setHoveredIndex] = React.useState<number | null>(null);\r\n const _chartId = React.useId();\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n role=\"img\"\r\n aria-label={chartLabel}\r\n className={merge(\r\n \"bg-white dark:bg-gray-800 rounded-2xl shadow-lg border border-gray-200 dark:border-gray-700 p-6\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {title && (\r\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white mb-4\">\r\n {title}\r\n </h3>\r\n )}\r\n\r\n <div className=\"relative\" style={{ height: `${height}px` }} aria-hidden=\"true\">\r\n {/* 그리드 라인 */}\r\n {showGrid && (\r\n <div className=\"absolute inset-0 flex flex-col justify-between\">\r\n {[0, 25, 50, 75, 100].map((percent) => (\r\n <div\r\n key={percent}\r\n className=\"border-t border-gray-200 dark:border-gray-700 opacity-30\"\r\n style={{ marginTop: `${percent === 0 ? 0 : (percent / 100) * height - 1}px` }}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* 막대 그래프 */}\r\n <div className=\"relative h-full flex items-end justify-between gap-2 px-2\">\r\n {data.map((item, index) => {\r\n const barHeight = max > 0 ? (item.value / max) * (height - 40) : 0;\r\n const isHighlighted = item.highlight || hoveredIndex === index;\r\n const barColor = item.color\r\n ? item.color\r\n : variant === \"gradient\"\r\n ? `bg-gradient-to-t ${isHighlighted ? colors.highlight : colors.gradient}`\r\n : colors.default;\r\n\r\n return (\r\n <div\r\n key={index}\r\n className=\"flex flex-col items-center flex-1 group relative\"\r\n onMouseEnter={() => setHoveredIndex(index)}\r\n onMouseLeave={() => setHoveredIndex(null)}\r\n >\r\n {/* 툴팁 */}\r\n {showTooltip && (\r\n <div\r\n className={merge(\r\n \"absolute bottom-full left-1/2 transform -translate-x-1/2 mb-2 px-2 py-1 bg-gray-900 dark:bg-gray-700 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none whitespace-nowrap z-10\"\r\n )}\r\n >\r\n {item.label}: {item.value.toLocaleString()}\r\n <div className=\"absolute top-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-l-4 border-r-4 border-t-4 border-transparent border-t-gray-900 dark:border-t-gray-700\"></div>\r\n </div>\r\n )}\r\n\r\n {/* 값 표시 */}\r\n {showValues && (\r\n <div\r\n className={merge(\r\n \"text-xs font-medium mb-1 transition-opacity duration-200\",\r\n hoveredIndex === index\r\n ? \"opacity-100 text-gray-900 dark:text-white\"\r\n : \"opacity-0 group-hover:opacity-100 text-gray-600 dark:text-gray-400\"\r\n )}\r\n >\r\n {item.value.toLocaleString()}\r\n </div>\r\n )}\r\n\r\n {/* 막대 */}\r\n <div className=\"relative w-full flex-1 flex items-end\">\r\n <div\r\n className={merge(\r\n \"w-full rounded-t-lg transition-all duration-500 ease-out\",\r\n barColor,\r\n isHighlighted && \"shadow-lg scale-105\"\r\n )}\r\n style={{\r\n height: `${Math.max(barHeight, 4)}px`,\r\n minHeight: \"4px\",\r\n }}\r\n >\r\n {/* 막대 위 점 */}\r\n {item.value > 0 && (\r\n <div className=\"absolute -top-1 left-1/2 transform -translate-x-1/2 w-2 h-2 bg-white dark:bg-gray-800 rounded-full shadow-sm\"></div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* 라벨 */}\r\n {showLabels && (\r\n <div\r\n className={merge(\r\n \"text-xs font-medium mt-2 transition-colors duration-200\",\r\n isHighlighted\r\n ? \"text-purple-600 dark:text-purple-400\"\r\n : \"text-gray-500 dark:text-gray-400\"\r\n )}\r\n >\r\n {item.label}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n\r\n {/* 하단 통계 */}\r\n {data.length > 0 && (\r\n <div className=\"mt-4 flex justify-between items-center text-xs text-gray-500 dark:text-gray-400 px-2\">\r\n <div>\r\n 총: {data.reduce((sum, item) => sum + item.value, 0).toLocaleString()}\r\n </div>\r\n <div>\r\n 평균:{\" \"}\r\n {Math.round(\r\n data.reduce((sum, item) => sum + item.value, 0) / data.length\r\n ).toLocaleString()}\r\n </div>\r\n <div>최고: {max.toLocaleString()}</div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nBarChart.displayName = \"BarChart\";\r\n\r\n","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\nimport { Icon } from \"./Icon\"\r\n\r\n/**\r\n * Drawer 컴포넌트의 props / Drawer component props\r\n * @typedef {Object} DrawerProps\r\n * @property {boolean} open - Drawer 열림/닫힘 상태 / Drawer open/close state\r\n * @property {(open: boolean) => void} onOpenChange - 상태 변경 콜백 / State change callback\r\n * @property {React.ReactNode} children - Drawer 내용 / Drawer content\r\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\r\n * @property {\"left\" | \"right\" | \"top\" | \"bottom\"} [side=\"right\"] - Drawer 표시 위치 / Drawer display position\r\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"} [size=\"md\"] - Drawer 크기 / Drawer size\r\n * @property {boolean} [showBackdrop=true] - 배경 오버레이 표시 여부 / Show backdrop overlay\r\n * @property {string} [backdropClassName] - 배경 오버레이 추가 CSS 클래스 / Backdrop overlay additional CSS class\r\n * @property {boolean} [closeOnBackdropClick=true] - 배경 클릭 시 닫기 여부 / Close on backdrop click\r\n * @property {boolean} [closeOnEscape=true] - ESC 키로 닫기 여부 / Close on ESC key\r\n */\r\ninterface DrawerProps {\r\n /** Drawer 열림/닫힘 상태 / Drawer open/close state */\r\n isOpen?: boolean\r\n /** Drawer 닫기 콜백 / Drawer close callback */\r\n onClose?: () => void\r\n /** Drawer 내용 / Drawer content */\r\n children: React.ReactNode\r\n /** 추가 CSS 클래스 / Additional CSS class */\r\n className?: string\r\n /** Drawer 표시 위치 / Drawer display position */\r\n side?: \"left\" | \"right\" | \"top\" | \"bottom\"\r\n /** Drawer 크기 / Drawer size */\r\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\r\n /** 배경 오버레이 표시 여부 / Show backdrop overlay */\r\n showBackdrop?: boolean\r\n /** 배경 오버레이 추가 CSS 클래스 / Backdrop overlay additional CSS class */\r\n backdropClassName?: string\r\n /** 배경 클릭 시 닫기 여부 / Close on backdrop click */\r\n closeOnBackdropClick?: boolean\r\n /** ESC 키로 닫기 여부 / Close on ESC key */\r\n closeOnEscape?: boolean\r\n /** 닫기 버튼 표시 여부 / Show close button */\r\n closable?: boolean\r\n}\r\n\r\n/**\r\n * Drawer 컴포넌트 / Drawer component\r\n * \r\n * 사이드에서 슬라이드되는 패널 컴포넌트입니다.\r\n * Modal과 유사하지만 특정 방향에서 슬라이드되는 애니메이션을 제공합니다.\r\n * ESC 키로 닫기, 배경 클릭으로 닫기 기능을 지원합니다.\r\n * \r\n * Panel component that slides from the side.\r\n * Similar to Modal but provides slide animation from a specific direction.\r\n * Supports closing with ESC key and backdrop click.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * const [open, setOpen] = useState(false)\r\n * \r\n * <Drawer open={open} onOpenChange={setOpen}>\r\n * <DrawerHeader>제목</DrawerHeader>\r\n * <DrawerContent>내용</DrawerContent>\r\n * <DrawerFooter>\r\n * <Button onClick={() => setOpen(false)}>닫기</Button>\r\n * </DrawerFooter>\r\n * </Drawer>\r\n * \r\n * @example\r\n * // 왼쪽에서 열기 / Open from left\r\n * <Drawer open={open} onOpenChange={setOpen} side=\"left\" size=\"lg\">\r\n * <DrawerContent>사이드바 내용</DrawerContent>\r\n * </Drawer>\r\n * \r\n * @param {DrawerProps} props - Drawer 컴포넌트의 props / Drawer component props\r\n * @param {React.Ref<HTMLDivElement>} ref - Drawer 컨테이너 ref / Drawer container ref\r\n * @returns {JSX.Element} Drawer 컴포넌트 / Drawer component\r\n * \r\n * @todo 접근성 개선: role=\"dialog\", aria-modal=\"true\" 추가 필요 / Accessibility: Add role=\"dialog\", aria-modal=\"true\"\r\n * @todo 접근성 개선: aria-labelledby, aria-describedby 연결 필요 / Accessibility: Connect aria-labelledby, aria-describedby\r\n */\r\nconst Drawer = React.forwardRef<HTMLDivElement, DrawerProps>(\r\n ({\r\n isOpen,\r\n onClose,\r\n children,\r\n className,\r\n side = \"right\",\r\n size = \"md\",\r\n showBackdrop = true,\r\n backdropClassName,\r\n closeOnBackdropClick = true,\r\n closeOnEscape = true,\r\n closable = true,\r\n ...props\r\n }, ref) => {\r\n const _isOpen = isOpen ?? false\r\n const handleClose = () => {\r\n onClose?.()\r\n }\r\n\r\n const [isVisible, setIsVisible] = React.useState(false)\r\n const [isAnimating, setIsAnimating] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n if (_isOpen) {\r\n setIsVisible(true)\r\n setIsAnimating(true)\r\n // 애니메이션 시작을 위한 지연\r\n const timer = setTimeout(() => setIsAnimating(false), 50)\r\n return () => clearTimeout(timer)\r\n } else {\r\n setIsAnimating(true)\r\n const timer = setTimeout(() => {\r\n setIsVisible(false)\r\n setIsAnimating(false)\r\n }, 300) // 애니메이션 완료 후 숨김\r\n return () => clearTimeout(timer)\r\n }\r\n }, [_isOpen])\r\n\r\n React.useEffect(() => {\r\n if (!closeOnEscape) return\r\n\r\n const handleEscapeKey = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && _isOpen) {\r\n handleClose()\r\n }\r\n }\r\n\r\n if (_isOpen) {\r\n document.addEventListener(\"keydown\", handleEscapeKey)\r\n document.body.style.overflow = \"hidden\"\r\n }\r\n\r\n return () => {\r\n document.removeEventListener(\"keydown\", handleEscapeKey)\r\n document.body.style.overflow = \"\"\r\n }\r\n }, [_isOpen, closeOnEscape])\r\n\r\n if (!isVisible) return null\r\n\r\n const sizeClasses = {\r\n sm: side === \"left\" || side === \"right\" ? \"w-80\" : \"h-64\",\r\n md: side === \"left\" || side === \"right\" ? \"w-96\" : \"h-96\",\r\n lg: side === \"left\" || side === \"right\" ? \"w-[28rem]\" : \"h-[32rem]\",\r\n xl: side === \"left\" || side === \"right\" ? \"w-[32rem]\" : \"h-[40rem]\",\r\n full: side === \"left\" || side === \"right\" ? \"w-full\" : \"h-full\"\r\n }\r\n\r\n const sideClasses = {\r\n left: \"left-0 top-0 h-full\",\r\n right: \"right-0 top-0 h-full\",\r\n top: \"top-0 left-0 w-full\",\r\n bottom: \"bottom-0 left-0 w-full\"\r\n }\r\n\r\n // Transform: _isOpen=true -> visible position, _isOpen=false -> hidden position\r\n const transformClasses = {\r\n left: _isOpen ? \"translate-x-0\" : \"-translate-x-full\",\r\n right: _isOpen ? \"translate-x-0\" : \"translate-x-full\",\r\n top: _isOpen ? \"translate-y-0\" : \"-translate-y-full\",\r\n bottom: _isOpen ? \"translate-y-0\" : \"translate-y-full\"\r\n }\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50\">\r\n {/* Backdrop */}\r\n {showBackdrop && (\r\n <div\r\n className={merge(\r\n \"absolute inset-0 bg-black/60 backdrop-blur-md transition-opacity duration-300\",\r\n isAnimating ? (_isOpen ? \"opacity-100\" : \"opacity-0\") : \"\",\r\n backdropClassName\r\n )}\r\n onClick={closeOnBackdropClick ? handleClose : undefined}\r\n />\r\n )}\r\n\r\n {/* Drawer Content */}\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"absolute bg-background/95 backdrop-blur-xl border border-border/50 shadow-2xl transition-transform duration-300 ease-out\",\r\n sizeClasses[size],\r\n sideClasses[side],\r\n transformClasses[side],\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n )\r\n }\r\n)\r\nDrawer.displayName = \"Drawer\"\r\n\r\n/**\r\n * DrawerHeader 컴포넌트의 props / DrawerHeader component props\r\n * @typedef {Object} DrawerHeaderProps\r\n * @property {React.ReactNode} children - 헤더 내용 / Header content\r\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\r\n * @property {boolean} [showCloseButton=true] - 닫기 버튼 표시 여부 / Show close button\r\n * @property {() => void} [onClose] - 닫기 버튼 클릭 콜백 / Close button click callback\r\n */\r\ninterface DrawerHeaderProps {\r\n children: React.ReactNode\r\n className?: string\r\n showCloseButton?: boolean\r\n onClose?: () => void\r\n}\r\n\r\n/**\r\n * DrawerHeader 컴포넌트 / DrawerHeader component\r\n * Drawer의 헤더 영역을 표시합니다.\r\n * Displays the header area of a Drawer.\r\n * \r\n * @component\r\n * @param {DrawerHeaderProps} props - DrawerHeader 컴포넌트의 props / DrawerHeader component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} DrawerHeader 컴포넌트 / DrawerHeader component\r\n */\r\nconst DrawerHeader = React.forwardRef<HTMLDivElement, DrawerHeaderProps>(\r\n ({ children, className, showCloseButton = true, onClose, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\"flex items-center justify-between p-6 border-b border-border/50\", className)}\r\n {...props}\r\n >\r\n <div className=\"flex-1\">{children}</div>\r\n {showCloseButton && (\r\n <button\r\n onClick={onClose}\r\n className=\"p-2 rounded-lg hover:bg-muted transition-colors\"\r\n >\r\n <Icon name=\"close\" size={20} />\r\n </button>\r\n )}\r\n </div>\r\n )\r\n }\r\n)\r\nDrawerHeader.displayName = \"DrawerHeader\"\r\n\r\n/**\r\n * DrawerContent 컴포넌트의 props / DrawerContent component props\r\n * @typedef {Object} DrawerContentProps\r\n * @property {React.ReactNode} children - 콘텐츠 / Content\r\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\r\n */\r\ninterface DrawerContentProps {\r\n children: React.ReactNode\r\n className?: string\r\n}\r\n\r\n/**\r\n * DrawerContent 컴포넌트 / DrawerContent component\r\n * Drawer의 메인 콘텐츠 영역을 표시합니다.\r\n * Displays the main content area of a Drawer.\r\n * \r\n * @component\r\n * @param {DrawerContentProps} props - DrawerContent 컴포넌트의 props / DrawerContent component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} DrawerContent 컴포넌트 / DrawerContent component\r\n */\r\nconst DrawerContent = React.forwardRef<HTMLDivElement, DrawerContentProps>(\r\n ({ children, className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\"flex-1 p-6 overflow-y-auto\", className)}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n }\r\n)\r\nDrawerContent.displayName = \"DrawerContent\"\r\n\r\n/**\r\n * DrawerFooter 컴포넌트의 props / DrawerFooter component props\r\n * @typedef {Object} DrawerFooterProps\r\n * @property {React.ReactNode} children - 푸터 내용 / Footer content\r\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\r\n */\r\ninterface DrawerFooterProps {\r\n children: React.ReactNode\r\n className?: string\r\n}\r\n\r\n/**\r\n * DrawerFooter 컴포넌트 / DrawerFooter component\r\n * Drawer의 푸터 영역을 표시합니다. 주로 액션 버튼을 배치합니다.\r\n * Displays the footer area of a Drawer. Typically used for action buttons.\r\n * \r\n * @component\r\n * @param {DrawerFooterProps} props - DrawerFooter 컴포넌트의 props / DrawerFooter component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} DrawerFooter 컴포넌트 / DrawerFooter component\r\n */\r\nconst DrawerFooter = React.forwardRef<HTMLDivElement, DrawerFooterProps>(\r\n ({ children, className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\"flex items-center justify-end gap-3 p-6 border-t border-border/50\", className)}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n }\r\n)\r\nDrawerFooter.displayName = \"DrawerFooter\"\r\n\r\nexport { Drawer, DrawerHeader, DrawerContent, DrawerFooter } ","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { Drawer, DrawerHeader, DrawerContent, DrawerFooter } from \"../Drawer\";\r\nimport { Badge } from \"../Badge\";\r\nimport { Icon } from \"../Icon\";\r\nimport type { IconName } from \"../../lib/icons\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport { DashboardEmptyState } from \"./EmptyState\";\r\nimport type { TransactionStatus } from \"./TransactionsTable\";\r\n\r\nconst STATUS_STYLES: Record<TransactionStatus, { label: string; badge: string }> = {\r\n approved: { label: \"승인\", badge: \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-200\" },\r\n pending: { label: \"대기\", badge: \"bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-200\" },\r\n failed: { label: \"실패\", badge: \"bg-rose-100 text-rose-700 dark:bg-rose-500/15 dark:text-rose-200\" },\r\n refunded: { label: \"환불\", badge: \"bg-sky-100 text-sky-700 dark:bg-sky-500/15 dark:text-sky-200\" },\r\n cancelled: { label: \"취소\", badge: \"bg-slate-100 text-slate-700 dark:bg-slate-500/15 dark:text-slate-200\" },\r\n review: { label: \"검토중\", badge: \"bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-200\" },\r\n};\r\n\r\n/**\r\n * 거래 상세 정보 인터페이스 / TransactionDetail interface\r\n * @typedef {Object} TransactionDetail\r\n * @property {string} id - 거래 ID / Transaction ID\r\n * @property {TransactionStatus} status - 거래 상태 / Transaction status\r\n * @property {number} amount - 거래 금액 / Transaction amount\r\n * @property {string} [currency] - 통화 / Currency\r\n * @property {string} [merchant] - 가맹점 / Merchant\r\n * @property {string} [method] - 결제수단 / Payment method\r\n * @property {string | Date} [createdAt] - 생성일시 / Created date\r\n * @property {string | Date} [approvedAt] - 승인일시 / Approved date\r\n * @property {string} [customer] - 고객 정보 / Customer information\r\n * @property {string} [reference] - 참조 번호 / Reference number\r\n */\r\nexport interface TransactionDetail {\r\n id: string;\r\n status: TransactionStatus;\r\n amount: number;\r\n currency?: string;\r\n merchant?: string;\r\n method?: string;\r\n createdAt?: string | Date;\r\n approvedAt?: string | Date;\r\n customer?: string;\r\n reference?: string;\r\n}\r\n\r\n/**\r\n * 거래 메타데이터 아이템 인터페이스 / TransactionMetadataItem interface\r\n * @typedef {Object} TransactionMetadataItem\r\n * @property {string} label - 라벨 / Label\r\n * @property {React.ReactNode} value - 값 / Value\r\n * @property {IconName} [icon] - 아이콘 / Icon\r\n */\r\nexport interface TransactionMetadataItem {\r\n label: string;\r\n value: React.ReactNode;\r\n icon?: IconName;\r\n}\r\n\r\nexport type SettlementStatus = \"pending\" | \"processing\" | \"completed\" | \"failed\";\r\n\r\n/**\r\n * 정산 정보 인터페이스 / SettlementInfo interface\r\n * @typedef {Object} SettlementInfo\r\n * @property {SettlementStatus} [status] - 정산 상태 / Settlement status\r\n * @property {number} [amount] - 정산 금액 / Settlement amount\r\n * @property {string} [currency] - 통화 / Currency\r\n * @property {string | Date} [scheduledDate] - 예정일 / Scheduled date\r\n * @property {string} [expectedPayout] - 예상 지급액 / Expected payout\r\n * @property {string} [bankAccount] - 계좌 정보 / Bank account information\r\n * @property {string} [reference] - 참조 번호 / Reference number\r\n * @property {string} [note] - 메모 / Note\r\n */\r\nexport interface SettlementInfo {\r\n status?: SettlementStatus;\r\n amount?: number;\r\n currency?: string;\r\n scheduledDate?: string | Date;\r\n expectedPayout?: string;\r\n bankAccount?: string;\r\n reference?: string;\r\n note?: string;\r\n}\r\n\r\n/**\r\n * 수수료 내역 인터페이스 / FeeBreakdown interface\r\n * @typedef {Object} FeeBreakdown\r\n * @property {string} label - 수수료 라벨 / Fee label\r\n * @property {number} amount - 수수료 금액 / Fee amount\r\n * @property {string} [currency] - 통화 / Currency\r\n * @property {string} [description] - 설명 / Description\r\n */\r\nexport interface FeeBreakdown {\r\n label: string;\r\n amount: number;\r\n currency?: string;\r\n description?: string;\r\n}\r\n\r\n/**\r\n * 거래 이벤트 인터페이스 / TransactionEvent interface\r\n * @typedef {Object} TransactionEvent\r\n * @property {string} id - 이벤트 ID / Event ID\r\n * @property {string} title - 이벤트 제목 / Event title\r\n * @property {string} [description] - 설명 / Description\r\n * @property {string | Date} timestamp - 타임스탬프 / Timestamp\r\n * @property {\"success\" | \"warning\" | \"error\" | \"info\"} [status] - 이벤트 상태 / Event status\r\n * @property {IconName} [icon] - 아이콘 / Icon\r\n * @property {string} [actor] - 실행자 / Actor\r\n */\r\nexport interface TransactionEvent {\r\n id: string;\r\n title: string;\r\n description?: string;\r\n timestamp: string | Date;\r\n status?: \"success\" | \"warning\" | \"error\" | \"info\";\r\n icon?: IconName;\r\n actor?: string;\r\n}\r\n\r\n/**\r\n * TransactionDetailDrawer 컴포넌트의 props / TransactionDetailDrawer component props\r\n * @typedef {Object} TransactionDetailDrawerProps\r\n * @property {boolean} open - 드로어 열림 상태 / Drawer open state\r\n * @property {() => void} onClose - 닫기 핸들러 / Close handler\r\n * @property {TransactionDetail} [transaction] - 거래 상세 정보 / Transaction detail information\r\n * @property {TransactionMetadataItem[]} [metadata=[]] - 메타데이터 배열 / Metadata array\r\n * @property {SettlementInfo} [settlement] - 정산 정보 / Settlement information\r\n * @property {FeeBreakdown[]} [fees=[]] - 수수료 내역 배열 / Fee breakdown array\r\n * @property {TransactionEvent[]} [events=[]] - 이벤트 로그 배열 / Event log array\r\n * @property {React.ReactNode} [actions] - 액션 컴포넌트 / Actions component\r\n * @property {React.ReactNode} [summary] - 요약 컴포넌트 / Summary component\r\n * @property {boolean} [loading=false] - 로딩 상태 / Loading state\r\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\r\n * @property {string} [defaultCurrency=\"KRW\"] - 기본 통화 / Default currency\r\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\r\n * @property {string} [className] - 추가 클래스명 / Additional class name\r\n */\r\nexport interface TransactionDetailDrawerProps {\r\n open: boolean;\r\n onClose: () => void;\r\n transaction?: TransactionDetail;\r\n metadata?: TransactionMetadataItem[];\r\n settlement?: SettlementInfo;\r\n fees?: FeeBreakdown[];\r\n events?: TransactionEvent[];\r\n actions?: React.ReactNode;\r\n summary?: React.ReactNode;\r\n loading?: boolean;\r\n locale?: string;\r\n defaultCurrency?: string;\r\n emptyState?: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nconst formatAmount = (amount?: number, currency?: string, locale = \"ko-KR\") => {\r\n if (typeof amount !== \"number\") return \"-\";\r\n try {\r\n return new Intl.NumberFormat(locale, {\r\n style: \"currency\",\r\n currency: currency ?? \"KRW\",\r\n maximumFractionDigits: 2,\r\n }).format(amount);\r\n } catch {\r\n return `${amount.toLocaleString(locale)} ${currency ?? \"\"}`.trim();\r\n }\r\n};\r\n\r\nconst formatDate = (date?: string | Date, locale = \"ko-KR\") => {\r\n if (!date) return \"-\";\r\n const parsed = date instanceof Date ? date : new Date(date);\r\n if (Number.isNaN(parsed.getTime())) return \"-\";\r\n return parsed.toLocaleString(locale, { dateStyle: \"medium\", timeStyle: \"short\" });\r\n};\r\n\r\nconst getEventColor = (status?: TransactionEvent[\"status\"]) => {\r\n switch (status) {\r\n case \"success\":\r\n return \"bg-emerald-50 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-100\";\r\n case \"warning\":\r\n return \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-100\";\r\n case \"error\":\r\n return \"bg-rose-50 text-rose-700 dark:bg-rose-500/20 dark:text-rose-100\";\r\n default:\r\n return \"bg-slate-50 text-slate-600 dark:bg-slate-800/50 dark:text-slate-100\";\r\n }\r\n};\r\n\r\nconst getSettlementBadge = (status?: SettlementStatus) => {\r\n switch (status) {\r\n case \"completed\":\r\n return \"bg-emerald-50 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-100\";\r\n case \"processing\":\r\n return \"bg-sky-50 text-sky-700 dark:bg-sky-500/20 dark:text-sky-100\";\r\n case \"failed\":\r\n return \"bg-rose-50 text-rose-700 dark:bg-rose-500/20 dark:text-rose-100\";\r\n case \"pending\":\r\n return \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-100\";\r\n default:\r\n return \"bg-slate-50 text-slate-600 dark:bg-slate-800/50 dark:text-slate-100\";\r\n }\r\n};\r\n\r\n/**\r\n * TransactionDetailDrawer 컴포넌트\r\n * \r\n * 거래 상세 정보를 표시하는 드로어 컴포넌트입니다.\r\n * 거래 정보, 정산 정보, 수수료 내역, 이벤트 로그 등을 포함합니다.\r\n * \r\n * Drawer component that displays detailed transaction information.\r\n * Includes transaction details, settlement info, fee breakdown, and event logs.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <TransactionDetailDrawer\r\n * open={isOpen}\r\n * onClose={() => setIsOpen(false)}\r\n * transaction={{\r\n * id: \"tx_123\",\r\n * status: \"approved\",\r\n * amount: 100000,\r\n * currency: \"KRW\",\r\n * merchant: \"가맹점 A\"\r\n * }}\r\n * metadata={[\r\n * { label: \"거래 ID\", value: \"tx_123\", icon: \"creditCard\" },\r\n * { label: \"고객\", value: \"홍길동\", icon: \"user\" }\r\n * ]}\r\n * />\r\n * \r\n * @example\r\n * // 정산 정보 포함 / With settlement info\r\n * <TransactionDetailDrawer\r\n * open={isOpen}\r\n * onClose={handleClose}\r\n * transaction={transaction}\r\n * settlement={{\r\n * status: \"processing\",\r\n * amount: 95000,\r\n * currency: \"KRW\",\r\n * scheduledDate: new Date(\"2024-01-15\")\r\n * }}\r\n * fees={[\r\n * { label: \"수수료\", amount: 5000, currency: \"KRW\" }\r\n * ]}\r\n * events={eventLogs}\r\n * />\r\n * \r\n * @param {TransactionDetailDrawerProps} props - TransactionDetailDrawer 컴포넌트의 props / TransactionDetailDrawer component props\r\n * @returns {JSX.Element} TransactionDetailDrawer 컴포넌트 / TransactionDetailDrawer component\r\n */\r\nexport const TransactionDetailDrawer: React.FC<TransactionDetailDrawerProps> = ({\r\n open,\r\n onClose,\r\n transaction,\r\n metadata = [],\r\n settlement,\r\n fees = [],\r\n events = [],\r\n actions,\r\n summary,\r\n loading = false,\r\n locale = \"ko-KR\",\r\n defaultCurrency = \"KRW\",\r\n emptyState,\r\n className,\r\n}) => {\r\n const statusStyle = transaction && STATUS_STYLES[transaction.status];\r\n\r\n return (\r\n <Drawer\r\n isOpen={open}\r\n onClose={onClose}\r\n className={className}\r\n >\r\n <DrawerHeader onClose={onClose}>\r\n <div className=\"space-y-1\">\r\n <div className=\"flex items-center gap-2 text-xs uppercase tracking-wide text-slate-400\">\r\n <span>거래 상세</span>\r\n {transaction?.reference && (\r\n <span className=\"rounded-full bg-slate-100 px-2 py-0.5 text-slate-500\">{transaction.reference}</span>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <p className=\"text-lg font-semibold text-slate-900 dark:text-white\">{transaction?.id ?? \"—\"}</p>\r\n {statusStyle && (\r\n <Badge className={merge(\"font-medium px-3 py-1 text-xs rounded-full\", statusStyle.badge)}>\r\n {statusStyle.label}\r\n </Badge>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">\r\n {transaction?.merchant ?? \"가맹점 정보 없음\"} · {transaction?.method ?? \"결제수단 미지정\"}\r\n </p>\r\n </div>\r\n </DrawerHeader>\r\n\r\n <DrawerContent className=\"space-y-6\">\r\n {loading ? (\r\n <div className=\"space-y-4\">\r\n {[...Array(3)].map((_, idx) => (\r\n <div key={idx} className=\"h-20 rounded-2xl border border-slate-100 dark:border-slate-800 animate-pulse bg-slate-50/60 dark:bg-slate-900/40\" />\r\n ))}\r\n </div>\r\n ) : (\r\n <>\r\n <section \r\n className=\"grid gap-4 rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4 md:grid-cols-2\"\r\n aria-label=\"거래 요약 정보\"\r\n >\r\n <div className=\"space-y-1\">\r\n <p className=\"text-xs uppercase text-slate-400\">거래 금액</p>\r\n <p className=\"text-2xl font-semibold text-slate-900 dark:text-white\">\r\n {formatAmount(transaction?.amount, transaction?.currency ?? defaultCurrency, locale)}\r\n </p>\r\n <p className=\"text-xs text-slate-400\">\r\n 생성 <time dateTime={transaction?.createdAt instanceof Date ? transaction.createdAt.toISOString() : typeof transaction?.createdAt === 'string' ? transaction.createdAt : undefined}>\r\n {formatDate(transaction?.createdAt, locale)}\r\n </time>\r\n </p>\r\n </div>\r\n <div className=\"space-y-2\">\r\n <p className=\"text-xs uppercase text-slate-400\">요약</p>\r\n {summary ?? (\r\n <p className=\"text-sm text-slate-600 dark:text-slate-300\">\r\n {transaction?.customer ?? \"고객 정보 없음\"} / {transaction?.method ?? \"결제수단 미지정\"}\r\n </p>\r\n )}\r\n </div>\r\n </section>\r\n\r\n {metadata.length > 0 && (\r\n <section \r\n className=\"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4\"\r\n aria-label=\"거래 세부 정보\"\r\n role=\"region\"\r\n >\r\n <h3 className=\"mb-3 text-sm font-semibold text-slate-900 dark:text-white\">세부 정보</h3>\r\n <dl className=\"grid gap-4 sm:grid-cols-2\">\r\n {metadata.map((item) => (\r\n <div key={item.label} className=\"flex items-center gap-3\">\r\n {item.icon && (\r\n <span className=\"rounded-lg bg-slate-100 p-2 text-slate-500 dark:bg-slate-800/80\" aria-hidden=\"true\">\r\n <Icon name={item.icon} className=\"h-4 w-4\" />\r\n </span>\r\n )}\r\n <div>\r\n <dt className=\"text-xs uppercase text-slate-400\">{item.label}</dt>\r\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">{item.value}</dd>\r\n </div>\r\n </div>\r\n ))}\r\n </dl>\r\n </section>\r\n )}\r\n\r\n {settlement && (\r\n <section \r\n className=\"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4\"\r\n aria-label=\"정산 정보\"\r\n role=\"region\"\r\n >\r\n <div className=\"mb-4 flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-white\">정산 정보</h3>\r\n {settlement.note && <p className=\"text-xs text-slate-500\">{settlement.note}</p>}\r\n </div>\r\n {settlement.status && (\r\n <span \r\n className={merge(\"rounded-full px-3 py-1 text-xs font-medium\", getSettlementBadge(settlement.status))}\r\n aria-label={`정산 상태: ${settlement.status}`}\r\n >\r\n {settlement.status}\r\n </span>\r\n )}\r\n </div>\r\n <dl className=\"grid gap-4 md:grid-cols-2\">\r\n <div>\r\n <dt className=\"text-xs uppercase text-slate-400\">정산 금액</dt>\r\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">\r\n {formatAmount(settlement.amount, settlement.currency ?? defaultCurrency, locale)}\r\n </dd>\r\n </div>\r\n <div>\r\n <dt className=\"text-xs uppercase text-slate-400\">예정일</dt>\r\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">\r\n {settlement.scheduledDate && (\r\n <time dateTime={settlement.scheduledDate instanceof Date ? settlement.scheduledDate.toISOString() : typeof settlement.scheduledDate === 'string' ? settlement.scheduledDate : undefined}>\r\n {formatDate(settlement.scheduledDate, locale)}\r\n </time>\r\n )}\r\n </dd>\r\n </div>\r\n {settlement.bankAccount && (\r\n <div>\r\n <dt className=\"text-xs uppercase text-slate-400\">계좌</dt>\r\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">{settlement.bankAccount}</dd>\r\n </div>\r\n )}\r\n {settlement.expectedPayout && (\r\n <div>\r\n <dt className=\"text-xs uppercase text-slate-400\">예상 지급</dt>\r\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">{settlement.expectedPayout}</dd>\r\n </div>\r\n )}\r\n </dl>\r\n </section>\r\n )}\r\n\r\n {fees.length > 0 && (\r\n <section \r\n className=\"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4\"\r\n aria-label=\"수수료 내역\"\r\n role=\"region\"\r\n >\r\n <h3 className=\"mb-3 text-sm font-semibold text-slate-900 dark:text-white\">수수료</h3>\r\n <dl className=\"space-y-3\">\r\n {fees.map((fee) => (\r\n <div key={fee.label} className=\"flex items-center justify-between text-sm text-slate-700 dark:text-slate-200\">\r\n <div>\r\n <dt className=\"font-medium\">{fee.label}</dt>\r\n {fee.description && <dd className=\"text-xs text-slate-400\">{fee.description}</dd>}\r\n </div>\r\n <dd>{formatAmount(fee.amount, fee.currency ?? defaultCurrency, locale)}</dd>\r\n </div>\r\n ))}\r\n </dl>\r\n </section>\r\n )}\r\n\r\n <section \r\n className=\"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4\"\r\n aria-label=\"이벤트 로그\"\r\n role=\"region\"\r\n >\r\n <h3 className=\"mb-4 text-sm font-semibold text-slate-900 dark:text-white\">이벤트 로그</h3>\r\n {events.length === 0 ? (\r\n emptyState ?? (\r\n <DashboardEmptyState\r\n icon=\"activity\"\r\n title=\"이벤트가 없습니다\"\r\n description=\"승인/정산 등 상태 변화가 발생하면 자동으로 표시됩니다.\"\r\n size=\"sm\"\r\n />\r\n )\r\n ) : (\r\n <ol className=\"space-y-3\" role=\"list\" aria-label=\"이벤트 목록\">\r\n {events.map((event) => (\r\n <li\r\n key={event.id}\r\n role=\"listitem\"\r\n className=\"flex items-start gap-3 rounded-xl border border-slate-100 dark:border-slate-800 p-3\"\r\n >\r\n <div className={merge(\"rounded-lg p-2\", getEventColor(event.status))} aria-hidden=\"true\">\r\n <Icon name={event.icon ?? \"activity\"} className=\"h-4 w-4\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center justify-between text-sm font-medium text-slate-900 dark:text-white\">\r\n <span>{event.title}</span>\r\n <time \r\n dateTime={event.timestamp instanceof Date ? event.timestamp.toISOString() : typeof event.timestamp === 'string' ? event.timestamp : undefined}\r\n className=\"text-xs text-slate-400\"\r\n >\r\n {formatDate(event.timestamp, locale)}\r\n </time>\r\n </div>\r\n {event.description && (\r\n <p className=\"text-xs text-slate-500 dark:text-slate-300\">{event.description}</p>\r\n )}\r\n {event.actor && (\r\n <p className=\"text-xs text-slate-400 mt-1\" aria-label={`실행자: ${event.actor}`}>\r\n by {event.actor}\r\n </p>\r\n )}\r\n </div>\r\n </li>\r\n ))}\r\n </ol>\r\n )}\r\n </section>\r\n </>\r\n )}\r\n </DrawerContent>\r\n\r\n {actions && <DrawerFooter>{actions}</DrawerFooter>}\r\n </Drawer>\r\n );\r\n};\r\n\r\nTransactionDetailDrawer.displayName = \"TransactionDetailDrawer\";\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport { Icon } from \"../Icon\";\r\nimport type { IconName } from \"../../lib/icons\";\r\nimport { DashboardEmptyState } from \"./EmptyState\";\r\n\r\nexport type SettlementTimelineStatus = \"pending\" | \"processing\" | \"completed\" | \"failed\";\r\n\r\n/**\r\n * 정산 타임라인 아이템 인터페이스 / SettlementTimelineItem interface\r\n * @typedef {Object} SettlementTimelineItem\r\n * @property {string} id - 아이템 고유 ID / Item unique ID\r\n * @property {string} title - 제목 / Title\r\n * @property {string} [description] - 설명 / Description\r\n * @property {SettlementTimelineStatus} status - 상태 / Status\r\n * @property {number} [amount] - 금액 / Amount\r\n * @property {string} [currency] - 통화 / Currency\r\n * @property {string | Date} [date] - 날짜 / Date\r\n * @property {string} [meta] - 메타 정보 / Meta information\r\n * @property {IconName} [icon] - 아이콘 / Icon\r\n */\r\nexport interface SettlementTimelineItem {\r\n id: string;\r\n title: string;\r\n description?: string;\r\n status: SettlementTimelineStatus;\r\n amount?: number;\r\n currency?: string;\r\n date?: string | Date;\r\n meta?: string;\r\n icon?: IconName;\r\n}\r\n\r\n/**\r\n * SettlementTimeline 컴포넌트의 props / SettlementTimeline component props\r\n * @typedef {Object} SettlementTimelineProps\r\n * @property {SettlementTimelineItem[]} items - 타임라인 아이템 배열 / Timeline items array\r\n * @property {string} [highlightedId] - 강조할 아이템 ID / Highlighted item ID\r\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\r\n * @property {string} [defaultCurrency=\"KRW\"] - 기본 통화 / Default currency\r\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface SettlementTimelineProps extends React.HTMLAttributes<HTMLDivElement> {\r\n items: SettlementTimelineItem[];\r\n highlightedId?: string;\r\n locale?: string;\r\n defaultCurrency?: string;\r\n emptyState?: React.ReactNode;\r\n}\r\n\r\nconst STATUS_CONFIG: Record<\r\n SettlementTimelineStatus,\r\n { dot: string; border: string; text: string; label: string }\r\n> = {\r\n completed: {\r\n dot: \"bg-emerald-500 border-emerald-500 shadow-[0_0_8px_rgba(16,185,129,0.5)]\",\r\n border: \"border-emerald-200 dark:border-emerald-500/40\",\r\n text: \"text-emerald-700 dark:text-emerald-300\",\r\n label: \"정산 완료\",\r\n },\r\n processing: {\r\n dot: \"bg-sky-500 border-sky-500 shadow-[0_0_8px_rgba(14,165,233,0.5)] animate-pulse\",\r\n border: \"border-sky-200 dark:border-sky-500/40\",\r\n text: \"text-sky-700 dark:text-sky-200\",\r\n label: \"처리 중\",\r\n },\r\n pending: {\r\n dot: \"bg-amber-400 border-amber-400\",\r\n border: \"border-amber-200 dark:border-amber-500/40\",\r\n text: \"text-amber-700 dark:text-amber-200\",\r\n label: \"대기\",\r\n },\r\n failed: {\r\n dot: \"bg-rose-500 border-rose-500\",\r\n border: \"border-rose-200 dark:border-rose-500/40\",\r\n text: \"text-rose-700 dark:text-rose-300\",\r\n label: \"실패\",\r\n },\r\n};\r\n\r\nconst formatAmount = (amount?: number, currency?: string, locale = \"ko-KR\") => {\r\n if (typeof amount !== \"number\") return undefined;\r\n const unit = currency ?? \"KRW\";\r\n try {\r\n return new Intl.NumberFormat(locale, {\r\n style: \"currency\",\r\n currency: unit,\r\n maximumFractionDigits: 2,\r\n }).format(amount);\r\n } catch {\r\n return `${amount.toLocaleString(locale)} ${unit}`;\r\n }\r\n};\r\n\r\nconst formatDate = (value?: string | Date, locale = \"ko-KR\") => {\r\n if (!value) return undefined;\r\n const parsed = value instanceof Date ? value : new Date(value);\r\n if (Number.isNaN(parsed.getTime())) return undefined;\r\n return parsed.toLocaleString(locale, { dateStyle: \"medium\", timeStyle: \"short\" });\r\n};\r\n\r\n/**\r\n * SettlementTimeline 컴포넌트\r\n * \r\n * 정산 처리 단계를 타임라인 형태로 표시하는 컴포넌트입니다.\r\n * 각 단계의 상태, 금액, 날짜를 시각적으로 표시합니다.\r\n * \r\n * Timeline component that displays settlement processing stages.\r\n * Visually shows status, amount, and date for each stage.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <SettlementTimeline\r\n * items={[\r\n * {\r\n * id: \"1\",\r\n * title: \"정산 요청\",\r\n * status: \"completed\",\r\n * amount: 1000000,\r\n * currency: \"KRW\",\r\n * date: new Date(\"2024-01-01\")\r\n * },\r\n * {\r\n * id: \"2\",\r\n * title: \"처리 중\",\r\n * status: \"processing\",\r\n * amount: 1000000,\r\n * currency: \"KRW\"\r\n * }\r\n * ]}\r\n * />\r\n * \r\n * @example\r\n * // 강조 기능 / Highlight feature\r\n * <SettlementTimeline\r\n * items={timelineItems}\r\n * highlightedId=\"2\"\r\n * locale=\"en-US\"\r\n * defaultCurrency=\"USD\"\r\n * />\r\n * \r\n * @param {SettlementTimelineProps} props - SettlementTimeline 컴포넌트의 props / SettlementTimeline component props\r\n * @returns {JSX.Element} SettlementTimeline 컴포넌트 / SettlementTimeline component\r\n */\r\nexport const SettlementTimeline: React.FC<SettlementTimelineProps> = ({\r\n items,\r\n highlightedId,\r\n locale = \"ko-KR\",\r\n defaultCurrency = \"KRW\",\r\n emptyState,\r\n className,\r\n ...props\r\n}) => {\r\n const hasItems = items.length > 0;\r\n\r\n return (\r\n <div\r\n className={merge(\r\n \"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/50 p-4\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div className=\"mb-4 flex items-center justify-between\">\r\n <div>\r\n <p className=\"text-sm font-semibold text-slate-900 dark:text-white\">정산 타임라인</p>\r\n <p className=\"text-xs text-slate-500\">처리 단계별 상태와 금액을 확인하세요.</p>\r\n </div>\r\n </div>\r\n\r\n {!hasItems\r\n ? emptyState ?? (\r\n <DashboardEmptyState\r\n icon=\"calendar-clock\"\r\n title=\"정산 단계가 없습니다\"\r\n description=\"정산 요청이 생성되면 자동으로 단계가 채워집니다.\"\r\n size=\"sm\"\r\n />\r\n )\r\n : (\r\n <ol className=\"space-y-4\" role=\"list\" aria-label=\"정산 타임라인\">\r\n {items.map((item, index) => {\r\n const statusConfig = STATUS_CONFIG[item.status];\r\n const amount = formatAmount(item.amount, item.currency ?? defaultCurrency, locale);\r\n const date = formatDate(item.date, locale);\r\n const isHighlighted = highlightedId === item.id;\r\n const showConnector = index !== items.length - 1;\r\n\r\n const itemLabel = `${item.title}, 상태: ${statusConfig.label}${amount ? `, 금액: ${amount}` : ''}${date ? `, 날짜: ${date}` : ''}`;\r\n\r\n return (\r\n <li \r\n key={item.id} \r\n role=\"listitem\"\r\n aria-label={itemLabel}\r\n className=\"relative flex gap-4\"\r\n >\r\n <div className=\"flex flex-col items-center\">\r\n <span\r\n className={merge(\r\n \"z-10 h-3.5 w-3.5 rounded-full border-2 bg-white shadow\",\r\n statusConfig.dot,\r\n isHighlighted && \"scale-110\"\r\n )}\r\n aria-label={`${statusConfig.label} 상태`}\r\n />\r\n {showConnector && (\r\n <span className=\"mt-1 flex-1 w-px bg-slate-200 dark:bg-slate-700\" aria-hidden=\"true\" />\r\n )}\r\n </div>\r\n\r\n <div\r\n className={merge(\r\n \"flex-1 rounded-xl border p-4\",\r\n statusConfig.border,\r\n isHighlighted && \"border-2 shadow-sm\"\r\n )}\r\n >\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n <span className=\"text-sm font-semibold text-slate-900 dark:text-white\">{item.title}</span>\r\n <span className={merge(\"text-xs font-medium rounded-full px-2 py-0.5\", statusConfig.text)}>\r\n {statusConfig.label}\r\n </span>\r\n {item.meta && (\r\n <span className=\"text-xs text-slate-500 dark:text-slate-300\">{item.meta}</span>\r\n )}\r\n </div>\r\n {item.description && (\r\n <p className=\"mt-1 text-sm text-slate-600 dark:text-slate-300\">{item.description}</p>\r\n )}\r\n <div className=\"mt-3 flex flex-wrap gap-4 text-xs text-slate-500 dark:text-slate-300\">\r\n {amount && (\r\n <div className=\"flex items-center gap-1 text-sm text-slate-700 dark:text-slate-100\">\r\n <Icon name=\"wallet\" className=\"h-3.5 w-3.5 text-slate-400\" />\r\n {amount}\r\n </div>\r\n )}\r\n {date && (\r\n <div className=\"flex items-center gap-1\">\r\n <Icon name=\"clock\" className=\"h-3.5 w-3.5 text-slate-400\" aria-hidden={true} />\r\n <time dateTime={item.date instanceof Date ? item.date.toISOString() : typeof item.date === 'string' ? item.date : undefined}>\r\n {date}\r\n </time>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nSettlementTimeline.displayName = \"SettlementTimeline\";\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport { DashboardEmptyState } from \"./EmptyState\";\r\nimport { Icon } from \"../Icon\";\r\nimport type { IconName } from \"../../lib/icons\";\r\n\r\ntype RoutingStatus = \"normal\" | \"warning\" | \"critical\";\r\n\r\n/**\r\n * 라우팅 분할 세그먼트 인터페이스 / RoutingBreakdownSegment interface\r\n * @typedef {Object} RoutingBreakdownSegment\r\n * @property {string} id - 세그먼트 고유 ID / Segment unique ID\r\n * @property {string} label - 세그먼트 라벨 / Segment label\r\n * @property {number} value - 세그먼트 값 / Segment value\r\n * @property {string} [color] - 커스텀 색상 / Custom color\r\n * @property {RoutingStatus} [status] - 상태 / Status\r\n * @property {string} [icon] - 아이콘 이름 / Icon name\r\n * @property {string} [detail] - 상세 정보 / Detail information\r\n */\r\nexport interface RoutingBreakdownSegment {\r\n id: string;\r\n label: string;\r\n value: number;\r\n color?: string;\r\n status?: RoutingStatus;\r\n icon?: string;\r\n detail?: string;\r\n}\r\n\r\n/**\r\n * RoutingBreakdownCard 컴포넌트의 props / RoutingBreakdownCard component props\r\n * @typedef {Object} RoutingBreakdownCardProps\r\n * @property {string} [title=\"PG / 결제수단 비중\"] - 카드 제목 / Card title\r\n * @property {string} [description=\"라우팅별 처리 비율과 상태\"] - 카드 설명 / Card description\r\n * @property {RoutingBreakdownSegment[]} segments - 세그먼트 배열 / Segments array\r\n * @property {string} [totalLabel=\"총 거래\"] - 총계 라벨 / Total label\r\n * @property {React.ReactNode} [totalValue] - 총계 값 / Total value\r\n * @property {string} [highlightId] - 강조할 세그먼트 ID / Highlighted segment ID\r\n * @property {React.ReactNode} [actions] - 액션 컴포넌트 / Actions component\r\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\r\n * @property {(segment: RoutingBreakdownSegment, percentage: number) => React.ReactNode} [formatter] - 커스텀 포맷터 / Custom formatter\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface RoutingBreakdownCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n title?: string;\r\n description?: string;\r\n segments: RoutingBreakdownSegment[];\r\n totalLabel?: string;\r\n totalValue?: React.ReactNode;\r\n highlightId?: string;\r\n actions?: React.ReactNode;\r\n emptyState?: React.ReactNode;\r\n formatter?: (segment: RoutingBreakdownSegment, percentage: number) => React.ReactNode;\r\n}\r\n\r\nconst DEFAULT_COLORS = [\"#0ea5e9\", \"#6366f1\", \"#22c55e\", \"#f97316\", \"#a855f7\", \"#ef4444\"];\r\n\r\nconst STATUS_BADGES: Record<RoutingStatus, string> = {\r\n normal: \"bg-emerald-50 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-100\",\r\n warning: \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-100\",\r\n critical: \"bg-rose-50 text-rose-700 dark:bg-rose-500/20 dark:text-rose-100\",\r\n};\r\n\r\nconst formatPercentage = (value: number, total: number) => {\r\n if (total <= 0) return \"0%\";\r\n return `${Math.round((value / total) * 1000) / 10}%`;\r\n};\r\n\r\n/**\r\n * RoutingBreakdownCard 컴포넌트\r\n * \r\n * PG 라우팅 또는 결제수단별 비중을 표시하는 카드 컴포넌트입니다.\r\n * 진행 바와 세그먼트별 상세 정보를 제공합니다.\r\n * \r\n * Card component that displays PG routing or payment method breakdown.\r\n * Provides progress bar and detailed information for each segment.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <RoutingBreakdownCard\r\n * title=\"PG 라우팅 비중\"\r\n * segments={[\r\n * { id: \"pg1\", label: \"PG A\", value: 5000, status: \"normal\" },\r\n * { id: \"pg2\", label: \"PG B\", value: 3000, status: \"warning\" },\r\n * { id: \"pg3\", label: \"PG C\", value: 2000, status: \"normal\" }\r\n * ]}\r\n * totalValue=\"10,000\"\r\n * />\r\n * \r\n * @example\r\n * // 강조 기능 / Highlight feature\r\n * <RoutingBreakdownCard\r\n * segments={segments}\r\n * highlightId=\"pg1\"\r\n * formatter={(segment, percentage) => (\r\n * <div>\r\n * <span>{segment.value.toLocaleString()}</span>\r\n * <span>{percentage}%</span>\r\n * </div>\r\n * )}\r\n * />\r\n * \r\n * @param {RoutingBreakdownCardProps} props - RoutingBreakdownCard 컴포넌트의 props / RoutingBreakdownCard component props\r\n * @returns {JSX.Element} RoutingBreakdownCard 컴포넌트 / RoutingBreakdownCard component\r\n */\r\nexport const RoutingBreakdownCard: React.FC<RoutingBreakdownCardProps> = ({\r\n title = \"PG / 결제수단 비중\",\r\n description = \"라우팅별 처리 비율과 상태\",\r\n segments,\r\n totalLabel = \"총 거래\",\r\n totalValue,\r\n highlightId,\r\n actions,\r\n emptyState,\r\n formatter,\r\n className,\r\n ...props\r\n}) => {\r\n const hasSegments = segments.length > 0;\r\n const total = segments.reduce((sum, segment) => sum + segment.value, 0);\r\n\r\n return (\r\n <div\r\n className={merge(\r\n \"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/60 p-5\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\r\n <div>\r\n <p className=\"text-sm font-semibold text-slate-900 dark:text-white\">{title}</p>\r\n <p className=\"text-xs text-slate-500\">{description}</p>\r\n </div>\r\n {actions && <div className=\"text-xs text-slate-500\">{actions}</div>}\r\n </div>\r\n\r\n {!hasSegments ? (\r\n emptyState ?? (\r\n <DashboardEmptyState\r\n icon=\"pie-chart\"\r\n title=\"라우팅 데이터가 없습니다\"\r\n description=\"PG 라우팅 혹은 결제수단 정보가 수집되면 자동으로 표시됩니다.\"\r\n size=\"sm\"\r\n className=\"mt-4\"\r\n />\r\n )\r\n ) : (\r\n <>\r\n <div className=\"mt-4\">\r\n <div className=\"flex h-3 overflow-hidden rounded-full bg-slate-100 dark:bg-slate-800\">\r\n {segments.map((segment, index) => {\r\n const width = total === 0 ? 0 : (segment.value / total) * 100;\r\n const color = segment.color ?? DEFAULT_COLORS[index % DEFAULT_COLORS.length];\r\n return (\r\n <div\r\n key={segment.id}\r\n className=\"h-full transition-all\"\r\n style={{\r\n width: `${width}%`,\r\n backgroundColor: color,\r\n opacity: highlightId && highlightId !== segment.id ? 0.4 : 1,\r\n }}\r\n aria-label={`${segment.label} ${formatPercentage(segment.value, total)}`}\r\n />\r\n );\r\n })}\r\n </div>\r\n <div className=\"mt-2 text-xs text-slate-500\">\r\n {totalLabel}: {totalValue ?? total.toLocaleString()}\r\n </div>\r\n </div>\r\n\r\n <div className=\"mt-4 space-y-3\">\r\n {segments.map((segment, index) => {\r\n const color = segment.color ?? DEFAULT_COLORS[index % DEFAULT_COLORS.length];\r\n const percentage = total === 0 ? 0 : (segment.value / total) * 100;\r\n const badgeClass = segment.status ? STATUS_BADGES[segment.status] : null;\r\n const customContent = formatter?.(segment, percentage);\r\n\r\n return (\r\n <div\r\n key={segment.id}\r\n className={merge(\r\n \"flex flex-wrap items-center gap-3 rounded-xl border border-slate-100 dark:border-slate-800 p-3 transition hover:border-slate-200 dark:hover:border-slate-700\",\r\n highlightId === segment.id && \"border-2 border-slate-200 dark:border-slate-600\"\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2 min-w-[3rem]\">\r\n {segment.icon && (\r\n <span className=\"rounded-lg bg-slate-100 dark:bg-slate-800 p-1.5 text-slate-500\">\r\n <Icon name={segment.icon as IconName} className=\"h-4 w-4\" />\r\n </span>\r\n )}\r\n <div\r\n className=\"h-2 w-12 rounded-full\"\r\n style={{ backgroundColor: color }}\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n <span className=\"text-sm font-medium text-slate-900 dark:text-white\">{segment.label}</span>\r\n {badgeClass && (\r\n <span className={merge(\"rounded-full px-2 py-0.5 text-[11px] font-medium\", badgeClass)}>\r\n {segment.status === \"critical\"\r\n ? \"장애\"\r\n : segment.status === \"warning\"\r\n ? \"감시\"\r\n : \"정상\"}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"text-xs text-slate-500 dark:text-slate-300\">\r\n {segment.detail}\r\n </div>\r\n </div>\r\n {customContent ?? (\r\n <div className=\"text-right text-sm text-slate-700 dark:text-slate-100\">\r\n <div className=\"font-semibold\">{segment.value.toLocaleString()}</div>\r\n <div className=\"text-xs text-slate-500\">{formatPercentage(segment.value, total)}</div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nRoutingBreakdownCard.displayName = \"RoutingBreakdownCard\";\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport { Badge } from \"../Badge\";\r\nimport { Icon } from \"../Icon\";\r\nimport type { IconName } from \"../../lib/icons\";\r\nimport { DashboardEmptyState } from \"./EmptyState\";\r\nimport { Skeleton } from \"../Skeleton\";\r\n\r\nexport type MerchantHealth = \"normal\" | \"warning\" | \"critical\";\r\n\r\n/**\r\n * 가맹점 리스트 아이템 인터페이스 / MerchantListItem interface\r\n * @typedef {Object} MerchantListItem\r\n * @property {string} id - 가맹점 고유 ID / Merchant unique ID\r\n * @property {string} name - 가맹점 이름 / Merchant name\r\n * @property {string} [status] - 상태 / Status\r\n * @property {MerchantHealth} [health] - 건강 상태 / Health status\r\n * @property {number} [approvalRate] - 승인률 (0-1) / Approval rate (0-1)\r\n * @property {number} [volume] - 거래량 / Transaction volume\r\n * @property {string} [currency] - 통화 / Currency\r\n * @property {string} [category] - 카테고리 / Category\r\n * @property {string} [region] - 지역 / Region\r\n * @property {string | Date} [updatedAt] - 업데이트 시간 / Updated time\r\n * @property {string} [tag] - 태그 / Tag\r\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\r\n * @property {Array<{ label: string; value: React.ReactNode }>} [metadata] - 메타데이터 / Metadata\r\n */\r\nexport interface MerchantListItem {\r\n id: string;\r\n name: string;\r\n status?: string;\r\n health?: MerchantHealth;\r\n approvalRate?: number;\r\n volume?: number;\r\n currency?: string;\r\n category?: string;\r\n region?: string;\r\n updatedAt?: string | Date;\r\n tag?: string;\r\n icon?: IconName | React.ReactNode;\r\n metadata?: Array<{ label: string; value: React.ReactNode }>;\r\n}\r\n\r\n/**\r\n * MerchantList 컴포넌트의 props / MerchantList component props\r\n * @typedef {Object} MerchantListProps\r\n * @property {MerchantListItem[]} items - 가맹점 아이템 배열 / Merchant items array\r\n * @property {boolean} [isLoading=false] - 로딩 상태 / Loading state\r\n * @property {React.ReactNode} [filters] - 필터 컴포넌트 / Filter component\r\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\r\n * @property {(merchant: MerchantListItem) => void} [onMerchantSelect] - 가맹점 선택 핸들러 / Merchant selection handler\r\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\r\n * @property {string} [defaultCurrency=\"KRW\"] - 기본 통화 / Default currency\r\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\">}\r\n */\r\nexport interface MerchantListProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\r\n items: MerchantListItem[];\r\n isLoading?: boolean;\r\n filters?: React.ReactNode;\r\n emptyState?: React.ReactNode;\r\n onMerchantSelect?: (merchant: MerchantListItem) => void;\r\n locale?: string;\r\n defaultCurrency?: string;\r\n}\r\n\r\nconst HEALTH_BADGES: Record<MerchantHealth, string> = {\r\n normal: \"bg-emerald-50 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-100\",\r\n warning: \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-100\",\r\n critical: \"bg-rose-50 text-rose-700 dark:bg-rose-500/20 dark:text-rose-100\",\r\n};\r\n\r\nconst formatPercent = (value?: number) => {\r\n if (typeof value !== \"number\") return undefined;\r\n return `${(Math.round(value * 10) / 10).toFixed(1)}%`;\r\n};\r\n\r\nconst formatVolume = (value?: number, currency?: string, locale = \"ko-KR\") => {\r\n if (typeof value !== \"number\") return undefined;\r\n const unit = currency ?? \"KRW\";\r\n try {\r\n return new Intl.NumberFormat(locale, {\r\n style: \"currency\",\r\n currency: unit,\r\n maximumFractionDigits: 0,\r\n }).format(value);\r\n } catch {\r\n return `${value.toLocaleString(locale)} ${unit}`;\r\n }\r\n};\r\n\r\n/**\r\n * MerchantList 컴포넌트\r\n * \r\n * 가맹점 목록을 표시하는 컴포넌트입니다.\r\n * 가맹점 정보, 건강 상태, 승인률, 거래량 등을 카드 형태로 표시합니다.\r\n * \r\n * Component that displays a list of merchants.\r\n * Shows merchant information, health status, approval rate, and transaction volume in card format.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <MerchantList\r\n * items={[\r\n * {\r\n * id: \"1\",\r\n * name: \"가맹점 A\",\r\n * health: \"normal\",\r\n * approvalRate: 0.985,\r\n * volume: 1000000,\r\n * currency: \"KRW\"\r\n * }\r\n * ]}\r\n * onMerchantSelect={(merchant) => console.log(merchant)}\r\n * />\r\n * \r\n * @example\r\n * // 로딩 상태 / Loading state\r\n * <MerchantList\r\n * items={merchants}\r\n * isLoading={true}\r\n * filters={<FilterComponent />}\r\n * />\r\n * \r\n * @param {MerchantListProps} props - MerchantList 컴포넌트의 props / MerchantList component props\r\n * @returns {JSX.Element} MerchantList 컴포넌트 / MerchantList component\r\n */\r\nexport const MerchantList: React.FC<MerchantListProps> = ({\r\n items,\r\n isLoading = false,\r\n filters,\r\n emptyState,\r\n onMerchantSelect,\r\n locale = \"ko-KR\",\r\n defaultCurrency = \"KRW\",\r\n className,\r\n ...props\r\n}) => {\r\n const hasItems = items.length > 0;\r\n\r\n return (\r\n <div\r\n className={merge(\r\n \"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {filters && (\r\n <div className=\"border-b border-slate-100 dark:border-slate-800 px-4 py-3 md:px-6\">{filters}</div>\r\n )}\r\n\r\n <div className=\"p-4 md:p-6\">\r\n {isLoading ? (\r\n <div className=\"space-y-3\">\r\n {[...Array(3)].map((_, idx) => (\r\n <Skeleton key={idx} className=\"h-20 rounded-2xl\" />\r\n ))}\r\n </div>\r\n ) : !hasItems ? (\r\n emptyState ?? (\r\n <DashboardEmptyState\r\n icon=\"store\"\r\n title=\"가맹점이 없습니다\"\r\n description=\"검색어를 변경하거나 새로운 가맹점을 온보딩하세요.\"\r\n size=\"sm\"\r\n className=\"py-6\"\r\n />\r\n )\r\n ) : (\r\n <div className=\"space-y-3\" role=\"list\" aria-label=\"가맹점 목록\">\r\n {items.map((merchant) => {\r\n const approval = formatPercent(merchant.approvalRate);\r\n const volume = formatVolume(merchant.volume, merchant.currency ?? defaultCurrency, locale);\r\n const badgeClass = merchant.health ? HEALTH_BADGES[merchant.health] : undefined;\r\n\r\n const merchantLabel = `${merchant.name}${merchant.status ? `, 상태: ${merchant.status}` : ''}${merchant.health ? `, 건강 상태: ${merchant.health === \"critical\" ? \"위험\" : merchant.health === \"warning\" ? \"감시\" : \"정상\"}` : ''}${volume ? `, 거래량: ${volume}` : ''}${approval ? `, 승인률: ${approval}` : ''}`;\r\n\r\n return (\r\n <button\r\n key={merchant.id}\r\n type=\"button\"\r\n role=\"button\"\r\n onClick={onMerchantSelect ? () => onMerchantSelect(merchant) : undefined}\r\n disabled={!onMerchantSelect}\r\n aria-label={onMerchantSelect ? `${merchantLabel} - 클릭하여 상세 정보 보기` : merchantLabel}\r\n className={merge(\r\n \"w-full rounded-2xl border border-slate-100 dark:border-slate-800 bg-white/90 dark:bg-slate-900/60 p-4 text-left shadow-sm transition hover:border-slate-200 dark:hover:border-slate-700 focus:outline-none focus-visible:ring-1 focus-visible:ring-cyan-500/70\",\r\n onMerchantSelect ? \"cursor-pointer\" : \"cursor-default opacity-60\"\r\n )}\r\n >\r\n <div className=\"flex flex-wrap items-center gap-3\">\r\n {merchant.icon && (\r\n <div className=\"rounded-xl bg-slate-100 dark:bg-slate-800 p-2 text-slate-500\">\r\n {typeof merchant.icon === \"string\" ? (\r\n <Icon name={merchant.icon as IconName} className=\"h-5 w-5\" />\r\n ) : (\r\n merchant.icon\r\n )}\r\n </div>\r\n )}\r\n <div className=\"flex-1\">\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n <p className=\"text-sm font-semibold text-slate-900 dark:text-white\">{merchant.name}</p>\r\n {merchant.status && (\r\n <Badge className=\"bg-slate-100 text-slate-600 dark:bg-slate-800 dark:text-slate-100\">\r\n {merchant.status}\r\n </Badge>\r\n )}\r\n {merchant.tag && (\r\n <span className=\"rounded-full bg-slate-50 px-2 py-0.5 text-[11px] text-slate-500 dark:bg-slate-800/80\">\r\n {merchant.tag}\r\n </span>\r\n )}\r\n {badgeClass && (\r\n <span className={merge(\"rounded-full px-2 py-0.5 text-[11px] font-medium\", badgeClass)}>\r\n {merchant.health === \"critical\"\r\n ? \"위험\"\r\n : merchant.health === \"warning\"\r\n ? \"감시\"\r\n : \"정상\"}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"text-xs text-slate-500 dark:text-slate-300\">\r\n {merchant.category ?? \"카테고리 미정\"} · {merchant.region ?? \"지역 정보 없음\"}\r\n </div>\r\n </div>\r\n <div className=\"text-right text-sm text-slate-900 dark:text-white\">\r\n {volume && <div className=\"font-semibold\">{volume}</div>}\r\n {approval && <div className=\"text-xs text-slate-500\">승인률 {approval}</div>}\r\n </div>\r\n </div>\r\n\r\n {merchant.metadata && merchant.metadata.length > 0 && (\r\n <div className=\"mt-3 grid gap-3 text-xs text-slate-500 dark:text-slate-300 sm:grid-cols-2\">\r\n {merchant.metadata.map((meta) => (\r\n <div key={meta.label} className=\"flex items-center gap-2\">\r\n <span className=\"text-slate-400\">{meta.label}</span>\r\n <span className=\"text-slate-700 dark:text-slate-100\">{meta.value}</span>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nMerchantList.displayName = \"MerchantList\";\r\n\r\n","\"use client\";\r\n\r\nimport React, { useMemo } from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\nimport type { Color } from \"../../lib/types/common\";\r\n\r\n/**\r\n * 색상 단계 매핑 (빈/1/2/3+)\r\n */\r\nconst colorSteps: Record<Color, { empty: string; s1: string; s2: string; s3: string; today: string }> = {\r\n cyan: {\r\n empty: \"bg-gray-100 dark:bg-gray-700/40\",\r\n s1: \"bg-cyan-200 dark:bg-cyan-800\",\r\n s2: \"bg-cyan-400 dark:bg-cyan-600\",\r\n s3: \"bg-cyan-600 dark:bg-cyan-400\",\r\n today: \"border-2 border-cyan-400 dark:border-cyan-300\",\r\n },\r\n blue: {\r\n empty: \"bg-gray-100 dark:bg-gray-700/40\",\r\n s1: \"bg-blue-200 dark:bg-blue-800\",\r\n s2: \"bg-blue-400 dark:bg-blue-600\",\r\n s3: \"bg-blue-600 dark:bg-blue-400\",\r\n today: \"border-2 border-blue-400 dark:border-blue-300\",\r\n },\r\n green: {\r\n empty: \"bg-gray-100 dark:bg-gray-700/40\",\r\n s1: \"bg-green-200 dark:bg-green-800\",\r\n s2: \"bg-green-400 dark:bg-green-600\",\r\n s3: \"bg-green-600 dark:bg-green-400\",\r\n today: \"border-2 border-green-400 dark:border-green-300\",\r\n },\r\n purple: {\r\n empty: \"bg-gray-100 dark:bg-gray-700/40\",\r\n s1: \"bg-purple-200 dark:bg-purple-800\",\r\n s2: \"bg-purple-400 dark:bg-purple-600\",\r\n s3: \"bg-purple-600 dark:bg-purple-400\",\r\n today: \"border-2 border-purple-400 dark:border-purple-300\",\r\n },\r\n orange: {\r\n empty: \"bg-gray-100 dark:bg-gray-700/40\",\r\n s1: \"bg-orange-200 dark:bg-orange-800\",\r\n s2: \"bg-orange-400 dark:bg-orange-600\",\r\n s3: \"bg-orange-600 dark:bg-orange-400\",\r\n today: \"border-2 border-orange-400 dark:border-orange-300\",\r\n },\r\n red: {\r\n empty: \"bg-gray-100 dark:bg-gray-700/40\",\r\n s1: \"bg-red-200 dark:bg-red-800\",\r\n s2: \"bg-red-400 dark:bg-red-600\",\r\n s3: \"bg-red-600 dark:bg-red-400\",\r\n today: \"border-2 border-red-400 dark:border-red-300\",\r\n },\r\n indigo: {\r\n empty: \"bg-gray-100 dark:bg-gray-700/40\",\r\n s1: \"bg-indigo-200 dark:bg-indigo-800\",\r\n s2: \"bg-indigo-400 dark:bg-indigo-600\",\r\n s3: \"bg-indigo-600 dark:bg-indigo-400\",\r\n today: \"border-2 border-indigo-400 dark:border-indigo-300\",\r\n },\r\n pink: {\r\n empty: \"bg-gray-100 dark:bg-gray-700/40\",\r\n s1: \"bg-pink-200 dark:bg-pink-800\",\r\n s2: \"bg-pink-400 dark:bg-pink-600\",\r\n s3: \"bg-pink-600 dark:bg-pink-400\",\r\n today: \"border-2 border-pink-400 dark:border-pink-300\",\r\n },\r\n gray: {\r\n empty: \"bg-gray-100 dark:bg-gray-700/40\",\r\n s1: \"bg-gray-200 dark:bg-gray-700\",\r\n s2: \"bg-gray-400 dark:bg-gray-500\",\r\n s3: \"bg-gray-600 dark:bg-gray-400\",\r\n today: \"border-2 border-gray-400 dark:border-gray-300\",\r\n },\r\n};\r\n\r\nexport interface YearlyHeatmapLabels {\r\n /** 제목 */\r\n title?: string;\r\n /** 총 일수 텍스트 (예: \"9일 작성\") */\r\n totalDays?: string;\r\n /** 범례 왼쪽 (예: \"적음\") */\r\n less?: string;\r\n /** 범례 오른쪽 (예: \"많음\") */\r\n more?: string;\r\n /** 툴팁 포맷 함수 (날짜, 카운트) => string */\r\n tooltip?: (dateStr: string, count: number) => string;\r\n}\r\n\r\nexport interface YearlyHeatmapProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** 날짜별 데이터 (키: \"YYYY-MM-DD\", 값: count) */\r\n data: Record<string, number>;\r\n /** 색상 테마 */\r\n color?: Color;\r\n /** locale (요일/월 표시용, 예: \"ko-KR\") */\r\n locale?: string;\r\n /** 텍스트 라벨 */\r\n labels?: YearlyHeatmapLabels;\r\n}\r\n\r\n/**\r\n * GitHub 잔디 스타일 1년 히트맵\r\n * 가로: 주(52~53주), 세로: 요일(일~토)\r\n */\r\nexport function YearlyHeatmap({\r\n data,\r\n color = \"cyan\",\r\n locale = \"en-US\",\r\n labels = {},\r\n className,\r\n ...props\r\n}: YearlyHeatmapProps) {\r\n const steps = colorSteps[color] || colorSteps.cyan;\r\n\r\n // 주 단위 데이터\r\n const { weeks, monthLabels } = useMemo(() => {\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n const startDate = new Date(today);\r\n startDate.setFullYear(startDate.getFullYear() - 1);\r\n startDate.setDate(startDate.getDate() + 1);\r\n startDate.setDate(startDate.getDate() - startDate.getDay());\r\n\r\n const weeks: (Date | null)[][] = [];\r\n const monthLabels: { label: string; colIndex: number }[] = [];\r\n const currentDate = new Date(startDate);\r\n let lastMonth = -1;\r\n\r\n while (currentDate <= today || weeks.length < 53) {\r\n const week: (Date | null)[] = [];\r\n let weekHasFirstOfMonth = false;\r\n let firstOfMonthDate: Date | null = null;\r\n\r\n for (let d = 0; d < 7; d++) {\r\n const cellDate = new Date(currentDate);\r\n cellDate.setDate(cellDate.getDate() + d);\r\n\r\n if (cellDate > today) {\r\n week.push(null);\r\n } else {\r\n week.push(cellDate);\r\n // 이 주에 1일이 포함되어 있으면 월 라벨 표시\r\n if (cellDate.getDate() === 1 && cellDate.getMonth() !== lastMonth) {\r\n weekHasFirstOfMonth = true;\r\n firstOfMonthDate = cellDate;\r\n }\r\n }\r\n }\r\n\r\n if (weekHasFirstOfMonth && firstOfMonthDate) {\r\n lastMonth = firstOfMonthDate.getMonth();\r\n monthLabels.push({\r\n label: firstOfMonthDate.toLocaleDateString(locale, { month: \"short\" }),\r\n colIndex: weeks.length,\r\n });\r\n }\r\n\r\n weeks.push(week);\r\n currentDate.setDate(currentDate.getDate() + 7);\r\n if (weeks.length >= 53) break;\r\n }\r\n\r\n return { weeks, monthLabels };\r\n }, [locale]);\r\n\r\n const getDateKey = (date: Date) =>\r\n `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}-${String(date.getDate()).padStart(2, \"0\")}`;\r\n\r\n const getCellClass = (date: Date | null): string => {\r\n if (!date) return \"bg-transparent\";\r\n const count = data[getDateKey(date)] || 0;\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n const isToday = date.getTime() === today.getTime();\r\n\r\n let c = steps.empty;\r\n if (count === 1) c = steps.s1;\r\n else if (count === 2) c = steps.s2;\r\n else if (count >= 3) c = steps.s3;\r\n\r\n return isToday ? `${c} ${steps.today}` : c;\r\n };\r\n\r\n const getTooltip = (date: Date | null): string => {\r\n if (!date) return \"\";\r\n const count = data[getDateKey(date)] || 0;\r\n const dateStr = date.toLocaleDateString(locale, { year: \"numeric\", month: \"short\", day: \"numeric\" });\r\n return labels.tooltip ? labels.tooltip(dateStr, count) : `${dateStr}: ${count}`;\r\n };\r\n\r\n const totalDays = useMemo(() => Object.values(data).filter((v) => v > 0).length, [data]);\r\n\r\n return (\r\n <div className={merge(\"bg-white dark:bg-gray-800 rounded-xl p-4 shadow-lg\", className)} {...props}>\r\n {/* 헤더 */}\r\n {(labels.title || labels.totalDays) && (\r\n <div className=\"flex items-center justify-between mb-3\">\r\n {labels.title && (\r\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">{labels.title}</h3>\r\n )}\r\n {labels.totalDays && (\r\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">{labels.totalDays}</span>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 히트맵 */}\r\n <div className=\"w-full overflow-x-auto\">\r\n {/* 월 라벨 */}\r\n <div className=\"flex mb-1 gap-[2px]\">\r\n {weeks.map((_, wi) => {\r\n const ml = monthLabels.find((m) => m.colIndex === wi);\r\n return (\r\n <div key={wi} className=\"flex-1 min-w-[10px]\">\r\n {ml && (\r\n <span className=\"text-[9px] text-gray-400 dark:text-gray-500 whitespace-nowrap\">\r\n {ml.label}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* 셀 그리드 */}\r\n <div className=\"flex gap-[2px]\">\r\n {weeks.map((week, wi) => (\r\n <div key={wi} className=\"flex-1 min-w-[10px] flex flex-col gap-[2px]\">\r\n {week.map((date, di) => (\r\n <div\r\n key={di}\r\n className={`aspect-square rounded-sm ${getCellClass(date)}`}\r\n title={getTooltip(date)}\r\n />\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* 범례 */}\r\n <div className=\"flex items-center justify-end gap-1.5 mt-3 text-[10px] text-gray-400 dark:text-gray-500\">\r\n <span>{labels.less || \"Less\"}</span>\r\n <div className={`w-3 h-3 rounded-sm ${steps.empty}`} />\r\n <div className={`w-3 h-3 rounded-sm ${steps.s1}`} />\r\n <div className={`w-3 h-3 rounded-sm ${steps.s2}`} />\r\n <div className={`w-3 h-3 rounded-sm ${steps.s3}`} />\r\n <span>{labels.more || \"More\"}</span>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React, { createContext, useContext, useCallback, useMemo } from \"react\";\r\nimport type {\r\n KanbanColumn,\r\n KanbanCard,\r\n KanbanDragData,\r\n KanbanCardMoveEvent,\r\n KanbanColumnMoveEvent,\r\n ExtendedVariant,\r\n} from \"./types\";\r\nimport type { Color } from \"../../../lib/types/common\";\r\n\r\n/**\r\n * Kanban Context Value 인터페이스\r\n */\r\ninterface KanbanContextValue {\r\n // 상태\r\n columns: KanbanColumn[];\r\n cards: KanbanCard[];\r\n dragData: KanbanDragData | null;\r\n dropTargetId: string | null;\r\n dropIndex: number | null;\r\n\r\n // 드래그 액션\r\n startDrag: (data: KanbanDragData) => void;\r\n updateDropTarget: (targetId: string | null, index: number | null) => void;\r\n endDrag: () => void;\r\n\r\n // 카드 액션\r\n moveCard: (cardId: string, toColumnId: string, toIndex: number) => void;\r\n addCard: (columnId: string, card: Partial<KanbanCard>) => void;\r\n updateCard: (cardId: string, updates: Partial<KanbanCard>) => void;\r\n deleteCard: (cardId: string) => void;\r\n\r\n // 컬럼 액션\r\n moveColumn: (columnId: string, toIndex: number) => void;\r\n addColumn: (column: Partial<KanbanColumn>) => void;\r\n updateColumn: (columnId: string, updates: Partial<KanbanColumn>) => void;\r\n deleteColumn: (columnId: string) => void;\r\n\r\n // 유틸리티\r\n getCardsByColumn: (columnId: string) => KanbanCard[];\r\n canDropCard: (columnId: string) => boolean;\r\n\r\n // 설정\r\n variant: ExtendedVariant;\r\n color: Color;\r\n allowCardDrag: boolean;\r\n allowColumnDrag: boolean;\r\n allowAddCard: boolean;\r\n allowAddColumn: boolean;\r\n readOnly: boolean;\r\n\r\n // 콜백\r\n onCardClick?: (card: KanbanCard) => void;\r\n}\r\n\r\nconst KanbanContext = createContext<KanbanContextValue | null>(null);\r\n\r\n/**\r\n * Kanban Context를 사용하는 훅\r\n */\r\nexport function useKanban(): KanbanContextValue {\r\n const context = useContext(KanbanContext);\r\n if (!context) {\r\n throw new Error(\"useKanban must be used within a KanbanProvider\");\r\n }\r\n return context;\r\n}\r\n\r\n/**\r\n * Kanban Provider Props\r\n */\r\ninterface KanbanProviderProps {\r\n children: React.ReactNode;\r\n columns: KanbanColumn[];\r\n cards: KanbanCard[];\r\n onColumnsChange?: (columns: KanbanColumn[]) => void;\r\n onCardsChange?: (cards: KanbanCard[]) => void;\r\n onCardMove?: (event: KanbanCardMoveEvent) => void;\r\n onColumnMove?: (event: KanbanColumnMoveEvent) => void;\r\n onCardAdd?: (columnId: string, card: Partial<KanbanCard>) => void;\r\n onCardDelete?: (cardId: string) => void;\r\n onCardUpdate?: (cardId: string, updates: Partial<KanbanCard>) => void;\r\n onColumnAdd?: (column: Partial<KanbanColumn>) => void;\r\n onColumnDelete?: (columnId: string) => void;\r\n onColumnUpdate?: (columnId: string, updates: Partial<KanbanColumn>) => void;\r\n onCardClick?: (card: KanbanCard) => void;\r\n variant?: ExtendedVariant;\r\n color?: Color;\r\n allowCardDrag?: boolean;\r\n allowColumnDrag?: boolean;\r\n allowAddCard?: boolean;\r\n allowAddColumn?: boolean;\r\n readOnly?: boolean;\r\n}\r\n\r\n/**\r\n * Kanban Provider 컴포넌트\r\n */\r\nexport function KanbanProvider({\r\n children,\r\n columns,\r\n cards,\r\n onColumnsChange,\r\n onCardsChange,\r\n onCardMove,\r\n onColumnMove,\r\n onCardAdd,\r\n onCardDelete,\r\n onCardUpdate,\r\n onColumnAdd,\r\n onColumnDelete,\r\n onColumnUpdate,\r\n onCardClick,\r\n variant = \"elevated\",\r\n color = \"blue\",\r\n allowCardDrag = true,\r\n allowColumnDrag = true,\r\n allowAddCard = true,\r\n allowAddColumn = false,\r\n readOnly = false,\r\n}: KanbanProviderProps) {\r\n // 드래그 상태\r\n const [dragData, setDragData] = React.useState<KanbanDragData | null>(null);\r\n const [dropTargetId, setDropTargetId] = React.useState<string | null>(null);\r\n const [dropIndex, setDropIndex] = React.useState<number | null>(null);\r\n\r\n // 드래그 시작\r\n const startDrag = useCallback((data: KanbanDragData) => {\r\n setDragData(data);\r\n }, []);\r\n\r\n // 드롭 타겟 업데이트\r\n const updateDropTarget = useCallback((targetId: string | null, index: number | null) => {\r\n setDropTargetId(targetId);\r\n setDropIndex(index);\r\n }, []);\r\n\r\n // 드래그 종료\r\n const endDrag = useCallback(() => {\r\n setDragData(null);\r\n setDropTargetId(null);\r\n setDropIndex(null);\r\n }, []);\r\n\r\n // 컬럼별 카드 가져오기 (order 기준 정렬)\r\n const getCardsByColumn = useCallback(\r\n (columnId: string): KanbanCard[] => {\r\n return cards\r\n .filter((card) => card.columnId === columnId)\r\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n },\r\n [cards]\r\n );\r\n\r\n // 카드 드롭 가능 여부 (WIP limit 체크)\r\n const canDropCard = useCallback(\r\n (columnId: string): boolean => {\r\n const column = columns.find((c) => c.id === columnId);\r\n if (!column || column.limit === undefined) return true;\r\n\r\n const currentCount = getCardsByColumn(columnId).length;\r\n\r\n // 같은 컬럼 내 이동은 항상 허용\r\n if (dragData?.type === \"card\" && dragData.columnId === columnId) {\r\n return true;\r\n }\r\n\r\n return currentCount < column.limit;\r\n },\r\n [columns, getCardsByColumn, dragData]\r\n );\r\n\r\n // 카드 이동\r\n const moveCard = useCallback(\r\n (cardId: string, toColumnId: string, toIndex: number) => {\r\n if (readOnly) return;\r\n\r\n const cardToMove = cards.find((c) => c.id === cardId);\r\n if (!cardToMove) return;\r\n\r\n const fromColumnId = cardToMove.columnId;\r\n\r\n // WIP limit 체크\r\n if (fromColumnId !== toColumnId && !canDropCard(toColumnId)) {\r\n return;\r\n }\r\n\r\n // 컬럼별로 카드 그룹화 (order 기준 정렬)\r\n const cardsByColumn = new Map<string, KanbanCard[]>();\r\n columns.forEach((col) => {\r\n cardsByColumn.set(col.id, []);\r\n });\r\n cards.forEach((card) => {\r\n if (card.id !== cardId) {\r\n const colCards = cardsByColumn.get(card.columnId);\r\n if (colCards) colCards.push(card);\r\n }\r\n });\r\n\r\n // 각 컬럼의 카드를 order로 정렬\r\n cardsByColumn.forEach((colCards) => {\r\n colCards.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n });\r\n\r\n // 목적지 컬럼에 새 위치로 삽입\r\n const targetColumnCards = cardsByColumn.get(toColumnId) || [];\r\n const clampedIndex = Math.min(toIndex, targetColumnCards.length);\r\n\r\n // 이동할 카드 (columnId 변경)\r\n const movedCard: KanbanCard = { ...cardToMove, columnId: toColumnId };\r\n targetColumnCards.splice(clampedIndex, 0, movedCard);\r\n cardsByColumn.set(toColumnId, targetColumnCards);\r\n\r\n // 모든 카드의 order 재계산 (컬럼별로)\r\n const updatedCards: KanbanCard[] = [];\r\n cardsByColumn.forEach((colCards) => {\r\n colCards.forEach((card, index) => {\r\n updatedCards.push({ ...card, order: index });\r\n });\r\n });\r\n\r\n onCardsChange?.(updatedCards);\r\n onCardMove?.({ cardId, fromColumnId, toColumnId, toIndex: clampedIndex });\r\n },\r\n [cards, columns, readOnly, canDropCard, onCardsChange, onCardMove]\r\n );\r\n\r\n // 카드 추가\r\n const addCard = useCallback(\r\n (columnId: string, card: Partial<KanbanCard>) => {\r\n if (readOnly) return;\r\n\r\n // WIP limit 체크\r\n if (!canDropCard(columnId)) return;\r\n\r\n const newCard: KanbanCard = {\r\n id: card.id || `card-${Date.now()}`,\r\n columnId,\r\n title: card.title || \"새 카드\",\r\n description: card.description,\r\n priority: card.priority,\r\n tags: card.tags,\r\n assignee: card.assignee,\r\n dueDate: card.dueDate,\r\n metadata: card.metadata,\r\n };\r\n\r\n const newCards = [...cards, newCard];\r\n onCardsChange?.(newCards);\r\n onCardAdd?.(columnId, newCard);\r\n },\r\n [cards, readOnly, canDropCard, onCardsChange, onCardAdd]\r\n );\r\n\r\n // 카드 수정\r\n const updateCard = useCallback(\r\n (cardId: string, updates: Partial<KanbanCard>) => {\r\n if (readOnly) return;\r\n\r\n const newCards = cards.map((card) =>\r\n card.id === cardId ? { ...card, ...updates } : card\r\n );\r\n\r\n onCardsChange?.(newCards);\r\n onCardUpdate?.(cardId, updates);\r\n },\r\n [cards, readOnly, onCardsChange, onCardUpdate]\r\n );\r\n\r\n // 카드 삭제\r\n const deleteCard = useCallback(\r\n (cardId: string) => {\r\n if (readOnly) return;\r\n\r\n const newCards = cards.filter((card) => card.id !== cardId);\r\n onCardsChange?.(newCards);\r\n onCardDelete?.(cardId);\r\n },\r\n [cards, readOnly, onCardsChange, onCardDelete]\r\n );\r\n\r\n // 컬럼 이동\r\n const moveColumn = useCallback(\r\n (columnId: string, toIndex: number) => {\r\n if (readOnly) return;\r\n\r\n const columnIndex = columns.findIndex((c) => c.id === columnId);\r\n if (columnIndex === -1) return;\r\n\r\n const newColumns = [...columns];\r\n const [removed] = newColumns.splice(columnIndex, 1);\r\n newColumns.splice(toIndex, 0, removed);\r\n\r\n onColumnsChange?.(newColumns);\r\n onColumnMove?.({ columnId, toIndex });\r\n },\r\n [columns, readOnly, onColumnsChange, onColumnMove]\r\n );\r\n\r\n // 컬럼 추가\r\n const addColumn = useCallback(\r\n (column: Partial<KanbanColumn>) => {\r\n if (readOnly) return;\r\n\r\n const newColumn: KanbanColumn = {\r\n id: column.id || `column-${Date.now()}`,\r\n title: column.title || \"새 컬럼\",\r\n color: column.color,\r\n limit: column.limit,\r\n collapsed: column.collapsed,\r\n };\r\n\r\n const newColumns = [...columns, newColumn];\r\n onColumnsChange?.(newColumns);\r\n onColumnAdd?.(newColumn);\r\n },\r\n [columns, readOnly, onColumnsChange, onColumnAdd]\r\n );\r\n\r\n // 컬럼 수정\r\n const updateColumn = useCallback(\r\n (columnId: string, updates: Partial<KanbanColumn>) => {\r\n if (readOnly) return;\r\n\r\n const newColumns = columns.map((column) =>\r\n column.id === columnId ? { ...column, ...updates } : column\r\n );\r\n\r\n onColumnsChange?.(newColumns);\r\n onColumnUpdate?.(columnId, updates);\r\n },\r\n [columns, readOnly, onColumnsChange, onColumnUpdate]\r\n );\r\n\r\n // 컬럼 삭제\r\n const deleteColumn = useCallback(\r\n (columnId: string) => {\r\n if (readOnly) return;\r\n\r\n // 해당 컬럼의 카드도 함께 삭제\r\n const newColumns = columns.filter((column) => column.id !== columnId);\r\n const newCards = cards.filter((card) => card.columnId !== columnId);\r\n\r\n onColumnsChange?.(newColumns);\r\n onCardsChange?.(newCards);\r\n onColumnDelete?.(columnId);\r\n },\r\n [columns, cards, readOnly, onColumnsChange, onCardsChange, onColumnDelete]\r\n );\r\n\r\n // Context 값 메모이제이션\r\n const value = useMemo<KanbanContextValue>(\r\n () => ({\r\n columns,\r\n cards,\r\n dragData,\r\n dropTargetId,\r\n dropIndex,\r\n startDrag,\r\n updateDropTarget,\r\n endDrag,\r\n moveCard,\r\n addCard,\r\n updateCard,\r\n deleteCard,\r\n moveColumn,\r\n addColumn,\r\n updateColumn,\r\n deleteColumn,\r\n getCardsByColumn,\r\n canDropCard,\r\n variant,\r\n color,\r\n allowCardDrag,\r\n allowColumnDrag,\r\n allowAddCard,\r\n allowAddColumn,\r\n readOnly,\r\n onCardClick,\r\n }),\r\n [\r\n columns,\r\n cards,\r\n dragData,\r\n dropTargetId,\r\n dropIndex,\r\n startDrag,\r\n updateDropTarget,\r\n endDrag,\r\n moveCard,\r\n addCard,\r\n updateCard,\r\n deleteCard,\r\n moveColumn,\r\n addColumn,\r\n updateColumn,\r\n deleteColumn,\r\n getCardsByColumn,\r\n canDropCard,\r\n variant,\r\n color,\r\n allowCardDrag,\r\n allowColumnDrag,\r\n allowAddCard,\r\n allowAddColumn,\r\n readOnly,\r\n onCardClick,\r\n ]\r\n );\r\n\r\n return <KanbanContext.Provider value={value}>{children}</KanbanContext.Provider>;\r\n}\r\n\r\nexport { KanbanContext };\r\n","\"use client\";\r\n\r\nimport React, { useState, useRef, useEffect } from \"react\";\r\nimport { merge } from \"../../../lib/utils\";\r\nimport { Icon } from \"../../Icon\";\r\nimport { useColorStyles } from \"../../../lib/styles/colors\";\r\nimport type { Color } from \"../../../lib/types/common\";\r\n\r\n/**\r\n * Color to dot class mapping\r\n */\r\nconst colorDotClasses: Record<Color, string> = {\r\n blue: \"bg-indigo-500\",\r\n purple: \"bg-purple-500\",\r\n green: \"bg-green-500\",\r\n orange: \"bg-orange-500\",\r\n red: \"bg-red-500\",\r\n indigo: \"bg-indigo-500\",\r\n pink: \"bg-pink-500\",\r\n gray: \"bg-gray-500\",\r\n cyan: \"bg-cyan-500\",\r\n};\r\nimport type { KanbanColumnHeaderProps } from \"./types\";\r\n\r\n/**\r\n * KanbanColumnHeader 컴포넌트\r\n *\r\n * 칸반 컬럼의 헤더를 렌더링합니다.\r\n * 제목 편집, 삭제, 접기/펼치기 기능을 제공합니다.\r\n */\r\nexport const KanbanColumnHeader = React.forwardRef<\r\n HTMLDivElement,\r\n KanbanColumnHeaderProps\r\n>(\r\n (\r\n {\r\n column,\r\n cardCount,\r\n onTitleChange,\r\n onDelete,\r\n onToggleCollapse,\r\n dragHandleProps,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [isEditing, setIsEditing] = useState(false);\r\n const [editTitle, setEditTitle] = useState(column.title);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n const colorStyles = useColorStyles(column.color || \"gray\");\r\n\r\n // Focus input when editing starts\r\n useEffect(() => {\r\n if (isEditing && inputRef.current) {\r\n inputRef.current.focus();\r\n inputRef.current.select();\r\n }\r\n }, [isEditing]);\r\n\r\n const handleTitleClick = () => {\r\n if (onTitleChange) {\r\n setIsEditing(true);\r\n setEditTitle(column.title);\r\n }\r\n };\r\n\r\n const handleTitleSubmit = () => {\r\n if (editTitle.trim() && editTitle !== column.title) {\r\n onTitleChange?.(editTitle.trim());\r\n } else {\r\n setEditTitle(column.title);\r\n }\r\n setIsEditing(false);\r\n };\r\n\r\n const handleTitleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === \"Enter\") {\r\n handleTitleSubmit();\r\n } else if (e.key === \"Escape\") {\r\n setEditTitle(column.title);\r\n setIsEditing(false);\r\n }\r\n };\r\n\r\n // Collapsed state - only show title vertically centered\r\n if (column.collapsed) {\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"flex flex-col items-center justify-center h-full min-h-[300px] py-4 px-2 rounded-xl\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {/* Expand button */}\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onToggleCollapse?.();\r\n }}\r\n onPointerDown={(e) => e.stopPropagation()}\r\n className=\"flex flex-col items-center gap-3 w-full h-full justify-center cursor-pointer hover:bg-gray-200/50 dark:hover:bg-gray-700/50 transition-colors rounded-lg p-2\"\r\n >\r\n <Icon\r\n name=\"chevronRight\"\r\n size={16}\r\n className=\"text-gray-400\"\r\n />\r\n <span\r\n className=\"text-sm font-semibold text-gray-700 dark:text-gray-300 tracking-wide\"\r\n style={{ writingMode: \"vertical-rl\", textOrientation: \"mixed\" }}\r\n >\r\n {column.title}\r\n </span>\r\n <span className={merge(\"text-xs px-2 py-1 rounded-full font-medium\", colorStyles.badge)}>\r\n {cardCount}\r\n </span>\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"flex items-center justify-between gap-2 px-3 py-3 border-b border-gray-200 dark:border-gray-700\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {/* Left: Drag handle + Color indicator + Title */}\r\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\r\n {/* Drag handle */}\r\n {dragHandleProps && (\r\n <div\r\n {...dragHandleProps}\r\n className={merge(\r\n \"flex-shrink-0 p-0.5 -ml-1 rounded hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors\",\r\n dragHandleProps?.className\r\n )}\r\n title=\"드래그하여 컬럼 이동\"\r\n >\r\n <Icon name=\"moreVertical\" size={16} className=\"text-gray-400\" />\r\n </div>\r\n )}\r\n\r\n {/* Color dot */}\r\n <div\r\n className={merge(\r\n \"w-3 h-3 rounded-full flex-shrink-0\",\r\n colorDotClasses[column.color || \"gray\"]\r\n )}\r\n />\r\n\r\n {/* Title */}\r\n {isEditing ? (\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n value={editTitle}\r\n onChange={(e) => setEditTitle(e.target.value)}\r\n onBlur={handleTitleSubmit}\r\n onKeyDown={handleTitleKeyDown}\r\n className=\"flex-1 min-w-0 px-2 py-1 text-sm font-semibold bg-transparent border border-indigo-500 rounded outline-none text-gray-800 dark:text-white\"\r\n />\r\n ) : (\r\n <h3\r\n className={merge(\r\n \"flex-1 min-w-0 text-sm font-semibold truncate text-gray-800 dark:text-white\",\r\n onTitleChange && \"cursor-pointer hover:text-indigo-600 dark:hover:text-indigo-400\"\r\n )}\r\n onClick={handleTitleClick}\r\n >\r\n {column.title}\r\n </h3>\r\n )}\r\n\r\n {/* Card count badge */}\r\n <span\r\n className={merge(\r\n \"text-xs px-2 py-0.5 rounded-full flex-shrink-0\",\r\n colorStyles.badge,\r\n column.limit && cardCount >= column.limit && \"bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400\"\r\n )}\r\n >\r\n {cardCount}\r\n {column.limit && `/${column.limit}`}\r\n </span>\r\n </div>\r\n\r\n {/* Right: Actions */}\r\n <div className=\"flex items-center gap-1 flex-shrink-0\">\r\n {/* Collapse button */}\r\n {onToggleCollapse && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n onToggleCollapse();\r\n }}\r\n onPointerDown={(e) => e.stopPropagation()}\r\n className=\"p-1 rounded hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors\"\r\n aria-label=\"컬럼 접기\"\r\n >\r\n <Icon\r\n name=\"chevronLeft\"\r\n size={14}\r\n className=\"text-gray-400\"\r\n />\r\n </button>\r\n )}\r\n\r\n {/* Delete button */}\r\n {onDelete && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n onDelete();\r\n }}\r\n onPointerDown={(e) => e.stopPropagation()}\r\n className=\"p-1 rounded hover:bg-red-100 dark:hover:bg-red-900/30 transition-colors group\"\r\n aria-label=\"컬럼 삭제\"\r\n >\r\n <Icon\r\n name=\"delete\"\r\n size={14}\r\n className=\"text-gray-400 group-hover:text-red-500\"\r\n />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nKanbanColumnHeader.displayName = \"KanbanColumnHeader\";\r\n","\"use client\";\r\n\r\nimport React, { useCallback, useState, useRef, useEffect } from \"react\";\r\nimport { useSortable } from \"@dnd-kit/sortable\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { merge } from \"../../../lib/utils\";\r\nimport { Icon } from \"../../Icon\";\r\nimport { useKanban } from \"./KanbanContext\";\r\nimport type { KanbanCardProps, KanbanPriority } from \"./types\";\r\n\r\n// Keyframes ID for animation\r\nconst KEYFRAMES_ID = \"kanban-card-keyframes\";\r\n\r\n/**\r\n * Hook to inject keyframes once\r\n */\r\nfunction useCardKeyframes() {\r\n useEffect(() => {\r\n if (document.getElementById(KEYFRAMES_ID)) return;\r\n\r\n const style = document.createElement(\"style\");\r\n style.id = KEYFRAMES_ID;\r\n style.textContent = `\r\n @keyframes kanban-card-enter {\r\n from {\r\n opacity: 0;\r\n transform: translateY(8px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n @keyframes kanban-card-exit {\r\n from {\r\n opacity: 1;\r\n transform: translateX(0) scale(1);\r\n }\r\n to {\r\n opacity: 0;\r\n transform: translateX(20px) scale(0.95);\r\n }\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }, []);\r\n}\r\n\r\n/**\r\n * Priority 라벨 매핑\r\n */\r\nconst priorityLabels: Record<KanbanPriority, string> = {\r\n low: \"낮음\",\r\n medium: \"중간\",\r\n high: \"높음\",\r\n urgent: \"긴급\",\r\n};\r\n\r\n/**\r\n * KanbanCard 컴포넌트\r\n *\r\n * @dnd-kit의 useSortable을 사용하여 드래그앤드롭을 지원합니다.\r\n * 우선순위 표시, 담당자, 마감일 등을 지원합니다.\r\n */\r\nexport const KanbanCard = React.forwardRef<HTMLDivElement, KanbanCardProps>(\r\n ({ card, index, isDragging: isDraggingProp = false, isOver = false, className, style, ...props }, ref) => {\r\n // Inject keyframes\r\n useCardKeyframes();\r\n\r\n const {\r\n deleteCard,\r\n variant,\r\n allowCardDrag,\r\n readOnly,\r\n onCardClick,\r\n } = useKanban();\r\n\r\n // Sortable setup\r\n const {\r\n attributes,\r\n listeners,\r\n setNodeRef,\r\n transform,\r\n transition,\r\n isDragging,\r\n } = useSortable({\r\n id: card.id,\r\n disabled: !allowCardDrag || readOnly,\r\n data: {\r\n type: \"card\",\r\n card,\r\n columnId: card.columnId,\r\n },\r\n });\r\n\r\n // Sortable styles\r\n const sortableStyle = {\r\n transform: CSS.Transform.toString(transform),\r\n transition,\r\n ...style,\r\n };\r\n\r\n const handleClick = useCallback(() => {\r\n if (!isDragging) {\r\n onCardClick?.(card);\r\n }\r\n }, [card, onCardClick, isDragging]);\r\n\r\n // Delete animation state\r\n const [isDeleting, setIsDeleting] = useState(false);\r\n const cardRef = useRef<HTMLDivElement>(null);\r\n\r\n const handleDelete = useCallback(\r\n (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n setIsDeleting(true);\r\n\r\n // Wait for animation then delete\r\n setTimeout(() => {\r\n deleteCard(card.id);\r\n }, 200);\r\n },\r\n [card.id, deleteCard]\r\n );\r\n\r\n // Format due date\r\n const formatDueDate = (date: Date | string | undefined): string | null => {\r\n if (!date) return null;\r\n const d = typeof date === \"string\" ? new Date(date) : date;\r\n const now = new Date();\r\n const diff = d.getTime() - now.getTime();\r\n const days = Math.ceil(diff / (1000 * 60 * 60 * 24));\r\n\r\n if (days < 0) return `${Math.abs(days)}일 지남`;\r\n if (days === 0) return \"오늘\";\r\n if (days === 1) return \"내일\";\r\n return `${days}일 남음`;\r\n };\r\n\r\n const dueText = formatDueDate(card.dueDate);\r\n const isOverdue = card.dueDate && new Date(card.dueDate) < new Date();\r\n\r\n // Variant styles\r\n const cardStyles = {\r\n default: \"bg-white dark:bg-gray-800\",\r\n gradient: \"bg-gradient-to-br from-white to-gray-50 dark:from-gray-800 dark:to-gray-850\",\r\n outline: \"bg-transparent border border-gray-200 dark:border-gray-700\",\r\n elevated: \"bg-white dark:bg-gray-800 shadow-sm\",\r\n };\r\n\r\n // Card animation styles\r\n const animationStyle = {\r\n ...sortableStyle,\r\n animation: isDeleting\r\n ? \"kanban-card-exit 0.2s ease-out forwards\"\r\n : \"kanban-card-enter 0.2s ease-out both\",\r\n animationDelay: isDeleting ? \"0ms\" : `${Math.min(index * 30, 150)}ms`,\r\n };\r\n\r\n return (\r\n <div\r\n {...attributes}\r\n {...listeners}\r\n ref={setNodeRef}\r\n data-card-id={card.id}\r\n role=\"listitem\"\r\n aria-label={card.title}\r\n tabIndex={0}\r\n className={merge(\r\n \"group relative rounded-lg p-3 mb-2 cursor-grab active:cursor-grabbing transition-all duration-200\",\r\n cardStyles[variant],\r\n isDragging && \"opacity-50 scale-95 shadow-2xl z-50\",\r\n isOver && \"ring-1 ring-indigo-500\",\r\n !allowCardDrag && \"cursor-default\",\r\n isDeleting && \"pointer-events-none\",\r\n \"hover:shadow-md hover:-translate-y-0.5 touch-none\",\r\n className\r\n )}\r\n style={animationStyle}\r\n onClick={handleClick}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n handleClick();\r\n }\r\n }}\r\n {...props}\r\n >\r\n {/* Delete button (shown on hover) */}\r\n {!readOnly && (\r\n <button\r\n type=\"button\"\r\n onClick={handleDelete}\r\n className=\"absolute top-2 right-2 p-1 rounded opacity-0 group-hover:opacity-100 hover:bg-red-100 dark:hover:bg-red-900/30 transition-all\"\r\n aria-label=\"카드 삭제\"\r\n >\r\n <Icon name=\"close\" size={12} className=\"text-gray-400 hover:text-red-500\" />\r\n </button>\r\n )}\r\n\r\n {/* Title */}\r\n <h4 className=\"text-sm font-medium text-gray-800 dark:text-white pr-6 mb-1\">\r\n {card.title}\r\n </h4>\r\n\r\n {/* Description */}\r\n {card.description && (\r\n <p className=\"text-xs text-gray-500 dark:text-gray-400 line-clamp-2 mb-2\">\r\n {card.description}\r\n </p>\r\n )}\r\n\r\n {/* Tags */}\r\n {card.tags && card.tags.length > 0 && (\r\n <div className=\"flex flex-wrap gap-1 mb-2\">\r\n {card.tags.slice(0, 3).map((tag) => (\r\n <span\r\n key={tag}\r\n className=\"text-xs px-1.5 py-0.5 rounded bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300\"\r\n >\r\n {tag}\r\n </span>\r\n ))}\r\n {card.tags.length > 3 && (\r\n <span className=\"text-xs text-gray-400\">+{card.tags.length - 3}</span>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Footer: Assignee, Due date, Priority */}\r\n <div className=\"flex items-center justify-between mt-2\">\r\n {/* Assignee */}\r\n <div className=\"flex items-center gap-1\">\r\n {card.assignee && (\r\n <div className=\"flex items-center gap-1.5\">\r\n {card.assignee.avatar ? (\r\n <img\r\n src={card.assignee.avatar}\r\n alt={card.assignee.name}\r\n className=\"w-5 h-5 rounded-full\"\r\n />\r\n ) : (\r\n <div className=\"w-5 h-5 rounded-full bg-gray-300 dark:bg-gray-600 flex items-center justify-center\">\r\n <span className=\"text-[10px] font-medium text-gray-600 dark:text-gray-300\">\r\n {card.assignee.name.charAt(0).toUpperCase()}\r\n </span>\r\n </div>\r\n )}\r\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\r\n {card.assignee.name}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Due date & Priority */}\r\n <div className=\"flex items-center gap-2\">\r\n {dueText && (\r\n <span\r\n className={merge(\r\n \"text-xs flex items-center gap-0.5\",\r\n isOverdue\r\n ? \"text-red-500\"\r\n : \"text-gray-400 dark:text-gray-500\"\r\n )}\r\n >\r\n <Icon name=\"clock\" size={12} />\r\n {dueText}\r\n </span>\r\n )}\r\n {card.priority && (\r\n <span\r\n className={merge(\r\n \"text-[10px] px-1.5 py-0.5 rounded\",\r\n card.priority === \"urgent\" && \"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400\",\r\n card.priority === \"high\" && \"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400\",\r\n card.priority === \"medium\" && \"bg-indigo-100 text-cyan-700 dark:bg-indigo-900/30 dark:text-cyan-400\",\r\n card.priority === \"low\" && \"bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-400\"\r\n )}\r\n >\r\n {priorityLabels[card.priority]}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nKanbanCard.displayName = \"KanbanCard\";\r\n","\"use client\";\r\n\r\nimport React, { useState, useRef, useEffect } from \"react\";\r\nimport { merge } from \"../../../lib/utils\";\r\nimport { Icon } from \"../../Icon\";\r\nimport { useKanban } from \"./KanbanContext\";\r\nimport type { KanbanAddCardProps } from \"./types\";\r\n\r\n/**\r\n * KanbanAddCard 컴포넌트\r\n *\r\n * 새 카드를 추가하는 인라인 폼입니다.\r\n * 버튼 클릭 시 입력 폼이 나타나고, Enter로 추가합니다.\r\n */\r\nexport const KanbanAddCard = React.forwardRef<HTMLDivElement, KanbanAddCardProps>(\r\n ({ columnId, onAdd, onCancel, placeholder = \"카드 제목 입력...\", className, ...props }, ref) => {\r\n const { addCard } = useKanban();\r\n const [isAdding, setIsAdding] = useState(false);\r\n const [title, setTitle] = useState(\"\");\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Focus input when adding starts\r\n useEffect(() => {\r\n if (isAdding && inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n }, [isAdding]);\r\n\r\n const handleStartAdding = () => {\r\n setIsAdding(true);\r\n setTitle(\"\");\r\n };\r\n\r\n const handleCancel = () => {\r\n setIsAdding(false);\r\n setTitle(\"\");\r\n onCancel?.();\r\n };\r\n\r\n const handleSubmit = () => {\r\n const trimmedTitle = title.trim();\r\n if (!trimmedTitle) {\r\n handleCancel();\r\n return;\r\n }\r\n\r\n const newCard = { title: trimmedTitle };\r\n\r\n if (onAdd) {\r\n onAdd(newCard);\r\n } else {\r\n addCard(columnId, newCard);\r\n }\r\n\r\n setTitle(\"\");\r\n // Keep form open for multiple additions\r\n inputRef.current?.focus();\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n handleSubmit();\r\n } else if (e.key === \"Escape\") {\r\n handleCancel();\r\n }\r\n };\r\n\r\n // Adding form\r\n if (isAdding) {\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"rounded-lg bg-white dark:bg-gray-800 shadow-sm border border-gray-200 dark:border-gray-700 p-2\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n value={title}\r\n onChange={(e) => setTitle(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n onBlur={() => {\r\n // Delay to allow button click\r\n setTimeout(() => {\r\n if (!title.trim()) {\r\n handleCancel();\r\n }\r\n }, 150);\r\n }}\r\n placeholder={placeholder}\r\n className=\"w-full px-2 py-1.5 text-sm bg-transparent border-none outline-none text-gray-800 dark:text-white placeholder-gray-400\"\r\n />\r\n <div className=\"flex items-center justify-end gap-1 mt-2\">\r\n <button\r\n type=\"button\"\r\n onClick={handleCancel}\r\n className=\"px-2 py-1 text-xs text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 transition-colors\"\r\n >\r\n 취소\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleSubmit}\r\n disabled={!title.trim()}\r\n className={merge(\r\n \"px-3 py-1 text-xs font-medium rounded transition-colors\",\r\n title.trim()\r\n ? \"bg-indigo-500 text-white hover:bg-indigo-600\"\r\n : \"bg-gray-200 text-gray-400 dark:bg-gray-700 cursor-not-allowed\"\r\n )}\r\n >\r\n 추가\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Add button\r\n return (\r\n <button\r\n ref={ref as React.Ref<HTMLButtonElement>}\r\n type=\"button\"\r\n onClick={handleStartAdding}\r\n className={merge(\r\n \"w-full flex items-center gap-2 px-3 py-2 text-sm text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700/50 rounded-lg transition-colors\",\r\n className\r\n )}\r\n {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}\r\n >\r\n <Icon name=\"add\" size={16} />\r\n <span>카드 추가</span>\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nKanbanAddCard.displayName = \"KanbanAddCard\";\r\n","\"use client\";\r\n\r\nimport React, { useMemo, useEffect } from \"react\";\r\nimport { useSortable } from \"@dnd-kit/sortable\";\r\nimport { SortableContext, verticalListSortingStrategy } from \"@dnd-kit/sortable\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { merge } from \"../../../lib/utils\";\r\nimport { useKanban } from \"./KanbanContext\";\r\nimport { KanbanColumnHeader } from \"./KanbanColumnHeader\";\r\nimport { KanbanCard } from \"./KanbanCard\";\r\nimport { KanbanAddCard } from \"./KanbanAddCard\";\r\nimport type { KanbanColumnProps } from \"./types\";\r\n\r\n// Keyframes ID for animation\r\nconst KEYFRAMES_ID = \"kanban-column-keyframes\";\r\n\r\n/**\r\n * Hook to inject keyframes once\r\n */\r\nfunction useColumnKeyframes() {\r\n useEffect(() => {\r\n if (document.getElementById(KEYFRAMES_ID)) return;\r\n\r\n const style = document.createElement(\"style\");\r\n style.id = KEYFRAMES_ID;\r\n style.textContent = `\r\n @keyframes kanban-column-enter {\r\n from {\r\n opacity: 0;\r\n transform: translateY(12px) scale(0.98);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }, []);\r\n}\r\n\r\n/**\r\n * KanbanColumn 컴포넌트\r\n *\r\n * @dnd-kit의 useSortable을 사용하여 컬럼 재정렬을 지원합니다.\r\n * 카드는 SortableContext로 감싸서 세로 정렬을 지원합니다.\r\n */\r\nexport const KanbanColumn = React.forwardRef<HTMLDivElement, KanbanColumnProps>(\r\n ({ column, cards, index, className, style, ...props }, ref) => {\r\n // Inject keyframes\r\n useColumnKeyframes();\r\n\r\n const {\r\n updateColumn,\r\n deleteColumn,\r\n canDropCard,\r\n variant,\r\n allowColumnDrag,\r\n allowAddCard,\r\n readOnly,\r\n } = useKanban();\r\n\r\n // Sortable setup for column\r\n const {\r\n attributes,\r\n listeners,\r\n setNodeRef,\r\n transform,\r\n transition,\r\n isDragging,\r\n } = useSortable({\r\n id: column.id,\r\n disabled: !allowColumnDrag || readOnly,\r\n });\r\n\r\n // Sortable styles with entrance animation\r\n // Keep dragged column in place (with low opacity) so dnd-kit sorting works correctly\r\n const sortableStyle: React.CSSProperties = {\r\n transform: CSS.Transform.toString(transform),\r\n transition,\r\n animation: isDragging ? \"none\" : \"kanban-column-enter 0.25s ease-out both\",\r\n animationDelay: isDragging ? \"0ms\" : `${index * 50}ms`,\r\n ...style,\r\n };\r\n\r\n // WIP limit check\r\n const isAtLimit = column.limit !== undefined && cards.length >= column.limit;\r\n const canDrop = canDropCard(column.id);\r\n\r\n // Card IDs for SortableContext\r\n const cardIds = useMemo(() => cards.map((c) => c.id), [cards]);\r\n\r\n // Column header actions\r\n const handleTitleChange = (title: string) => {\r\n updateColumn(column.id, { title });\r\n };\r\n\r\n const handleDelete = () => {\r\n deleteColumn(column.id);\r\n };\r\n\r\n const handleToggleCollapse = () => {\r\n updateColumn(column.id, { collapsed: !column.collapsed });\r\n };\r\n\r\n // Variant styles\r\n const columnStyles = {\r\n default: \"bg-gray-100 dark:bg-gray-800/50\",\r\n gradient: \"bg-gradient-to-b from-gray-100 to-white dark:from-gray-800 dark:to-gray-900\",\r\n outline: \"bg-transparent border-2 border-gray-200 dark:border-gray-700\",\r\n elevated: \"bg-white dark:bg-gray-800 shadow-md\",\r\n };\r\n\r\n return (\r\n <div\r\n ref={setNodeRef}\r\n role=\"group\"\r\n aria-label={`${column.title} 컬럼`}\r\n className={merge(\r\n \"flex flex-col rounded-xl transition-all duration-300 ease-out\",\r\n columnStyles[variant],\r\n // Show placeholder with low opacity when dragging (DragOverlay shows the actual visual)\r\n isDragging && \"opacity-40\",\r\n column.collapsed ? \"w-16 min-w-[4rem] max-w-[4rem]\" : \"flex-shrink-0\",\r\n className\r\n )}\r\n style={sortableStyle}\r\n {...props}\r\n >\r\n {/* Column Header */}\r\n <KanbanColumnHeader\r\n column={column}\r\n cardCount={cards.length}\r\n onTitleChange={!readOnly ? handleTitleChange : undefined}\r\n onDelete={!readOnly ? handleDelete : undefined}\r\n onToggleCollapse={handleToggleCollapse}\r\n dragHandleProps={{\r\n ...attributes,\r\n ...listeners,\r\n className: merge(\r\n \"cursor-grab active:cursor-grabbing\",\r\n !allowColumnDrag && \"cursor-default\"\r\n ),\r\n }}\r\n />\r\n\r\n {/* Cards Container */}\r\n {!column.collapsed && (\r\n <div\r\n className=\"flex-1 px-2 pb-2 overflow-y-auto overflow-x-hidden min-h-[100px]\"\r\n role=\"list\"\r\n aria-label={`${column.title} 카드 목록`}\r\n >\r\n <SortableContext items={cardIds} strategy={verticalListSortingStrategy}>\r\n {cards.map((card, cardIndex) => (\r\n <KanbanCard\r\n key={card.id}\r\n card={card}\r\n index={cardIndex}\r\n />\r\n ))}\r\n </SortableContext>\r\n\r\n {/* Empty state */}\r\n {cards.length === 0 && (\r\n <div className=\"flex items-center justify-center h-20 text-sm text-gray-400 dark:text-gray-500\">\r\n 카드를 드래그하세요\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Add Card Button */}\r\n {!column.collapsed && allowAddCard && !readOnly && !isAtLimit && (\r\n <div className=\"px-2 pb-2\">\r\n <KanbanAddCard columnId={column.id} />\r\n </div>\r\n )}\r\n\r\n {/* WIP Limit Warning */}\r\n {!column.collapsed && isAtLimit && (\r\n <div className=\"px-2 pb-2 text-xs text-center text-amber-600 dark:text-amber-400\">\r\n WIP 제한 도달 ({column.limit}개)\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nKanbanColumn.displayName = \"KanbanColumn\";\r\n","\"use client\";\r\n\r\nimport React, { useState, useRef, useEffect } from \"react\";\r\nimport { merge } from \"../../../lib/utils\";\r\nimport { Icon } from \"../../Icon\";\r\nimport { useKanban } from \"./KanbanContext\";\r\nimport type { KanbanAddColumnProps } from \"./types\";\r\n\r\n/**\r\n * KanbanAddColumn 컴포넌트\r\n *\r\n * 새 컬럼을 추가하는 UI입니다.\r\n * 버튼 클릭 시 입력 폼이 나타나고, Enter로 추가합니다.\r\n */\r\nexport const KanbanAddColumn = React.forwardRef<HTMLDivElement, KanbanAddColumnProps>(\r\n ({ onAdd, onCancel, placeholder = \"컬럼 제목 입력...\", className, style, ...props }, ref) => {\r\n const { addColumn, variant } = useKanban();\r\n const [isAdding, setIsAdding] = useState(false);\r\n const [title, setTitle] = useState(\"\");\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Focus input when adding starts\r\n useEffect(() => {\r\n if (isAdding && inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n }, [isAdding]);\r\n\r\n const handleStartAdding = () => {\r\n setIsAdding(true);\r\n setTitle(\"\");\r\n };\r\n\r\n const handleCancel = () => {\r\n setIsAdding(false);\r\n setTitle(\"\");\r\n onCancel?.();\r\n };\r\n\r\n const handleSubmit = () => {\r\n const trimmedTitle = title.trim();\r\n if (!trimmedTitle) {\r\n handleCancel();\r\n return;\r\n }\r\n\r\n const newColumn = { title: trimmedTitle };\r\n\r\n if (onAdd) {\r\n onAdd(newColumn);\r\n } else {\r\n addColumn(newColumn);\r\n }\r\n\r\n setIsAdding(false);\r\n setTitle(\"\");\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n handleSubmit();\r\n } else if (e.key === \"Escape\") {\r\n handleCancel();\r\n }\r\n };\r\n\r\n // Variant styles\r\n const columnStyles = {\r\n default: \"bg-gray-100/50 dark:bg-gray-800/30\",\r\n gradient: \"bg-gradient-to-b from-gray-100/50 to-white/50 dark:from-gray-800/30 dark:to-gray-900/30\",\r\n outline: \"border-2 border-dashed border-gray-300 dark:border-gray-600\",\r\n elevated: \"bg-gray-100/50 dark:bg-gray-800/30\",\r\n };\r\n\r\n // Adding form\r\n if (isAdding) {\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"flex-shrink-0 rounded-xl p-3\",\r\n columnStyles[variant],\r\n className\r\n )}\r\n style={style}\r\n {...props}\r\n >\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n value={title}\r\n onChange={(e) => setTitle(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n placeholder={placeholder}\r\n className=\"w-full px-3 py-2 text-sm bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg outline-none focus:ring-1 focus:ring-indigo-500 text-gray-800 dark:text-white placeholder-gray-400\"\r\n />\r\n <div className=\"flex items-center justify-end gap-2 mt-3\">\r\n <button\r\n type=\"button\"\r\n onClick={handleCancel}\r\n className=\"px-3 py-1.5 text-sm text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 transition-colors\"\r\n >\r\n 취소\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleSubmit}\r\n disabled={!title.trim()}\r\n className={merge(\r\n \"px-4 py-1.5 text-sm font-medium rounded-lg transition-colors\",\r\n title.trim()\r\n ? \"bg-indigo-500 text-white hover:bg-indigo-600\"\r\n : \"bg-gray-200 text-gray-400 dark:bg-gray-700 cursor-not-allowed\"\r\n )}\r\n >\r\n 추가\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Add button - prominent and inviting\r\n return (\r\n <button\r\n ref={ref as React.Ref<HTMLButtonElement>}\r\n type=\"button\"\r\n onClick={handleStartAdding}\r\n className={merge(\r\n \"group flex-shrink-0 flex flex-col items-center justify-center gap-3 rounded-xl\",\r\n \"border-2 border-dashed border-gray-300 dark:border-gray-600\",\r\n \"hover:border-indigo-400 dark:hover:border-indigo-500\",\r\n \"hover:bg-indigo-50/50 dark:hover:bg-indigo-900/20\",\r\n \"transition-all duration-200\",\r\n \"text-gray-400 hover:text-indigo-500 dark:hover:text-indigo-400\",\r\n className\r\n )}\r\n style={{ ...style, minHeight: 300 }}\r\n {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}\r\n >\r\n <div className=\"w-12 h-12 rounded-full border-2 border-dashed border-current flex items-center justify-center group-hover:border-solid group-hover:bg-indigo-100 dark:group-hover:bg-indigo-900/30 transition-all duration-200\">\r\n <Icon name=\"add\" size={24} />\r\n </div>\r\n <span className=\"text-sm font-medium\">새 컬럼 추가</span>\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nKanbanAddColumn.displayName = \"KanbanAddColumn\";\r\n","\"use client\";\r\n\r\nimport React, { useState, useCallback, useMemo, useEffect } from \"react\";\r\nimport {\r\n DndContext,\r\n DragOverlay,\r\n closestCenter,\r\n KeyboardSensor,\r\n PointerSensor,\r\n useSensor,\r\n useSensors,\r\n type DragStartEvent,\r\n type DragEndEvent,\r\n type DragOverEvent,\r\n} from \"@dnd-kit/core\";\r\nimport {\r\n SortableContext,\r\n horizontalListSortingStrategy,\r\n arrayMove,\r\n} from \"@dnd-kit/sortable\";\r\nimport { merge } from \"../../../lib/utils\";\r\nimport { KanbanProvider } from \"./KanbanContext\";\r\nimport { KanbanColumn } from \"./KanbanColumn\";\r\nimport { KanbanCard } from \"./KanbanCard\";\r\nimport { KanbanAddColumn } from \"./KanbanAddColumn\";\r\nimport { Skeleton } from \"../../Skeleton\";\r\nimport type {\r\n KanbanBoardProps,\r\n KanbanColumn as KanbanColumnType,\r\n KanbanCard as KanbanCardType,\r\n} from \"./types\";\r\n\r\n/**\r\n * KanbanBoard 컴포넌트\r\n *\r\n * @dnd-kit을 사용한 드래그앤드롭 칸반 보드 컴포넌트입니다.\r\n * 컬럼 간 카드 이동, 같은 컬럼 내 순서 변경을 지원합니다.\r\n */\r\nexport const KanbanBoard = React.forwardRef<HTMLDivElement, KanbanBoardProps>(\r\n (\r\n {\r\n // Controlled props\r\n columns: controlledColumns,\r\n cards: controlledCards,\r\n // Uncontrolled props\r\n defaultColumns = [],\r\n defaultCards = [],\r\n // Callbacks\r\n onColumnsChange,\r\n onCardsChange,\r\n onCardMove,\r\n onColumnMove,\r\n onCardAdd,\r\n onCardDelete,\r\n onCardUpdate,\r\n onColumnAdd,\r\n onColumnDelete,\r\n onColumnUpdate,\r\n onCardClick,\r\n onKanbanDragStart,\r\n onKanbanDragEnd,\r\n // Style\r\n variant = \"elevated\",\r\n color = \"blue\",\r\n // Flags\r\n allowAddColumn = false,\r\n allowAddCard = true,\r\n allowColumnDrag = true,\r\n allowCardDrag = true,\r\n readOnly = false,\r\n // Layout\r\n columnMinWidth = 280,\r\n columnMaxWidth = 320,\r\n // Drag effects\r\n showDragOverlay = true,\r\n dragOverlayClassName,\r\n dragRotation = 3,\r\n dragScale = 1.05,\r\n // Standard props\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n // SSR hydration fix: only render DndContext after mount\r\n const [isMounted, setIsMounted] = useState(false);\r\n useEffect(() => {\r\n setIsMounted(true);\r\n }, []);\r\n\r\n // Internal state for uncontrolled mode\r\n const [internalColumns, setInternalColumns] =\r\n useState<KanbanColumnType[]>(defaultColumns);\r\n const [internalCards, setInternalCards] =\r\n useState<KanbanCardType[]>(defaultCards);\r\n\r\n // Drag state\r\n const [activeId, setActiveId] = useState<string | null>(null);\r\n const [activeType, setActiveType] = useState<\"card\" | \"column\" | null>(null);\r\n\r\n // Determine controlled vs uncontrolled\r\n const isControlled = controlledColumns !== undefined;\r\n const columns = isControlled ? controlledColumns : internalColumns;\r\n const cards = isControlled ? controlledCards ?? [] : internalCards;\r\n\r\n // Is dragging?\r\n const isDragging = activeId !== null;\r\n const isDraggingColumn = activeType === \"column\";\r\n\r\n // Sensors\r\n const sensors = useSensors(\r\n useSensor(PointerSensor, {\r\n activationConstraint: { distance: 8 },\r\n }),\r\n useSensor(KeyboardSensor)\r\n );\r\n\r\n // Handle column changes\r\n const handleColumnsChange = useCallback(\r\n (newColumns: KanbanColumnType[]) => {\r\n if (!isControlled) {\r\n setInternalColumns(newColumns);\r\n }\r\n onColumnsChange?.(newColumns);\r\n },\r\n [isControlled, onColumnsChange]\r\n );\r\n\r\n // Handle card changes\r\n const handleCardsChange = useCallback(\r\n (newCards: KanbanCardType[]) => {\r\n if (!isControlled) {\r\n setInternalCards(newCards);\r\n }\r\n onCardsChange?.(newCards);\r\n },\r\n [isControlled, onCardsChange]\r\n );\r\n\r\n // Get cards for a specific column (sorted by order)\r\n const getColumnCards = useCallback(\r\n (columnId: string) => {\r\n return cards\r\n .filter((card) => card.columnId === columnId)\r\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n },\r\n [cards]\r\n );\r\n\r\n // Find which column a card belongs to\r\n const findColumnByCardId = useCallback(\r\n (cardId: string): string | null => {\r\n const card = cards.find((c) => c.id === cardId);\r\n return card?.columnId ?? null;\r\n },\r\n [cards]\r\n );\r\n\r\n // Check if item is a column\r\n const isColumn = useCallback(\r\n (id: string): boolean => {\r\n return columns.some((col) => col.id === id);\r\n },\r\n [columns]\r\n );\r\n\r\n // Drag start handler\r\n const handleDragStart = useCallback(\r\n (event: DragStartEvent) => {\r\n const { active } = event;\r\n const id = active.id as string;\r\n const type = isColumn(id) ? \"column\" : \"card\";\r\n\r\n setActiveId(id);\r\n setActiveType(type);\r\n onKanbanDragStart?.(type, id);\r\n },\r\n [isColumn, onKanbanDragStart]\r\n );\r\n\r\n // Drag over handler (for moving cards between columns)\r\n const handleDragOver = useCallback(\r\n (event: DragOverEvent) => {\r\n const { active, over } = event;\r\n if (!over) return;\r\n\r\n const activeId = active.id as string;\r\n const overId = over.id as string;\r\n\r\n // Skip if dragging column (handled by dnd-kit sortable)\r\n if (isColumn(activeId)) return;\r\n\r\n const activeColumnId = findColumnByCardId(activeId);\r\n const overColumnId = isColumn(overId) ? overId : findColumnByCardId(overId);\r\n\r\n if (!activeColumnId || !overColumnId) return;\r\n\r\n // Moving to different column\r\n if (activeColumnId !== overColumnId) {\r\n const activeCards = getColumnCards(activeColumnId);\r\n const overCards = getColumnCards(overColumnId);\r\n\r\n const activeIndex = activeCards.findIndex((c) => c.id === activeId);\r\n const overIndex = isColumn(overId)\r\n ? overCards.length\r\n : overCards.findIndex((c) => c.id === overId);\r\n\r\n // Check WIP limit\r\n const overColumn = columns.find((c) => c.id === overColumnId);\r\n if (overColumn?.limit && overCards.length >= overColumn.limit) {\r\n return;\r\n }\r\n\r\n // Update cards\r\n const newCards = cards.map((card) => {\r\n if (card.id === activeId) {\r\n return { ...card, columnId: overColumnId, order: overIndex };\r\n }\r\n return card;\r\n });\r\n\r\n // Reorder cards in target column\r\n const reorderedCards = newCards.map((card) => {\r\n if (card.columnId === overColumnId && card.id !== activeId) {\r\n const currentOrder = card.order ?? 0;\r\n if (currentOrder >= overIndex) {\r\n return { ...card, order: currentOrder + 1 };\r\n }\r\n }\r\n return card;\r\n });\r\n\r\n handleCardsChange(reorderedCards);\r\n }\r\n },\r\n [cards, columns, findColumnByCardId, getColumnCards, handleCardsChange, isColumn]\r\n );\r\n\r\n // Drag end handler\r\n const handleDragEnd = useCallback(\r\n (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n const draggedId = activeId;\r\n const draggedType = activeType;\r\n\r\n setActiveId(null);\r\n setActiveType(null);\r\n\r\n if (draggedId && draggedType) {\r\n onKanbanDragEnd?.(draggedType, draggedId);\r\n }\r\n\r\n if (!over) return;\r\n\r\n const activeIdStr = active.id as string;\r\n const overId = over.id as string;\r\n\r\n if (activeIdStr === overId) return;\r\n\r\n // Column drag\r\n if (isColumn(activeIdStr) && isColumn(overId)) {\r\n const oldIndex = columns.findIndex((c) => c.id === activeIdStr);\r\n const newIndex = columns.findIndex((c) => c.id === overId);\r\n\r\n if (oldIndex !== newIndex) {\r\n const newColumns = arrayMove(columns, oldIndex, newIndex);\r\n handleColumnsChange(newColumns);\r\n onColumnMove?.({ columnId: activeIdStr, toIndex: newIndex });\r\n }\r\n return;\r\n }\r\n\r\n // Card drag within same column\r\n const activeColumnId = findColumnByCardId(activeIdStr);\r\n const overColumnId = isColumn(overId) ? overId : findColumnByCardId(overId);\r\n\r\n if (!activeColumnId || !overColumnId) return;\r\n\r\n if (activeColumnId === overColumnId) {\r\n const columnCards = getColumnCards(activeColumnId);\r\n const oldIndex = columnCards.findIndex((c) => c.id === activeIdStr);\r\n const newIndex = isColumn(overId)\r\n ? columnCards.length - 1\r\n : columnCards.findIndex((c) => c.id === overId);\r\n\r\n if (oldIndex !== newIndex && oldIndex !== -1 && newIndex !== -1) {\r\n const reorderedColumnCards = arrayMove(columnCards, oldIndex, newIndex);\r\n\r\n // Update order for all cards in this column\r\n const newCards = cards.map((card) => {\r\n if (card.columnId === activeColumnId) {\r\n const newOrder = reorderedColumnCards.findIndex((c) => c.id === card.id);\r\n return { ...card, order: newOrder };\r\n }\r\n return card;\r\n });\r\n\r\n handleCardsChange(newCards);\r\n onCardMove?.({\r\n cardId: activeIdStr,\r\n fromColumnId: activeColumnId,\r\n toColumnId: overColumnId,\r\n toIndex: newIndex,\r\n });\r\n }\r\n } else {\r\n // Card moved to different column (already handled in dragOver)\r\n onCardMove?.({\r\n cardId: activeIdStr,\r\n fromColumnId: activeColumnId,\r\n toColumnId: overColumnId,\r\n toIndex: 0,\r\n });\r\n }\r\n },\r\n [\r\n activeId,\r\n activeType,\r\n columns,\r\n cards,\r\n findColumnByCardId,\r\n getColumnCards,\r\n handleColumnsChange,\r\n handleCardsChange,\r\n isColumn,\r\n onCardMove,\r\n onColumnMove,\r\n onKanbanDragEnd,\r\n ]\r\n );\r\n\r\n // Active item for overlay\r\n const activeCard = useMemo(() => {\r\n if (!activeId || activeType !== \"card\") return null;\r\n return cards.find((c) => c.id === activeId);\r\n }, [activeId, activeType, cards]);\r\n\r\n const activeColumnData = useMemo(() => {\r\n if (!activeId || activeType !== \"column\") return null;\r\n return columns.find((c) => c.id === activeId);\r\n }, [activeId, activeType, columns]);\r\n\r\n // Board styles based on variant\r\n const boardStyles = useMemo(() => {\r\n const baseStyles = \"flex gap-4 overflow-x-auto pb-4 min-h-[400px]\";\r\n\r\n switch (variant) {\r\n case \"gradient\":\r\n return merge(baseStyles, \"p-4 rounded-2xl bg-gradient-to-br from-gray-100 to-gray-200 dark:from-gray-900 dark:to-gray-800\");\r\n case \"outline\":\r\n return merge(baseStyles, \"p-4 rounded-2xl border-2 border-dashed border-gray-300 dark:border-gray-700\");\r\n case \"elevated\":\r\n return merge(baseStyles, \"p-4 rounded-2xl bg-gray-50 dark:bg-gray-900/50\");\r\n default:\r\n return baseStyles;\r\n }\r\n }, [variant]);\r\n\r\n // Column IDs for SortableContext\r\n const columnIds = useMemo(() => columns.map((c) => c.id), [columns]);\r\n\r\n // Drag overlay styles\r\n const cardOverlayStyle = useMemo(() => ({\r\n transform: `rotate(${dragRotation}deg) scale(${dragScale})`,\r\n }), [dragRotation, dragScale]);\r\n\r\n // SSR placeholder - prevents hydration mismatch from @dnd-kit's aria-describedby\r\n if (!isMounted) {\r\n return (\r\n <div\r\n ref={ref}\r\n role=\"region\"\r\n aria-label=\"칸반 보드\"\r\n className={merge(boardStyles, className)}\r\n {...props}\r\n >\r\n {columns.map((column) => (\r\n <div\r\n key={column.id}\r\n className=\"flex-shrink-0 bg-gray-100 dark:bg-gray-800 rounded-xl p-3\"\r\n style={{ minWidth: columnMinWidth, maxWidth: columnMaxWidth }}\r\n >\r\n <Skeleton variant=\"text\" className=\"h-8 mb-3\" />\r\n <div className=\"space-y-2\">\r\n {getColumnCards(column.id).slice(0, 3).map((card) => (\r\n <Skeleton key={card.id} variant=\"rounded\" className=\"h-20\" />\r\n ))}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <KanbanProvider\r\n columns={columns}\r\n cards={cards}\r\n onColumnsChange={handleColumnsChange}\r\n onCardsChange={handleCardsChange}\r\n onCardMove={onCardMove}\r\n onColumnMove={onColumnMove}\r\n onCardAdd={onCardAdd}\r\n onCardDelete={onCardDelete}\r\n onCardUpdate={onCardUpdate}\r\n onColumnAdd={onColumnAdd}\r\n onColumnDelete={onColumnDelete}\r\n onColumnUpdate={onColumnUpdate}\r\n onCardClick={onCardClick}\r\n variant={variant}\r\n color={color}\r\n allowCardDrag={allowCardDrag && !readOnly}\r\n allowColumnDrag={allowColumnDrag && !readOnly}\r\n allowAddCard={allowAddCard && !readOnly}\r\n allowAddColumn={allowAddColumn && !readOnly}\r\n readOnly={readOnly}\r\n >\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragStart={handleDragStart}\r\n onDragOver={handleDragOver}\r\n onDragEnd={handleDragEnd}\r\n >\r\n {/* Dimmed overlay when dragging column */}\r\n {showDragOverlay && isDragging && isDraggingColumn && (\r\n <div\r\n className={merge(\r\n \"fixed inset-0 bg-black/20 dark:bg-black/40 z-40 transition-opacity duration-200\",\r\n dragOverlayClassName\r\n )}\r\n aria-hidden=\"true\"\r\n />\r\n )}\r\n\r\n <div\r\n ref={ref}\r\n role=\"region\"\r\n aria-label=\"칸반 보드\"\r\n className={merge(\r\n boardStyles,\r\n isDragging && \"relative z-50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <SortableContext\r\n items={columnIds}\r\n strategy={horizontalListSortingStrategy}\r\n >\r\n {columns.map((column, index) => (\r\n <KanbanColumn\r\n key={column.id}\r\n column={column}\r\n cards={getColumnCards(column.id)}\r\n index={index}\r\n style={column.collapsed ? undefined : {\r\n minWidth: columnMinWidth,\r\n maxWidth: columnMaxWidth,\r\n }}\r\n />\r\n ))}\r\n </SortableContext>\r\n\r\n {/* Add Column Button */}\r\n {allowAddColumn && !readOnly && (\r\n <KanbanAddColumn\r\n style={{\r\n minWidth: columnMinWidth,\r\n maxWidth: columnMaxWidth,\r\n }}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Drag Overlay */}\r\n <DragOverlay dropAnimation={{\r\n duration: 200,\r\n easing: \"cubic-bezier(0.18, 0.67, 0.6, 1.22)\",\r\n }}>\r\n {activeCard && (\r\n <div\r\n style={cardOverlayStyle}\r\n className=\"shadow-2xl\"\r\n >\r\n <KanbanCard\r\n card={activeCard}\r\n index={0}\r\n isDragging\r\n />\r\n </div>\r\n )}\r\n {activeColumnData && (\r\n <div\r\n className=\"opacity-90 shadow-2xl\"\r\n style={{\r\n transform: \"rotate(1deg)\",\r\n minWidth: columnMinWidth,\r\n maxWidth: columnMaxWidth,\r\n }}\r\n >\r\n <KanbanColumn\r\n column={activeColumnData}\r\n cards={getColumnCards(activeColumnData.id)}\r\n index={0}\r\n />\r\n </div>\r\n )}\r\n </DragOverlay>\r\n </DndContext>\r\n </KanbanProvider>\r\n );\r\n }\r\n);\r\n\r\nKanbanBoard.displayName = \"KanbanBoard\";\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../../../lib/utils\";\r\nimport type { KanbanDropIndicatorProps } from \"./types\";\r\n\r\n/**\r\n * KanbanDropIndicator 컴포넌트\r\n *\r\n * 드래그앤드롭 시 드롭 위치를 시각적으로 표시합니다.\r\n */\r\nexport const KanbanDropIndicator = React.forwardRef<\r\n HTMLDivElement,\r\n KanbanDropIndicatorProps\r\n>(({ visible, orientation = \"horizontal\", className, ...props }, ref) => {\r\n if (!visible) return null;\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"transition-all duration-150\",\r\n orientation === \"horizontal\"\r\n ? \"h-1 my-1 rounded-full bg-indigo-500\"\r\n : \"w-1 mx-1 rounded-full bg-indigo-500 self-stretch\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n );\r\n});\r\n\r\nKanbanDropIndicator.displayName = \"KanbanDropIndicator\";\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../lib/utils\";\r\n\r\n/**\r\n * StatsPanelItem 인터페이스 / StatsPanelItem interface\r\n * @typedef {Object} StatsPanelItem\r\n * @property {string} label - 통계 항목 라벨 / Stat item label\r\n * @property {string | React.ReactNode} value - 통계 값 / Stat value\r\n * @property {string | React.ReactNode} [description] - 통계 설명 / Stat description\r\n * @property {\"up\" | \"down\" | \"neutral\"} [trend] - 추세 방향 / Trend direction\r\n * @property {string} [trendValue] - 추세 값 / Trend value\r\n * @property {\"primary\" | \"secondary\" | \"neutral\" | \"warning\"} [accent] - 강조 색상 / Accent color\r\n * @property {React.ReactNode} [icon] - 아이콘 / Icon\r\n */\r\nexport interface StatsPanelItem {\r\n label: string;\r\n value: string | React.ReactNode;\r\n description?: string | React.ReactNode;\r\n trend?: \"up\" | \"down\" | \"neutral\";\r\n trendValue?: string;\r\n accent?: \"primary\" | \"secondary\" | \"neutral\" | \"warning\";\r\n icon?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * StatsPanel 컴포넌트의 props / StatsPanel component props\r\n * @typedef {Object} StatsPanelProps\r\n * @property {string} [title] - 패널 제목 / Panel title\r\n * @property {StatsPanelItem[]} items - 통계 항목 배열 / Stat items array\r\n * @property {1 | 2 | 3 | 4} [columns=4] - 그리드 컬럼 수 / Grid column count\r\n * @property {boolean} [loading=false] - 로딩 상태 / Loading state\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface StatsPanelProps extends React.HTMLAttributes<HTMLDivElement> {\r\n title?: string;\r\n items: StatsPanelItem[];\r\n columns?: 1 | 2 | 3 | 4;\r\n loading?: boolean;\r\n}\r\n\r\n/**\r\n * StatsPanel 컴포넌트 / StatsPanel component\r\n * \r\n * 통계 정보를 표시하는 패널 컴포넌트입니다.\r\n * 여러 통계 항목을 그리드 형태로 표시하며, 추세 정보를 포함할 수 있습니다.\r\n * \r\n * Panel component that displays statistics.\r\n * Shows multiple stat items in grid format and can include trend information.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <StatsPanel\r\n * items={[\r\n * { label: \"총 사용자\", value: \"1,234\", trend: \"up\", trendValue: \"+12%\" },\r\n * { label: \"활성 사용자\", value: \"567\", trend: \"down\", trendValue: \"-5%\" }\r\n * ]}\r\n * />\r\n * \r\n * @example\r\n * // 2열 그리드, 제목 포함 / 2-column grid with title\r\n * <StatsPanel\r\n * title=\"통계\"\r\n * columns={2}\r\n * items={[\r\n * { label: \"항목 1\", value: \"100\", accent: \"primary\" },\r\n * { label: \"항목 2\", value: \"200\", accent: \"secondary\" }\r\n * ]}\r\n * />\r\n * \r\n * @param {StatsPanelProps} props - StatsPanel 컴포넌트의 props / StatsPanel component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} StatsPanel 컴포넌트 / StatsPanel component\r\n */\r\nexport const StatsPanel = React.forwardRef<HTMLDivElement, StatsPanelProps>(\r\n (\r\n {\r\n title,\r\n items,\r\n columns = 4,\r\n loading = false,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const baseCardClass =\r\n \"rounded-2xl border border-[var(--border-subtle)] bg-[var(--surface)] text-[var(--text-strong)] shadow-sm transition-colors\";\r\n\r\n const accentStyles: Record<\r\n NonNullable<StatsPanelItem[\"accent\"]>,\r\n {\r\n card: string;\r\n label: string;\r\n value: string;\r\n icon: string;\r\n iconWrapper: string;\r\n }\r\n > = {\r\n primary: {\r\n card: `${baseCardClass} ring-1 ring-[rgba(0,82,204,0.18)] dark:ring-[rgba(59,130,246,0.28)] bg-gradient-to-br from-[rgba(0,82,204,0.08)] via-transparent to-transparent dark:from-[rgba(59,130,246,0.18)]`,\r\n label: \"text-[var(--brand-primary)]\",\r\n value: \"text-[var(--text-strong)]\",\r\n icon: \"text-[var(--brand-primary)]\",\r\n iconWrapper: \"bg-[rgba(0,82,204,0.12)] dark:bg-[rgba(59,130,246,0.25)]\",\r\n },\r\n secondary: {\r\n card: `${baseCardClass} ring-1 ring-[rgba(11,122,91,0.18)] dark:ring-[rgba(52,211,153,0.25)] bg-gradient-to-br from-[rgba(0,200,151,0.08)] via-transparent to-transparent dark:from-[rgba(52,211,153,0.16)]`,\r\n label: \"text-[var(--brand-secondary)]\",\r\n value: \"text-[var(--text-strong)]\",\r\n icon: \"text-[var(--brand-secondary)]\",\r\n iconWrapper: \"bg-[rgba(0,200,151,0.12)] dark:bg-[rgba(52,211,153,0.22)]\",\r\n },\r\n warning: {\r\n card: `${baseCardClass} ring-1 ring-[rgba(245,158,11,0.2)] dark:ring-[rgba(251,191,36,0.32)] bg-gradient-to-br from-[rgba(245,158,11,0.1)] via-transparent to-transparent dark:from-[rgba(251,191,36,0.2)]`,\r\n label: \"text-amber-600\",\r\n value: \"text-[var(--text-strong)]\",\r\n icon: \"text-amber-600\",\r\n iconWrapper: \"bg-[rgba(245,158,11,0.15)] dark:bg-[rgba(251,191,36,0.25)]\",\r\n },\r\n neutral: {\r\n card: baseCardClass,\r\n label: \"text-[var(--text-muted)]\",\r\n value: \"text-[var(--text-strong)]\",\r\n icon: \"text-[var(--text-muted)]\",\r\n iconWrapper: \"bg-[var(--surface-muted)]\",\r\n },\r\n };\r\n\r\n const gridCols = {\r\n 1: \"grid-cols-1\",\r\n 2: \"grid-cols-1 lg:grid-cols-2\",\r\n 3: \"grid-cols-1 lg:grid-cols-2 xl:grid-cols-3\",\r\n 4: \"grid-cols-1 lg:grid-cols-2 xl:grid-cols-4\",\r\n }[columns];\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\"w-full\", className)}\r\n {...props}\r\n >\r\n {title && (\r\n <h2 className=\"mb-4 text-lg font-semibold text-foreground\">\r\n {title}\r\n </h2>\r\n )}\r\n <div\r\n className={merge(\"grid gap-5\", gridCols)}\r\n >\r\n {loading ? (\r\n Array.from({ length: columns }).map((_, i) => (\r\n <div\r\n key={i}\r\n className=\"animate-pulse rounded-2xl border border-[var(--border-subtle)] bg-[var(--surface)] p-6\"\r\n >\r\n <div className=\"mb-2 h-4 w-20 rounded bg-[var(--surface-muted)]/80\" />\r\n <div className=\"mb-1 h-8 w-24 rounded bg-[var(--surface-muted)]/80\" />\r\n <div className=\"h-3 w-32 rounded bg-[var(--surface-muted)]/80\" />\r\n </div>\r\n ))\r\n ) : (\r\n items.map((item, index) => (\r\n <div\r\n key={index}\r\n className={merge(\r\n \"rounded-xl transition-all duration-200 p-6\",\r\n accentStyles[item.accent ?? \"neutral\"].card\r\n )}\r\n >\r\n <div className=\"mb-3 flex items-start justify-between gap-4\">\r\n <div\r\n className={merge(\r\n \"text-sm font-medium\",\r\n accentStyles[item.accent ?? \"neutral\"].label\r\n )}\r\n >\r\n {item.label}\r\n </div>\r\n {item.icon && (\r\n <div\r\n className={merge(\r\n \"inline-flex h-10 w-10 items-center justify-center rounded-xl text-base font-semibold\",\r\n accentStyles[item.accent ?? \"neutral\"].iconWrapper,\r\n accentStyles[item.accent ?? \"neutral\"].icon\r\n )}\r\n >\r\n {item.icon}\r\n </div>\r\n )}\r\n </div>\r\n <div\r\n className={merge(\r\n \"text-2xl font-semibold leading-tight mb-2\",\r\n accentStyles[item.accent ?? \"neutral\"].value\r\n )}\r\n >\r\n {item.value}\r\n </div>\r\n {item.description && (\r\n <div className=\"mt-1 text-xs text-muted-foreground\">\r\n {item.description}\r\n </div>\r\n )}\r\n {item.trend && item.trendValue && (\r\n <div\r\n className={merge(\r\n \"mt-2 flex items-center gap-1 text-xs\",\r\n item.trend === \"up\"\r\n ? \"text-green-600 dark:text-green-400\"\r\n : item.trend === \"down\"\r\n ? \"text-red-600 dark:text-red-400\"\r\n : \"text-muted-foreground\"\r\n )}\r\n >\r\n {item.trend === \"up\" && \"↑\"}\r\n {item.trend === \"down\" && \"↓\"}\r\n {item.trendValue}\r\n </div>\r\n )}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nStatsPanel.displayName = \"StatsPanel\";\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../lib/utils\";\r\n\r\n/**\r\n * SectionHeader 컴포넌트의 props / SectionHeader component props\r\n * @typedef {Object} SectionHeaderProps\r\n * @property {string} title - 섹션 제목 / Section title\r\n * @property {string} [description] - 섹션 설명 / Section description\r\n * @property {React.ReactNode} [action] - 액션 버튼 또는 요소 / Action button or element\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface SectionHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\r\n title: string;\r\n description?: string;\r\n action?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * SectionHeader 컴포넌트 / SectionHeader component\r\n * \r\n * 섹션의 헤더를 표시하는 컴포넌트입니다.\r\n * 제목, 설명, 액션 버튼을 포함할 수 있습니다.\r\n * \r\n * Component that displays section header.\r\n * Can include title, description, and action button.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <SectionHeader title=\"섹션 제목\" />\r\n * \r\n * @example\r\n * // 설명과 액션 포함 / With description and action\r\n * <SectionHeader\r\n * title=\"알림\"\r\n * description=\"최근 알림 목록\"\r\n * action={<Button>모두 읽음</Button>}\r\n * />\r\n * \r\n * @param {SectionHeaderProps} props - SectionHeader 컴포넌트의 props / SectionHeader component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} SectionHeader 컴포넌트 / SectionHeader component\r\n */\r\nexport const SectionHeader = React.forwardRef<HTMLDivElement, SectionHeaderProps>(\r\n (\r\n {\r\n title,\r\n description,\r\n action,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"flex items-center justify-between border-b border-border bg-transparent px-6 py-4 text-foreground\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div className=\"flex-1\">\r\n <h3 className=\"text-base font-semibold text-inherit\">\r\n {title}\r\n </h3>\r\n {description && (\r\n <p className=\"mt-1 text-sm text-muted-foreground\">\r\n {description}\r\n </p>\r\n )}\r\n </div>\r\n {action && (\r\n <div className=\"flex-shrink-0 ml-4\">\r\n {action}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nSectionHeader.displayName = \"SectionHeader\";\r\n\r\n","'use client'\r\n\r\nimport React, { useState, useEffect, useRef, useCallback } from 'react'\r\nimport { merge } from '../../lib/utils'\r\n\r\nexport type TransitionType = \r\n | 'fade' \r\n | 'slide' \r\n | 'scale' \r\n | 'flip' \r\n | 'morph' \r\n | 'cube' \r\n | 'zoom' \r\n | 'slide-up' \r\n | 'slide-down' \r\n | 'slide-left' \r\n | 'slide-right'\r\n\r\nexport type TransitionEasing = \r\n | 'linear' \r\n | 'ease-in' \r\n | 'ease-out' \r\n | 'ease-in-out' \r\n | 'bounce' \r\n | 'elastic' \r\n | 'smooth'\r\n\r\nexport interface AdvancedPageTransitionProps {\r\n children: React.ReactNode\r\n className?: string\r\n type?: TransitionType\r\n duration?: number\r\n easing?: TransitionEasing\r\n delay?: number\r\n autoStart?: boolean\r\n onStart?: () => void\r\n onComplete?: () => void\r\n showProgress?: boolean\r\n progressClassName?: string\r\n}\r\n\r\nexport const AdvancedPageTransition = React.forwardRef<HTMLDivElement, AdvancedPageTransitionProps>(({\r\n children,\r\n className,\r\n type = 'fade',\r\n duration = 500,\r\n easing = 'smooth',\r\n delay = 0,\r\n autoStart = true,\r\n onStart,\r\n onComplete,\r\n showProgress = false,\r\n progressClassName\r\n}, ref) => {\r\n const [isVisible, setIsVisible] = useState(false)\r\n const [progress, setProgress] = useState(0)\r\n const [_isTransitioning, setIsTransitioning] = useState(false)\r\n const animationRef = useRef<number | null>(null)\r\n const startTimeRef = useRef<number | null>(null)\r\n\r\n const getEasingFunction = (easingType: TransitionEasing) => {\r\n const easingFunctions = {\r\n linear: (t: number) => t,\r\n 'ease-in': (t: number) => t * t,\r\n 'ease-out': (t: number) => 1 - Math.pow(1 - t, 2),\r\n 'ease-in-out': (t: number) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\r\n bounce: (t: number) => {\r\n if (t < 1 / 2.75) return 7.5625 * t * t\r\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75\r\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375\r\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375\r\n },\r\n elastic: (t: number) => {\r\n return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1\r\n },\r\n smooth: (t: number) => {\r\n return t * t * (3 - 2 * t)\r\n }\r\n }\r\n return easingFunctions[easingType]\r\n }\r\n\r\n const animate = useCallback((timestamp: number) => {\r\n if (!startTimeRef.current) {\r\n startTimeRef.current = timestamp\r\n }\r\n\r\n const elapsed = timestamp - startTimeRef.current\r\n const easingFunction = getEasingFunction(easing)\r\n\r\n let currentProgress = Math.min(elapsed / duration, 1)\r\n currentProgress = easingFunction(currentProgress)\r\n\r\n setProgress(currentProgress)\r\n setIsVisible(currentProgress > 0.1)\r\n\r\n if (currentProgress < 1) {\r\n animationRef.current = requestAnimationFrame((t) => animate(t))\r\n } else {\r\n setIsTransitioning(false)\r\n setProgress(1)\r\n onComplete?.()\r\n }\r\n }, [duration, easing, onComplete])\r\n\r\n const startTransition = useCallback(() => {\r\n setIsTransitioning(true)\r\n setProgress(0)\r\n onStart?.()\r\n\r\n startTimeRef.current = null\r\n animationRef.current = requestAnimationFrame(animate)\r\n }, [animate, onStart])\r\n\r\n useEffect(() => {\r\n if (autoStart) {\r\n const timer = setTimeout(() => {\r\n startTransition()\r\n }, delay)\r\n\r\n return () => clearTimeout(timer)\r\n }\r\n }, [autoStart, delay, startTransition])\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current)\r\n }\r\n }\r\n }, [])\r\n\r\n const getTransitionStyles = () => {\r\n switch (type) {\r\n case 'fade':\r\n return {\r\n opacity: isVisible ? 1 : 0,\r\n transform: 'none'\r\n }\r\n \r\n case 'slide':\r\n return {\r\n opacity: isVisible ? 1 : 0,\r\n transform: `translateX(${(1 - progress) * 100}%)`\r\n }\r\n \r\n case 'slide-up':\r\n return {\r\n opacity: isVisible ? 1 : 0,\r\n transform: `translateY(${(1 - progress) * 100}%)`\r\n }\r\n \r\n case 'slide-down':\r\n return {\r\n opacity: isVisible ? 1 : 0,\r\n transform: `translateY(-${(1 - progress) * 100}%)`\r\n }\r\n \r\n case 'slide-left':\r\n return {\r\n opacity: isVisible ? 1 : 0,\r\n transform: `translateX(-${(1 - progress) * 100}%)`\r\n }\r\n \r\n case 'slide-right':\r\n return {\r\n opacity: isVisible ? 1 : 0,\r\n transform: `translateX(${(1 - progress) * 100}%)`\r\n }\r\n \r\n case 'scale':\r\n return {\r\n opacity: isVisible ? 1 : 0,\r\n transform: `scale(${0.8 + progress * 0.2})`\r\n }\r\n \r\n case 'flip':\r\n return {\r\n opacity: isVisible ? 1 : 0,\r\n transform: `perspective(1000px) rotateY(${(1 - progress) * 90}deg)`\r\n }\r\n \r\n case 'morph':\r\n return {\r\n opacity: isVisible ? 1 : 0,\r\n transform: `scale(${0.9 + progress * 0.1}) rotate(${(1 - progress) * 5}deg)`\r\n }\r\n \r\n case 'cube':\r\n return {\r\n opacity: isVisible ? 1 : 0,\r\n transform: `perspective(1000px) rotateX(${(1 - progress) * 90}deg) rotateY(${(1 - progress) * 45}deg)`\r\n }\r\n \r\n case 'zoom':\r\n return {\r\n opacity: isVisible ? 1 : 0,\r\n transform: `scale(${0.5 + progress * 0.5})`\r\n }\r\n \r\n default:\r\n return {\r\n opacity: isVisible ? 1 : 0,\r\n transform: 'none'\r\n }\r\n }\r\n }\r\n\r\n const transitionStyles = getTransitionStyles()\r\n\r\n return (\r\n <div className=\"relative\">\r\n {showProgress && (\r\n <div className={merge(\r\n 'fixed top-4 right-4 z-50 bg-background rounded-lg px-3 py-2 shadow-lg border',\r\n progressClassName\r\n )}>\r\n <div className=\"text-sm font-medium text-foreground\">\r\n Progress: {Math.round(progress * 100)}%\r\n </div>\r\n <div className=\"w-24 h-2 bg-muted rounded-full mt-2\">\r\n <div \r\n className=\"h-full bg-primary rounded-full transition-all duration-100\"\r\n style={{ width: `${progress * 100}%` }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n \r\n <div\r\n ref={ref}\r\n className={merge(\r\n 'transition-all duration-500 ease-out',\r\n className\r\n )}\r\n style={{\r\n ...transitionStyles,\r\n transitionDuration: `${duration}ms`,\r\n transitionTimingFunction: easing === 'smooth' \r\n ? 'cubic-bezier(0.4, 0, 0.2, 1)'\r\n : easing === 'bounce'\r\n ? 'cubic-bezier(0.68, -0.55, 0.265, 1.55)'\r\n : easing === 'elastic'\r\n ? 'cubic-bezier(0.175, 0.885, 0.32, 1.275)'\r\n : easing\r\n }}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n )\r\n})\r\n\r\nAdvancedPageTransition.displayName = 'AdvancedPageTransition'\r\n\r\n// 편의 컴포넌트들\r\nexport const FadePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\r\n <AdvancedPageTransition ref={ref} type=\"fade\" {...props} />\r\n))\r\n\r\nexport const SlidePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\r\n <AdvancedPageTransition ref={ref} type=\"slide\" {...props} />\r\n))\r\n\r\nexport const ScalePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\r\n <AdvancedPageTransition ref={ref} type=\"scale\" {...props} />\r\n))\r\n\r\nexport const FlipPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\r\n <AdvancedPageTransition ref={ref} type=\"flip\" {...props} />\r\n))\r\n\r\nexport const MorphPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\r\n <AdvancedPageTransition ref={ref} type=\"morph\" {...props} />\r\n))\r\n\r\nexport const CubePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\r\n <AdvancedPageTransition ref={ref} type=\"cube\" {...props} />\r\n))\r\n\r\nexport const ZoomPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\r\n <AdvancedPageTransition ref={ref} type=\"zoom\" {...props} />\r\n))\r\n\r\n// displayName 설정\r\nFadePageTransition.displayName = 'FadePageTransition'\r\nSlidePageTransition.displayName = 'SlidePageTransition'\r\nScalePageTransition.displayName = 'ScalePageTransition'\r\nFlipPageTransition.displayName = 'FlipPageTransition'\r\nMorphPageTransition.displayName = 'MorphPageTransition'\r\nCubePageTransition.displayName = 'CubePageTransition'\r\nZoomPageTransition.displayName = 'ZoomPageTransition'\r\n","'use client'\r\n\r\nimport { useState, useEffect, useCallback, useRef } from 'react'\r\n\r\nexport type TransitionType = \r\n | 'fade' \r\n | 'slide' \r\n | 'scale' \r\n | 'flip' \r\n | 'morph' \r\n | 'cube' \r\n | 'zoom' \r\n | 'slide-up' \r\n | 'slide-down' \r\n | 'slide-left' \r\n | 'slide-right'\r\n\r\nexport type TransitionEasing = \r\n | 'linear' \r\n | 'ease-in' \r\n | 'ease-out' \r\n | 'ease-in-out' \r\n | 'bounce' \r\n | 'elastic' \r\n | 'smooth'\r\n\r\nexport interface TransitionConfig {\r\n type: TransitionType\r\n duration: number\r\n easing: TransitionEasing\r\n delay?: number\r\n stagger?: number\r\n direction?: 'forward' | 'backward'\r\n onStart?: () => void\r\n onComplete?: () => void\r\n onReverse?: () => void\r\n}\r\n\r\nexport interface PageTransitionState {\r\n isTransitioning: boolean\r\n isVisible: boolean\r\n currentStep: number\r\n progress: number\r\n}\r\n\r\nexport interface PageTransitionControls {\r\n start: (config?: Partial<TransitionConfig>) => Promise<void>\r\n reverse: () => Promise<void>\r\n pause: () => void\r\n resume: () => void\r\n reset: () => void\r\n}\r\n\r\nexport const usePageTransition = (\r\n initialConfig: Partial<TransitionConfig> = {}\r\n): [PageTransitionState, PageTransitionControls] => {\r\n const [state, setState] = useState<PageTransitionState>({\r\n isTransitioning: false,\r\n isVisible: false,\r\n currentStep: 0,\r\n progress: 0\r\n })\r\n\r\n const animationRef = useRef<number | null>(null)\r\n const startTimeRef = useRef<number | null>(null)\r\n const configRef = useRef<TransitionConfig>({\r\n type: 'fade',\r\n duration: 500,\r\n easing: 'smooth',\r\n delay: 0,\r\n stagger: 0,\r\n direction: 'forward',\r\n ...initialConfig\r\n })\r\n\r\n const getEasingFunction = useCallback((easing: TransitionEasing) => {\r\n const easingFunctions = {\r\n linear: (t: number) => t,\r\n 'ease-in': (t: number) => t * t,\r\n 'ease-out': (t: number) => 1 - Math.pow(1 - t, 2),\r\n 'ease-in-out': (t: number) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\r\n bounce: (t: number) => {\r\n if (t < 1 / 2.75) return 7.5625 * t * t\r\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75\r\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375\r\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375\r\n },\r\n elastic: (t: number) => {\r\n return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1\r\n },\r\n smooth: (t: number) => {\r\n return t * t * (3 - 2 * t)\r\n }\r\n }\r\n return easingFunctions[easing]\r\n }, [])\r\n\r\n const animate = useCallback((timestamp: number) => {\r\n if (!startTimeRef.current) {\r\n startTimeRef.current = timestamp\r\n }\r\n\r\n const elapsed = timestamp - startTimeRef.current\r\n const config = configRef.current\r\n const easing = getEasingFunction(config.easing)\r\n \r\n let progress = Math.min(elapsed / config.duration, 1)\r\n progress = easing(progress)\r\n\r\n setState(prev => ({\r\n ...prev,\r\n progress,\r\n isVisible: config.direction === 'forward' ? progress > 0.1 : progress < 0.9,\r\n currentStep: Math.floor(progress * 10)\r\n }))\r\n\r\n if (progress < 1) {\r\n animationRef.current = requestAnimationFrame(animate)\r\n } else {\r\n setState(prev => ({\r\n ...prev,\r\n isTransitioning: false,\r\n progress: config.direction === 'forward' ? 1 : 0\r\n }))\r\n config.onComplete?.()\r\n }\r\n }, [getEasingFunction])\r\n\r\n const start = useCallback(async (config?: Partial<TransitionConfig>) => {\r\n return new Promise<void>((resolve) => {\r\n if (config) {\r\n configRef.current = { ...configRef.current, ...config }\r\n }\r\n\r\n const finalConfig = configRef.current\r\n finalConfig.onComplete = () => resolve()\r\n\r\n setState(prev => ({\r\n ...prev,\r\n isTransitioning: true,\r\n progress: finalConfig.direction === 'forward' ? 0 : 1\r\n }))\r\n\r\n startTimeRef.current = null\r\n finalConfig.onStart?.()\r\n \r\n if (finalConfig.delay) {\r\n setTimeout(() => {\r\n animationRef.current = requestAnimationFrame(animate)\r\n }, finalConfig.delay)\r\n } else {\r\n animationRef.current = requestAnimationFrame(animate)\r\n }\r\n })\r\n }, [animate])\r\n\r\n const reverse = useCallback(async () => {\r\n return new Promise<void>((resolve) => {\r\n const config = configRef.current\r\n config.direction = 'backward'\r\n config.onComplete = () => resolve()\r\n \r\n start()\r\n })\r\n }, [start])\r\n\r\n const pause = useCallback(() => {\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current)\r\n }\r\n }, [])\r\n\r\n const resume = useCallback(() => {\r\n if (state.isTransitioning) {\r\n animationRef.current = requestAnimationFrame(animate)\r\n }\r\n }, [state.isTransitioning, animate])\r\n\r\n const reset = useCallback(() => {\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current)\r\n }\r\n setState({\r\n isTransitioning: false,\r\n isVisible: false,\r\n currentStep: 0,\r\n progress: 0\r\n })\r\n }, [])\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current)\r\n }\r\n }\r\n }, [])\r\n\r\n return [state, { start, reverse, pause, resume, reset }]\r\n}\r\n\r\n// 특정 전환 타입을 위한 편의 훅들\r\nexport const useFadeTransition = (config?: Partial<TransitionConfig>) => {\r\n return usePageTransition({ type: 'fade', duration: 400, ...config })\r\n}\r\n\r\nexport const useSlideTransition = (config?: Partial<TransitionConfig>) => {\r\n return usePageTransition({ type: 'slide', duration: 600, ...config })\r\n}\r\n\r\nexport const useScaleTransition = (config?: Partial<TransitionConfig>) => {\r\n return usePageTransition({ type: 'scale', duration: 500, ...config })\r\n}\r\n\r\nexport const useMorphTransition = (config?: Partial<TransitionConfig>) => {\r\n return usePageTransition({ type: 'morph', duration: 800, ...config })\r\n}\r\n\r\nexport const useCubeTransition = (config?: Partial<TransitionConfig>) => {\r\n return usePageTransition({ type: 'cube', duration: 1000, ...config })\r\n}\r\n","'use client'\r\n\r\nimport { useState, useCallback, useRef, useEffect } from 'react'\r\nimport { TransitionType, TransitionEasing, TransitionConfig } from './usePageTransition'\r\n\r\nexport interface PageTransitionManagerConfig {\r\n defaultType?: TransitionType\r\n defaultDuration?: number\r\n defaultEasing?: TransitionEasing\r\n enableHistory?: boolean\r\n enableProgress?: boolean\r\n enableDebug?: boolean\r\n}\r\n\r\nexport interface PageTransitionEvent {\r\n id: string\r\n type: TransitionType\r\n duration: number\r\n easing: TransitionEasing\r\n timestamp: number\r\n status: 'pending' | 'active' | 'completed' | 'failed'\r\n}\r\n\r\nexport interface PageTransitionManagerState {\r\n isTransitioning: boolean\r\n currentTransition: PageTransitionEvent | null\r\n transitionHistory: PageTransitionEvent[]\r\n totalTransitions: number\r\n averageDuration: number\r\n}\r\n\r\nexport interface PageTransitionManagerControls {\r\n startTransition: (config: Partial<TransitionConfig>) => Promise<string>\r\n cancelTransition: (id: string) => void\r\n pauseAll: () => void\r\n resumeAll: () => void\r\n clearHistory: () => void\r\n getTransitionStats: () => {\r\n total: number\r\n average: number\r\n byType: Record<TransitionType, number>\r\n byStatus: Record<string, number>\r\n }\r\n}\r\n\r\nexport const usePageTransitionManager = (\r\n config: PageTransitionManagerConfig = {}\r\n): [PageTransitionManagerState, PageTransitionManagerControls] => {\r\n const {\r\n defaultType = 'fade',\r\n defaultDuration = 500,\r\n defaultEasing = 'smooth',\r\n enableHistory = true,\r\n enableProgress: _enableProgress = true,\r\n enableDebug = false\r\n } = config\r\n\r\n const [state, setState] = useState<PageTransitionManagerState>({\r\n isTransitioning: false,\r\n currentTransition: null,\r\n transitionHistory: [],\r\n totalTransitions: 0,\r\n averageDuration: 0\r\n })\r\n\r\n const activeTransitionsRef = useRef<Map<string, { timer: NodeJS.Timeout; config: TransitionConfig }>>(new Map())\r\n const transitionCounterRef = useRef(0)\r\n\r\n const logDebug = useCallback((message: string, data?: unknown) => {\r\n if (enableDebug) {\r\n // eslint-disable-next-line no-console\r\n console.log(`[PageTransitionManager] ${message}`, data)\r\n }\r\n }, [enableDebug])\r\n\r\n const updateStats = useCallback((newTransition: PageTransitionEvent) => {\r\n setState(prev => {\r\n const newHistory = enableHistory ? [...prev.transitionHistory, newTransition] : prev.transitionHistory\r\n const total = newHistory.length\r\n const average = newHistory.reduce((sum, t) => sum + t.duration, 0) / total\r\n\r\n return {\r\n ...prev,\r\n totalTransitions: total,\r\n averageDuration: average,\r\n transitionHistory: newHistory\r\n }\r\n })\r\n }, [enableHistory])\r\n\r\n const startTransition = useCallback(async (config: Partial<TransitionConfig>): Promise<string> => {\r\n const transitionId = `transition_${++transitionCounterRef.current}`\r\n const fullConfig: TransitionConfig = {\r\n type: defaultType,\r\n duration: defaultDuration,\r\n easing: defaultEasing,\r\n ...config\r\n }\r\n\r\n const transitionEvent: PageTransitionEvent = {\r\n id: transitionId,\r\n type: fullConfig.type,\r\n duration: fullConfig.duration,\r\n easing: fullConfig.easing,\r\n timestamp: Date.now(),\r\n status: 'pending'\r\n }\r\n\r\n logDebug('Starting transition', { id: transitionId, config: fullConfig })\r\n\r\n setState(prev => ({\r\n ...prev,\r\n isTransitioning: true,\r\n currentTransition: transitionEvent\r\n }))\r\n\r\n // 실제 전환 로직을 시뮬레이션 (실제로는 usePageTransition과 연동)\r\n const timer = setTimeout(() => {\r\n const completedEvent: PageTransitionEvent = {\r\n ...transitionEvent,\r\n status: 'completed'\r\n }\r\n\r\n setState(prev => ({\r\n ...prev,\r\n isTransitioning: false,\r\n currentTransition: null\r\n }))\r\n\r\n updateStats(completedEvent)\r\n activeTransitionsRef.current.delete(transitionId)\r\n logDebug('Transition completed', { id: transitionId })\r\n\r\n fullConfig.onComplete?.()\r\n }, fullConfig.duration)\r\n\r\n activeTransitionsRef.current.set(transitionId, { timer, config: fullConfig })\r\n\r\n // 진행 상태 업데이트\r\n setTimeout(() => {\r\n setState(prev => ({\r\n ...prev,\r\n currentTransition: {\r\n ...prev.currentTransition!,\r\n status: 'active'\r\n }\r\n }))\r\n }, 50)\r\n\r\n return transitionId\r\n }, [defaultType, defaultDuration, defaultEasing, logDebug, updateStats])\r\n\r\n const cancelTransition = useCallback((id: string) => {\r\n const transition = activeTransitionsRef.current.get(id)\r\n if (transition) {\r\n clearTimeout(transition.timer)\r\n activeTransitionsRef.current.delete(id)\r\n\r\n setState(prev => ({\r\n ...prev,\r\n isTransitioning: activeTransitionsRef.current.size > 0,\r\n currentTransition: prev.currentTransition?.id === id ? null : prev.currentTransition\r\n }))\r\n\r\n logDebug('Transition cancelled', { id })\r\n }\r\n }, [logDebug])\r\n\r\n const pauseAll = useCallback(() => {\r\n activeTransitionsRef.current.forEach(({ timer }, id) => {\r\n clearTimeout(timer)\r\n logDebug('Transition paused', { id })\r\n })\r\n }, [logDebug])\r\n\r\n const resumeAll = useCallback(() => {\r\n activeTransitionsRef.current.forEach(({ config }, _id) => {\r\n startTransition(config)\r\n })\r\n }, [startTransition])\r\n\r\n const clearHistory = useCallback(() => {\r\n setState(prev => ({\r\n ...prev,\r\n transitionHistory: [],\r\n totalTransitions: 0,\r\n averageDuration: 0\r\n }))\r\n logDebug('History cleared')\r\n }, [logDebug])\r\n\r\n const getTransitionStats = useCallback(() => {\r\n const { transitionHistory } = state\r\n const byType = transitionHistory.reduce((acc, t) => {\r\n acc[t.type] = (acc[t.type] || 0) + 1\r\n return acc\r\n }, {} as Record<TransitionType, number>)\r\n\r\n const byStatus = transitionHistory.reduce((acc, t) => {\r\n acc[t.status] = (acc[t.status] || 0) + 1\r\n return acc\r\n }, {} as Record<string, number>)\r\n\r\n return {\r\n total: transitionHistory.length,\r\n average: state.averageDuration,\r\n byType,\r\n byStatus\r\n }\r\n }, [state])\r\n\r\n useEffect(() => {\r\n const activeTransitions = activeTransitionsRef.current\r\n return () => {\r\n // 컴포넌트 언마운트 시 모든 타이머 정리\r\n activeTransitions.forEach(({ timer }) => {\r\n clearTimeout(timer)\r\n })\r\n activeTransitions.clear()\r\n }\r\n }, [])\r\n\r\n return [state, {\r\n startTransition,\r\n cancelTransition,\r\n pauseAll,\r\n resumeAll,\r\n clearHistory,\r\n getTransitionStats\r\n }]\r\n}\r\n\r\n// 특정 전환 타입을 위한 편의 훅들\r\nexport const useFadeTransitionManager = (config?: PageTransitionManagerConfig) => {\r\n return usePageTransitionManager({ ...config, defaultType: 'fade' })\r\n}\r\n\r\nexport const useSlideTransitionManager = (config?: PageTransitionManagerConfig) => {\r\n return usePageTransitionManager({ ...config, defaultType: 'slide' })\r\n}\r\n\r\nexport const useScaleTransitionManager = (config?: PageTransitionManagerConfig) => {\r\n return usePageTransitionManager({ ...config, defaultType: 'scale' })\r\n}\r\n\r\nexport const useMorphTransitionManager = (config?: PageTransitionManagerConfig) => {\r\n return usePageTransitionManager({ ...config, defaultType: 'morph' })\r\n}\r\n\r\nexport const useCubeTransitionManager = (config?: PageTransitionManagerConfig) => {\r\n return usePageTransitionManager({ ...config, defaultType: 'cube' })\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\n\r\n/**\r\n * Parallax 컴포넌트의 props / Parallax component props\r\n * @property {number} [speed=0.5] - 패럴렉스 속도 (0-1, 1이 가장 빠름) / Parallax speed (0-1, 1 is fastest)\r\n * @property {\"up\" | \"down\" | \"left\" | \"right\"} [direction=\"up\"] - 이동 방향 / Movement direction\r\n * @property {number} [offset=0] - 시작 오프셋 (px) / Starting offset in pixels\r\n * @property {boolean} [disabled=false] - 패럴렉스 비활성화 / Disable parallax\r\n * @property {boolean} [scale=false] - 스케일 효과 추가 / Add scale effect\r\n * @property {boolean} [opacity=false] - 투명도 효과 추가 / Add opacity effect\r\n * @property {boolean} [rotate=false] - 회전 효과 추가 / Add rotation effect\r\n */\r\nexport interface ParallaxProps extends React.HTMLAttributes<HTMLDivElement> {\r\n speed?: number;\r\n direction?: \"up\" | \"down\" | \"left\" | \"right\";\r\n offset?: number;\r\n disabled?: boolean;\r\n scale?: boolean;\r\n opacity?: boolean;\r\n rotate?: boolean;\r\n rotateDirection?: \"cw\" | \"ccw\";\r\n}\r\n\r\n/**\r\n * Parallax 컴포넌트 / Parallax component\r\n *\r\n * 스크롤에 반응하여 패럴렉스 효과를 제공하는 컴포넌트입니다.\r\n * 다양한 방향과 속도, 추가 효과(스케일, 투명도, 회전)를 지원합니다.\r\n *\r\n * Component that provides parallax effect in response to scrolling.\r\n * Supports various directions, speeds, and additional effects (scale, opacity, rotation).\r\n *\r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <Parallax speed={0.3}>\r\n * <img src=\"/background.jpg\" alt=\"background\" />\r\n * </Parallax>\r\n *\r\n * @example\r\n * // 다양한 효과 / With effects\r\n * <Parallax speed={0.5} scale opacity direction=\"up\">\r\n * <div className=\"h-screen bg-gradient-to-b from-indigo-500 to-purple-600\" />\r\n * </Parallax>\r\n */\r\nconst Parallax = React.forwardRef<HTMLDivElement, ParallaxProps>(\r\n (\r\n {\r\n children,\r\n className,\r\n speed = 0.5,\r\n direction = \"up\",\r\n offset = 0,\r\n disabled = false,\r\n scale = false,\r\n opacity = false,\r\n rotate = false,\r\n rotateDirection = \"cw\",\r\n style,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const innerRef = useRef<HTMLDivElement>(null);\r\n const [transform, setTransform] = useState({\r\n x: 0,\r\n y: 0,\r\n scale: 1,\r\n opacity: 1,\r\n rotate: 0,\r\n });\r\n\r\n // Check for reduced motion preference\r\n const prefersReducedMotion = useReducedMotion();\r\n\r\n const updateTransform = useCallback(() => {\r\n if (disabled || prefersReducedMotion) return;\r\n\r\n const element = innerRef.current;\r\n if (!element) return;\r\n\r\n const rect = element.getBoundingClientRect();\r\n const windowHeight = window.innerHeight;\r\n const windowWidth = window.innerWidth;\r\n\r\n // Calculate how far through the viewport the element is\r\n const elementCenter = rect.top + rect.height / 2;\r\n const viewportCenter = windowHeight / 2;\r\n const progress = (viewportCenter - elementCenter) / windowHeight;\r\n\r\n // Calculate movement based on direction\r\n const movement = progress * speed * 100 + offset;\r\n\r\n let x = 0;\r\n let y = 0;\r\n\r\n switch (direction) {\r\n case \"up\":\r\n y = -movement;\r\n break;\r\n case \"down\":\r\n y = movement;\r\n break;\r\n case \"left\":\r\n x = -movement;\r\n break;\r\n case \"right\":\r\n x = movement;\r\n break;\r\n }\r\n\r\n // Calculate additional effects\r\n const scaleValue = scale ? 1 + Math.abs(progress) * 0.1 : 1;\r\n const opacityValue = opacity ? Math.max(0.3, 1 - Math.abs(progress) * 0.5) : 1;\r\n const rotateValue = rotate\r\n ? progress * 10 * (rotateDirection === \"cw\" ? 1 : -1)\r\n : 0;\r\n\r\n setTransform({ x, y, scale: scaleValue, opacity: opacityValue, rotate: rotateValue });\r\n }, [disabled, prefersReducedMotion, speed, direction, offset, scale, opacity, rotate, rotateDirection]);\r\n\r\n useEffect(() => {\r\n if (disabled || prefersReducedMotion) return;\r\n\r\n // Initial calculation\r\n updateTransform();\r\n\r\n // Listen to scroll events\r\n const handleScroll = () => {\r\n requestAnimationFrame(updateTransform);\r\n };\r\n\r\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\r\n window.addEventListener(\"resize\", handleScroll, { passive: true });\r\n\r\n return () => {\r\n window.removeEventListener(\"scroll\", handleScroll);\r\n window.removeEventListener(\"resize\", handleScroll);\r\n };\r\n }, [updateTransform, disabled, prefersReducedMotion]);\r\n\r\n const combinedStyle: React.CSSProperties = {\r\n ...style,\r\n transform: disabled || prefersReducedMotion\r\n ? undefined\r\n : `translate3d(${transform.x}px, ${transform.y}px, 0) scale(${transform.scale}) rotate(${transform.rotate}deg)`,\r\n opacity: disabled || prefersReducedMotion ? 1 : transform.opacity,\r\n willChange: disabled || prefersReducedMotion ? undefined : \"transform, opacity\",\r\n };\r\n\r\n return (\r\n <div\r\n ref={mergeRefs(ref, innerRef)}\r\n className={merge(\"transition-none\", className)}\r\n style={combinedStyle}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nParallax.displayName = \"Parallax\";\r\n\r\n// Hook to check for reduced motion preference\r\nfunction useReducedMotion(): boolean {\r\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\r\n\r\n useEffect(() => {\r\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\r\n setPrefersReducedMotion(mediaQuery.matches);\r\n\r\n const handleChange = (e: MediaQueryListEvent) => {\r\n setPrefersReducedMotion(e.matches);\r\n };\r\n\r\n mediaQuery.addEventListener(\"change\", handleChange);\r\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\r\n }, []);\r\n\r\n return prefersReducedMotion;\r\n}\r\n\r\n// Utility to merge refs\r\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\r\n return (value) => {\r\n refs.forEach((ref) => {\r\n if (typeof ref === \"function\") {\r\n ref(value);\r\n } else if (ref && typeof ref === \"object\") {\r\n (ref as React.MutableRefObject<T | null>).current = value;\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport { Parallax };\r\n","\"use client\";\r\n\r\nimport React, { useRef, useEffect, useState } from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\n\r\n/**\r\n * Marquee 컴포넌트의 props / Marquee component props\r\n * @property {\"left\" | \"right\" | \"up\" | \"down\"} [direction=\"left\"] - 이동 방향 / Movement direction\r\n * @property {number} [speed=50] - 속도 (px/s) / Speed in pixels per second\r\n * @property {boolean} [pauseOnHover=true] - 호버시 일시정지 / Pause on hover\r\n * @property {boolean} [pauseOnClick=false] - 클릭시 일시정지 / Pause on click\r\n * @property {number} [gap=16] - 아이템 간격 (px) / Gap between items in pixels\r\n * @property {boolean} [gradient=true] - 양쪽 페이드 그라디언트 / Fade gradient on edges\r\n * @property {string} [gradientColor=\"hsl(var(--background))\"] - 그라디언트 색상 / Gradient color\r\n * @property {number} [gradientWidth=100] - 그라디언트 너비 (px) / Gradient width in pixels\r\n */\r\nexport interface MarqueeProps extends React.HTMLAttributes<HTMLDivElement> {\r\n direction?: \"left\" | \"right\" | \"up\" | \"down\";\r\n speed?: number;\r\n pauseOnHover?: boolean;\r\n pauseOnClick?: boolean;\r\n gap?: number;\r\n gradient?: boolean;\r\n gradientColor?: string;\r\n gradientWidth?: number;\r\n}\r\n\r\n/**\r\n * Marquee 컴포넌트 / Marquee component\r\n *\r\n * 무한 스크롤 애니메이션을 제공하는 컴포넌트입니다.\r\n * 로고, 텍스트, 이미지 등을 자동으로 흐르게 표시합니다.\r\n *\r\n * Component that provides infinite scroll animation.\r\n * Displays logos, text, images, etc. with automatic scrolling.\r\n *\r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <Marquee>\r\n * <span>Item 1</span>\r\n * <span>Item 2</span>\r\n * <span>Item 3</span>\r\n * </Marquee>\r\n *\r\n * @example\r\n * // 로고 캐러셀 / Logo carousel\r\n * <Marquee speed={30} pauseOnHover gradient>\r\n * {logos.map(logo => <img key={logo.id} src={logo.src} />)}\r\n * </Marquee>\r\n */\r\nconst Marquee = React.forwardRef<HTMLDivElement, MarqueeProps>(\r\n (\r\n {\r\n children,\r\n className,\r\n direction = \"left\",\r\n speed = 50,\r\n pauseOnHover = true,\r\n pauseOnClick = false,\r\n gap = 16,\r\n gradient = true,\r\n gradientColor = \"hsl(var(--background))\",\r\n gradientWidth = 100,\r\n style,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const [contentWidth, setContentWidth] = useState(0);\r\n const [contentHeight, setContentHeight] = useState(0);\r\n const [isPaused, setIsPaused] = useState(false);\r\n\r\n const isHorizontal = direction === \"left\" || direction === \"right\";\r\n const isReverse = direction === \"right\" || direction === \"down\";\r\n\r\n // Measure content size\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const firstChild = container.firstElementChild as HTMLElement;\r\n if (!firstChild) return;\r\n\r\n const updateSize = () => {\r\n if (isHorizontal) {\r\n setContentWidth(firstChild.offsetWidth);\r\n } else {\r\n setContentHeight(firstChild.offsetHeight);\r\n }\r\n };\r\n\r\n updateSize();\r\n\r\n const resizeObserver = new ResizeObserver(updateSize);\r\n resizeObserver.observe(firstChild);\r\n\r\n return () => resizeObserver.disconnect();\r\n }, [isHorizontal, children]);\r\n\r\n // Calculate animation duration\r\n const duration = isHorizontal\r\n ? contentWidth / speed\r\n : contentHeight / speed;\r\n\r\n const animationStyle: React.CSSProperties = {\r\n [\"--marquee-duration\" as string]: `${duration}s`,\r\n [\"--marquee-gap\" as string]: `${gap}px`,\r\n };\r\n\r\n // Gradient styles\r\n const gradientStyle = gradient\r\n ? {\r\n [\"--gradient-color\" as string]: gradientColor,\r\n [\"--gradient-width\" as string]: `${gradientWidth}px`,\r\n }\r\n : {};\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"relative overflow-hidden\",\r\n gradient && \"marquee-gradient\",\r\n className\r\n )}\r\n style={{ ...style, ...gradientStyle }}\r\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\r\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\r\n onClick={() => pauseOnClick && setIsPaused(!isPaused)}\r\n {...props}\r\n >\r\n <div\r\n ref={containerRef}\r\n className={merge(\r\n \"flex\",\r\n isHorizontal ? \"flex-row\" : \"flex-col\",\r\n isPaused ? \"animate-pause\" : \"\",\r\n isHorizontal\r\n ? isReverse\r\n ? \"animate-marquee-right\"\r\n : \"animate-marquee-left\"\r\n : isReverse\r\n ? \"animate-marquee-down\"\r\n : \"animate-marquee-up\"\r\n )}\r\n style={animationStyle}\r\n >\r\n {/* Original content */}\r\n <div\r\n className={merge(\r\n \"flex shrink-0\",\r\n isHorizontal ? \"flex-row\" : \"flex-col\"\r\n )}\r\n style={{ gap }}\r\n >\r\n {children}\r\n </div>\r\n {/* Duplicated content for seamless loop */}\r\n <div\r\n className={merge(\r\n \"flex shrink-0\",\r\n isHorizontal ? \"flex-row\" : \"flex-col\"\r\n )}\r\n style={{ gap, [isHorizontal ? \"marginLeft\" : \"marginTop\"]: gap }}\r\n aria-hidden=\"true\"\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n\r\n {/* CSS for animations - injected as style element */}\r\n <style dangerouslySetInnerHTML={{ __html: `\r\n @keyframes marquee-left {\r\n from { transform: translateX(0); }\r\n to { transform: translateX(calc(-50% - var(--marquee-gap) / 2)); }\r\n }\r\n @keyframes marquee-right {\r\n from { transform: translateX(calc(-50% - var(--marquee-gap) / 2)); }\r\n to { transform: translateX(0); }\r\n }\r\n @keyframes marquee-up {\r\n from { transform: translateY(0); }\r\n to { transform: translateY(calc(-50% - var(--marquee-gap) / 2)); }\r\n }\r\n @keyframes marquee-down {\r\n from { transform: translateY(calc(-50% - var(--marquee-gap) / 2)); }\r\n to { transform: translateY(0); }\r\n }\r\n .animate-marquee-left { animation: marquee-left var(--marquee-duration) linear infinite; }\r\n .animate-marquee-right { animation: marquee-right var(--marquee-duration) linear infinite; }\r\n .animate-marquee-up { animation: marquee-up var(--marquee-duration) linear infinite; }\r\n .animate-marquee-down { animation: marquee-down var(--marquee-duration) linear infinite; }\r\n .animate-pause { animation-play-state: paused !important; }\r\n .marquee-gradient::before, .marquee-gradient::after {\r\n content: \"\";\r\n position: absolute;\r\n top: 0;\r\n bottom: 0;\r\n width: var(--gradient-width);\r\n z-index: 10;\r\n pointer-events: none;\r\n }\r\n .marquee-gradient::before {\r\n left: 0;\r\n background: linear-gradient(to right, var(--gradient-color), transparent);\r\n }\r\n .marquee-gradient::after {\r\n right: 0;\r\n background: linear-gradient(to left, var(--gradient-color), transparent);\r\n }\r\n `}} />\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nMarquee.displayName = \"Marquee\";\r\n\r\nexport { Marquee };\r\n","\"use client\";\r\n\r\nimport React, { useRef, useState, useCallback } from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\n\r\n/**\r\n * GlowCard 컴포넌트의 props / GlowCard component props\r\n * @property {string} [glowColor=\"rgba(120, 119, 198, 0.3)\"] - 글로우 색상 / Glow color\r\n * @property {number} [glowSize=400] - 글로우 크기 (px) / Glow size in pixels\r\n * @property {number} [glowOpacity=0.6] - 글로우 투명도 / Glow opacity\r\n * @property {boolean} [border=true] - 글로우 보더 표시 / Show glow border\r\n * @property {string} [borderColor] - 보더 색상 (기본: glowColor) / Border color (default: glowColor)\r\n */\r\nexport interface GlowCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n glowColor?: string;\r\n glowSize?: number;\r\n glowOpacity?: number;\r\n border?: boolean;\r\n borderColor?: string;\r\n}\r\n\r\n/**\r\n * GlowCard 컴포넌트 / GlowCard component\r\n *\r\n * 마우스를 따라다니는 글로우 효과가 있는 카드 컴포넌트입니다.\r\n * SaaS 랜딩 페이지, 프리미엄 UI에 적합합니다.\r\n *\r\n * Card component with mouse-following glow effect.\r\n * Perfect for SaaS landing pages and premium UI.\r\n *\r\n * @component\r\n * @example\r\n * <GlowCard glowColor=\"rgba(59, 130, 246, 0.4)\">\r\n * <h3>Premium Feature</h3>\r\n * <p>This is a premium feature card</p>\r\n * </GlowCard>\r\n */\r\nconst GlowCard = React.forwardRef<HTMLDivElement, GlowCardProps>(\r\n (\r\n {\r\n children,\r\n className,\r\n glowColor = \"rgba(120, 119, 198, 0.3)\",\r\n glowSize = 400,\r\n glowOpacity = 0.6,\r\n border = true,\r\n borderColor,\r\n style,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const cardRef = useRef<HTMLDivElement>(null);\r\n const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });\r\n const [isHovered, setIsHovered] = useState(false);\r\n\r\n const handleMouseMove = useCallback(\r\n (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (!cardRef.current) return;\r\n const rect = cardRef.current.getBoundingClientRect();\r\n setMousePosition({\r\n x: e.clientX - rect.left,\r\n y: e.clientY - rect.top,\r\n });\r\n },\r\n []\r\n );\r\n\r\n const glowStyle: React.CSSProperties = {\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n borderRadius: \"inherit\",\r\n opacity: isHovered ? glowOpacity : 0,\r\n background: `radial-gradient(${glowSize}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${glowColor}, transparent 40%)`,\r\n transition: \"opacity 0.3s ease\",\r\n pointerEvents: \"none\",\r\n };\r\n\r\n const borderStyle: React.CSSProperties = border\r\n ? {\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n borderRadius: \"inherit\",\r\n opacity: isHovered ? 1 : 0,\r\n background: `radial-gradient(${glowSize / 2}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${borderColor || glowColor}, transparent 40%)`,\r\n transition: \"opacity 0.3s ease\",\r\n pointerEvents: \"none\",\r\n mask: \"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\r\n maskComposite: \"exclude\",\r\n WebkitMaskComposite: \"xor\",\r\n padding: \"1px\",\r\n }\r\n : {};\r\n\r\n return (\r\n <div\r\n ref={mergeRefs(ref, cardRef)}\r\n className={merge(\r\n \"relative overflow-hidden rounded-xl bg-card border border-border p-6\",\r\n \"transition-all duration-300\",\r\n isHovered && \"border-transparent\",\r\n className\r\n )}\r\n style={style}\r\n onMouseMove={handleMouseMove}\r\n onMouseEnter={() => setIsHovered(true)}\r\n onMouseLeave={() => setIsHovered(false)}\r\n {...props}\r\n >\r\n {/* Glow effect */}\r\n <div style={glowStyle} aria-hidden=\"true\" />\r\n\r\n {/* Border glow */}\r\n {border && <div style={borderStyle as React.CSSProperties} aria-hidden=\"true\" />}\r\n\r\n {/* Content */}\r\n <div className=\"relative z-10\">{children}</div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nGlowCard.displayName = \"GlowCard\";\r\n\r\n// Utility to merge refs\r\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\r\n return (value) => {\r\n refs.forEach((ref) => {\r\n if (typeof ref === \"function\") {\r\n ref(value);\r\n } else if (ref && typeof ref === \"object\") {\r\n (ref as React.MutableRefObject<T | null>).current = value;\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport { GlowCard };\r\n","\"use client\";\r\n\r\nimport React, { useRef, useState, useCallback } from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\n\r\n/**\r\n * SpotlightCard 컴포넌트의 props / SpotlightCard component props\r\n * @property {string} [spotlightColor=\"rgba(255, 255, 255, 0.1)\"] - 스포트라이트 색상 / Spotlight color\r\n * @property {number} [spotlightSize=300] - 스포트라이트 크기 (px) / Spotlight size in pixels\r\n * @property {boolean} [gradient=true] - 그라디언트 배경 효과 / Gradient background effect\r\n * @property {string} [gradientFrom=\"rgba(255, 255, 255, 0.05)\"] - 그라디언트 시작 색상 / Gradient start color\r\n * @property {string} [gradientTo=\"transparent\"] - 그라디언트 끝 색상 / Gradient end color\r\n */\r\nexport interface SpotlightCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n spotlightColor?: string;\r\n spotlightSize?: number;\r\n gradient?: boolean;\r\n gradientFrom?: string;\r\n gradientTo?: string;\r\n}\r\n\r\n/**\r\n * SpotlightCard 컴포넌트 / SpotlightCard component\r\n *\r\n * 마우스 위치에 스포트라이트 효과를 표시하는 프리미엄 카드 컴포넌트입니다.\r\n * 다크 테마 랜딩 페이지, 프리미엄 UI에 적합합니다.\r\n *\r\n * Premium card component that displays a spotlight effect at mouse position.\r\n * Perfect for dark theme landing pages and premium UI.\r\n *\r\n * @component\r\n * @example\r\n * <SpotlightCard className=\"bg-gray-900 text-white p-8\">\r\n * <h3>Premium Feature</h3>\r\n * <p>Discover our exclusive features</p>\r\n * </SpotlightCard>\r\n */\r\nconst SpotlightCard = React.forwardRef<HTMLDivElement, SpotlightCardProps>(\r\n (\r\n {\r\n children,\r\n className,\r\n spotlightColor = \"rgba(255, 255, 255, 0.1)\",\r\n spotlightSize = 300,\r\n gradient = true,\r\n gradientFrom = \"rgba(255, 255, 255, 0.05)\",\r\n gradientTo = \"transparent\",\r\n style,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const cardRef = useRef<HTMLDivElement>(null);\r\n const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });\r\n const [isHovered, setIsHovered] = useState(false);\r\n\r\n const handleMouseMove = useCallback(\r\n (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (!cardRef.current) return;\r\n const rect = cardRef.current.getBoundingClientRect();\r\n setMousePosition({\r\n x: e.clientX - rect.left,\r\n y: e.clientY - rect.top,\r\n });\r\n },\r\n []\r\n );\r\n\r\n const spotlightStyle: React.CSSProperties = {\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n borderRadius: \"inherit\",\r\n opacity: isHovered ? 1 : 0,\r\n background: `radial-gradient(${spotlightSize}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${spotlightColor}, transparent 60%)`,\r\n transition: \"opacity 0.4s ease\",\r\n pointerEvents: \"none\",\r\n };\r\n\r\n const gradientOverlayStyle: React.CSSProperties = gradient\r\n ? {\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n borderRadius: \"inherit\",\r\n background: `linear-gradient(135deg, ${gradientFrom} 0%, ${gradientTo} 100%)`,\r\n pointerEvents: \"none\",\r\n }\r\n : {};\r\n\r\n return (\r\n <div\r\n ref={mergeRefs(ref, cardRef)}\r\n className={merge(\r\n \"relative overflow-hidden rounded-xl\",\r\n \"bg-gray-900 border border-gray-800\",\r\n \"transition-all duration-300\",\r\n isHovered && \"border-gray-700 shadow-2xl shadow-black/20\",\r\n className\r\n )}\r\n style={style}\r\n onMouseMove={handleMouseMove}\r\n onMouseEnter={() => setIsHovered(true)}\r\n onMouseLeave={() => setIsHovered(false)}\r\n {...props}\r\n >\r\n {/* Gradient overlay */}\r\n {gradient && <div style={gradientOverlayStyle} aria-hidden=\"true\" />}\r\n\r\n {/* Spotlight effect */}\r\n <div style={spotlightStyle} aria-hidden=\"true\" />\r\n\r\n {/* Content */}\r\n <div className=\"relative z-10\">{children}</div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nSpotlightCard.displayName = \"SpotlightCard\";\r\n\r\n// Utility to merge refs\r\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\r\n return (value) => {\r\n refs.forEach((ref) => {\r\n if (typeof ref === \"function\") {\r\n ref(value);\r\n } else if (ref && typeof ref === \"object\") {\r\n (ref as React.MutableRefObject<T | null>).current = value;\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport { SpotlightCard };\r\n","\"use client\";\r\n\r\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\n\r\n/**\r\n * TextReveal 컴포넌트의 props / TextReveal component props\r\n * @property {string} text - 표시할 텍스트 / Text to display\r\n * @property {string} [revealColor=\"currentColor\"] - 공개된 텍스트 색상 / Revealed text color\r\n * @property {string} [hiddenColor=\"rgba(128, 128, 128, 0.3)\"] - 숨겨진 텍스트 색상 / Hidden text color\r\n * @property {number} [threshold=0.5] - 공개 시작 임계값 (0-1) / Reveal threshold (0-1)\r\n * @property {boolean} [byWord=false] - 단어별 공개 / Reveal by word\r\n * @property {boolean} [byChar=false] - 글자별 공개 / Reveal by character\r\n */\r\nexport interface TextRevealProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\r\n text: string;\r\n revealColor?: string;\r\n hiddenColor?: string;\r\n threshold?: number;\r\n byWord?: boolean;\r\n byChar?: boolean;\r\n}\r\n\r\n/**\r\n * TextReveal 컴포넌트 / TextReveal component\r\n *\r\n * 스크롤에 따라 텍스트가 점진적으로 공개되는 효과를 제공합니다.\r\n * 히어로 섹션, 스토리텔링 페이지에 적합합니다.\r\n *\r\n * Provides a text reveal effect based on scroll position.\r\n * Perfect for hero sections and storytelling pages.\r\n *\r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <TextReveal text=\"Welcome to the future of design\" />\r\n *\r\n * @example\r\n * // 단어별 공개 / Word by word reveal\r\n * <TextReveal\r\n * text=\"Build amazing products with our platform\"\r\n * byWord\r\n * revealColor=\"#3b82f6\"\r\n * />\r\n */\r\nconst TextReveal = React.forwardRef<HTMLDivElement, TextRevealProps>(\r\n (\r\n {\r\n text,\r\n className,\r\n revealColor = \"currentColor\",\r\n hiddenColor = \"rgba(128, 128, 128, 0.3)\",\r\n threshold = 0.5,\r\n byWord = false,\r\n byChar = false,\r\n style,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const [progress, setProgress] = useState(0);\r\n\r\n // Check for reduced motion preference\r\n const prefersReducedMotion = useReducedMotion();\r\n\r\n const updateProgress = useCallback(() => {\r\n if (!containerRef.current) return;\r\n\r\n const rect = containerRef.current.getBoundingClientRect();\r\n const windowHeight = window.innerHeight;\r\n\r\n // Calculate progress based on element position\r\n const start = windowHeight * (1 - threshold);\r\n const end = windowHeight * threshold;\r\n const elementCenter = rect.top + rect.height / 2;\r\n\r\n let newProgress = 0;\r\n if (elementCenter <= start && elementCenter >= end) {\r\n newProgress = (start - elementCenter) / (start - end);\r\n } else if (elementCenter < end) {\r\n newProgress = 1;\r\n }\r\n\r\n setProgress(Math.max(0, Math.min(1, newProgress)));\r\n }, [threshold]);\r\n\r\n useEffect(() => {\r\n if (prefersReducedMotion) {\r\n setProgress(1);\r\n return;\r\n }\r\n\r\n updateProgress();\r\n\r\n const handleScroll = () => {\r\n requestAnimationFrame(updateProgress);\r\n };\r\n\r\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\r\n window.addEventListener(\"resize\", handleScroll, { passive: true });\r\n\r\n return () => {\r\n window.removeEventListener(\"scroll\", handleScroll);\r\n window.removeEventListener(\"resize\", handleScroll);\r\n };\r\n }, [updateProgress, prefersReducedMotion]);\r\n\r\n // Split text based on mode\r\n const renderText = () => {\r\n if (byChar) {\r\n const chars = text.split(\"\");\r\n return chars.map((char, index) => {\r\n const charProgress = progress * chars.length;\r\n const isRevealed = index < charProgress;\r\n return (\r\n <span\r\n key={index}\r\n style={{\r\n color: isRevealed ? revealColor : hiddenColor,\r\n transition: \"color 0.1s ease-out\",\r\n }}\r\n >\r\n {char}\r\n </span>\r\n );\r\n });\r\n }\r\n\r\n if (byWord) {\r\n const words = text.split(\" \");\r\n return words.map((word, index) => {\r\n const wordProgress = progress * words.length;\r\n const isRevealed = index < wordProgress;\r\n return (\r\n <span key={index}>\r\n <span\r\n style={{\r\n color: isRevealed ? revealColor : hiddenColor,\r\n transition: \"color 0.15s ease-out\",\r\n }}\r\n >\r\n {word}\r\n </span>\r\n {index < words.length - 1 && \" \"}\r\n </span>\r\n );\r\n });\r\n }\r\n\r\n // Default: gradient mask reveal\r\n return (\r\n <span\r\n style={{\r\n background: `linear-gradient(90deg, ${revealColor} ${progress * 100}%, ${hiddenColor} ${progress * 100}%)`,\r\n WebkitBackgroundClip: \"text\",\r\n WebkitTextFillColor: \"transparent\",\r\n backgroundClip: \"text\",\r\n transition: \"background 0.1s ease-out\",\r\n }}\r\n >\r\n {text}\r\n </span>\r\n );\r\n };\r\n\r\n return (\r\n <div\r\n ref={mergeRefs(ref, containerRef)}\r\n className={merge(\"font-medium\", className)}\r\n style={style}\r\n {...props}\r\n >\r\n {renderText()}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nTextReveal.displayName = \"TextReveal\";\r\n\r\n// Hook to check for reduced motion preference\r\nfunction useReducedMotion(): boolean {\r\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\r\n\r\n useEffect(() => {\r\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\r\n setPrefersReducedMotion(mediaQuery.matches);\r\n\r\n const handleChange = (e: MediaQueryListEvent) => {\r\n setPrefersReducedMotion(e.matches);\r\n };\r\n\r\n mediaQuery.addEventListener(\"change\", handleChange);\r\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\r\n }, []);\r\n\r\n return prefersReducedMotion;\r\n}\r\n\r\n// Utility to merge refs\r\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\r\n return (value) => {\r\n refs.forEach((ref) => {\r\n if (typeof ref === \"function\") {\r\n ref(value);\r\n } else if (ref && typeof ref === \"object\") {\r\n (ref as React.MutableRefObject<T | null>).current = value;\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport { TextReveal };\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\n\r\n/**\r\n * AnimatedGradient 컴포넌트의 props / AnimatedGradient component props\r\n * @property {string[]} [colors] - 그라디언트 색상 배열 / Array of gradient colors\r\n * @property {number} [speed=3] - 애니메이션 속도 (초) / Animation speed in seconds\r\n * @property {boolean} [blur=true] - 블러 효과 / Blur effect\r\n * @property {number} [blurAmount=100] - 블러 양 (px) / Blur amount in pixels\r\n * @property {\"linear\" | \"radial\" | \"conic\" | \"mesh\"} [type=\"mesh\"] - 그라디언트 타입 / Gradient type\r\n * @property {boolean} [animate=true] - 애니메이션 활성화 / Enable animation\r\n */\r\nexport interface AnimatedGradientProps extends React.HTMLAttributes<HTMLDivElement> {\r\n colors?: string[];\r\n speed?: number;\r\n blur?: boolean;\r\n blurAmount?: number;\r\n type?: \"linear\" | \"radial\" | \"conic\" | \"mesh\";\r\n animate?: boolean;\r\n}\r\n\r\nconst defaultColors = [\r\n \"#ff0080\",\r\n \"#7928ca\",\r\n \"#0070f3\",\r\n \"#00dfd8\",\r\n];\r\n\r\n/**\r\n * AnimatedGradient 컴포넌트 / AnimatedGradient component\r\n *\r\n * 아름다운 애니메이션 그라디언트 배경을 제공합니다.\r\n * 히어로 섹션, 배경, 오버레이에 적합합니다.\r\n *\r\n * Provides beautiful animated gradient backgrounds.\r\n * Perfect for hero sections, backgrounds, and overlays.\r\n *\r\n * @component\r\n * @example\r\n * // 메쉬 그라디언트 / Mesh gradient\r\n * <AnimatedGradient type=\"mesh\" className=\"absolute inset-0 -z-10\" />\r\n *\r\n * @example\r\n * // 커스텀 색상 / Custom colors\r\n * <AnimatedGradient\r\n * colors={[\"#667eea\", \"#764ba2\", \"#f093fb\"]}\r\n * speed={5}\r\n * type=\"conic\"\r\n * />\r\n */\r\nconst AnimatedGradient = React.forwardRef<HTMLDivElement, AnimatedGradientProps>(\r\n (\r\n {\r\n children,\r\n className,\r\n colors = defaultColors,\r\n speed = 3,\r\n blur = true,\r\n blurAmount = 100,\r\n type = \"mesh\",\r\n animate = true,\r\n style,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [mounted, setMounted] = useState(false);\r\n const prefersReducedMotion = useReducedMotion();\r\n const shouldAnimate = animate && !prefersReducedMotion;\r\n\r\n useEffect(() => {\r\n setMounted(true);\r\n }, []);\r\n\r\n const renderGradient = () => {\r\n switch (type) {\r\n case \"linear\":\r\n return (\r\n <div\r\n className=\"absolute inset-0\"\r\n style={{\r\n background: `linear-gradient(\r\n ${shouldAnimate ? \"var(--gradient-angle, 0deg)\" : \"135deg\"},\r\n ${colors.join(\", \")}\r\n )`,\r\n animation: shouldAnimate ? `gradient-rotate ${speed}s linear infinite` : undefined,\r\n }}\r\n />\r\n );\r\n\r\n case \"radial\":\r\n return (\r\n <div\r\n className=\"absolute inset-0\"\r\n style={{\r\n background: `radial-gradient(\r\n circle at ${shouldAnimate ? \"var(--gradient-x, 50%) var(--gradient-y, 50%)\" : \"50% 50%\"},\r\n ${colors.join(\", \")}\r\n )`,\r\n animation: shouldAnimate ? `gradient-move ${speed}s ease-in-out infinite` : undefined,\r\n }}\r\n />\r\n );\r\n\r\n case \"conic\":\r\n return (\r\n <div\r\n className=\"absolute inset-0\"\r\n style={{\r\n background: `conic-gradient(\r\n from ${shouldAnimate ? \"var(--gradient-angle, 0deg)\" : \"0deg\"} at 50% 50%,\r\n ${colors.join(\", \")},\r\n ${colors[0]}\r\n )`,\r\n animation: shouldAnimate ? `gradient-spin ${speed}s linear infinite` : undefined,\r\n }}\r\n />\r\n );\r\n\r\n case \"mesh\":\r\n default:\r\n return (\r\n <>\r\n {colors.map((color, index) => {\r\n const angle = (360 / colors.length) * index;\r\n const delay = (speed / colors.length) * index;\r\n return (\r\n <div\r\n key={index}\r\n className=\"absolute rounded-full mix-blend-screen\"\r\n style={{\r\n width: \"60%\",\r\n height: \"60%\",\r\n background: `radial-gradient(circle at center, ${color} 0%, transparent 70%)`,\r\n top: `${30 + Math.sin((angle * Math.PI) / 180) * 20}%`,\r\n left: `${30 + Math.cos((angle * Math.PI) / 180) * 20}%`,\r\n animation: shouldAnimate\r\n ? `gradient-blob ${speed}s ease-in-out infinite`\r\n : undefined,\r\n animationDelay: shouldAnimate ? `${-delay}s` : undefined,\r\n opacity: mounted ? 1 : 0,\r\n transition: \"opacity 0.5s ease-out\",\r\n }}\r\n />\r\n );\r\n })}\r\n </>\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"relative overflow-hidden\",\r\n className\r\n )}\r\n style={style}\r\n {...props}\r\n >\r\n {/* Gradient layer */}\r\n <div\r\n className=\"absolute inset-0\"\r\n style={{\r\n filter: blur ? `blur(${blurAmount}px)` : undefined,\r\n }}\r\n >\r\n {renderGradient()}\r\n </div>\r\n\r\n {/* Content */}\r\n {children && <div className=\"relative z-10\">{children}</div>}\r\n\r\n {/* Animation keyframes - injected as style element */}\r\n <style dangerouslySetInnerHTML={{ __html: `\r\n @keyframes gradient-rotate {\r\n 0% { --gradient-angle: 0deg; }\r\n 100% { --gradient-angle: 360deg; }\r\n }\r\n @keyframes gradient-spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n @keyframes gradient-move {\r\n 0%, 100% { --gradient-x: 0%; --gradient-y: 0%; }\r\n 25% { --gradient-x: 100%; --gradient-y: 0%; }\r\n 50% { --gradient-x: 100%; --gradient-y: 100%; }\r\n 75% { --gradient-x: 0%; --gradient-y: 100%; }\r\n }\r\n @keyframes gradient-blob {\r\n 0%, 100% { transform: translate(0, 0) scale(1); }\r\n 25% { transform: translate(20%, -20%) scale(1.1); }\r\n 50% { transform: translate(0, 20%) scale(0.9); }\r\n 75% { transform: translate(-20%, -10%) scale(1.05); }\r\n }\r\n `}} />\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nAnimatedGradient.displayName = \"AnimatedGradient\";\r\n\r\n// Hook to check for reduced motion preference\r\nfunction useReducedMotion(): boolean {\r\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\r\n\r\n useEffect(() => {\r\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\r\n setPrefersReducedMotion(mediaQuery.matches);\r\n\r\n const handleChange = (e: MediaQueryListEvent) => {\r\n setPrefersReducedMotion(e.matches);\r\n };\r\n\r\n mediaQuery.addEventListener(\"change\", handleChange);\r\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\r\n }, []);\r\n\r\n return prefersReducedMotion;\r\n}\r\n\r\nexport { AnimatedGradient };\r\n","\"use client\";\r\n\r\nimport React, { useRef, useState, useCallback } from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\n\r\n/**\r\n * TiltCard 컴포넌트의 props / TiltCard component props\r\n * @property {number} [maxTilt=15] - 최대 기울기 각도 / Maximum tilt angle in degrees\r\n * @property {number} [perspective=1000] - 원근감 / Perspective value\r\n * @property {number} [scale=1.02] - 호버시 스케일 / Scale on hover\r\n * @property {number} [speed=400] - 전환 속도 (ms) / Transition speed in milliseconds\r\n * @property {boolean} [glare=true] - 글레어 효과 / Glare effect\r\n * @property {number} [maxGlare=0.3] - 최대 글레어 투명도 / Maximum glare opacity\r\n * @property {boolean} [reset=true] - 마우스 떠나면 리셋 / Reset on mouse leave\r\n */\r\nexport interface TiltCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n maxTilt?: number;\r\n perspective?: number;\r\n scale?: number;\r\n speed?: number;\r\n glare?: boolean;\r\n maxGlare?: number;\r\n reset?: boolean;\r\n}\r\n\r\n/**\r\n * TiltCard 컴포넌트 / TiltCard component\r\n *\r\n * 마우스 움직임에 따라 3D 틸트 효과를 제공하는 카드 컴포넌트입니다.\r\n * 제품 카드, 프로필 카드, 갤러리에 적합합니다.\r\n *\r\n * Card component that provides 3D tilt effect based on mouse movement.\r\n * Perfect for product cards, profile cards, and galleries.\r\n *\r\n * @component\r\n * @example\r\n * <TiltCard className=\"bg-white shadow-lg rounded-xl p-6\">\r\n * <img src=\"/product.jpg\" alt=\"Product\" />\r\n * <h3>Premium Product</h3>\r\n * </TiltCard>\r\n */\r\nconst TiltCard = React.forwardRef<HTMLDivElement, TiltCardProps>(\r\n (\r\n {\r\n children,\r\n className,\r\n maxTilt = 15,\r\n perspective = 1000,\r\n scale = 1.02,\r\n speed = 400,\r\n glare = true,\r\n maxGlare = 0.3,\r\n reset = true,\r\n style,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const cardRef = useRef<HTMLDivElement>(null);\r\n const [transform, setTransform] = useState({\r\n rotateX: 0,\r\n rotateY: 0,\r\n scale: 1,\r\n });\r\n const [glarePosition, setGlarePosition] = useState({ x: 50, y: 50 });\r\n const [isHovered, setIsHovered] = useState(false);\r\n\r\n const handleMouseMove = useCallback(\r\n (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (!cardRef.current) return;\r\n\r\n const rect = cardRef.current.getBoundingClientRect();\r\n const centerX = rect.left + rect.width / 2;\r\n const centerY = rect.top + rect.height / 2;\r\n\r\n // Calculate rotation based on mouse position\r\n const mouseX = e.clientX - centerX;\r\n const mouseY = e.clientY - centerY;\r\n\r\n const rotateY = (mouseX / (rect.width / 2)) * maxTilt;\r\n const rotateX = -(mouseY / (rect.height / 2)) * maxTilt;\r\n\r\n setTransform({\r\n rotateX,\r\n rotateY,\r\n scale,\r\n });\r\n\r\n // Calculate glare position (0-100%)\r\n const glareX = ((e.clientX - rect.left) / rect.width) * 100;\r\n const glareY = ((e.clientY - rect.top) / rect.height) * 100;\r\n setGlarePosition({ x: glareX, y: glareY });\r\n },\r\n [maxTilt, scale]\r\n );\r\n\r\n const handleMouseEnter = () => {\r\n setIsHovered(true);\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n setIsHovered(false);\r\n if (reset) {\r\n setTransform({\r\n rotateX: 0,\r\n rotateY: 0,\r\n scale: 1,\r\n });\r\n }\r\n };\r\n\r\n const cardStyle: React.CSSProperties = {\r\n ...style,\r\n perspective: `${perspective}px`,\r\n };\r\n\r\n const innerStyle: React.CSSProperties = {\r\n transform: `rotateX(${transform.rotateX}deg) rotateY(${transform.rotateY}deg) scale(${transform.scale})`,\r\n transition: isHovered ? \"none\" : `transform ${speed}ms ease-out`,\r\n transformStyle: \"preserve-3d\",\r\n };\r\n\r\n const glareStyle: React.CSSProperties = {\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n borderRadius: \"inherit\",\r\n background: `linear-gradient(\r\n ${Math.atan2(glarePosition.y - 50, glarePosition.x - 50) * (180 / Math.PI) + 90}deg,\r\n rgba(255, 255, 255, ${isHovered ? maxGlare : 0}) 0%,\r\n transparent 80%\r\n )`,\r\n transition: isHovered ? \"opacity 0.1s ease-out\" : `opacity ${speed}ms ease-out`,\r\n pointerEvents: \"none\",\r\n opacity: isHovered ? 1 : 0,\r\n };\r\n\r\n return (\r\n <div\r\n ref={mergeRefs(ref, cardRef)}\r\n className={merge(\"relative\", className)}\r\n style={cardStyle}\r\n onMouseMove={handleMouseMove}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n {...props}\r\n >\r\n <div style={innerStyle} className=\"relative\">\r\n {children}\r\n\r\n {/* Glare effect */}\r\n {glare && <div style={glareStyle} aria-hidden=\"true\" />}\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nTiltCard.displayName = \"TiltCard\";\r\n\r\n// Utility to merge refs\r\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\r\n return (value) => {\r\n refs.forEach((ref) => {\r\n if (typeof ref === \"function\") {\r\n ref(value);\r\n } else if (ref && typeof ref === \"object\") {\r\n (ref as React.MutableRefObject<T | null>).current = value;\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport { TiltCard };\r\n","\"use client\";\r\n\r\nimport React, { useRef, useEffect, useState } from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\n\r\n/**\r\n * VideoBackground 컴포넌트의 props / VideoBackground component props\r\n * @property {string} src - 비디오 소스 (URL, YouTube ID, Vimeo ID) / Video source\r\n * @property {\"native\" | \"youtube\" | \"vimeo\"} [type=\"native\"] - 비디오 타입 / Video type\r\n * @property {string} [poster] - 포스터 이미지 URL / Poster image URL\r\n * @property {boolean} [autoPlay=true] - 자동 재생 / Auto play\r\n * @property {boolean} [loop=true] - 반복 재생 / Loop playback\r\n * @property {boolean} [muted=true] - 음소거 / Mute audio\r\n * @property {boolean} [controls=false] - 컨트롤 표시 / Show controls\r\n * @property {\"cover\" | \"contain\" | \"fill\"} [objectFit=\"cover\"] - 비디오 맞춤 / Video fit\r\n * @property {boolean} [overlay=true] - 오버레이 표시 / Show overlay\r\n * @property {string} [overlayColor=\"rgba(0, 0, 0, 0.4)\"] - 오버레이 색상 / Overlay color\r\n * @property {boolean} [gradient=false] - 그라디언트 오버레이 / Gradient overlay\r\n * @property {\"top\" | \"bottom\" | \"both\"} [gradientDirection=\"bottom\"] - 그라디언트 방향 / Gradient direction\r\n * @property {number} [playbackRate=1] - 재생 속도 / Playback rate\r\n * @property {boolean} [fadeIn=true] - 페이드 인 효과 / Fade in effect\r\n */\r\nexport interface VideoBackgroundProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\r\n src: string;\r\n type?: \"native\" | \"youtube\" | \"vimeo\";\r\n poster?: string;\r\n autoPlay?: boolean;\r\n loop?: boolean;\r\n muted?: boolean;\r\n controls?: boolean;\r\n objectFit?: \"cover\" | \"contain\" | \"fill\";\r\n overlay?: boolean;\r\n overlayColor?: string;\r\n gradient?: boolean;\r\n gradientDirection?: \"top\" | \"bottom\" | \"both\";\r\n playbackRate?: number;\r\n fadeIn?: boolean;\r\n children?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * VideoBackground 컴포넌트 / VideoBackground component\r\n *\r\n * 페이지 배경으로 사용할 수 있는 비디오 컴포넌트입니다.\r\n * YouTube, Vimeo, 일반 비디오 소스를 지원합니다.\r\n *\r\n * Video component that can be used as page background.\r\n * Supports YouTube, Vimeo, and native video sources.\r\n *\r\n * @component\r\n * @example\r\n * // Native video\r\n * <VideoBackground src=\"/hero-video.mp4\" overlay gradient>\r\n * <h1>Welcome</h1>\r\n * </VideoBackground>\r\n *\r\n * @example\r\n * // YouTube video\r\n * <VideoBackground\r\n * type=\"youtube\"\r\n * src=\"dQw4w9WgXcQ\"\r\n * overlay\r\n * overlayColor=\"rgba(0, 0, 50, 0.5)\"\r\n * />\r\n *\r\n * @example\r\n * // Vimeo video\r\n * <VideoBackground type=\"vimeo\" src=\"123456789\" />\r\n */\r\nconst VideoBackground = React.forwardRef<HTMLDivElement, VideoBackgroundProps>(\r\n (\r\n {\r\n src,\r\n type = \"native\",\r\n poster,\r\n autoPlay = true,\r\n loop = true,\r\n muted = true,\r\n controls = false,\r\n objectFit = \"cover\",\r\n overlay = true,\r\n overlayColor = \"rgba(0, 0, 0, 0.4)\",\r\n gradient = false,\r\n gradientDirection = \"bottom\",\r\n playbackRate = 1,\r\n fadeIn = true,\r\n children,\r\n className,\r\n style,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const videoRef = useRef<HTMLVideoElement>(null);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n const [isPlaying, setIsPlaying] = useState(false);\r\n\r\n // Handle native video playback rate\r\n useEffect(() => {\r\n if (type === \"native\" && videoRef.current) {\r\n videoRef.current.playbackRate = playbackRate;\r\n }\r\n }, [playbackRate, type]);\r\n\r\n // Handle video loaded\r\n const handleLoadedData = () => {\r\n setIsLoaded(true);\r\n };\r\n\r\n const handlePlaying = () => {\r\n setIsPlaying(true);\r\n };\r\n\r\n // Generate YouTube embed URL\r\n const getYouTubeUrl = (videoId: string) => {\r\n const params = new URLSearchParams({\r\n autoplay: autoPlay ? \"1\" : \"0\",\r\n mute: muted ? \"1\" : \"0\",\r\n loop: loop ? \"1\" : \"0\",\r\n controls: controls ? \"1\" : \"0\",\r\n playlist: videoId, // Required for loop to work\r\n modestbranding: \"1\",\r\n rel: \"0\",\r\n showinfo: \"0\",\r\n iv_load_policy: \"3\",\r\n disablekb: \"1\",\r\n enablejsapi: \"1\",\r\n playsinline: \"1\",\r\n });\r\n return `https://www.youtube.com/embed/${videoId}?${params.toString()}`;\r\n };\r\n\r\n // Generate Vimeo embed URL\r\n const getVimeoUrl = (videoId: string) => {\r\n const params = new URLSearchParams({\r\n autoplay: autoPlay ? \"1\" : \"0\",\r\n muted: muted ? \"1\" : \"0\",\r\n loop: loop ? \"1\" : \"0\",\r\n controls: controls ? \"1\" : \"0\",\r\n background: \"1\",\r\n quality: \"auto\",\r\n dnt: \"1\",\r\n });\r\n return `https://player.vimeo.com/video/${videoId}?${params.toString()}`;\r\n };\r\n\r\n // Render video element based on type\r\n const renderVideo = () => {\r\n const objectFitClass = {\r\n cover: \"object-cover\",\r\n contain: \"object-contain\",\r\n fill: \"object-fill\",\r\n }[objectFit];\r\n\r\n switch (type) {\r\n case \"youtube\":\r\n return (\r\n <iframe\r\n src={getYouTubeUrl(src)}\r\n className={merge(\r\n \"absolute inset-0 w-full h-full pointer-events-none\",\r\n \"scale-[1.2]\" // Scale up to hide YouTube branding\r\n )}\r\n style={{\r\n opacity: isLoaded || !fadeIn ? 1 : 0,\r\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\r\n }}\r\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\r\n allowFullScreen\r\n onLoad={() => setIsLoaded(true)}\r\n title=\"YouTube video background\"\r\n />\r\n );\r\n\r\n case \"vimeo\":\r\n return (\r\n <iframe\r\n src={getVimeoUrl(src)}\r\n className=\"absolute inset-0 w-full h-full pointer-events-none\"\r\n style={{\r\n opacity: isLoaded || !fadeIn ? 1 : 0,\r\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\r\n }}\r\n allow=\"autoplay; fullscreen; picture-in-picture\"\r\n allowFullScreen\r\n onLoad={() => setIsLoaded(true)}\r\n title=\"Vimeo video background\"\r\n />\r\n );\r\n\r\n case \"native\":\r\n default:\r\n return (\r\n <video\r\n ref={videoRef}\r\n src={src}\r\n poster={poster}\r\n autoPlay={autoPlay}\r\n loop={loop}\r\n muted={muted}\r\n controls={controls}\r\n playsInline\r\n className={merge(\r\n \"absolute inset-0 w-full h-full\",\r\n objectFitClass\r\n )}\r\n style={{\r\n opacity: isPlaying || !fadeIn ? 1 : 0,\r\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\r\n }}\r\n onLoadedData={handleLoadedData}\r\n onPlaying={handlePlaying}\r\n />\r\n );\r\n }\r\n };\r\n\r\n // Generate gradient overlay\r\n const renderGradientOverlay = () => {\r\n if (!gradient) return null;\r\n\r\n const gradients = [];\r\n\r\n if (gradientDirection === \"top\" || gradientDirection === \"both\") {\r\n gradients.push(\r\n <div\r\n key=\"top\"\r\n className=\"absolute top-0 left-0 right-0 h-1/3\"\r\n style={{\r\n background: `linear-gradient(to bottom, ${overlayColor}, transparent)`,\r\n }}\r\n aria-hidden=\"true\"\r\n />\r\n );\r\n }\r\n\r\n if (gradientDirection === \"bottom\" || gradientDirection === \"both\") {\r\n gradients.push(\r\n <div\r\n key=\"bottom\"\r\n className=\"absolute bottom-0 left-0 right-0 h-1/3\"\r\n style={{\r\n background: `linear-gradient(to top, ${overlayColor}, transparent)`,\r\n }}\r\n aria-hidden=\"true\"\r\n />\r\n );\r\n }\r\n\r\n return <>{gradients}</>;\r\n };\r\n\r\n // Check if className contains position class (fixed, absolute, sticky)\r\n const hasPositionClass = className && /\\b(fixed|absolute|sticky)\\b/.test(className);\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"overflow-hidden\",\r\n !hasPositionClass && \"relative\",\r\n className\r\n )}\r\n style={style}\r\n {...props}\r\n >\r\n {/* Poster image (shows until video loads) */}\r\n {poster && fadeIn && !isLoaded && !isPlaying && (\r\n <div\r\n className=\"absolute inset-0 bg-cover bg-center\"\r\n style={{ backgroundImage: `url(${poster})` }}\r\n aria-hidden=\"true\"\r\n />\r\n )}\r\n\r\n {/* Video layer */}\r\n {renderVideo()}\r\n\r\n {/* Solid overlay */}\r\n {overlay && !gradient && (\r\n <div\r\n className=\"absolute inset-0\"\r\n style={{ backgroundColor: overlayColor }}\r\n aria-hidden=\"true\"\r\n />\r\n )}\r\n\r\n {/* Gradient overlay */}\r\n {renderGradientOverlay()}\r\n\r\n {/* Content */}\r\n {children && (\r\n <div className=\"relative z-10 h-full\">\r\n {children}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nVideoBackground.displayName = \"VideoBackground\";\r\n\r\nexport { VideoBackground };\r\n","\"use client\";\r\n\r\nimport React, { useRef, useState, useCallback, useEffect } from \"react\";\r\nimport { merge } from \"../../lib/utils\";\r\n\r\n/**\r\n * Carousel 컴포넌트의 props / Carousel component props\r\n * @property {boolean} [autoPlay=false] - 자동 재생 / Auto play\r\n * @property {number} [interval=5000] - 자동 재생 간격 (ms) / Auto play interval\r\n * @property {boolean} [loop=true] - 무한 루프 / Infinite loop\r\n * @property {boolean} [pauseOnHover=true] - 호버시 일시정지 / Pause on hover\r\n * @property {\"dots\" | \"bars\" | \"numbers\" | \"none\"} [indicators=\"dots\"] - 인디케이터 타입 / Indicator type\r\n * @property {\"bottom\" | \"top\" | \"inside-bottom\" | \"inside-top\"} [indicatorPosition=\"bottom\"] - 인디케이터 위치 / Indicator position\r\n * @property {boolean} [showArrows=true] - 화살표 버튼 표시 / Show arrow buttons\r\n * @property {\"inside\" | \"outside\" | \"hidden\"} [arrowPosition=\"inside\"] - 화살표 위치 / Arrow position\r\n * @property {\"slide\" | \"fade\" | \"scale\"} [transition=\"slide\"] - 전환 효과 / Transition effect\r\n * @property {number} [transitionDuration=500] - 전환 시간 (ms) / Transition duration\r\n * @property {(index: number) => void} [onSlideChange] - 슬라이드 변경 콜백 / Slide change callback\r\n * @property {boolean} [showPlayPause=false] - 재생/일시정지 버튼 표시 / Show play/pause button\r\n * @property {\"left\" | \"right\" | \"center\"} [playPausePosition=\"right\"] - 재생/일시정지 버튼 위치 / Play/pause button position\r\n */\r\nexport interface CarouselProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\r\n children: React.ReactNode[];\r\n autoPlay?: boolean;\r\n interval?: number;\r\n loop?: boolean;\r\n pauseOnHover?: boolean;\r\n indicators?: \"dots\" | \"bars\" | \"numbers\" | \"none\";\r\n indicatorPosition?: \"bottom\" | \"top\" | \"inside-bottom\" | \"inside-top\";\r\n showArrows?: boolean;\r\n arrowPosition?: \"inside\" | \"outside\" | \"hidden\";\r\n transition?: \"slide\" | \"fade\" | \"scale\";\r\n transitionDuration?: number;\r\n onSlideChange?: (index: number) => void;\r\n showPlayPause?: boolean;\r\n playPausePosition?: \"left\" | \"right\" | \"center\";\r\n}\r\n\r\n/**\r\n * Carousel 컴포넌트 / Carousel component\r\n *\r\n * 슬라이드 캐러셀 컴포넌트입니다.\r\n * 다양한 인디케이터, 화살표, 전환 효과를 지원합니다.\r\n *\r\n * Slide carousel component.\r\n * Supports various indicators, arrows, and transition effects.\r\n *\r\n * @component\r\n * @example\r\n * <Carousel autoPlay interval={3000} indicators=\"bars\">\r\n * <img src=\"/slide1.jpg\" alt=\"Slide 1\" />\r\n * <img src=\"/slide2.jpg\" alt=\"Slide 2\" />\r\n * <img src=\"/slide3.jpg\" alt=\"Slide 3\" />\r\n * </Carousel>\r\n */\r\nconst Carousel = React.forwardRef<HTMLDivElement, CarouselProps>(\r\n (\r\n {\r\n children,\r\n autoPlay = false,\r\n interval = 5000,\r\n loop = true,\r\n pauseOnHover = true,\r\n indicators = \"dots\",\r\n indicatorPosition = \"bottom\",\r\n showArrows = true,\r\n arrowPosition = \"inside\",\r\n transition = \"slide\",\r\n transitionDuration = 500,\r\n onSlideChange,\r\n showPlayPause = false,\r\n playPausePosition = \"right\",\r\n className,\r\n style,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n // For slide transition with loop: start at 1 (account for cloned first slide)\r\n // For fade/scale: always start at 0 (no cloned slides)\r\n const getInitialIndex = () => {\r\n if (transition === \"slide\" && loop) return 1;\r\n return 0;\r\n };\r\n const [currentIndex, setCurrentIndex] = useState(getInitialIndex);\r\n const [isPaused, setIsPaused] = useState(!autoPlay);\r\n const [isManuallyPaused, setIsManuallyPaused] = useState(false);\r\n const [isTransitioning, setIsTransitioning] = useState(false);\r\n const [noTransition, setNoTransition] = useState(false);\r\n const [touchStart, setTouchStart] = useState<number | null>(null);\r\n const [touchEnd, setTouchEnd] = useState<number | null>(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const slideCount = React.Children.count(children);\r\n\r\n // Check for reduced motion preference\r\n const prefersReducedMotion = useReducedMotion();\r\n\r\n // Get actual slide index for display (accounting for cloned slides in loop mode for slide transition)\r\n const getActualIndex = useCallback((index: number) => {\r\n // For fade/scale transitions, currentIndex is the actual index\r\n if (transition !== \"slide\") return index;\r\n // For slide transition without loop, index is actual\r\n if (!loop) return index;\r\n // For slide transition with loop, account for cloned slides\r\n if (index === 0) return slideCount - 1;\r\n if (index === slideCount + 1) return 0;\r\n return index - 1;\r\n }, [loop, slideCount, transition]);\r\n\r\n // Go to specific slide\r\n const goToSlide = useCallback(\r\n (index: number) => {\r\n if (isTransitioning) return;\r\n\r\n let newIndex = index;\r\n if (!loop) {\r\n newIndex = Math.max(0, Math.min(index, slideCount - 1));\r\n } else if (transition !== \"slide\") {\r\n // For fade/scale with loop, wrap around without cloned slides\r\n if (index < 0) {\r\n newIndex = slideCount - 1;\r\n } else if (index >= slideCount) {\r\n newIndex = 0;\r\n }\r\n }\r\n\r\n if (newIndex !== currentIndex) {\r\n setIsTransitioning(true);\r\n setCurrentIndex(newIndex);\r\n const actualIndex = loop && transition === \"slide\"\r\n ? (newIndex === 0 ? slideCount - 1 : newIndex === slideCount + 1 ? 0 : newIndex - 1)\r\n : newIndex;\r\n onSlideChange?.(actualIndex);\r\n setTimeout(() => setIsTransitioning(false), transitionDuration);\r\n }\r\n },\r\n [currentIndex, slideCount, loop, isTransitioning, transitionDuration, transition, onSlideChange]\r\n );\r\n\r\n // Handle infinite loop jump (when reaching cloned slides)\r\n useEffect(() => {\r\n if (!loop || isTransitioning || transition !== \"slide\") return;\r\n\r\n // Jump to real slide without animation when on cloned slides\r\n if (currentIndex === 0) {\r\n // At cloned last slide -> jump to real last slide\r\n setTimeout(() => {\r\n setNoTransition(true);\r\n setCurrentIndex(slideCount);\r\n setTimeout(() => setNoTransition(false), 50);\r\n }, transitionDuration);\r\n } else if (currentIndex === slideCount + 1) {\r\n // At cloned first slide -> jump to real first slide\r\n setTimeout(() => {\r\n setNoTransition(true);\r\n setCurrentIndex(1);\r\n setTimeout(() => setNoTransition(false), 50);\r\n }, transitionDuration);\r\n }\r\n }, [currentIndex, slideCount, loop, isTransitioning, transitionDuration, transition]);\r\n\r\n // Next slide\r\n const nextSlide = useCallback(() => {\r\n goToSlide(currentIndex + 1);\r\n }, [currentIndex, goToSlide]);\r\n\r\n // Previous slide\r\n const prevSlide = useCallback(() => {\r\n goToSlide(currentIndex - 1);\r\n }, [currentIndex, goToSlide]);\r\n\r\n // Toggle play/pause manually\r\n const togglePlayPause = useCallback(() => {\r\n setIsManuallyPaused(prev => !prev);\r\n }, []);\r\n\r\n // Play function\r\n const play = useCallback(() => {\r\n setIsManuallyPaused(false);\r\n }, []);\r\n\r\n // Pause function\r\n const pause = useCallback(() => {\r\n setIsManuallyPaused(true);\r\n }, []);\r\n\r\n // Auto play\r\n useEffect(() => {\r\n if (!autoPlay || isPaused || isManuallyPaused || prefersReducedMotion) return;\r\n\r\n const timer = setInterval(nextSlide, interval);\r\n return () => clearInterval(timer);\r\n }, [autoPlay, interval, isPaused, isManuallyPaused, nextSlide, prefersReducedMotion]);\r\n\r\n // Touch handlers for swipe\r\n const handleTouchStart = (e: React.TouchEvent) => {\r\n setTouchStart(e.targetTouches[0].clientX);\r\n };\r\n\r\n const handleTouchMove = (e: React.TouchEvent) => {\r\n setTouchEnd(e.targetTouches[0].clientX);\r\n };\r\n\r\n const handleTouchEnd = () => {\r\n if (!touchStart || !touchEnd) return;\r\n\r\n const distance = touchStart - touchEnd;\r\n const minSwipeDistance = 50;\r\n\r\n if (Math.abs(distance) >= minSwipeDistance) {\r\n if (distance > 0) {\r\n nextSlide();\r\n } else {\r\n prevSlide();\r\n }\r\n }\r\n\r\n setTouchStart(null);\r\n setTouchEnd(null);\r\n };\r\n\r\n // Keyboard navigation\r\n useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === \"ArrowLeft\") {\r\n prevSlide();\r\n } else if (e.key === \"ArrowRight\") {\r\n nextSlide();\r\n }\r\n };\r\n\r\n const container = containerRef.current;\r\n container?.addEventListener(\"keydown\", handleKeyDown);\r\n return () => container?.removeEventListener(\"keydown\", handleKeyDown);\r\n }, [nextSlide, prevSlide]);\r\n\r\n // Render slides with transition\r\n const renderSlides = () => {\r\n const duration = prefersReducedMotion || noTransition ? 0 : transitionDuration;\r\n const actualIndex = getActualIndex(currentIndex);\r\n\r\n switch (transition) {\r\n case \"fade\":\r\n return React.Children.map(children, (child, index) => (\r\n <div\r\n key={index}\r\n className={merge(\r\n \"absolute inset-0 w-full h-full\",\r\n index === actualIndex ? \"z-10\" : \"z-0\"\r\n )}\r\n style={{\r\n opacity: index === actualIndex ? 1 : 0,\r\n transition: `opacity ${duration}ms ease-in-out`,\r\n }}\r\n >\r\n {child}\r\n </div>\r\n ));\r\n\r\n case \"scale\":\r\n return React.Children.map(children, (child, index) => (\r\n <div\r\n key={index}\r\n className={merge(\r\n \"absolute inset-0 w-full h-full\",\r\n index === actualIndex ? \"z-10\" : \"z-0\"\r\n )}\r\n style={{\r\n opacity: index === actualIndex ? 1 : 0,\r\n transform: `scale(${index === actualIndex ? 1 : 0.9})`,\r\n transition: `opacity ${duration}ms ease-in-out, transform ${duration}ms ease-in-out`,\r\n }}\r\n >\r\n {child}\r\n </div>\r\n ));\r\n\r\n case \"slide\":\r\n default: {\r\n const childArray = React.Children.toArray(children);\r\n // For infinite loop: clone last slide at beginning and first slide at end\r\n const slides = loop\r\n ? [childArray[childArray.length - 1], ...childArray, childArray[0]]\r\n : childArray;\r\n\r\n // 각 슬라이드를 fade/scale처럼 absolute로 배치하고 translateX로 위치 조정\r\n return slides.map((child, index) => (\r\n <div\r\n key={index}\r\n className=\"absolute inset-0 w-full h-full\"\r\n style={{\r\n transform: `translateX(${(index - currentIndex) * 100}%)`,\r\n transition: noTransition ? 'none' : `transform ${duration}ms ease-in-out`,\r\n }}\r\n >\r\n {child}\r\n </div>\r\n ));\r\n }\r\n }\r\n };\r\n\r\n // Render indicators\r\n const renderIndicators = () => {\r\n if (indicators === \"none\") return null;\r\n\r\n const isInside = indicatorPosition.includes(\"inside\");\r\n const isTop = indicatorPosition.includes(\"top\");\r\n const actualIndex = getActualIndex(currentIndex);\r\n\r\n const indicatorContainerClass = merge(\r\n \"flex items-center justify-center gap-2\",\r\n isInside\r\n ? merge(\r\n \"absolute left-1/2 -translate-x-1/2 z-20\",\r\n isTop ? \"top-4\" : \"bottom-4\"\r\n )\r\n : merge(\r\n \"mt-4\",\r\n isTop && \"order-first mb-4 mt-0\"\r\n )\r\n );\r\n\r\n // Handle indicator click - go to the correct index accounting for loop mode\r\n const handleIndicatorClick = (index: number) => {\r\n if (loop && transition === \"slide\") {\r\n goToSlide(index + 1); // +1 because of cloned first slide (only for slide transition)\r\n } else {\r\n goToSlide(index);\r\n }\r\n };\r\n\r\n return (\r\n <div className={indicatorContainerClass} role=\"tablist\">\r\n {Array.from({ length: slideCount }, (_, index) => {\r\n const isActive = index === actualIndex;\r\n\r\n switch (indicators) {\r\n case \"bars\":\r\n return (\r\n <button\r\n key={index}\r\n onClick={() => handleIndicatorClick(index)}\r\n className={merge(\r\n \"h-1 rounded-full transition-all duration-300\",\r\n isActive\r\n ? \"w-8 bg-white\"\r\n : \"w-4 bg-white/50 hover:bg-white/70\"\r\n )}\r\n role=\"tab\"\r\n aria-selected={isActive}\r\n aria-label={`슬라이드 ${index + 1}`}\r\n />\r\n );\r\n\r\n case \"numbers\":\r\n return (\r\n <button\r\n key={index}\r\n onClick={() => handleIndicatorClick(index)}\r\n className={merge(\r\n \"w-8 h-8 rounded-full text-sm font-medium transition-all duration-300\",\r\n isActive\r\n ? \"bg-white text-gray-900\"\r\n : \"bg-white/30 text-white hover:bg-white/50\"\r\n )}\r\n role=\"tab\"\r\n aria-selected={isActive}\r\n aria-label={`슬라이드 ${index + 1}`}\r\n >\r\n {index + 1}\r\n </button>\r\n );\r\n\r\n case \"dots\":\r\n default:\r\n return (\r\n <button\r\n key={index}\r\n onClick={() => handleIndicatorClick(index)}\r\n className={merge(\r\n \"w-2.5 h-2.5 rounded-full transition-all duration-300\",\r\n isActive\r\n ? \"bg-white scale-125\"\r\n : \"bg-white/50 hover:bg-white/70\"\r\n )}\r\n role=\"tab\"\r\n aria-selected={isActive}\r\n aria-label={`슬라이드 ${index + 1}`}\r\n />\r\n );\r\n }\r\n })}\r\n </div>\r\n );\r\n };\r\n\r\n // Render play/pause button\r\n const renderPlayPause = () => {\r\n if (!showPlayPause || !autoPlay) return null;\r\n\r\n const isPlaying = !isManuallyPaused;\r\n const positionClasses = {\r\n left: \"left-4\",\r\n center: \"left-1/2 -translate-x-1/2\",\r\n right: \"right-4\"\r\n };\r\n\r\n return (\r\n <button\r\n onClick={togglePlayPause}\r\n className={merge(\r\n \"absolute bottom-4 z-20\",\r\n \"w-8 h-8 rounded-full flex items-center justify-center\",\r\n \"bg-white/80 hover:bg-white text-gray-800\",\r\n \"transition-all duration-200\",\r\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white\",\r\n positionClasses[playPausePosition]\r\n )}\r\n aria-label={isPlaying ? \"일시정지\" : \"재생\"}\r\n >\r\n {isPlaying ? <PauseIcon className=\"w-4 h-4\" /> : <PlayIcon className=\"w-4 h-4\" />}\r\n </button>\r\n );\r\n };\r\n\r\n // Render arrows\r\n const renderArrows = () => {\r\n if (!showArrows || arrowPosition === \"hidden\") return null;\r\n\r\n const canGoPrev = loop || currentIndex > 0;\r\n const canGoNext = loop || currentIndex < slideCount - 1;\r\n\r\n const arrowBaseClass = merge(\r\n \"absolute top-1/2 -translate-y-1/2 z-20\",\r\n \"w-10 h-10 rounded-full flex items-center justify-center\",\r\n \"bg-white/80 hover:bg-white text-gray-800\",\r\n \"transition-all duration-200\",\r\n \"disabled:opacity-30 disabled:cursor-not-allowed\",\r\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white\"\r\n );\r\n\r\n const prevPosition = arrowPosition === \"outside\" ? \"-left-14\" : \"left-4\";\r\n const nextPosition = arrowPosition === \"outside\" ? \"-right-14\" : \"right-4\";\r\n\r\n return (\r\n <>\r\n <button\r\n onClick={prevSlide}\r\n disabled={!canGoPrev}\r\n className={merge(arrowBaseClass, prevPosition)}\r\n aria-label=\"이전 슬라이드\"\r\n >\r\n <ChevronLeft className=\"w-5 h-5\" />\r\n </button>\r\n <button\r\n onClick={nextSlide}\r\n disabled={!canGoNext}\r\n className={merge(arrowBaseClass, nextPosition)}\r\n aria-label=\"다음 슬라이드\"\r\n >\r\n <ChevronRight className=\"w-5 h-5\" />\r\n </button>\r\n </>\r\n );\r\n };\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"flex flex-col w-full h-full\",\r\n arrowPosition === \"outside\" && \"px-16\",\r\n className\r\n )}\r\n style={style}\r\n {...props}\r\n >\r\n <div\r\n ref={containerRef}\r\n className=\"relative overflow-hidden w-full flex-1\"\r\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\r\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\r\n onTouchStart={handleTouchStart}\r\n onTouchMove={handleTouchMove}\r\n onTouchEnd={handleTouchEnd}\r\n tabIndex={0}\r\n role=\"region\"\r\n aria-roledescription=\"carousel\"\r\n aria-label=\"이미지 슬라이더\"\r\n >\r\n {renderSlides()}\r\n {renderArrows()}\r\n {renderPlayPause()}\r\n {indicatorPosition.includes(\"inside\") && renderIndicators()}\r\n </div>\r\n {!indicatorPosition.includes(\"inside\") && renderIndicators()}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nCarousel.displayName = \"Carousel\";\r\n\r\n// Hook to check for reduced motion preference\r\nfunction useReducedMotion(): boolean {\r\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\r\n\r\n useEffect(() => {\r\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\r\n setPrefersReducedMotion(mediaQuery.matches);\r\n\r\n const handleChange = (e: MediaQueryListEvent) => {\r\n setPrefersReducedMotion(e.matches);\r\n };\r\n\r\n mediaQuery.addEventListener(\"change\", handleChange);\r\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\r\n }, []);\r\n\r\n return prefersReducedMotion;\r\n}\r\n\r\n// Simple icon components\r\nfunction ChevronLeft({ className }: { className?: string }) {\r\n return (\r\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronRight({ className }: { className?: string }) {\r\n return (\r\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction PlayIcon({ className }: { className?: string }) {\r\n return (\r\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M8 5v14l11-7z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction PauseIcon({ className }: { className?: string }) {\r\n return (\r\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M6 4h4v16H6V4zm8 0h4v16h-4V4z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport { Carousel };\r\n","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { cva } from \"class-variance-authority\"\r\nimport { merge } from \"../lib/utils\"\r\n\r\nexport const cardVariants = cva(\r\n \"rounded-lg\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"bg-card text-card-foreground border border-border\",\r\n outline: \"bg-transparent border-2 border-border\",\r\n elevated: \"bg-card text-card-foreground shadow-lg border border-border\",\r\n },\r\n shadow: {\r\n none: \"shadow-none\",\r\n sm: \"shadow-sm\",\r\n md: \"shadow-md\",\r\n lg: \"shadow-lg\",\r\n },\r\n padding: {\r\n none: \"\",\r\n sm: \"p-3\",\r\n md: \"p-4\",\r\n lg: \"p-6\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n padding: \"none\",\r\n },\r\n }\r\n)\r\n\r\n/**\r\n * Card 컴포넌트의 props / Card component props\r\n */\r\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n variant?: \"default\" | \"outline\" | \"elevated\"\r\n shadow?: \"none\" | \"sm\" | \"md\" | \"lg\"\r\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\"\r\n hoverable?: boolean\r\n}\r\n\r\n/**\r\n * Card 컴포넌트 / Card component\r\n *\r\n * 콘텐츠를 카드 형태로 표시하는 컴포넌트입니다.\r\n *\r\n * @example\r\n * <Card>\r\n * <CardHeader><CardTitle>제목</CardTitle></CardHeader>\r\n * <CardContent><p>내용</p></CardContent>\r\n * </Card>\r\n */\r\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\r\n ({ className, variant = \"default\", shadow, padding = \"none\", hoverable, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n cardVariants({ variant, shadow, padding }),\r\n hoverable && \"transition-shadow hover:shadow-lg cursor-pointer\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\n\r\nCard.displayName = \"Card\"\r\n\r\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\r\n\r\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\r\n ({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={merge(\"flex flex-col space-y-1 p-3\", className)}\r\n {...props}\r\n />\r\n )\r\n)\r\n\r\nCardHeader.displayName = \"CardHeader\"\r\n\r\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\r\n\r\nconst CardTitle = React.forwardRef<HTMLParagraphElement, CardTitleProps>(\r\n ({ className, ...props }, ref) => (\r\n <h3\r\n ref={ref}\r\n className={merge(\r\n \"text-base md:text-lg font-semibold leading-tight tracking-tight\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n)\r\n\r\nCardTitle.displayName = \"CardTitle\"\r\n\r\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\r\n\r\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\r\n ({ className, ...props }, ref) => (\r\n <p\r\n ref={ref}\r\n className={merge(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n)\r\n\r\nCardDescription.displayName = \"CardDescription\"\r\n\r\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\r\n\r\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\r\n ({ className, ...props }, ref) => (\r\n <div ref={ref} className={merge(\"px-3 pb-3\", className)} {...props} />\r\n )\r\n)\r\n\r\nCardContent.displayName = \"CardContent\"\r\n\r\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\r\n\r\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\r\n ({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={merge(\"flex items-center px-3 pb-3\", className)}\r\n {...props}\r\n />\r\n )\r\n)\r\n\r\nCardFooter.displayName = \"CardFooter\"\r\n\r\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\r\n","/**\r\n * 슬러그 생성 유틸리티\r\n * Slug generation utilities\r\n */\r\n\r\n/**\r\n * 제목에서 URL 슬러그 생성\r\n * Generate URL slug from title\r\n *\r\n * @param title - 제목 / Title\r\n * @returns 슬러그 / Slug\r\n *\r\n * @example\r\n * ```ts\r\n * generateSlug('Hello World') // 'hello-world'\r\n * generateSlug('안녕하세요') // '안녕하세요'\r\n * generateSlug('Hello 안녕') // 'hello-안녕'\r\n * ```\r\n */\r\nexport function generateSlug(title: string): string {\r\n return title\r\n .toLowerCase()\r\n .replace(/[^a-z0-9가-힣ぁ-んァ-ン一-龯_.~\\s-]/g, '')\r\n .replace(/\\s+/g, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/^-+|-+$/g, '')\r\n .trim()\r\n}\r\n\r\n/**\r\n * 슬러그 유효성 검사\r\n * Validate slug\r\n *\r\n * @param slug - 슬러그 / Slug\r\n * @returns 유효 여부 / Whether valid\r\n */\r\nexport function isValidSlug(slug: string): boolean {\r\n if (!slug || slug.length === 0) return false\r\n if (slug.length > 200) return false\r\n\r\n // 슬러그 형식 검사: 영문, 숫자, 한글, 일본어, 하이픈만 허용\r\n const slugPattern = /^[a-z0-9가-힣ぁ-んァ-ン一-龯_.~-]+$/\r\n return slugPattern.test(slug)\r\n}\r\n\r\n/**\r\n * 슬러그 정규화 (입력된 슬러그를 유효한 형식으로 변환)\r\n * Normalize slug (convert input to valid format)\r\n *\r\n * @param input - 입력값 / Input value\r\n * @returns 정규화된 슬러그 / Normalized slug\r\n */\r\nexport function normalizeSlug(input: string): string {\r\n return input\r\n .toLowerCase()\r\n .replace(/\\s+/g, '-')\r\n .replace(/[^a-z0-9가-힣ぁ-んァ-ン一-龯_.~-]/g, '')\r\n .replace(/-+/g, '-')\r\n .replace(/^-+|-+$/g, '')\r\n}\r\n","\"use client\"\r\n\r\nimport React, { createContext, useContext, useState, useCallback, useMemo, useEffect, useRef } from 'react'\r\nimport type {\r\n BlogEditorContextValue,\r\n BlogEditorData,\r\n BlogEditorProps,\r\n BlogEditorLabels,\r\n BlogEditorFeatures,\r\n LanguageConfig,\r\n MultilingualField,\r\n} from './types'\r\nimport { generateSlug as generateSlugUtil } from './utils/slug'\r\n\r\n/**\r\n * 기본 레이블 / Default labels\r\n */\r\nconst DEFAULT_LABELS: BlogEditorLabels = {\r\n // Header\r\n pageTitle: '새 글 작성',\r\n editTitle: '글 수정',\r\n preview: '미리보기',\r\n editMode: '편집',\r\n\r\n // Metadata\r\n basicInfo: '기본 정보',\r\n slug: '슬러그',\r\n slugPrefix: '/blog/',\r\n tags: '태그',\r\n tagsPlaceholder: '개발, 일상, 업데이트',\r\n coverImage: '커버 이미지 URL',\r\n coverImagePlaceholder: 'https://example.com/image.jpg',\r\n publishDate: '발행 예약일시',\r\n publishDateHint: '비워두면 즉시 발행됨',\r\n expiresAt: '만료 일시',\r\n expiresAtHint: '비워두면 만료되지 않음',\r\n\r\n // Content\r\n titleLabel: '제목',\r\n titlePlaceholder: '제목을 입력하세요',\r\n excerpt: '요약',\r\n excerptPlaceholder: '카드에 표시될 짧은 요약',\r\n contentLabel: '본문',\r\n contentPlaceholder: '마크다운으로 작성하세요...',\r\n\r\n // Actions\r\n cancel: '취소',\r\n saveDraft: '임시저장',\r\n publish: '발행',\r\n update: '수정 완료',\r\n saving: '저장 중...',\r\n\r\n // Translation\r\n translateHint: 'AI 번역 기능',\r\n translateButton: 'AI 번역',\r\n translating: '번역 중...',\r\n translateSuccess: '번역 완료!',\r\n\r\n // Errors\r\n requiredFields: '필수 필드를 입력해주세요',\r\n saveError: '저장 중 오류 발생',\r\n translateError: '번역 중 오류 발생',\r\n noTitle: '제목 없음',\r\n\r\n // Toolbar\r\n bold: '굵게',\r\n italic: '기울임',\r\n strikethrough: '취소선',\r\n heading: '제목',\r\n link: '링크',\r\n image: '이미지',\r\n code: '코드',\r\n codeBlock: '코드블록',\r\n quote: '인용문',\r\n list: '목록',\r\n orderedList: '순서 목록',\r\n horizontalRule: '수평선',\r\n}\r\n\r\n/**\r\n * 기본 기능 / Default features\r\n */\r\nconst DEFAULT_FEATURES: Required<BlogEditorFeatures> = {\r\n enableSlug: true,\r\n enableTags: true,\r\n enableCoverImage: true,\r\n enablePublishDate: true,\r\n enableExcerpt: true,\r\n enableTranslation: true,\r\n enablePreview: true,\r\n enableMarkdownToolbar: true,\r\n enableAutoSave: true,\r\n enableExpiresAt: false,\r\n}\r\n\r\n/**\r\n * 기본 언어 / Default languages\r\n */\r\nconst DEFAULT_LANGUAGES: LanguageConfig[] = [\r\n { key: 'ko', label: '한국어', isPrimary: true, flag: '🇰🇷' },\r\n { key: 'en', label: 'English', flag: '🇺🇸' },\r\n { key: 'ja', label: '日本語', flag: '🇯🇵' },\r\n]\r\n\r\n/**\r\n * 빈 다국어 필드 생성 / Create empty multilingual field\r\n */\r\nfunction createEmptyMultilingualField(languages: LanguageConfig[]): MultilingualField {\r\n const field: MultilingualField = {}\r\n languages.forEach((lang) => {\r\n field[lang.key] = ''\r\n })\r\n return field\r\n}\r\n\r\n/**\r\n * 초기 데이터 생성 / Create initial data\r\n */\r\nfunction createInitialData(\r\n languages: LanguageConfig[],\r\n initialData?: Partial<BlogEditorData>\r\n): BlogEditorData {\r\n return {\r\n slug: initialData?.slug ?? '',\r\n title: initialData?.title ?? createEmptyMultilingualField(languages),\r\n excerpt: initialData?.excerpt ?? createEmptyMultilingualField(languages),\r\n content: initialData?.content ?? createEmptyMultilingualField(languages),\r\n tags: initialData?.tags ?? [],\r\n coverImage: initialData?.coverImage ?? '',\r\n publishedAt: initialData?.publishedAt ?? null,\r\n expiresAt: initialData?.expiresAt ?? null,\r\n }\r\n}\r\n\r\n/**\r\n * BlogEditor 컨텍스트 / BlogEditor context\r\n */\r\nconst BlogEditorContext = createContext<BlogEditorContextValue | null>(null)\r\n\r\n/**\r\n * BlogEditor 컨텍스트 훅 / BlogEditor context hook\r\n */\r\nexport function useBlogEditor(): BlogEditorContextValue {\r\n const context = useContext(BlogEditorContext)\r\n if (!context) {\r\n throw new Error('useBlogEditor must be used within a BlogEditorProvider')\r\n }\r\n return context\r\n}\r\n\r\n/**\r\n * BlogEditor 프로바이더 Props / BlogEditor provider props\r\n */\r\ninterface BlogEditorProviderProps extends BlogEditorProps {\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * BlogEditor 프로바이더 / BlogEditor provider\r\n */\r\nexport function BlogEditorProvider({\r\n children,\r\n initialData,\r\n isEditMode = false,\r\n languages = DEFAULT_LANGUAGES,\r\n defaultLanguage,\r\n labels: userLabels,\r\n callbacks,\r\n features: userFeatures,\r\n variant = 'default',\r\n autoSaveKey,\r\n autoSaveInterval = 3000,\r\n}: BlogEditorProviderProps) {\r\n // 언어 설정\r\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key ?? languages[0]?.key ?? 'ko'\r\n const initialLanguage = defaultLanguage ?? primaryLanguage\r\n\r\n // 병합된 설정\r\n const labels = useMemo<BlogEditorLabels>(\r\n () => ({ ...DEFAULT_LABELS, ...userLabels }),\r\n [userLabels]\r\n )\r\n const features = useMemo<Required<BlogEditorFeatures>>(\r\n () => ({ ...DEFAULT_FEATURES, ...userFeatures }),\r\n [userFeatures]\r\n )\r\n\r\n // 상태\r\n const [formData, setFormData] = useState<BlogEditorData>(() =>\r\n createInitialData(languages, initialData)\r\n )\r\n const [activeLanguage, setActiveLanguage] = useState(initialLanguage)\r\n const [showPreview, setShowPreview] = useState(false)\r\n const [submitting, setSubmitting] = useState(false)\r\n const [translating, setTranslating] = useState(false)\r\n const [uploading, setUploading] = useState(false)\r\n const [error, setError] = useState<string | null>(null)\r\n const [translateSuccess, setTranslateSuccess] = useState(false)\r\n // 슬러그가 사용자에 의해 수동 편집되었는지 추적\r\n const [slugManuallyEdited, setSlugManuallyEdited] = useState(isEditMode || !!initialData?.slug)\r\n const [autoSaveStatus, setAutoSaveStatus] = useState<'idle' | 'saving' | 'saved'>('idle')\r\n const autoSaveTimerRef = useRef<NodeJS.Timeout | null>(null)\r\n const isInitialMount = useRef(true)\r\n\r\n // 자동저장 키 생성 / Generate auto-save key\r\n const storageKey = autoSaveKey || (isEditMode ? null : 'blog-editor-draft')\r\n\r\n // localStorage에서 복원 (새 글 작성 모드만) / Restore from localStorage (create mode only)\r\n useEffect(() => {\r\n if (!features.enableAutoSave || !storageKey || isEditMode) return\r\n\r\n try {\r\n const saved = localStorage.getItem(storageKey)\r\n if (saved) {\r\n const parsed = JSON.parse(saved) as BlogEditorData\r\n setFormData(parsed)\r\n }\r\n } catch {\r\n // 파싱 실패 시 무시\r\n }\r\n }, []) // 마운트 시 한 번만 실행\r\n\r\n // 자동저장 / Auto-save to localStorage\r\n useEffect(() => {\r\n if (!features.enableAutoSave || !storageKey) return\r\n\r\n // 초기 마운트 시에는 저장하지 않음\r\n if (isInitialMount.current) {\r\n isInitialMount.current = false\r\n return\r\n }\r\n\r\n // 기존 타이머 취소\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current)\r\n }\r\n\r\n setAutoSaveStatus('saving')\r\n\r\n // debounce 저장\r\n autoSaveTimerRef.current = setTimeout(() => {\r\n try {\r\n localStorage.setItem(storageKey, JSON.stringify(formData))\r\n setAutoSaveStatus('saved')\r\n // 3초 후 idle로\r\n setTimeout(() => setAutoSaveStatus('idle'), 2000)\r\n } catch {\r\n setAutoSaveStatus('idle')\r\n }\r\n }, autoSaveInterval)\r\n\r\n return () => {\r\n if (autoSaveTimerRef.current) {\r\n clearTimeout(autoSaveTimerRef.current)\r\n }\r\n }\r\n }, [formData, features.enableAutoSave, storageKey, autoSaveInterval])\r\n\r\n // 저장 성공 시 localStorage 초기화 / Clear localStorage on successful save\r\n const clearAutoSave = useCallback(() => {\r\n if (storageKey) {\r\n try {\r\n localStorage.removeItem(storageKey)\r\n } catch {\r\n // 무시\r\n }\r\n }\r\n }, [storageKey])\r\n\r\n // 필드 업데이트 / Update field\r\n const updateField = useCallback(\r\n <K extends keyof BlogEditorData>(field: K, value: BlogEditorData[K]) => {\r\n setFormData((prev) => ({ ...prev, [field]: value }))\r\n },\r\n []\r\n )\r\n\r\n // 다국어 필드 업데이트 / Update multilingual field\r\n const updateMultilingualField = useCallback(\r\n (field: 'title' | 'excerpt' | 'content', language: string, value: string) => {\r\n setFormData((prev) => ({\r\n ...prev,\r\n [field]: {\r\n ...prev[field],\r\n [language]: value,\r\n },\r\n }))\r\n },\r\n []\r\n )\r\n\r\n // 슬러그 생성 / Generate slug\r\n const generateSlug = useCallback((title: string) => {\r\n return generateSlugUtil(title)\r\n }, [])\r\n\r\n // 저장 핸들러 / Save handler\r\n const handleSave = useCallback(\r\n async (publish: boolean) => {\r\n // 유효성 검사\r\n const primaryTitle = formData.title[primaryLanguage]\r\n const primaryContent = formData.content[primaryLanguage]\r\n\r\n if (!primaryTitle || !primaryContent) {\r\n setError(labels.requiredFields)\r\n return\r\n }\r\n\r\n if (features.enableSlug && !formData.slug) {\r\n setError(labels.requiredFields)\r\n return\r\n }\r\n\r\n setSubmitting(true)\r\n setError(null)\r\n\r\n try {\r\n await callbacks.onSave(formData, publish)\r\n // 저장 성공 시 자동저장 데이터 삭제\r\n clearAutoSave()\r\n } catch (err) {\r\n setError(labels.saveError)\r\n } finally {\r\n setSubmitting(false)\r\n }\r\n },\r\n [formData, primaryLanguage, labels, features, callbacks, clearAutoSave]\r\n )\r\n\r\n // 번역 핸들러 / Translate handler\r\n const handleTranslate = useCallback(async () => {\r\n if (!callbacks.onTranslate) return\r\n\r\n const primaryTitle = formData.title[primaryLanguage]\r\n const primaryContent = formData.content[primaryLanguage]\r\n const primaryExcerpt = formData.excerpt[primaryLanguage]\r\n\r\n if (!primaryTitle || !primaryContent) {\r\n setError(labels.requiredFields)\r\n return\r\n }\r\n\r\n setTranslating(true)\r\n setError(null)\r\n setTranslateSuccess(false)\r\n\r\n try {\r\n const translations = await callbacks.onTranslate({\r\n sourceLanguage: primaryLanguage,\r\n title: primaryTitle,\r\n content: primaryContent,\r\n excerpt: primaryExcerpt || undefined,\r\n })\r\n\r\n // 번역 결과 적용\r\n setFormData((prev) => {\r\n const newTitle = { ...prev.title }\r\n const newContent = { ...prev.content }\r\n const newExcerpt = { ...prev.excerpt }\r\n\r\n // translations는 { title: MultilingualField, content: MultilingualField, excerpt: MultilingualField } 형태일 수 있음\r\n // 또는 단순히 { ko: { title, content, excerpt }, en: { ... }, ja: { ... } } 형태일 수 있음\r\n // 여기서는 콜백이 언어별 번역을 반환한다고 가정\r\n Object.keys(translations).forEach((langKey) => {\r\n if (langKey !== primaryLanguage) {\r\n const translation = translations[langKey]\r\n if (typeof translation === 'object' && translation !== null) {\r\n const trans = translation as { title?: string; content?: string; excerpt?: string }\r\n if (trans.title) newTitle[langKey] = trans.title\r\n if (trans.content) newContent[langKey] = trans.content\r\n if (trans.excerpt) newExcerpt[langKey] = trans.excerpt\r\n }\r\n }\r\n })\r\n\r\n return {\r\n ...prev,\r\n title: newTitle,\r\n content: newContent,\r\n excerpt: newExcerpt,\r\n }\r\n })\r\n\r\n setTranslateSuccess(true)\r\n setTimeout(() => setTranslateSuccess(false), 3000)\r\n } catch (err) {\r\n setError(labels.translateError)\r\n } finally {\r\n setTranslating(false)\r\n }\r\n }, [formData, primaryLanguage, labels, callbacks])\r\n\r\n // 이미지 업로드 핸들러 / Image upload handler\r\n const handleUploadImage = useCallback(async (file: File): Promise<string | null> => {\r\n if (!callbacks.onUploadImage) return null\r\n\r\n setUploading(true)\r\n setError(null)\r\n\r\n try {\r\n const url = await callbacks.onUploadImage(file)\r\n return url\r\n } catch (err) {\r\n setError('이미지 업로드 실패')\r\n return null\r\n } finally {\r\n setUploading(false)\r\n }\r\n }, [callbacks])\r\n\r\n // 취소 핸들러 / Cancel handler\r\n const handleCancel = useCallback(() => {\r\n callbacks.onCancel?.()\r\n }, [callbacks])\r\n\r\n // 컨텍스트 값\r\n const value = useMemo<BlogEditorContextValue>(\r\n () => ({\r\n // State\r\n formData,\r\n activeLanguage,\r\n showPreview,\r\n submitting,\r\n translating,\r\n uploading,\r\n error,\r\n translateSuccess,\r\n autoSaveStatus,\r\n\r\n // Config\r\n languages,\r\n features,\r\n labels,\r\n variant,\r\n isEditMode,\r\n\r\n // Actions\r\n setActiveLanguage,\r\n setShowPreview,\r\n updateField,\r\n updateMultilingualField,\r\n handleSave,\r\n handleTranslate,\r\n handleUploadImage,\r\n handleCancel,\r\n setError,\r\n generateSlug,\r\n slugManuallyEdited,\r\n setSlugManuallyEdited,\r\n }),\r\n [\r\n formData,\r\n activeLanguage,\r\n showPreview,\r\n submitting,\r\n translating,\r\n uploading,\r\n error,\r\n translateSuccess,\r\n autoSaveStatus,\r\n languages,\r\n features,\r\n labels,\r\n variant,\r\n isEditMode,\r\n updateField,\r\n updateMultilingualField,\r\n handleSave,\r\n handleTranslate,\r\n handleUploadImage,\r\n handleCancel,\r\n generateSlug,\r\n slugManuallyEdited,\r\n setSlugManuallyEdited,\r\n ]\r\n )\r\n\r\n return <BlogEditorContext.Provider value={value}>{children}</BlogEditorContext.Provider>\r\n}\r\n\r\nexport { BlogEditorContext }\r\n","\"use client\"\r\n\r\nimport React from 'react'\r\nimport { merge } from '../../../lib/utils'\r\nimport { Icon } from '../../Icon'\r\nimport { useBlogEditor } from './BlogEditorContext'\r\n\r\n/**\r\n * BlogEditorHeader Props\r\n */\r\nexport interface BlogEditorHeaderProps {\r\n /** 뒤로가기 콜백 / Back navigation callback */\r\n onBack?: () => void\r\n /** 뒤로가기 링크 컴포넌트 / Back link component */\r\n backLink?: React.ReactNode\r\n /** 추가 CSS 클래스 / Additional CSS classes */\r\n className?: string\r\n}\r\n\r\n/**\r\n * BlogEditorHeader 컴포넌트\r\n * 에디터 헤더 (제목 + 미리보기 토글)\r\n */\r\nconst BlogEditorHeader = React.forwardRef<HTMLElement, BlogEditorHeaderProps>(\r\n ({ onBack, backLink, className }, ref) => {\r\n const { labels, isEditMode, formData } = useBlogEditor()\r\n\r\n return (\r\n <header\r\n ref={ref}\r\n className={merge('flex items-center justify-between mb-8', className)}\r\n >\r\n <div className=\"flex items-center gap-4\">\r\n {backLink || (\r\n onBack && (\r\n <button\r\n type=\"button\"\r\n onClick={onBack}\r\n className=\"p-2 text-muted-foreground hover:text-foreground transition-colors\"\r\n aria-label=\"뒤로가기\"\r\n >\r\n <Icon name=\"chevronLeft\" size={24} />\r\n </button>\r\n )\r\n )}\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-foreground\">\r\n {isEditMode ? labels.editTitle : labels.pageTitle}\r\n </h1>\r\n {isEditMode && formData.slug && (\r\n <p className=\"text-sm text-muted-foreground\">\r\n {labels.slugPrefix}{formData.slug}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </header>\r\n )\r\n }\r\n)\r\n\r\nBlogEditorHeader.displayName = 'BlogEditorHeader'\r\n\r\nexport { BlogEditorHeader }\r\n","\"use client\"\r\n\r\nimport React, { useState, useCallback, useRef, KeyboardEvent, ChangeEvent } from 'react'\r\nimport { merge } from '../../../lib/utils'\r\nimport { Icon } from '../../Icon'\r\nimport { useBlogEditor } from './BlogEditorContext'\r\nimport { normalizeSlug } from './utils/slug'\r\n\r\n/**\r\n * BlogEditorMetadata Props\r\n */\r\nexport interface BlogEditorMetadataProps {\r\n /** 추가 CSS 클래스 / Additional CSS classes */\r\n className?: string\r\n}\r\n\r\n/**\r\n * BlogEditorMetadata 컴포넌트\r\n * 메타데이터 필드 (슬러그, 태그, 커버 이미지, 발행일)\r\n */\r\nconst BlogEditorMetadata = React.forwardRef<HTMLDivElement, BlogEditorMetadataProps>(\r\n ({ className }, ref) => {\r\n const { formData, updateField, features, labels, variant, handleUploadImage, uploading, setSlugManuallyEdited } = useBlogEditor()\r\n const [tagInput, setTagInput] = useState('')\r\n const fileInputRef = useRef<HTMLInputElement>(null)\r\n\r\n const containerClasses = merge(\r\n 'rounded-xl p-6 space-y-4',\r\n variant === 'glass'\r\n ? 'bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-background/20 dark:border-border/50'\r\n : variant === 'minimal'\r\n ? 'bg-transparent'\r\n : 'bg-background',\r\n className\r\n )\r\n\r\n const inputClasses =\r\n 'w-full px-3 py-2 border border-border rounded-lg bg-background text-foreground focus:ring-1 focus:ring-ring focus:border-transparent transition-colors'\r\n\r\n const labelClasses = 'block text-sm font-medium text-foreground mb-1'\r\n\r\n // 태그 추가\r\n const addTag = useCallback((tag: string) => {\r\n const trimmed = tag.trim()\r\n if (trimmed && !formData.tags.includes(trimmed)) {\r\n updateField('tags', [...formData.tags, trimmed])\r\n }\r\n setTagInput('')\r\n }, [formData.tags, updateField])\r\n\r\n // 태그 삭제\r\n const removeTag = useCallback((tagToRemove: string) => {\r\n updateField('tags', formData.tags.filter((t) => t !== tagToRemove))\r\n }, [formData.tags, updateField])\r\n\r\n // 태그 입력 핸들러\r\n const handleTagInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value\r\n // 쉼표 입력 시 태그 추가\r\n if (value.includes(',')) {\r\n const parts = value.split(',')\r\n parts.forEach((part, idx) => {\r\n if (idx < parts.length - 1) {\r\n // 마지막이 아닌 부분들은 태그로 추가\r\n addTag(part)\r\n } else {\r\n // 마지막 부분은 입력창에 유지\r\n setTagInput(part)\r\n }\r\n })\r\n } else {\r\n setTagInput(value)\r\n }\r\n }, [addTag])\r\n\r\n // 키보드 이벤트 핸들러\r\n const handleTagKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault()\r\n addTag(tagInput)\r\n } else if (e.key === 'Backspace' && !tagInput && formData.tags.length > 0) {\r\n // 입력창이 비어있을 때 Backspace 누르면 마지막 태그 삭제\r\n removeTag(formData.tags[formData.tags.length - 1])\r\n }\r\n }, [tagInput, formData.tags, addTag, removeTag])\r\n\r\n return (\r\n <div ref={ref} className={containerClasses}>\r\n <h2 className=\"font-semibold text-foreground\">{labels.basicInfo}</h2>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n {/* 슬러그 */}\r\n {features.enableSlug && (\r\n <div>\r\n <label className={labelClasses}>\r\n {labels.slug} *\r\n </label>\r\n <div className=\"flex items-center\">\r\n <span className=\"text-muted-foreground mr-1 text-sm\">\r\n {labels.slugPrefix}\r\n </span>\r\n <input\r\n type=\"text\"\r\n value={formData.slug}\r\n onChange={(e) => {\r\n updateField('slug', normalizeSlug(e.target.value))\r\n setSlugManuallyEdited(true)\r\n }}\r\n className={merge(inputClasses, 'flex-1')}\r\n placeholder=\"my-post-slug\"\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* 태그 */}\r\n {features.enableTags && (\r\n <div>\r\n <label className={labelClasses}>{labels.tags}</label>\r\n <div className={merge(\r\n 'flex flex-wrap items-center gap-2 min-h-[42px] px-3 py-2 border border-border rounded-lg bg-background focus-within:ring-1 focus-within:ring-ring focus-within:border-transparent transition-colors'\r\n )}>\r\n {/* 태그 칩들 */}\r\n {formData.tags.map((tag) => (\r\n <span\r\n key={tag}\r\n className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-primary/10 text-primary text-sm rounded-md\"\r\n >\r\n {tag}\r\n <button\r\n type=\"button\"\r\n onClick={() => removeTag(tag)}\r\n className=\"hover:text-primary transition-colors\"\r\n aria-label={`${tag} 태그 삭제`}\r\n >\r\n <Icon name=\"x\" size={14} />\r\n </button>\r\n </span>\r\n ))}\r\n {/* 입력창 */}\r\n <input\r\n type=\"text\"\r\n value={tagInput}\r\n onChange={handleTagInputChange}\r\n onKeyDown={handleTagKeyDown}\r\n className=\"flex-1 min-w-[100px] bg-transparent outline-none text-foreground text-sm\"\r\n placeholder={formData.tags.length === 0 ? labels.tagsPlaceholder : '태그 추가...'}\r\n />\r\n </div>\r\n <p className=\"mt-1 text-xs text-muted-foreground\">\r\n 쉼표(,) 또는 Enter로 태그 추가\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* 커버 이미지 */}\r\n {features.enableCoverImage && (\r\n <div>\r\n <label className={labelClasses}>{labels.coverImage}</label>\r\n <div className=\"space-y-3\">\r\n {/* 이미지 미리보기 */}\r\n {formData.coverImage && (\r\n <div className=\"relative w-full h-40 rounded-lg overflow-hidden bg-muted\">\r\n <img\r\n src={formData.coverImage}\r\n alt=\"커버 이미지 미리보기\"\r\n className=\"w-full h-full object-cover\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => updateField('coverImage', '')}\r\n className=\"absolute top-2 right-2 p-1.5 bg-red-500 text-white rounded-full hover:bg-red-600 transition-colors\"\r\n aria-label=\"이미지 삭제\"\r\n >\r\n <Icon name=\"x\" size={14} />\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* URL 입력 + 파일 업로드 */}\r\n <div className=\"flex gap-2\">\r\n <input\r\n type=\"text\"\r\n value={formData.coverImage}\r\n onChange={(e) => updateField('coverImage', e.target.value)}\r\n className={merge(inputClasses, 'flex-1')}\r\n placeholder={labels.coverImagePlaceholder}\r\n />\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept=\"image/*\"\r\n className=\"hidden\"\r\n onChange={async (e: ChangeEvent<HTMLInputElement>) => {\r\n const file = e.target.files?.[0]\r\n if (file) {\r\n const url = await handleUploadImage(file)\r\n if (url) {\r\n updateField('coverImage', url)\r\n }\r\n }\r\n // 같은 파일 다시 선택할 수 있도록 초기화\r\n e.target.value = ''\r\n }}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => fileInputRef.current?.click()}\r\n disabled={uploading}\r\n className=\"px-3 py-2 border border-border rounded-lg hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n title=\"이미지 업로드\"\r\n >\r\n {uploading ? (\r\n <Icon name=\"loader\" size={20} spin />\r\n ) : (\r\n <Icon name=\"upload\" size={20} />\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* 발행일 & 만료일 */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n {features.enablePublishDate && (\r\n <div>\r\n <label className={labelClasses}>{labels.publishDate}</label>\r\n <input\r\n type=\"datetime-local\"\r\n value={formData.publishedAt ?? ''}\r\n onChange={(e) => updateField('publishedAt', e.target.value || null)}\r\n className={inputClasses}\r\n />\r\n <p className=\"mt-1 text-sm text-muted-foreground\">\r\n {labels.publishDateHint}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {features.enableExpiresAt && (\r\n <div>\r\n <label className={labelClasses}>{labels.expiresAt}</label>\r\n <input\r\n type=\"datetime-local\"\r\n value={formData.expiresAt ?? ''}\r\n onChange={(e) => updateField('expiresAt', e.target.value || null)}\r\n className={inputClasses}\r\n />\r\n <p className=\"mt-1 text-sm text-muted-foreground\">\r\n {labels.expiresAtHint}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nBlogEditorMetadata.displayName = 'BlogEditorMetadata'\r\n\r\nexport { BlogEditorMetadata }\r\n","\"use client\"\r\n\r\nimport React from 'react'\r\nimport { merge } from '../../../lib/utils'\r\nimport { Icon } from '../../Icon'\r\nimport { useBlogEditor } from './BlogEditorContext'\r\n\r\n/**\r\n * BlogEditorLanguageTabs Props\r\n */\r\nexport interface BlogEditorLanguageTabsProps {\r\n /** 추가 CSS 클래스 / Additional CSS classes */\r\n className?: string\r\n}\r\n\r\n/**\r\n * BlogEditorLanguageTabs 컴포넌트\r\n * 언어 탭 네비게이션 + 미리보기 토글 (sticky)\r\n */\r\nconst BlogEditorLanguageTabs = React.forwardRef<HTMLDivElement, BlogEditorLanguageTabsProps>(\r\n ({ className }, ref) => {\r\n const { languages, activeLanguage, setActiveLanguage, showPreview, setShowPreview, features, labels } = useBlogEditor()\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n 'flex items-center border-b border-border sticky top-0 z-10 bg-background',\r\n className\r\n )}\r\n role=\"tablist\"\r\n aria-label=\"언어 선택\"\r\n >\r\n <div className=\"flex flex-1\">\r\n {languages.map((lang) => {\r\n const isActive = activeLanguage === lang.key\r\n const isPrimary = lang.isPrimary\r\n\r\n return (\r\n <button\r\n key={lang.key}\r\n type=\"button\"\r\n role=\"tab\"\r\n aria-selected={isActive}\r\n aria-controls={`tabpanel-${lang.key}`}\r\n id={`tab-${lang.key}`}\r\n onClick={() => setActiveLanguage(lang.key)}\r\n className={merge(\r\n 'flex-1 px-4 py-3 text-sm font-medium transition-colors',\r\n isActive\r\n ? 'bg-primary/10 text-primary border-b-2 border-primary'\r\n : 'text-muted-foreground hover:bg-muted'\r\n )}\r\n >\r\n {lang.flag && <span className=\"mr-1.5\">{lang.flag}</span>}\r\n {lang.label}\r\n {isPrimary && ' *'}\r\n </button>\r\n )\r\n })}\r\n </div>\r\n\r\n {features.enablePreview && (\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPreview(!showPreview)}\r\n className=\"inline-flex items-center gap-1.5 px-3 py-2 mx-2 text-sm border border-border rounded-lg hover:bg-muted transition-colors shrink-0\"\r\n >\r\n <Icon name={showPreview ? 'pencil' : 'eye'} size={14} />\r\n {showPreview ? labels.editMode : labels.preview}\r\n </button>\r\n )}\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nBlogEditorLanguageTabs.displayName = 'BlogEditorLanguageTabs'\r\n\r\nexport { BlogEditorLanguageTabs }\r\n","\"use client\"\r\n\r\nimport React from 'react'\r\nimport { merge } from '../../../lib/utils'\r\nimport { useBlogEditor } from './BlogEditorContext'\r\n\r\n/**\r\n * BlogEditorContent Props\r\n */\r\nexport interface BlogEditorContentProps {\r\n /** 추가 CSS 클래스 / Additional CSS classes */\r\n className?: string\r\n /** textarea ref 콜백 / textarea ref callback */\r\n textareaRef?: React.RefObject<HTMLTextAreaElement | null>\r\n}\r\n\r\n/**\r\n * BlogEditorContent 컴포넌트\r\n * 제목, 요약, 본문 입력 필드\r\n */\r\nconst BlogEditorContent = React.forwardRef<HTMLDivElement, BlogEditorContentProps>(\r\n ({ className, textareaRef }, ref) => {\r\n const {\r\n formData,\r\n activeLanguage,\r\n updateMultilingualField,\r\n updateField,\r\n features,\r\n labels,\r\n languages,\r\n generateSlug,\r\n isEditMode,\r\n slugManuallyEdited,\r\n } = useBlogEditor()\r\n\r\n const isPrimaryLanguage = languages.find((l) => l.isPrimary)?.key === activeLanguage\r\n const currentLang = languages.find((l) => l.key === activeLanguage)\r\n\r\n const inputClasses =\r\n 'w-full px-3 py-2 border border-border rounded-lg bg-background text-foreground focus:ring-1 focus:ring-ring focus:border-transparent transition-colors'\r\n\r\n const labelClasses = 'block text-sm font-medium text-foreground mb-1'\r\n\r\n const handleTitleChange = (value: string) => {\r\n updateMultilingualField('title', activeLanguage, value)\r\n\r\n // 영어 탭에서 타이틀 입력 시 슬러그 자동 생성\r\n // (한국어/일본어보다 영어 슬러그가 URL에 적합)\r\n if (activeLanguage === 'en' && !isEditMode && !slugManuallyEdited) {\r\n updateField('slug', generateSlug(value))\r\n }\r\n }\r\n\r\n // 언어별 레이블 생성\r\n const getLangLabel = (baseLabel: string) => {\r\n if (isPrimaryLanguage) {\r\n return `${baseLabel} *`\r\n }\r\n return `${baseLabel} (${currentLang?.label || activeLanguage})`\r\n }\r\n\r\n return (\r\n <div ref={ref} className={merge('p-6 space-y-4', className)}>\r\n {/* 제목 */}\r\n <div>\r\n <label className={labelClasses}>{getLangLabel(labels.titleLabel)}</label>\r\n <input\r\n type=\"text\"\r\n value={formData.title[activeLanguage] || ''}\r\n onChange={(e) => handleTitleChange(e.target.value)}\r\n className={inputClasses}\r\n placeholder={labels.titlePlaceholder}\r\n />\r\n </div>\r\n\r\n {/* 요약 */}\r\n {features.enableExcerpt && (\r\n <div>\r\n <label className={labelClasses}>{getLangLabel(labels.excerpt)}</label>\r\n <textarea\r\n value={formData.excerpt[activeLanguage] || ''}\r\n onChange={(e) => updateMultilingualField('excerpt', activeLanguage, e.target.value)}\r\n rows={2}\r\n className={merge(inputClasses, 'resize-none')}\r\n placeholder={labels.excerptPlaceholder}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* 본문 */}\r\n <div>\r\n <label className={labelClasses}>\r\n {getLangLabel(labels.contentLabel)} (마크다운)\r\n </label>\r\n <textarea\r\n ref={textareaRef}\r\n value={formData.content[activeLanguage] || ''}\r\n onChange={(e) => updateMultilingualField('content', activeLanguage, e.target.value)}\r\n rows={15}\r\n className={merge(inputClasses, 'font-mono text-sm resize-y min-h-[300px]')}\r\n placeholder={labels.contentPlaceholder}\r\n />\r\n </div>\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nBlogEditorContent.displayName = 'BlogEditorContent'\r\n\r\nexport { BlogEditorContent }\r\n","/**\r\n * 마크다운 파서 유틸리티\r\n * Markdown parser utilities\r\n *\r\n * 지원 문법 / Supported syntax:\r\n * - **볼드**, *이탤릭*, ~~취소선~~\r\n * - [링크](url)\r\n * - # 헤딩 (h1-h6)\r\n * - - 또는 * 리스트\r\n * - `인라인 코드`\r\n * - ```코드블록```\r\n * - > 인용문\r\n * - --- 수평선\r\n */\r\n\r\n/**\r\n * HTML 특수문자 이스케이프\r\n * Escape HTML special characters\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#039;')\r\n}\r\n\r\n/**\r\n * 마크다운 텍스트를 HTML로 변환\r\n * Convert markdown text to HTML\r\n */\r\nexport function parseMarkdown(text: string): string {\r\n if (!text) return ''\r\n\r\n let html = text\r\n\r\n // 코드블록 먼저 처리 (다른 파싱 방지)\r\n html = html.replace(/```(\\w*)\\n?([\\s\\S]*?)```/g, (_, lang, code) => {\r\n const escaped = escapeHtml(code.trim())\r\n return `<pre class=\"bg-gray-100 dark:bg-gray-800 rounded-lg p-4 overflow-x-auto my-4\"><code class=\"text-sm\">${escaped}</code></pre>`\r\n })\r\n\r\n // 인라인 코드\r\n html = html.replace(\r\n /`([^`]+)`/g,\r\n '<code class=\"bg-gray-100 dark:bg-gray-700 px-1.5 py-0.5 rounded text-sm\">$1</code>'\r\n )\r\n\r\n // 헤딩 (줄 시작에서만)\r\n html = html.replace(/^######\\s+(.+)$/gm, '<h6 class=\"text-base font-semibold mt-4 mb-2\">$1</h6>')\r\n html = html.replace(/^#####\\s+(.+)$/gm, '<h5 class=\"text-lg font-semibold mt-4 mb-2\">$1</h5>')\r\n html = html.replace(/^####\\s+(.+)$/gm, '<h4 class=\"text-xl font-semibold mt-5 mb-2\">$1</h4>')\r\n html = html.replace(/^###\\s+(.+)$/gm, '<h3 class=\"text-2xl font-semibold mt-5 mb-3\">$1</h3>')\r\n html = html.replace(/^##\\s+(.+)$/gm, '<h2 class=\"text-2xl font-bold mt-6 mb-3\">$1</h2>')\r\n html = html.replace(/^#\\s+(.+)$/gm, '<h1 class=\"text-3xl font-bold mt-6 mb-4\">$1</h1>')\r\n\r\n // 수평선\r\n html = html.replace(/^---+$/gm, '<hr class=\"my-6 border-gray-300 dark:border-gray-600\" />')\r\n\r\n // 인용문\r\n html = html.replace(\r\n /^>\\s+(.+)$/gm,\r\n '<blockquote class=\"border-l-4 border-gray-300 dark:border-gray-600 pl-4 my-4 italic text-gray-600 dark:text-gray-400\">$1</blockquote>'\r\n )\r\n\r\n // 볼드, 이탤릭, 취소선\r\n html = html.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\r\n html = html.replace(/\\*(.+?)\\*/g, '<em>$1</em>')\r\n html = html.replace(/~~(.+?)~~/g, '<del class=\"text-gray-500\">$1</del>')\r\n\r\n // 링크\r\n html = html.replace(\r\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\r\n '<a href=\"$2\" class=\"text-cyan-600 hover:text-cyan-700 dark:text-cyan-400 dark:hover:text-cyan-300 underline\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>'\r\n )\r\n\r\n // 리스트 (연속된 리스트 아이템을 ul로 감싸기)\r\n html = html.replace(/^[-*]\\s+(.+)$/gm, '<li class=\"ml-4\">$1</li>')\r\n html = html.replace(/(<li[^>]*>.*<\\/li>\\n?)+/g, (match) => {\r\n return `<ul class=\"list-disc list-inside my-4 space-y-1\">${match}</ul>`\r\n })\r\n\r\n // 줄바꿈을 <br>로 변환 (단, 블록 요소 직후는 제외)\r\n html = html.replace(/\\n(?!<)/g, '<br />\\n')\r\n\r\n // 연속된 <br /> 정리\r\n html = html.replace(/(<br \\/>[\\n\\s]*){3,}/g, '<br /><br />\\n')\r\n\r\n return html\r\n}\r\n\r\n/**\r\n * 마크다운에서 순수 텍스트만 추출 (미리보기용)\r\n * Extract plain text from markdown (for preview)\r\n */\r\nexport function stripMarkdown(text: string): string {\r\n if (!text) return ''\r\n\r\n return text\r\n // 코드블록 제거\r\n .replace(/```[\\s\\S]*?```/g, '')\r\n // 인라인 코드 제거\r\n .replace(/`[^`]+`/g, '')\r\n // 헤딩 마크 제거\r\n .replace(/^#{1,6}\\s+/gm, '')\r\n // 볼드/이탤릭 마크 제거\r\n .replace(/\\*\\*(.+?)\\*\\*/g, '$1')\r\n .replace(/\\*(.+?)\\*/g, '$1')\r\n .replace(/~~(.+?)~~/g, '$1')\r\n // 링크에서 텍스트만 추출\r\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1')\r\n // 리스트 마크 제거\r\n .replace(/^[-*]\\s+/gm, '')\r\n // 인용문 마크 제거\r\n .replace(/^>\\s+/gm, '')\r\n // 수평선 제거\r\n .replace(/^---+$/gm, '')\r\n // 연속 공백/줄바꿈 정리\r\n .replace(/\\n{3,}/g, '\\n\\n')\r\n .trim()\r\n}\r\n\r\n/**\r\n * 마크다운 텍스트 미리보기 (글자수 제한)\r\n * Markdown text preview (with character limit)\r\n */\r\nexport function getMarkdownPreview(text: string, maxLength: number = 150): string {\r\n const stripped = stripMarkdown(text)\r\n if (stripped.length <= maxLength) return stripped\r\n return stripped.slice(0, maxLength).trim() + '...'\r\n}\r\n\r\n/**\r\n * 마크다운 삽입 헬퍼\r\n * Markdown insertion helper\r\n */\r\nexport function insertMarkdown(\r\n text: string,\r\n selectionStart: number,\r\n selectionEnd: number,\r\n before: string,\r\n after: string\r\n): { text: string; cursorPosition: number } {\r\n const selectedText = text.slice(selectionStart, selectionEnd)\r\n const beforeText = text.slice(0, selectionStart)\r\n const afterText = text.slice(selectionEnd)\r\n\r\n const newText = beforeText + before + selectedText + after + afterText\r\n const cursorPosition = selectionStart + before.length + selectedText.length + after.length\r\n\r\n return { text: newText, cursorPosition }\r\n}\r\n","\"use client\"\r\n\r\nimport React, { useCallback } from 'react'\r\nimport { merge } from '../../../lib/utils'\r\nimport { Icon } from '../../Icon'\r\nimport { useBlogEditor } from './BlogEditorContext'\r\nimport { insertMarkdown } from './utils/markdown'\r\nimport type { ToolbarItem } from './types'\r\n\r\n/**\r\n * BlogEditorToolbar Props\r\n */\r\nexport interface BlogEditorToolbarProps {\r\n /** textarea ref / textarea reference */\r\n textareaRef: React.RefObject<HTMLTextAreaElement | null>\r\n /** 추가 CSS 클래스 / Additional CSS classes */\r\n className?: string\r\n}\r\n\r\n/**\r\n * 툴바 아이템 정의 / Toolbar item definitions\r\n */\r\nconst TOOLBAR_ITEMS: ToolbarItem[] = [\r\n {\r\n icon: 'bold',\r\n label: 'bold',\r\n markdown: { before: '**', after: '**' },\r\n shortcut: 'Ctrl+B',\r\n },\r\n {\r\n icon: 'italic',\r\n label: 'italic',\r\n markdown: { before: '*', after: '*' },\r\n shortcut: 'Ctrl+I',\r\n },\r\n {\r\n icon: 'strikethrough',\r\n label: 'strikethrough',\r\n markdown: { before: '~~', after: '~~' },\r\n },\r\n {\r\n icon: 'heading',\r\n label: 'heading',\r\n markdown: { before: '## ', after: '' },\r\n },\r\n {\r\n icon: 'link',\r\n label: 'link',\r\n markdown: { before: '[', after: '](url)' },\r\n shortcut: 'Ctrl+K',\r\n },\r\n {\r\n icon: 'image',\r\n label: 'image',\r\n markdown: { before: '![alt](', after: ')' },\r\n },\r\n {\r\n icon: 'code',\r\n label: 'code',\r\n markdown: { before: '`', after: '`' },\r\n },\r\n {\r\n icon: 'fileCode',\r\n label: 'codeBlock',\r\n markdown: { before: '```\\n', after: '\\n```' },\r\n },\r\n {\r\n icon: 'quote',\r\n label: 'quote',\r\n markdown: { before: '> ', after: '' },\r\n },\r\n {\r\n icon: 'list',\r\n label: 'list',\r\n markdown: { before: '- ', after: '' },\r\n },\r\n {\r\n icon: 'listOrdered',\r\n label: 'orderedList',\r\n markdown: { before: '1. ', after: '' },\r\n },\r\n {\r\n icon: 'minus',\r\n label: 'horizontalRule',\r\n markdown: { before: '\\n---\\n', after: '' },\r\n },\r\n]\r\n\r\n/**\r\n * BlogEditorToolbar 컴포넌트\r\n * 마크다운 포맷팅 툴바\r\n */\r\nconst BlogEditorToolbar = React.forwardRef<HTMLDivElement, BlogEditorToolbarProps>(\r\n ({ textareaRef, className }, ref) => {\r\n const { labels, activeLanguage, updateMultilingualField, formData, features } = useBlogEditor()\r\n\r\n const handleInsert = useCallback(\r\n (item: ToolbarItem) => {\r\n const textarea = textareaRef.current\r\n if (!textarea) return\r\n\r\n const { selectionStart, selectionEnd } = textarea\r\n const currentContent = formData.content[activeLanguage] || ''\r\n\r\n const { text: newText, cursorPosition } = insertMarkdown(\r\n currentContent,\r\n selectionStart,\r\n selectionEnd,\r\n item.markdown.before,\r\n item.markdown.after\r\n )\r\n\r\n updateMultilingualField('content', activeLanguage, newText)\r\n\r\n // 커서 위치 복원\r\n requestAnimationFrame(() => {\r\n textarea.focus()\r\n textarea.setSelectionRange(cursorPosition, cursorPosition)\r\n })\r\n },\r\n [textareaRef, formData, activeLanguage, updateMultilingualField]\r\n )\r\n\r\n if (!features.enableMarkdownToolbar) {\r\n return null\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n 'flex flex-wrap gap-1 px-4 py-2 border-b border-border bg-muted',\r\n className\r\n )}\r\n role=\"toolbar\"\r\n aria-label=\"마크다운 서식\"\r\n >\r\n {TOOLBAR_ITEMS.map((item) => (\r\n <button\r\n key={item.icon}\r\n type=\"button\"\r\n onClick={() => handleInsert(item)}\r\n className=\"p-2 text-muted-foreground hover:text-foreground hover:bg-muted rounded transition-colors\"\r\n title={`${labels[item.label as keyof typeof labels] || item.label}${item.shortcut ? ` (${item.shortcut})` : ''}`}\r\n aria-label={labels[item.label as keyof typeof labels] || item.label}\r\n >\r\n <Icon name={item.icon as Parameters<typeof Icon>[0]['name']} size={16} />\r\n </button>\r\n ))}\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nBlogEditorToolbar.displayName = 'BlogEditorToolbar'\r\n\r\nexport { BlogEditorToolbar }\r\n","\"use client\"\r\n\r\nimport React from 'react'\r\nimport { merge } from '../../../lib/utils'\r\nimport { useBlogEditor } from './BlogEditorContext'\r\nimport { parseMarkdown } from './utils/markdown'\r\n\r\n/**\r\n * BlogEditorPreview Props\r\n */\r\nexport interface BlogEditorPreviewProps {\r\n /** 커스텀 마크다운 렌더러 / Custom markdown renderer */\r\n renderMarkdown?: (content: string) => React.ReactNode\r\n /** 추가 CSS 클래스 / Additional CSS classes */\r\n className?: string\r\n}\r\n\r\n/**\r\n * BlogEditorPreview 컴포넌트\r\n * 마크다운 미리보기\r\n */\r\nconst BlogEditorPreview = React.forwardRef<HTMLDivElement, BlogEditorPreviewProps>(\r\n ({ renderMarkdown, className }, ref) => {\r\n const { formData, activeLanguage, languages, labels } = useBlogEditor()\r\n\r\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key || languages[0]?.key\r\n\r\n // 현재 언어의 콘텐츠, 없으면 기본 언어 콘텐츠\r\n const title = formData.title[activeLanguage] || formData.title[primaryLanguage] || labels.noTitle\r\n const content = formData.content[activeLanguage] || formData.content[primaryLanguage] || ''\r\n\r\n // 마크다운 렌더링\r\n const renderedContent = React.useMemo(() => {\r\n if (renderMarkdown) {\r\n return renderMarkdown(content)\r\n }\r\n // 기본 마크다운 파서 사용\r\n return (\r\n <div\r\n dangerouslySetInnerHTML={{ __html: parseMarkdown(content) }}\r\n />\r\n )\r\n }, [content, renderMarkdown])\r\n\r\n return (\r\n <div ref={ref} className={merge('p-6', className)}>\r\n <h3 className=\"text-xl font-bold text-foreground mb-4\">\r\n {title}\r\n </h3>\r\n <div className=\"prose dark:prose-invert max-w-none\">\r\n {renderedContent}\r\n </div>\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nBlogEditorPreview.displayName = 'BlogEditorPreview'\r\n\r\nexport { BlogEditorPreview }\r\n","\"use client\"\r\n\r\nimport React from 'react'\r\nimport { merge } from '../../../lib/utils'\r\nimport { Icon } from '../../Icon'\r\nimport { useBlogEditor } from './BlogEditorContext'\r\n\r\n/**\r\n * BlogEditorActions Props\r\n */\r\nexport interface BlogEditorActionsProps {\r\n /** 취소 링크 컴포넌트 / Cancel link component */\r\n cancelLink?: React.ReactNode\r\n /** 추가 CSS 클래스 / Additional CSS classes */\r\n className?: string\r\n}\r\n\r\n/**\r\n * BlogEditorActions 컴포넌트\r\n * 저장/발행/취소 버튼\r\n */\r\nconst BlogEditorActions = React.forwardRef<HTMLDivElement, BlogEditorActionsProps>(\r\n ({ cancelLink, className }, ref) => {\r\n const { labels, submitting, handleSave, handleCancel, isEditMode, autoSaveStatus, features } = useBlogEditor()\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge('flex items-center justify-end gap-3', className)}\r\n >\r\n {/* 자동저장 상태 */}\r\n {features.enableAutoSave && autoSaveStatus !== 'idle' && (\r\n <span className=\"text-sm text-muted-foreground flex items-center gap-1\">\r\n {autoSaveStatus === 'saving' && (\r\n <>\r\n <Icon name=\"loader\" size={14} spin />\r\n 저장 중...\r\n </>\r\n )}\r\n {autoSaveStatus === 'saved' && (\r\n <>\r\n <Icon name=\"check\" size={14} />\r\n 자동저장됨\r\n </>\r\n )}\r\n </span>\r\n )}\r\n\r\n {/* 취소 */}\r\n {cancelLink || (\r\n <button\r\n type=\"button\"\r\n onClick={handleCancel}\r\n className=\"px-4 py-2 text-foreground hover:text-foreground transition-colors\"\r\n >\r\n {labels.cancel}\r\n </button>\r\n )}\r\n\r\n {/* 임시저장 */}\r\n <button\r\n type=\"button\"\r\n onClick={() => handleSave(false)}\r\n disabled={submitting}\r\n className=\"px-4 py-2 border border-border rounded-lg hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n >\r\n {labels.saveDraft}\r\n </button>\r\n\r\n {/* 발행/수정 */}\r\n <button\r\n type=\"button\"\r\n onClick={() => handleSave(true)}\r\n disabled={submitting}\r\n className=\"px-6 py-2 bg-primary text-white rounded-lg hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center gap-2 transition-colors\"\r\n >\r\n {submitting ? (\r\n <>\r\n <Icon name=\"loader\" size={16} spin />\r\n {labels.saving}\r\n </>\r\n ) : (\r\n <>\r\n <Icon name=\"check\" size={16} />\r\n {isEditMode ? labels.update : labels.publish}\r\n </>\r\n )}\r\n </button>\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nBlogEditorActions.displayName = 'BlogEditorActions'\r\n\r\nexport { BlogEditorActions }\r\n","\"use client\"\r\n\r\nimport React from 'react'\r\nimport { merge } from '../../../lib/utils'\r\nimport { Icon } from '../../Icon'\r\nimport { useBlogEditor } from './BlogEditorContext'\r\n\r\n/**\r\n * BlogEditorTranslate Props\r\n */\r\nexport interface BlogEditorTranslateProps {\r\n /** 힌트 메시지 오버라이드 / Hint message override */\r\n hint?: string\r\n /** 추가 CSS 클래스 / Additional CSS classes */\r\n className?: string\r\n}\r\n\r\n/**\r\n * BlogEditorTranslate 컴포넌트\r\n * AI 번역 버튼\r\n */\r\nconst BlogEditorTranslate = React.forwardRef<HTMLDivElement, BlogEditorTranslateProps>(\r\n ({ hint, className }, ref) => {\r\n const {\r\n labels,\r\n translating,\r\n translateSuccess,\r\n handleTranslate,\r\n formData,\r\n languages,\r\n features,\r\n } = useBlogEditor()\r\n\r\n if (!features.enableTranslation) {\r\n return null\r\n }\r\n\r\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key || languages[0]?.key\r\n const primaryTitle = formData.title[primaryLanguage] || ''\r\n const primaryContent = formData.content[primaryLanguage] || ''\r\n const canTranslate = primaryTitle && primaryContent\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n 'px-6 py-3 bg-muted border-b border-border flex items-center justify-between',\r\n className\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\r\n <Icon name=\"sparkles\" size={16} />\r\n <span>{hint || labels.translateHint}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={handleTranslate}\r\n disabled={translating || !canTranslate}\r\n className={merge(\r\n 'inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',\r\n translateSuccess\r\n ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\r\n : 'bg-primary text-white hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed'\r\n )}\r\n >\r\n {translating ? (\r\n <>\r\n <Icon name=\"loader\" size={16} spin />\r\n {labels.translating}\r\n </>\r\n ) : translateSuccess ? (\r\n <>\r\n <Icon name=\"check\" size={16} />\r\n {labels.translateSuccess}\r\n </>\r\n ) : (\r\n <>\r\n <Icon name=\"sparkles\" size={16} />\r\n {labels.translateButton}\r\n </>\r\n )}\r\n </button>\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nBlogEditorTranslate.displayName = 'BlogEditorTranslate'\r\n\r\nexport { BlogEditorTranslate }\r\n","\"use client\"\r\n\r\nimport React, { useRef } from 'react'\r\nimport { merge } from '../../../lib/utils'\r\nimport { BlogEditorProvider, useBlogEditor } from './BlogEditorContext'\r\nimport { BlogEditorHeader, type BlogEditorHeaderProps } from './BlogEditorHeader'\r\nimport { BlogEditorMetadata, type BlogEditorMetadataProps } from './BlogEditorMetadata'\r\nimport { BlogEditorLanguageTabs, type BlogEditorLanguageTabsProps } from './BlogEditorLanguageTabs'\r\nimport { BlogEditorContent, type BlogEditorContentProps } from './BlogEditorContent'\r\nimport { BlogEditorToolbar, type BlogEditorToolbarProps } from './BlogEditorToolbar'\r\nimport { BlogEditorPreview, type BlogEditorPreviewProps } from './BlogEditorPreview'\r\nimport { BlogEditorActions, type BlogEditorActionsProps } from './BlogEditorActions'\r\nimport { BlogEditorTranslate, type BlogEditorTranslateProps } from './BlogEditorTranslate'\r\nimport type { BlogEditorProps } from './types'\r\n\r\n/**\r\n * BlogEditorRoot Props (내부 컴포넌트)\r\n */\r\ninterface BlogEditorRootProps {\r\n /** 뒤로가기 콜백 / Back navigation callback */\r\n onBack?: () => void\r\n /** 뒤로가기 링크 컴포넌트 / Back link component */\r\n backLink?: React.ReactNode\r\n /** 취소 링크 컴포넌트 / Cancel link component */\r\n cancelLink?: React.ReactNode\r\n /** 커스텀 마크다운 렌더러 / Custom markdown renderer */\r\n renderMarkdown?: (content: string) => React.ReactNode\r\n /** AI 번역 힌트 / AI translation hint */\r\n translateHint?: string\r\n /** 최대 너비 / Max width */\r\n maxWidth?: string\r\n /** 추가 CSS 클래스 / Additional CSS classes */\r\n className?: string\r\n /** 자식 요소 / Children */\r\n children?: React.ReactNode\r\n}\r\n\r\n/**\r\n * BlogEditorRoot 내부 컴포넌트\r\n * 기본 레이아웃 제공\r\n */\r\nfunction BlogEditorRoot({\r\n onBack,\r\n backLink,\r\n cancelLink,\r\n renderMarkdown,\r\n translateHint,\r\n maxWidth = 'max-w-4xl',\r\n className,\r\n children,\r\n}: BlogEditorRootProps) {\r\n const { showPreview, error, variant, features } = useBlogEditor()\r\n const textareaRef = useRef<HTMLTextAreaElement>(null)\r\n\r\n const containerClasses = merge(\r\n variant === 'glass'\r\n ? 'bg-gradient-to-br from-gray-100 to-gray-200 dark:from-gray-900 dark:to-gray-800'\r\n : variant === 'minimal'\r\n ? ''\r\n : 'bg-muted'\r\n )\r\n\r\n const contentContainerClasses = merge(\r\n 'rounded-xl overflow-hidden',\r\n variant === 'glass'\r\n ? 'bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/20 dark:border-slate-700/50'\r\n : variant === 'minimal'\r\n ? 'bg-transparent border border-border'\r\n : 'bg-background'\r\n )\r\n\r\n // 커스텀 자식 요소가 있으면 그걸 렌더링\r\n if (children) {\r\n return (\r\n <div className={merge(containerClasses, className)}>\r\n <div className={merge(maxWidth, 'mx-auto px-4 py-8')}>\r\n {children}\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n // 기본 레이아웃\r\n return (\r\n <div className={merge(containerClasses, className)}>\r\n <div className={merge(maxWidth, 'mx-auto px-4 py-8')}>\r\n {/* 헤더 */}\r\n <BlogEditorHeader onBack={onBack} backLink={backLink} />\r\n\r\n {/* 에러 메시지 */}\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-50 dark:bg-red-900/30 border border-red-200 dark:border-red-800 rounded-lg text-red-600 dark:text-red-400\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div className=\"space-y-6\">\r\n {/* 메타데이터 */}\r\n <BlogEditorMetadata />\r\n\r\n {/* 콘텐츠 영역 */}\r\n <div className={contentContainerClasses}>\r\n {/* AI 번역 */}\r\n {features.enableTranslation && (\r\n <BlogEditorTranslate hint={translateHint} />\r\n )}\r\n\r\n {/* 언어 탭 */}\r\n <BlogEditorLanguageTabs />\r\n\r\n {/* 툴바 & 콘텐츠 */}\r\n {showPreview ? (\r\n <BlogEditorPreview renderMarkdown={renderMarkdown} />\r\n ) : (\r\n <>\r\n {features.enableMarkdownToolbar && (\r\n <BlogEditorToolbar textareaRef={textareaRef} />\r\n )}\r\n <BlogEditorContent textareaRef={textareaRef} />\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* 액션 버튼 */}\r\n <BlogEditorActions cancelLink={cancelLink} />\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n/**\r\n * BlogEditor 컴포넌트\r\n *\r\n * 다국어 블로그 에디터 컴포넌트\r\n * Compound component 패턴으로 유연한 커스터마이징 지원\r\n *\r\n * @example\r\n * ```tsx\r\n * // 기본 사용\r\n * <BlogEditor\r\n * callbacks={{\r\n * onSave: async (data, publish) => { ... },\r\n * onCancel: () => router.back(),\r\n * }}\r\n * />\r\n *\r\n * // 커스텀 레이아웃\r\n * <BlogEditor callbacks={...}>\r\n * <BlogEditor.Header backLink={<Link href=\"/admin\">Back</Link>} />\r\n * <BlogEditor.Metadata />\r\n * <BlogEditor.LanguageTabs />\r\n * <BlogEditor.Content />\r\n * <BlogEditor.Actions />\r\n * </BlogEditor>\r\n * ```\r\n */\r\nconst BlogEditor = React.forwardRef<\r\n HTMLDivElement,\r\n BlogEditorProps & BlogEditorRootProps\r\n>(\r\n (\r\n {\r\n // BlogEditorProps\r\n initialData,\r\n isEditMode,\r\n languages,\r\n defaultLanguage,\r\n labels,\r\n callbacks,\r\n features,\r\n variant,\r\n\r\n // BlogEditorRootProps\r\n onBack,\r\n backLink,\r\n cancelLink,\r\n renderMarkdown,\r\n translateHint,\r\n maxWidth,\r\n className,\r\n children,\r\n\r\n // Auto-save\r\n autoSaveKey,\r\n autoSaveInterval,\r\n },\r\n ref\r\n ) => {\r\n return (\r\n <BlogEditorProvider\r\n initialData={initialData}\r\n isEditMode={isEditMode}\r\n languages={languages}\r\n defaultLanguage={defaultLanguage}\r\n labels={labels}\r\n callbacks={callbacks}\r\n features={features}\r\n variant={variant}\r\n autoSaveKey={autoSaveKey}\r\n autoSaveInterval={autoSaveInterval}\r\n >\r\n <div ref={ref}>\r\n <BlogEditorRoot\r\n onBack={onBack}\r\n backLink={backLink}\r\n cancelLink={cancelLink}\r\n renderMarkdown={renderMarkdown}\r\n translateHint={translateHint}\r\n maxWidth={maxWidth}\r\n className={className}\r\n >\r\n {children}\r\n </BlogEditorRoot>\r\n </div>\r\n </BlogEditorProvider>\r\n )\r\n }\r\n)\r\n\r\nBlogEditor.displayName = 'BlogEditor'\r\n\r\n// Compound component exports\r\nconst BlogEditorCompound = BlogEditor as typeof BlogEditor & {\r\n Header: typeof BlogEditorHeader\r\n Metadata: typeof BlogEditorMetadata\r\n LanguageTabs: typeof BlogEditorLanguageTabs\r\n Content: typeof BlogEditorContent\r\n Toolbar: typeof BlogEditorToolbar\r\n Preview: typeof BlogEditorPreview\r\n Actions: typeof BlogEditorActions\r\n Translate: typeof BlogEditorTranslate\r\n}\r\n\r\nBlogEditorCompound.Header = BlogEditorHeader\r\nBlogEditorCompound.Metadata = BlogEditorMetadata\r\nBlogEditorCompound.LanguageTabs = BlogEditorLanguageTabs\r\nBlogEditorCompound.Content = BlogEditorContent\r\nBlogEditorCompound.Toolbar = BlogEditorToolbar\r\nBlogEditorCompound.Preview = BlogEditorPreview\r\nBlogEditorCompound.Actions = BlogEditorActions\r\nBlogEditorCompound.Translate = BlogEditorTranslate\r\n\r\nexport { BlogEditorCompound as BlogEditor }\r\n\r\n// 개별 컴포넌트도 export\r\nexport {\r\n BlogEditorHeader,\r\n BlogEditorMetadata,\r\n BlogEditorLanguageTabs,\r\n BlogEditorContent,\r\n BlogEditorToolbar,\r\n BlogEditorPreview,\r\n BlogEditorActions,\r\n BlogEditorTranslate,\r\n}\r\n\r\n// 타입 export\r\nexport type {\r\n BlogEditorHeaderProps,\r\n BlogEditorMetadataProps,\r\n BlogEditorLanguageTabsProps,\r\n BlogEditorContentProps,\r\n BlogEditorToolbarProps,\r\n BlogEditorPreviewProps,\r\n BlogEditorActionsProps,\r\n BlogEditorTranslateProps,\r\n}\r\n","/**\r\n * HUA UI 디자인 토큰 시스템\r\n * 중앙화된 디자인 토큰 정의\r\n */\r\n\r\nimport type { Size } from \"../../types/common\";\r\n\r\n/**\r\n * 색상 스케일 타입\r\n * light/dark 테마별 색상 정의\r\n */\r\nexport interface ColorScale {\r\n light: string;\r\n dark: string;\r\n}\r\n\r\n/**\r\n * 디자인 토큰 인터페이스\r\n */\r\nexport interface DesignTokens {\r\n colors: {\r\n primary: ColorScale;\r\n secondary: ColorScale;\r\n accent: ColorScale;\r\n destructive: ColorScale;\r\n success: ColorScale;\r\n warning: ColorScale;\r\n info: ColorScale;\r\n muted: ColorScale;\r\n background: ColorScale;\r\n foreground: ColorScale;\r\n border: ColorScale;\r\n };\r\n spacing: {\r\n sm: string;\r\n md: string;\r\n lg: string;\r\n xl: string;\r\n };\r\n typography: {\r\n fontFamily: string[];\r\n fontSize: Record<Size, string>;\r\n fontWeight: {\r\n normal: string;\r\n medium: string;\r\n semibold: string;\r\n bold: string;\r\n };\r\n };\r\n borderRadius: {\r\n sm: string;\r\n md: string;\r\n lg: string;\r\n xl: string;\r\n full: string;\r\n };\r\n shadows: {\r\n sm: string;\r\n md: string;\r\n lg: string;\r\n xl: string;\r\n };\r\n}\r\n\r\n/**\r\n * 기본 디자인 토큰\r\n * Tailwind CSS 클래스 기반\r\n */\r\nexport const defaultTokens: DesignTokens = {\r\n colors: {\r\n primary: {\r\n light: \"primary\",\r\n dark: \"primary\",\r\n },\r\n secondary: {\r\n light: \"secondary\",\r\n dark: \"secondary\",\r\n },\r\n accent: {\r\n light: \"accent\",\r\n dark: \"accent\",\r\n },\r\n destructive: {\r\n light: \"destructive\",\r\n dark: \"destructive\",\r\n },\r\n success: {\r\n light: \"green-600\",\r\n dark: \"green-500\",\r\n },\r\n warning: {\r\n light: \"yellow-600\",\r\n dark: \"yellow-500\",\r\n },\r\n info: {\r\n light: \"blue-600\",\r\n dark: \"blue-400\",\r\n },\r\n muted: {\r\n light: \"muted-foreground\",\r\n dark: \"muted-foreground\",\r\n },\r\n background: {\r\n light: \"background\",\r\n dark: \"background\",\r\n },\r\n foreground: {\r\n light: \"foreground\",\r\n dark: \"foreground\",\r\n },\r\n border: {\r\n light: \"border\",\r\n dark: \"border\",\r\n },\r\n },\r\n spacing: {\r\n sm: \"0.5rem\", // 8px\r\n md: \"1rem\", // 16px\r\n lg: \"1.5rem\", // 24px\r\n xl: \"2rem\", // 32px\r\n },\r\n typography: {\r\n fontFamily: [\"system-ui\", \"-apple-system\", \"sans-serif\"],\r\n fontSize: {\r\n sm: \"text-sm\", // 14px\r\n md: \"text-base\", // 16px\r\n lg: \"text-lg\", // 18px\r\n xl: \"text-xl\", // 20px\r\n },\r\n fontWeight: {\r\n normal: \"font-normal\",\r\n medium: \"font-medium\",\r\n semibold: \"font-semibold\",\r\n bold: \"font-bold\",\r\n },\r\n },\r\n borderRadius: {\r\n sm: \"rounded\",\r\n md: \"rounded-md\",\r\n lg: \"rounded-lg\",\r\n xl: \"rounded-xl\",\r\n full: \"rounded-full\",\r\n },\r\n shadows: {\r\n sm: \"shadow-sm\",\r\n md: \"shadow-md\",\r\n lg: \"shadow-lg\",\r\n xl: \"shadow-xl\",\r\n },\r\n};\r\n\r\n/**\r\n * 테마별 토큰 가져오기\r\n * \r\n * @param theme - 테마 ('light' | 'dark')\r\n * @param tokens - 디자인 토큰 (기본값: defaultTokens)\r\n * @returns 테마별 토큰 값\r\n */\r\nexport function getThemeTokenValue<T extends keyof DesignTokens>(\r\n theme: \"light\" | \"dark\",\r\n tokenPath: T,\r\n tokens: DesignTokens = defaultTokens\r\n): DesignTokens[T] {\r\n const token = tokens[tokenPath];\r\n \r\n // 색상 토큰인 경우 light/dark 값 반환\r\n if (tokenPath === \"colors\") {\r\n const colorToken = token as DesignTokens[\"colors\"];\r\n return Object.fromEntries(\r\n Object.entries(colorToken).map(([key, value]) => [\r\n key,\r\n value[theme],\r\n ])\r\n ) as DesignTokens[T];\r\n }\r\n \r\n return token;\r\n}\r\n\r\n/**\r\n * 색상 토큰 가져오기\r\n * \r\n * @param theme - 테마\r\n * @param colorKey - 색상 키\r\n * @param tokens - 디자인 토큰\r\n * @returns 색상 클래스 문자열\r\n */\r\nexport function getColorToken(\r\n theme: \"light\" | \"dark\",\r\n colorKey: keyof DesignTokens[\"colors\"],\r\n tokens: DesignTokens = defaultTokens\r\n): string {\r\n const color = tokens.colors[colorKey];\r\n return color[theme];\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect } from \"react\";\r\nimport { merge } from \"../lib/utils\";\r\nimport { defaultTokens } from \"../lib/styles/system/tokens\";\r\n\r\n/**\r\n * Logo variant 타입\r\n * - symbol: 엠블럼만 (기본값)\r\n * - full: 엠블럼 + 워드마크\r\n */\r\nexport type LogoVariant = \"symbol\" | \"full\";\r\n\r\n/**\r\n * Logo size 타입\r\n * - sm, md, lg: 디자인 토큰 기반 크기\r\n * - number: 직접 rem 값 지정\r\n */\r\nexport type LogoSize = \"sm\" | \"md\" | \"lg\" | number;\r\n\r\n/**\r\n * Logo 컴포넌트 Props\r\n */\r\nexport interface LogoProps extends Omit<React.HTMLAttributes<HTMLElement>, \"width\" | \"height\"> {\r\n /**\r\n * 로고 변형\r\n * @default \"symbol\"\r\n */\r\n variant?: LogoVariant;\r\n /**\r\n * 로고 크기\r\n * @default \"md\"\r\n */\r\n size?: LogoSize;\r\n /**\r\n * 애니메이션 활성화 (Path Drawing 효과)\r\n * @default false\r\n */\r\n animated?: boolean;\r\n /**\r\n * 추가 className\r\n */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * 엠블럼 SVG Path (viewBox: 0 0 40 40)\r\n */\r\nconst EMBLEM_PATH =\r\n \"M1.83795 0.0849609C3.16041 -0.269391 4.51968 0.515459 4.87408 1.83789L11.7335 27.4395L17.8184 21.3545L13.9464 6.90332C13.5921 5.58102 14.3771 4.22171 15.6993 3.86719C16.2369 3.72314 16.78 3.76987 17.2598 3.96191C17.3834 3.97561 17.5081 3.99515 17.6319 4.02832L38.1182 9.51855C39.4407 9.87293 40.2255 11.2322 39.8712 12.5547C39.5166 13.8769 38.1574 14.6619 36.835 14.3076L32.9249 13.2598L23.3487 22.8359L24.4893 27.0908C24.8437 28.4133 24.0588 29.7735 22.7364 30.1279C21.4141 30.4822 20.0548 29.6972 19.7003 28.375L19.3008 26.8838L13.3506 32.835C13.3068 32.8789 13.2592 32.9181 13.213 32.958L14.2637 36.8789C14.6179 38.2012 13.8331 39.5606 12.5108 39.915C11.1884 40.2694 9.82913 39.4845 9.47467 38.1621L0.085022 3.12109C-0.269246 1.79868 0.515578 0.439365 1.83795 0.0849609ZM21.8672 17.3057L27.3946 11.7773L19.8438 9.75488L21.8672 17.3057Z\";\r\n\r\n/**\r\n * 워드마크 SVG Path (viewBox: 0 0 192 37, x=40부터 시작)\r\n */\r\nconst WORDMARK_PATH =\r\n \"M40.8865 0.0761719C41.2577 0.0762268 41.5614 0.211458 41.7976 0.481445C42.0507 0.751482 42.1605 1.08058 42.1267 1.46875L39.823 23.165C39.5361 25.933 40.042 28.0937 41.3416 29.6465C42.658 31.1823 44.5825 31.9502 47.114 31.9502C49.8482 31.9502 51.9919 31.1984 53.5447 29.6963C55.1142 28.1942 56.059 25.9832 56.3796 23.0635L58.6833 1.19043C58.7171 0.886659 58.8524 0.624671 59.0886 0.405273C59.3418 0.185863 59.6293 0.0761719 59.95 0.0761719H62.6589C63.0132 0.0762861 63.3085 0.211518 63.5447 0.481445C63.7978 0.751463 63.899 1.07211 63.8484 1.44336L61.4685 24.0254C61.0466 28.0084 59.5278 31.1565 56.9119 33.4688C54.2958 35.7641 50.9029 36.9121 46.7341 36.9121C42.6667 36.9121 39.5025 35.7215 37.241 33.3418C34.9794 30.962 34.0593 27.7639 34.4812 23.7471L36.8865 1.21582C36.9034 0.912022 37.0301 0.650074 37.2664 0.430664C37.5195 0.194523 37.8061 0.0761804 38.1267 0.0761719H40.8865ZM157.419 0.0761719C157.756 0.0762579 158.026 0.203032 158.228 0.456055C158.448 0.709181 158.532 1.01283 158.481 1.36719L156.502 12.4541C157.226 11.6092 158.164 10.9091 159.317 10.3545C160.667 9.71319 162.127 9.39258 163.697 9.39258C166.279 9.39262 168.355 10.3468 169.925 12.2539C171.494 14.1611 172.01 16.6756 171.469 19.7979L170.33 26.2539C169.756 29.5448 168.439 32.1437 166.381 34.0508C164.322 35.958 161.941 36.9121 159.241 36.9121C157.553 36.9121 156.102 36.5404 154.886 35.7979C153.815 35.1281 153.052 34.2874 152.597 33.2764L152.127 35.7979C152.093 36.0004 151.983 36.1857 151.798 36.3545C151.612 36.5063 151.393 36.583 151.139 36.583H148.861C148.524 36.5829 148.245 36.4561 148.026 36.2031C147.824 35.9501 147.756 35.6547 147.823 35.3174L153.899 1.0127C153.933 0.75964 154.06 0.540084 154.279 0.354492C154.498 0.168895 154.735 0.0761719 154.988 0.0761719H157.419ZM139.621 9.39258C142.203 9.39258 144.178 10.135 145.545 11.6201C146.929 13.1053 147.401 15.0885 146.963 17.5693L143.748 35.6455C143.714 35.8986 143.587 36.1181 143.368 36.3037C143.165 36.4894 142.92 36.582 142.634 36.582H140.33C140.026 36.582 139.773 36.4723 139.57 36.2529C139.368 36.0336 139.292 35.7723 139.343 35.4688L139.753 33.2568C138.858 34.4755 137.845 35.3911 136.71 36C135.562 36.6076 134.279 36.9111 132.861 36.9111C130.684 36.9111 128.987 36.27 127.772 34.9873C126.574 33.7047 126.161 31.9917 126.532 29.8486L127.09 26.6582C127.478 24.4306 128.515 22.6923 130.203 21.4434C131.891 20.1945 133.992 19.5694 136.507 19.5693C137.452 19.5693 138.389 19.6961 139.317 19.9492C140.245 20.1855 141.047 20.5316 141.722 20.9873L142.304 17.5947C142.541 16.2448 142.296 15.2156 141.57 14.5068C140.844 13.798 139.883 13.4434 138.684 13.4434C137.959 13.4434 137.3 13.5616 136.71 13.7979C136.136 14.0341 135.603 14.3547 135.114 14.7598C134.625 15.1479 134.161 15.6209 133.722 16.1777C133.301 16.7174 132.98 17.004 132.76 17.0381C132.541 17.0718 132.329 17.0293 132.127 16.9111L130.456 15.8486C130.27 15.7305 130.144 15.5527 130.077 15.3164C130.026 15.0801 130.254 14.5742 130.76 13.7979C131.284 13.0046 131.983 12.2613 132.861 11.5693C133.739 10.8605 134.726 10.3205 135.823 9.94922C136.937 9.57791 138.203 9.39258 139.621 9.39258ZM184.457 9.39258C185.587 9.39262 186.592 9.57795 187.469 9.94922C188.347 10.3205 189.064 10.8862 189.621 11.6455C190.195 12.405 190.566 13.1142 190.735 13.7725C190.921 14.4305 190.962 14.878 190.861 15.1143C190.76 15.3503 190.6 15.5104 190.381 15.5947L188.431 16.4307C188.178 16.5319 187.942 16.5489 187.722 16.4814C187.52 16.3971 187.318 16.1181 187.115 15.6455C186.912 15.173 186.659 14.7512 186.355 14.3799C186.068 13.9917 185.714 13.7127 185.292 13.5439C184.87 13.3584 184.355 13.2656 183.748 13.2656C182.803 13.2656 181.975 13.5105 181.266 14C180.574 14.4726 180.144 15.1818 179.975 16.127L179.899 16.5312C179.747 17.4931 179.866 18.2782 180.254 18.8857C180.659 19.4764 181.882 20.3124 183.925 21.3926C186.22 22.5065 187.74 23.6375 188.482 24.7852C189.225 25.9328 189.41 27.5113 189.039 29.5195L189.013 29.6963C188.558 32.2279 187.478 34.0681 185.773 35.2158C184.085 36.3466 182.119 36.9111 179.874 36.9111C178.406 36.9111 177.132 36.6671 176.052 36.1777C174.988 35.6714 174.169 34.9962 173.595 34.1523C173.038 33.3085 172.692 32.4981 172.557 31.7217C172.422 30.9453 172.422 30.4555 172.557 30.2529C172.692 30.0336 172.879 29.8822 173.115 29.7979L175.14 29.0381C175.377 28.9707 175.596 28.9791 175.799 29.0635C176.018 29.1481 176.22 29.4943 176.406 30.1016C176.609 30.6922 176.853 31.2067 177.14 31.6455C177.444 32.0843 177.857 32.4304 178.381 32.6836C178.921 32.9199 179.604 33.0381 180.431 33.0381C181.427 33.038 182.296 32.7761 183.039 32.2529C183.798 31.7297 184.263 30.9788 184.431 30L184.507 29.6709C184.692 28.6584 184.625 27.8232 184.304 27.165C183.984 26.4899 182.954 25.671 181.216 24.709C178.684 23.477 177.004 22.2532 176.177 21.0381C175.367 19.8061 175.115 18.3884 175.419 16.7852L175.545 16.1523C175.916 13.9751 176.879 12.3042 178.431 11.1396C180.001 9.97511 182.01 9.39258 184.457 9.39258ZM7.92456 0.0507812C8.3294 0.0508971 8.6588 0.202195 8.91187 0.505859C9.16494 0.792681 9.26609 1.13054 9.21558 1.51855L7.72632 15.5439H25.7742L27.2917 1.24023C27.3255 0.936656 27.4685 0.666822 27.7214 0.430664C27.9746 0.177499 28.2706 0.0507812 28.6082 0.0507812H31.4685C31.8566 0.0507849 32.1773 0.202255 32.4304 0.505859C32.7004 0.792695 32.81 1.13051 32.7595 1.51855L29.1648 35.418C29.131 35.7217 28.9872 35.9998 28.7341 36.2529C28.481 36.4892 28.1859 36.6074 27.8484 36.6074H24.9871C24.5822 36.6073 24.2528 36.4645 23.9998 36.1777C23.7467 35.874 23.6455 35.5277 23.696 35.1396L25.2371 20.6074H7.18921L5.61987 35.3926C5.60297 35.7131 5.46 35.9999 5.19019 36.2529C4.93702 36.4892 4.64953 36.6074 4.32886 36.6074H1.44312C1.05506 36.6074 0.725803 36.4645 0.455811 36.1777C0.202712 35.874 0.10156 35.5277 0.1521 35.1396L3.74683 1.26562C3.7806 0.945022 3.92439 0.666913 4.17749 0.430664C4.43063 0.177522 4.72572 0.0508046 5.06323 0.0507812H7.92456ZM81.2156 0.0507812C81.57 0.050791 81.8821 0.168994 82.1521 0.405273C82.4389 0.624614 82.6328 0.902832 82.7341 1.24023L92.4304 34.9111C92.5654 35.3837 92.5068 35.7894 92.2537 36.127C92.0005 36.4475 91.6458 36.6074 91.1902 36.6074H88.2283C87.9414 36.6074 87.6709 36.5148 87.4177 36.3291C87.1816 36.1266 87.0301 35.8986 86.9626 35.6455L84.6492 27.3418H69.4958L65.3171 35.8232C65.2159 36.0426 65.055 36.228 64.8357 36.3799C64.6163 36.5149 64.3799 36.582 64.1267 36.582H61.1394C60.6838 36.582 60.3376 36.3967 60.1013 36.0254C59.8651 35.6542 59.8652 35.2407 60.1013 34.7852L77.0632 1.0127C77.2151 0.708897 77.4185 0.472488 77.6716 0.303711C77.9416 0.135061 78.2453 0.0507812 78.5828 0.0507812H81.2156ZM111.368 0.0507812C111.773 0.050882 112.102 0.210697 112.355 0.53125C112.608 0.835009 112.692 1.18973 112.608 1.59473L107.368 31.3672H122.634C123.039 31.3672 123.359 31.511 123.595 31.7979C123.832 32.0847 123.916 32.4139 123.848 32.7852L123.368 35.418C123.334 35.7048 123.19 35.9498 122.937 36.1523C122.701 36.3548 122.439 36.4561 122.152 36.4561H102.405C102.017 36.456 101.696 36.3207 101.443 36.0508C101.207 35.7639 101.123 35.4177 101.19 35.0127L107.19 1.13965C107.241 0.869608 107.393 0.624683 107.646 0.405273C107.899 0.169049 108.177 0.0508458 108.481 0.0507812H111.368ZM136.81 23.0889C135.41 23.0889 134.254 23.384 133.343 23.9746C132.431 24.5653 131.883 25.4346 131.697 26.582L131.165 29.5947C130.979 30.6747 131.182 31.4938 131.772 32.0508C132.363 32.6077 133.283 32.8867 134.532 32.8867C136.085 32.8867 137.418 32.3295 138.532 31.2158C139.663 30.085 140.304 28.9115 140.456 27.6963L141.013 24.6328C140.676 24.1266 140.127 23.7473 139.368 23.4941C138.608 23.2241 137.755 23.0889 136.81 23.0889ZM162.052 13.8232C160.364 13.8232 158.853 14.3972 157.519 15.5449C156.186 16.6757 155.351 18.1946 155.013 20.1016L153.925 26.2793C153.604 28.085 153.857 29.5784 154.684 30.7598C155.511 31.9243 156.836 32.5068 158.659 32.5068C160.296 32.5068 161.782 31.9584 163.115 30.8613C164.465 29.7475 165.3 28.2115 165.621 26.2539L166.71 20.0762C167.047 18.1353 166.785 16.608 165.925 15.4941C165.064 14.3803 163.773 13.8233 162.052 13.8232ZM79.0134 8.02539L71.5916 23.0889H83.4636L79.2664 8.02539L79.1902 7.64551L79.0134 8.02539Z\";\r\n\r\n/**\r\n * size prop을 rem 값으로 변환\r\n */\r\nfunction getSizeInRem(size: LogoSize): string {\r\n if (typeof size === \"number\") {\r\n return `${size}rem`;\r\n }\r\n\r\n // 디자인 토큰 기반 크기 매핑\r\n const sizeMap: Record<\"sm\" | \"md\" | \"lg\", string> = {\r\n sm: defaultTokens.spacing.md, // 1rem (16px)\r\n md: defaultTokens.spacing.lg, // 1.5rem (24px)\r\n lg: defaultTokens.spacing.xl, // 2rem (32px)\r\n };\r\n\r\n return sizeMap[size];\r\n}\r\n\r\n/**\r\n * Logo 컴포넌트\r\n *\r\n * HUA Labs 공식 로고 컴포넌트\r\n *\r\n * @example\r\n * ```tsx\r\n * // 기본 (엠블럼만)\r\n * <Logo />\r\n *\r\n * // 워드마크 포함\r\n * <Logo variant=\"full\" />\r\n *\r\n * // 크기 조정\r\n * <Logo size=\"lg\" />\r\n * <Logo size={3} /> // 3rem\r\n *\r\n * // 애니메이션\r\n * <Logo animated />\r\n * ```\r\n */\r\nexport function Logo({\r\n variant = \"symbol\",\r\n size = \"md\",\r\n animated = false,\r\n className,\r\n ...props\r\n}: LogoProps) {\r\n const sizeInRem = getSizeInRem(size);\r\n\r\n // 애니메이션용 스타일 시트 주입 (한 번만)\r\n useEffect(() => {\r\n if (!animated) return;\r\n\r\n const styleId = \"hua-logo-animation\";\r\n if (document.getElementById(styleId)) return;\r\n\r\n const style = document.createElement(\"style\");\r\n style.id = styleId;\r\n style.textContent = `\r\n @keyframes hua-logo-draw {\r\n from {\r\n stroke-dashoffset: 1000;\r\n }\r\n to {\r\n stroke-dashoffset: 0;\r\n }\r\n }\r\n @keyframes hua-logo-draw-wordmark {\r\n from {\r\n stroke-dashoffset: 2000;\r\n }\r\n to {\r\n stroke-dashoffset: 0;\r\n }\r\n }\r\n .hua-logo-path {\r\n stroke: currentColor;\r\n stroke-width: 0.5;\r\n fill: none;\r\n animation: hua-logo-draw 2s ease-in-out forwards;\r\n }\r\n .hua-logo-wordmark {\r\n stroke: currentColor;\r\n stroke-width: 0.5;\r\n fill: none;\r\n animation: hua-logo-draw-wordmark 2s ease-in-out 0.5s forwards;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n\r\n return () => {\r\n const existingStyle = document.getElementById(styleId);\r\n if (existingStyle) {\r\n existingStyle.remove();\r\n }\r\n };\r\n }, [animated]);\r\n\r\n // Symbol only (엠블럼만)\r\n if (variant === \"symbol\") {\r\n return (\r\n <svg\r\n width={sizeInRem}\r\n height={sizeInRem}\r\n viewBox=\"0 0 40 40\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className={merge(\"text-foreground\", className)}\r\n >\r\n <path\r\n d={EMBLEM_PATH}\r\n fill={animated ? \"none\" : \"currentColor\"}\r\n stroke={animated ? \"currentColor\" : \"none\"}\r\n strokeWidth={animated ? \"0.5\" : undefined}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={animated ? \"hua-logo-path\" : undefined}\r\n />\r\n </svg>\r\n );\r\n }\r\n\r\n // Full variant (엠블럼 + 워드마크 flex 배치)\r\n // 워드마크 원본: 152x37, 비율 152/37 ≈ 4.1\r\n const wordmarkRatio = 152 / 37;\r\n\r\n return (\r\n <div\r\n className={merge(\"inline-flex items-center gap-1 flex-shrink-0 min-w-max\", className)}\r\n {...(props as React.HTMLAttributes<HTMLDivElement>)}\r\n >\r\n {/* 엠블럼 */}\r\n <svg\r\n viewBox=\"0 0 40 40\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"flex-shrink-0\"\r\n style={{ width: sizeInRem, height: sizeInRem }}\r\n >\r\n <path\r\n d={EMBLEM_PATH}\r\n fill={animated ? \"none\" : \"currentColor\"}\r\n stroke={animated ? \"currentColor\" : \"none\"}\r\n strokeWidth={animated ? \"0.5\" : undefined}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={animated ? \"hua-logo-path\" : undefined}\r\n />\r\n </svg>\r\n {/* 워드마크 */}\r\n <svg\r\n viewBox=\"40 0 152 37\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"flex-shrink-0\"\r\n style={{ \r\n height: sizeInRem,\r\n width: `calc(${sizeInRem} * ${wordmarkRatio})`,\r\n }}\r\n >\r\n <path\r\n d={WORDMARK_PATH}\r\n fill={animated ? \"none\" : \"currentColor\"}\r\n stroke={animated ? \"currentColor\" : \"none\"}\r\n strokeWidth={animated ? \"0.5\" : undefined}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={animated ? \"hua-logo-wordmark\" : undefined}\r\n />\r\n </svg>\r\n </div>\r\n );\r\n}\r\n","\"use client\"\r\n\r\nimport React, { useState, useEffect } from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\nimport { Icon } from \"./Icon\"\r\n\r\n/**\r\n * Bookmark 컴포넌트의 props / Bookmark component props\r\n * @typedef {Object} BookmarkProps\r\n * @property {string} id - 북마크 고유 ID / Bookmark unique ID\r\n * @property {string} [storageKey='bookmarks'] - localStorage 키 / localStorage key\r\n * @property {boolean} [defaultBookmarked=false] - 기본 북마크 상태 / Default bookmarked state\r\n * @property {(bookmarked: boolean) => void} [onBookmarkChange] - 북마크 상태 변경 콜백 / Bookmark state change callback\r\n * @property {'sm' | 'md' | 'lg'} [size='md'] - Bookmark 크기 / Bookmark size\r\n * @property {'default' | 'filled' | 'outline'} [variant='default'] - Bookmark 스타일 변형 / Bookmark style variant\r\n * @extends {React.HTMLAttributes<HTMLButtonElement>}\r\n */\r\nexport interface BookmarkProps extends React.HTMLAttributes<HTMLButtonElement> {\r\n id: string\r\n storageKey?: string\r\n defaultBookmarked?: boolean\r\n onBookmarkChange?: (bookmarked: boolean) => void\r\n size?: 'sm' | 'md' | 'lg'\r\n variant?: 'default' | 'filled' | 'outline'\r\n}\r\n\r\n/**\r\n * Bookmark 컴포넌트 / Bookmark component\r\n * \r\n * 북마크 기능을 제공하는 버튼 컴포넌트입니다.\r\n * localStorage에 북마크 상태를 저장하며, 여러 항목의 북마크를 관리할 수 있습니다.\r\n * \r\n * Button component that provides bookmark functionality.\r\n * Saves bookmark state to localStorage and can manage bookmarks for multiple items.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <Bookmark id=\"article-1\" />\r\n * \r\n * @example\r\n * // 상태 변경 감지 / State change detection\r\n * <Bookmark \r\n * id=\"article-1\"\r\n * onBookmarkChange={(bookmarked) => console.log(bookmarked)}\r\n * variant=\"filled\"\r\n * />\r\n * \r\n * @param {BookmarkProps} props - Bookmark 컴포넌트의 props / Bookmark component props\r\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\r\n * @returns {JSX.Element} Bookmark 컴포넌트 / Bookmark component\r\n */\r\nconst Bookmark = React.forwardRef<HTMLButtonElement, BookmarkProps>(\r\n ({ \r\n className, \r\n id, \r\n storageKey = 'bookmarks',\r\n defaultBookmarked = false,\r\n onBookmarkChange,\r\n size = 'md',\r\n variant = 'default',\r\n ...props \r\n }, ref) => {\r\n const [isBookmarked, setIsBookmarked] = useState(defaultBookmarked)\r\n\r\n // 로컬 스토리지에서 북마크 상태 불러오기\r\n useEffect(() => {\r\n const savedBookmarks = localStorage.getItem(storageKey)\r\n if (savedBookmarks) {\r\n const bookmarks = JSON.parse(savedBookmarks)\r\n setIsBookmarked(bookmarks.includes(id))\r\n }\r\n }, [id, storageKey])\r\n\r\n // 북마크 토글\r\n const toggleBookmark = () => {\r\n const newBookmarked = !isBookmarked\r\n setIsBookmarked(newBookmarked)\r\n \r\n // 로컬 스토리지 업데이트\r\n const savedBookmarks = localStorage.getItem(storageKey)\r\n const bookmarks = savedBookmarks ? JSON.parse(savedBookmarks) : []\r\n \r\n if (newBookmarked) {\r\n if (!bookmarks.includes(id)) {\r\n bookmarks.push(id)\r\n }\r\n } else {\r\n const index = bookmarks.indexOf(id)\r\n if (index > -1) {\r\n bookmarks.splice(index, 1)\r\n }\r\n }\r\n \r\n localStorage.setItem(storageKey, JSON.stringify(bookmarks))\r\n onBookmarkChange?.(newBookmarked)\r\n }\r\n\r\n const sizeClasses = {\r\n sm: \"w-6 h-6\",\r\n md: \"w-8 h-8\", \r\n lg: \"w-10 h-10\"\r\n }\r\n\r\n const variantClasses = {\r\n default: \"text-muted-foreground hover:text-yellow-500 transition-colors\",\r\n filled: \"text-yellow-500 hover:text-yellow-600 transition-colors\",\r\n outline: \"border border-border text-muted-foreground hover:text-yellow-500 hover:border-yellow-500 transition-colors rounded\"\r\n }\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n onClick={toggleBookmark}\r\n className={merge(\r\n \"flex items-center justify-center transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-yellow-500 focus-visible:ring-offset-2\",\r\n sizeClasses[size],\r\n variantClasses[variant],\r\n className\r\n )}\r\n {...props}\r\n >\r\n <Icon \r\n name=\"star\" \r\n className={merge(\r\n \"transition-all duration-200\",\r\n isBookmarked && \"fill-current\"\r\n )}\r\n />\r\n </button>\r\n )\r\n }\r\n)\r\n\r\nBookmark.displayName = \"Bookmark\"\r\n\r\nexport { Bookmark } ","\"use client\"\r\n\r\nimport React, { useState } from \"react\"\r\nimport { cva } from \"class-variance-authority\"\r\nimport { merge } from \"../lib/utils\"\r\n\r\nexport const avatarVariants = cva(\r\n \"relative flex shrink-0 overflow-hidden rounded-full\",\r\n {\r\n variants: {\r\n size: {\r\n sm: \"w-8 h-8 text-xs\",\r\n md: \"w-10 h-10 text-sm\",\r\n lg: \"w-12 h-12 text-base\",\r\n },\r\n variant: {\r\n default: \"\",\r\n glass: \"ring-1 ring-white/30 backdrop-blur-sm\",\r\n },\r\n },\r\n defaultVariants: {\r\n size: \"md\",\r\n variant: \"default\",\r\n },\r\n }\r\n)\r\n\r\n/**\r\n * Avatar 컴포넌트의 props / Avatar component props\r\n */\r\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\r\n size?: \"sm\" | \"md\" | \"lg\"\r\n variant?: \"default\" | \"glass\"\r\n src?: string\r\n alt?: string\r\n fallbackText?: string\r\n}\r\n\r\nexport interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {}\r\nexport interface AvatarFallbackProps extends React.HTMLAttributes<HTMLDivElement> {}\r\n\r\n/**\r\n * Avatar 컴포넌트 / Avatar component\r\n *\r\n * 사용자 프로필 이미지를 표시하는 컴포넌트입니다.\r\n *\r\n * @example\r\n * <Avatar src=\"/user.jpg\" alt=\"사용자\" />\r\n * <Avatar alt=\"홍길동\">홍</Avatar>\r\n * <Avatar variant=\"glass\" size=\"lg\" src=\"/user.jpg\" alt=\"사용자\" />\r\n */\r\nconst Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\r\n ({ className, size = \"md\", variant = \"default\", src, alt, fallbackText, children, ...props }, ref) => {\r\n const [imgError, setImgError] = useState(false)\r\n\r\n const getFallbackContent = () => {\r\n if (fallbackText) return fallbackText\r\n if (children) return children\r\n if (alt) return alt.charAt(0).toUpperCase()\r\n return \"U\"\r\n }\r\n\r\n const showImage = src && !imgError\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(avatarVariants({ size, variant }), className)}\r\n {...props}\r\n >\r\n {showImage ? (\r\n <AvatarImage\r\n src={src}\r\n alt={alt || \"avatar\"}\r\n onError={() => setImgError(true)}\r\n />\r\n ) : (\r\n <AvatarFallback>\r\n {getFallbackContent()}\r\n </AvatarFallback>\r\n )}\r\n </div>\r\n )\r\n }\r\n)\r\nAvatar.displayName = \"Avatar\"\r\n\r\nconst AvatarImage = React.forwardRef<HTMLImageElement, AvatarImageProps>(\r\n ({ className, ...props }, ref) => (\r\n <img\r\n ref={ref}\r\n className={merge(\"aspect-square h-full w-full object-cover object-center\", className)}\r\n {...props}\r\n />\r\n )\r\n)\r\nAvatarImage.displayName = \"AvatarImage\"\r\n\r\nconst AvatarFallback = React.forwardRef<HTMLDivElement, AvatarFallbackProps>(\r\n ({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"flex h-full w-full items-center justify-center rounded-full bg-primary text-primary-foreground font-semibold\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n)\r\nAvatarFallback.displayName = \"AvatarFallback\"\r\n\r\nexport { Avatar, AvatarImage, AvatarFallback } ","'use client'\r\n\r\nimport React from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\nimport { Avatar, AvatarImage, AvatarFallback } from \"./Avatar\"\r\nimport { Badge } from \"./Badge\"\r\nimport { Card, CardContent } from \"./Card\"\r\n\r\n/**\r\n * ChatMessage 컴포넌트의 props / ChatMessage component props\r\n * @typedef {Object} ChatMessageProps\r\n * @property {Object} message - 메시지 데이터 / Message data\r\n * @property {string} message.id - 메시지 ID / Message ID\r\n * @property {string} message.content - 메시지 내용 / Message content\r\n * @property {\"user\" | \"assistant\" | \"system\"} message.role - 메시지 역할 / Message role\r\n * @property {Date} message.timestamp - 메시지 타임스탬프 / Message timestamp\r\n * @property {string} [message.emotion] - 감정 정보 / Emotion information\r\n * @property {number} [message.intensity] - 감정 강도 / Emotion intensity\r\n * @property {boolean} [message.isTyping] - 타이핑 중 여부 / Typing state\r\n * @property {Object} [user] - 사용자 정보 / User information\r\n * @property {string} [user.name=\"사용자\"] - 사용자 이름 / User name\r\n * @property {string} [user.avatar] - 사용자 아바타 URL / User avatar URL\r\n * @property {string} [user.color=\"#3b82f6\"] - 사용자 색상 / User color\r\n * @property {Object} [assistant] - AI 어시스턴트 정보 / AI assistant information\r\n * @property {string} [assistant.name=\"AI\"] - AI 이름 / AI name\r\n * @property {string} [assistant.avatar] - AI 아바타 URL / AI avatar URL\r\n * @property {string} [assistant.color=\"#10b981\"] - AI 색상 / AI color\r\n * @property {boolean} [showAvatar=true] - 아바타 표시 여부 / Show avatar\r\n * @property {boolean} [showTimestamp=true] - 타임스탬프 표시 여부 / Show timestamp\r\n * @property {boolean} [showEmotion=true] - 감정 표시 여부 / Show emotion\r\n * @property {\"default\" | \"compact\" | \"bubble\"} [variant=\"default\"] - ChatMessage 스타일 변형 / ChatMessage style variant\r\n * @property {Object} [theme] - 커스텀 테마 / Custom theme\r\n * @property {string} [theme.userBubbleBg] - 사용자 버블 배경색 / User bubble background color\r\n * @property {string} [theme.userBubbleText] - 사용자 버블 텍스트 색상 / User bubble text color\r\n * @property {string} [theme.aiBubbleBg] - AI 버블 배경색 / AI bubble background color\r\n * @property {string} [theme.aiBubbleText] - AI 버블 텍스트 색상 / AI bubble text color\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\ninterface ChatMessageProps extends React.HTMLAttributes<HTMLDivElement> {\r\n message: {\r\n id: string\r\n content: string\r\n role: \"user\" | \"assistant\" | \"system\"\r\n timestamp: Date\r\n emotion?: string\r\n intensity?: number\r\n isTyping?: boolean\r\n }\r\n user?: {\r\n name?: string\r\n avatar?: string\r\n color?: string\r\n }\r\n assistant?: {\r\n name?: string\r\n avatar?: string\r\n color?: string\r\n }\r\n showAvatar?: boolean\r\n showTimestamp?: boolean\r\n showEmotion?: boolean\r\n variant?: \"default\" | \"compact\" | \"bubble\"\r\n theme?: {\r\n userBubbleBg?: string\r\n userBubbleText?: string\r\n aiBubbleBg?: string\r\n aiBubbleText?: string\r\n }\r\n}\r\n\r\n/**\r\n * ChatMessage 컴포넌트\r\n * \r\n * 채팅 메시지를 표시하는 컴포넌트입니다.\r\n * 사용자, AI 어시스턴트, 시스템 메시지를 지원하며, 감정 정보를 표시할 수 있습니다.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용\r\n * <ChatMessage\r\n * message={{\r\n * id: \"1\",\r\n * content: \"안녕하세요!\",\r\n * role: \"user\",\r\n * timestamp: new Date()\r\n * }}\r\n * />\r\n * \r\n * @example\r\n * // AI 메시지, 감정 정보 포함\r\n * <ChatMessage\r\n * message={{\r\n * id: \"2\",\r\n * content: \"안녕하세요! 도와드릴까요?\",\r\n * role: \"assistant\",\r\n * timestamp: new Date(),\r\n * emotion: \"joy\",\r\n * intensity: 0.8\r\n * }}\r\n * variant=\"bubble\"\r\n * />\r\n * \r\n * @param {ChatMessageProps} props - ChatMessage 컴포넌트의 props / ChatMessage component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} ChatMessage 컴포넌트 / ChatMessage component\r\n */\r\nconst ChatMessage = React.forwardRef<HTMLDivElement, ChatMessageProps>(\r\n ({ \r\n className, \r\n message,\r\n user = { name: \"사용자\", color: \"#3b82f6\" },\r\n assistant = { name: \"AI\", color: \"#10b981\" },\r\n showAvatar = true,\r\n showTimestamp = true,\r\n showEmotion = true,\r\n variant = \"default\",\r\n theme = {\r\n userBubbleBg: \"#3b82f6\",\r\n userBubbleText: \"#ffffff\",\r\n aiBubbleBg: \"#f3f4f6\",\r\n aiBubbleText: \"#1f2937\"\r\n },\r\n ...props \r\n }, ref) => {\r\n const isUser = message.role === \"user\"\r\n const _isAssistant = message.role === \"assistant\"\r\n const _isSystem = message.role === \"system\"\r\n\r\n const getEmotionColor = (emotion?: string) => {\r\n if (!emotion) return \"bg-gray-100\"\r\n \r\n const emotionColors = {\r\n joy: \"bg-yellow-100 text-yellow-800\",\r\n sadness: \"bg-indigo-100 text-cyan-800\",\r\n anger: \"bg-red-100 text-red-800\",\r\n calm: \"bg-green-100 text-green-800\",\r\n excitement: \"bg-pink-100 text-pink-800\",\r\n worry: \"bg-gray-100 text-gray-800\",\r\n gratitude: \"bg-purple-100 text-purple-800\",\r\n loneliness: \"bg-indigo-100 text-indigo-800\"\r\n }\r\n \r\n return emotionColors[emotion as keyof typeof emotionColors] || \"bg-gray-100 text-gray-800\"\r\n }\r\n\r\n const formatTime = (date: Date) => {\r\n return date.toLocaleTimeString('ko-KR', { \r\n hour: '2-digit', \r\n minute: '2-digit' \r\n })\r\n }\r\n\r\n if (variant === \"bubble\") {\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"flex w-full\",\r\n isUser ? \"justify-end\" : \"justify-start\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div className={merge(\r\n \"flex max-w-[80%] space-x-2\",\r\n isUser ? \"flex-row-reverse space-x-reverse\" : \"flex-row\"\r\n )}>\r\n {showAvatar && (\r\n <Avatar className=\"w-8 h-8 flex-shrink-0\">\r\n <AvatarImage\r\n src={isUser ? user.avatar : assistant.avatar}\r\n alt={isUser ? user.name : assistant.name}\r\n />\r\n <AvatarFallback\r\n style={{\r\n backgroundColor: isUser ? user.color : assistant.color\r\n }}\r\n >\r\n {(isUser ? user.name : assistant.name)?.charAt(0)}\r\n </AvatarFallback>\r\n </Avatar>\r\n )}\r\n \r\n <div className=\"space-y-1\">\r\n <div\r\n className={merge(\r\n \"px-4 py-2 rounded-2xl max-w-full break-words\",\r\n isUser \r\n ? \"rounded-br-md\" \r\n : \"rounded-bl-md\"\r\n )}\r\n style={{\r\n backgroundColor: isUser ? theme.userBubbleBg : theme.aiBubbleBg,\r\n color: isUser ? theme.userBubbleText : theme.aiBubbleText\r\n }}\r\n >\r\n {message.isTyping ? (\r\n <div className=\"flex space-x-1\">\r\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce\" />\r\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-100\" />\r\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-200\" />\r\n </div>\r\n ) : (\r\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\r\n )}\r\n </div>\r\n \r\n <div className={merge(\r\n \"flex items-center space-x-2 text-xs text-muted-foreground\",\r\n isUser ? \"justify-end\" : \"justify-start\"\r\n )}>\r\n {showTimestamp && (\r\n <span>{formatTime(message.timestamp)}</span>\r\n )}\r\n {showEmotion && message.emotion && (\r\n <Badge \r\n variant=\"secondary\" \r\n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\r\n >\r\n {message.emotion}\r\n </Badge>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (variant === \"compact\") {\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"flex items-start space-x-3 py-2\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {showAvatar && (\r\n <Avatar className=\"w-6 h-6 flex-shrink-0\">\r\n <AvatarImage\r\n src={isUser ? user.avatar : assistant.avatar}\r\n alt={isUser ? user.name : assistant.name}\r\n />\r\n <AvatarFallback\r\n style={{\r\n backgroundColor: isUser ? user.color : assistant.color\r\n }}\r\n >\r\n {(isUser ? user.name : assistant.name)?.charAt(0)}\r\n </AvatarFallback>\r\n </Avatar>\r\n )}\r\n \r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center space-x-2 mb-1\">\r\n <span className=\"text-sm font-medium\">\r\n {isUser ? user.name : assistant.name}\r\n </span>\r\n {showTimestamp && (\r\n <span className=\"text-xs text-muted-foreground\">\r\n {formatTime(message.timestamp)}\r\n </span>\r\n )}\r\n {showEmotion && message.emotion && (\r\n <Badge \r\n variant=\"secondary\" \r\n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\r\n >\r\n {message.emotion}\r\n </Badge>\r\n )}\r\n </div>\r\n \r\n <div className=\"text-sm\">\r\n {message.isTyping ? (\r\n <div className=\"flex space-x-1\">\r\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce\" />\r\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce delay-100\" />\r\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce delay-200\" />\r\n </div>\r\n ) : (\r\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n // default variant\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"flex items-start space-x-3 py-4\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {showAvatar && (\r\n <Avatar className=\"w-10 h-10 flex-shrink-0\">\r\n <AvatarImage\r\n src={isUser ? user.avatar : assistant.avatar}\r\n alt={isUser ? user.name : assistant.name}\r\n />\r\n <AvatarFallback\r\n style={{\r\n backgroundColor: isUser ? user.color : assistant.color\r\n }}\r\n >\r\n {(isUser ? user.name : assistant.name)?.charAt(0)}\r\n </AvatarFallback>\r\n </Avatar>\r\n )}\r\n \r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center space-x-2 mb-2\">\r\n <span className=\"font-medium\">\r\n {isUser ? user.name : assistant.name}\r\n </span>\r\n {showTimestamp && (\r\n <span className=\"text-sm text-muted-foreground\">\r\n {formatTime(message.timestamp)}\r\n </span>\r\n )}\r\n {showEmotion && message.emotion && (\r\n <Badge \r\n variant=\"secondary\" \r\n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\r\n >\r\n {message.emotion}\r\n </Badge>\r\n )}\r\n </div>\r\n \r\n <Card className={merge(\r\n \"inline-block\",\r\n isUser ? \"bg-primary text-primary-foreground\" : \"bg-muted\"\r\n )}>\r\n <CardContent className=\"p-3\">\r\n {message.isTyping ? (\r\n <div className=\"flex space-x-1\">\r\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce\" />\r\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-100\" />\r\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-200\" />\r\n </div>\r\n ) : (\r\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n </div>\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nChatMessage.displayName = \"ChatMessage\"\r\n\r\nexport { ChatMessage } ","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\nimport { Icon } from \"./Icon\"\r\nimport type { IconName } from \"../lib/icons\"\r\n\r\n/**\r\n * Breadcrumb 항목 타입 / Breadcrumb item type\r\n */\r\nexport interface BreadcrumbItemData {\r\n label: string\r\n href?: string\r\n icon?: IconName\r\n}\r\n\r\n/**\r\n * Breadcrumb 컴포넌트의 props / Breadcrumb component props\r\n * @typedef {Object} BreadcrumbProps\r\n * @property {React.ReactNode} [children] - BreadcrumbItem 컴포넌트들 / BreadcrumbItem components\r\n * @property {BreadcrumbItemData[]} [items] - Breadcrumb 항목 배열 (children 대신 사용 가능) / Breadcrumb items array (alternative to children)\r\n * @property {number} [maxItems] - 최대 표시할 항목 수 (긴 경로 처리) / Maximum number of items to display (for long paths)\r\n * @property {boolean} [showHomeIcon] - 홈 아이콘 표시 여부 / Show home icon\r\n * @property {string} [homeLabel] - 홈 라벨 (기본: \"Home\") / Home label (default: \"Home\")\r\n * @property {React.ReactNode} [separator] - 항목 사이 구분자 (기본: chevronRight 아이콘) / Separator between items (default: chevronRight icon)\r\n * @property {'default' | 'subtle' | 'transparent' | 'glass'} [variant='default'] - Breadcrumb 스타일 변형 / Breadcrumb style variant\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLDivElement> {\r\n children?: React.ReactNode\r\n items?: BreadcrumbItemData[]\r\n maxItems?: number\r\n showHomeIcon?: boolean\r\n homeLabel?: string\r\n separator?: React.ReactNode\r\n variant?: 'default' | 'subtle' | 'transparent' | 'glass'\r\n}\r\n\r\n/**\r\n * BreadcrumbItem 컴포넌트의 props / BreadcrumbItem component props\r\n * @typedef {Object} BreadcrumbItemProps\r\n * @property {string} [href] - 링크 URL (없으면 일반 텍스트) / Link URL (plain text if not provided)\r\n * @property {boolean} [isCurrent=false] - 현재 페이지 여부 / Current page indicator\r\n * @property {React.ReactNode} children - 항목 텍스트 / Item text\r\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\r\n */\r\nexport interface BreadcrumbItemProps {\r\n href?: string\r\n isCurrent?: boolean\r\n children: React.ReactNode\r\n className?: string\r\n}\r\n\r\n/**\r\n * Breadcrumb 컴포넌트 / Breadcrumb component\r\n * \r\n * 네비게이션 경로를 표시하는 breadcrumb 컴포넌트입니다.\r\n * 현재 위치와 경로를 시각적으로 표현합니다.\r\n * \r\n * Breadcrumb component for displaying navigation paths.\r\n * Visually represents current location and path.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <Breadcrumb>\r\n * <BreadcrumbItem href=\"/\">홈</BreadcrumbItem>\r\n * <BreadcrumbItem href=\"/products\">상품</BreadcrumbItem>\r\n * <BreadcrumbItem isCurrent>상세</BreadcrumbItem>\r\n * </Breadcrumb>\r\n * \r\n * @example\r\n * // 커스텀 구분자 / Custom separator\r\n * <Breadcrumb separator={<span>/</span>}>\r\n * <BreadcrumbItem href=\"/\">홈</BreadcrumbItem>\r\n * <BreadcrumbItem isCurrent>현재</BreadcrumbItem>\r\n * </Breadcrumb>\r\n * \r\n * @param {BreadcrumbProps} props - Breadcrumb 컴포넌트의 props / Breadcrumb component props\r\n * @param {React.Ref<HTMLDivElement>} ref - nav 요소 ref / nav element ref\r\n * @returns {JSX.Element} Breadcrumb 컴포넌트 / Breadcrumb component\r\n */\r\nconst Breadcrumb = React.forwardRef<HTMLDivElement, BreadcrumbProps>(\r\n ({ \r\n className, \r\n children, \r\n items,\r\n maxItems,\r\n showHomeIcon,\r\n homeLabel = \"Home\",\r\n separator = <Icon name=\"chevronRight\" className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />, \r\n variant = 'default', \r\n ...props \r\n }, ref) => {\r\n const variantStyles = {\r\n default: \"inline-flex items-center text-sm w-fit\",\r\n subtle: \"inline-flex items-center text-xs bg-background/40 backdrop-blur-md rounded-md px-3 py-2 border border-border/30 w-fit shadow-sm\",\r\n transparent: \"inline-flex items-center text-xs w-fit\",\r\n glass: \"inline-flex items-center text-xs bg-background/30 backdrop-blur-lg rounded-lg px-4 py-2 border border-border/25 w-fit shadow-lg\"\r\n }\r\n \r\n // items prop이 있으면 BreadcrumbItem으로 변환\r\n const renderItems = () => {\r\n if (items) {\r\n let displayItems = [...items]\r\n \r\n // maxItems 처리\r\n if (maxItems && displayItems.length > maxItems) {\r\n const firstItem = displayItems[0]\r\n const lastItems = displayItems.slice(-(maxItems - 1))\r\n displayItems = [firstItem, { label: '...', href: undefined }, ...lastItems]\r\n }\r\n \r\n // 마지막 항목은 isCurrent로 표시\r\n return displayItems.map((item, index) => {\r\n const isLast = index === displayItems.length - 1\r\n const isCurrent = isLast && !item.href\r\n \r\n return (\r\n <BreadcrumbItem\r\n key={index}\r\n href={item.href}\r\n isCurrent={isCurrent}\r\n >\r\n {item.icon && (\r\n <Icon name={item.icon} className=\"w-4 h-4 mr-1\" />\r\n )}\r\n {item.label}\r\n </BreadcrumbItem>\r\n )\r\n })\r\n }\r\n \r\n // children이 있으면 그대로 사용\r\n if (children) {\r\n return React.Children.map(children, (child, index) => {\r\n if (React.isValidElement(child)) {\r\n return (\r\n <li key={index} className=\"flex items-center\">\r\n {child}\r\n {index < React.Children.count(children) - 1 && (\r\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\r\n {separator}\r\n </span>\r\n )}\r\n </li>\r\n )\r\n }\r\n return child\r\n })\r\n }\r\n \r\n return null\r\n }\r\n \r\n const renderedItems = renderItems()\r\n const itemsCount = items ? items.length : (children ? React.Children.count(children) : 0)\r\n \r\n return (\r\n <nav\r\n ref={ref}\r\n aria-label=\"Breadcrumb\"\r\n className={merge(variantStyles[variant], className)}\r\n {...props}\r\n >\r\n <ol className=\"inline-flex items-center\">\r\n {showHomeIcon && (\r\n <li className=\"flex items-center\">\r\n <BreadcrumbItem href=\"/\">\r\n <Icon name=\"home\" className=\"w-4 h-4 mr-1\" />\r\n {homeLabel}\r\n </BreadcrumbItem>\r\n {itemsCount > 0 && (\r\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\r\n {separator}\r\n </span>\r\n )}\r\n </li>\r\n )}\r\n {items ? (\r\n renderedItems?.map((item, index) => (\r\n <li key={index} className=\"flex items-center\">\r\n {item}\r\n {index < (renderedItems?.length || 0) - 1 && (\r\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\r\n {separator}\r\n </span>\r\n )}\r\n </li>\r\n ))\r\n ) : (\r\n renderedItems\r\n )}\r\n </ol>\r\n </nav>\r\n )\r\n }\r\n)\r\nBreadcrumb.displayName = \"Breadcrumb\"\r\n\r\n/**\r\n * BreadcrumbItem 컴포넌트\r\n * Breadcrumb의 개별 항목을 표시합니다.\r\n * \r\n * @component\r\n * @param {BreadcrumbItemProps} props - BreadcrumbItem 컴포넌트의 props\r\n * @param {React.Ref<HTMLLIElement>} ref - li 요소 ref\r\n * @returns {JSX.Element} BreadcrumbItem 컴포넌트\r\n */\r\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, BreadcrumbItemProps>(\r\n ({ className, href, isCurrent = false, children, ...props }, ref) => {\r\n if (isCurrent) {\r\n return (\r\n <span\r\n ref={ref}\r\n aria-current=\"page\"\r\n className={merge(\r\n \"text-muted-foreground font-medium\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </span>\r\n )\r\n }\r\n\r\n if (href) {\r\n return (\r\n <a\r\n href={href}\r\n className={merge(\r\n \"text-muted-foreground hover:text-foreground transition-colors\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </a>\r\n )\r\n }\r\n\r\n return (\r\n <span\r\n ref={ref}\r\n className={merge(\r\n \"text-muted-foreground\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </span>\r\n )\r\n }\r\n)\r\nBreadcrumbItem.displayName = \"BreadcrumbItem\"\r\n\r\nexport { Breadcrumb, BreadcrumbItem } ","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\nimport { Breadcrumb, BreadcrumbItem } from \"./Breadcrumb\"\r\n\r\n/**\r\n * ComponentLayout 컴포넌트의 props / ComponentLayout component props\r\n * @typedef {Object} ComponentLayoutProps\r\n * @property {string} title - 페이지 제목 / Page title\r\n * @property {string} description - 페이지 설명 / Page description\r\n * @property {React.ReactNode} children - 페이지 내용 / Page content\r\n * @property {Object} [prevPage] - 이전 페이지 정보 / Previous page information\r\n * @property {string} prevPage.title - 이전 페이지 제목 / Previous page title\r\n * @property {string} prevPage.href - 이전 페이지 링크 / Previous page link\r\n * @property {Object} [nextPage] - 다음 페이지 정보 / Next page information\r\n * @property {string} nextPage.title - 다음 페이지 제목 / Next page title\r\n * @property {string} nextPage.href - 다음 페이지 링크 / Next page link\r\n * @property {Array<Object>} [breadcrumbItems] - Breadcrumb 항목들 / Breadcrumb items\r\n * @property {string} breadcrumbItems[].label - Breadcrumb 라벨 / Breadcrumb label\r\n * @property {string} [breadcrumbItems[].href] - Breadcrumb 링크 / Breadcrumb link\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface ComponentLayoutProps extends React.HTMLAttributes<HTMLDivElement> {\r\n title: string\r\n description: string\r\n children: React.ReactNode\r\n prevPage?: {\r\n title: string\r\n href: string\r\n }\r\n nextPage?: {\r\n title: string\r\n href: string\r\n }\r\n breadcrumbItems?: Array<{\r\n label: string\r\n href?: string\r\n }>\r\n}\r\n\r\n/**\r\n * ComponentLayout 컴포넌트 / ComponentLayout component\r\n * \r\n * 컴포넌트 문서 페이지 레이아웃을 제공하는 컴포넌트입니다.\r\n * 제목, 설명, Breadcrumb, 이전/다음 페이지 네비게이션을 포함합니다.\r\n * \r\n * Component that provides layout for component documentation pages.\r\n * Includes title, description, Breadcrumb, and previous/next page navigation.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <ComponentLayout\r\n * title=\"Button 컴포넌트\"\r\n * description=\"버튼 컴포넌트 사용법\"\r\n * >\r\n * <Button>예제</Button>\r\n * </ComponentLayout>\r\n * \r\n * @example\r\n * // 이전/다음 페이지 네비게이션 포함 / With previous/next page navigation\r\n * <ComponentLayout\r\n * title=\"Input 컴포넌트\"\r\n * description=\"입력 컴포넌트 사용법\"\r\n * prevPage={{ title: \"Button\", href: \"/components/button\" }}\r\n * nextPage={{ title: \"Select\", href: \"/components/select\" }}\r\n * >\r\n * <Input placeholder=\"입력하세요\" />\r\n * </ComponentLayout>\r\n * \r\n * @param {ComponentLayoutProps} props - ComponentLayout 컴포넌트의 props / ComponentLayout component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} ComponentLayout 컴포넌트 / ComponentLayout component\r\n */\r\nconst ComponentLayout = React.forwardRef<HTMLDivElement, ComponentLayoutProps>(\r\n ({ \r\n className, \r\n title, \r\n description, \r\n children, \r\n prevPage, \r\n nextPage,\r\n breadcrumbItems = [\r\n { label: \"Components\", href: \"/components\" }\r\n ],\r\n ...props \r\n }, ref) => {\r\n return (\r\n <div className=\"relative min-h-screen\">\r\n {/* 고정된 페이지 네비게이션 - 위쪽 */}\r\n <div className=\"fixed right-4 top-4 z-50 hidden lg:block\">\r\n <div className=\"flex flex-col space-y-4\">\r\n {prevPage && (\r\n <a\r\n href={prevPage.href}\r\n className=\"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200\"\r\n title={`이전: ${prevPage.title}`}\r\n >\r\n <svg\r\n className=\"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\r\n </svg>\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* 고정된 페이지 네비게이션 - 아래쪽 */}\r\n <div className=\"fixed right-4 bottom-4 z-50 hidden lg:block\">\r\n <div className=\"flex flex-col space-y-4\">\r\n {nextPage && (\r\n <a\r\n href={nextPage.href}\r\n className=\"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200\"\r\n title={`다음: ${nextPage.title}`}\r\n >\r\n <svg\r\n className=\"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* 메인 콘텐츠 */}\r\n <div\r\n ref={ref}\r\n className={merge(\"container mx-auto px-4 py-8\", className)}\r\n {...props}\r\n >\r\n <div className=\"max-w-4xl mx-auto\">\r\n {/* 브레드크럼 */}\r\n <Breadcrumb className=\"mb-6\">\r\n {breadcrumbItems.map((item, index) => (\r\n <BreadcrumbItem \r\n key={index}\r\n href={item.href}\r\n isCurrent={index === breadcrumbItems.length - 1}\r\n >\r\n {item.label}\r\n </BreadcrumbItem>\r\n ))}\r\n </Breadcrumb>\r\n\r\n {/* 페이지 헤더 */}\r\n <div className=\"mb-8\">\r\n <h1 className=\"text-4xl font-bold mb-4\">{title}</h1>\r\n <p className=\"text-lg text-muted-foreground\">\r\n {description}\r\n </p>\r\n </div>\r\n\r\n {/* 페이지 콘텐츠 */}\r\n <div className=\"space-y-8\">\r\n {children}\r\n </div>\r\n\r\n {/* 모바일 페이지 네비게이션 */}\r\n <div className=\"mt-12 lg:hidden\">\r\n <div className=\"flex items-center justify-between py-4 border-t border-border\">\r\n {prevPage && (\r\n <a\r\n href={prevPage.href}\r\n className=\"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\r\n >\r\n <svg className=\"w-4 h-4 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\r\n </svg>\r\n {prevPage.title}\r\n </a>\r\n )}\r\n {nextPage && (\r\n <a\r\n href={nextPage.href}\r\n className=\"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\r\n >\r\n {nextPage.title}\r\n <svg className=\"w-4 h-4 ml-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n)\r\nComponentLayout.displayName = \"ComponentLayout\"\r\n\r\nexport { ComponentLayout } ","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\nimport type { Color } from \"../lib/types/common\"\r\n\r\n/**\r\n * EmotionMeter 컴포넌트의 props / EmotionMeter component props\r\n * @typedef {Object} EmotionMeterProps\r\n * @property {number} value - 감정 강도 값 (0-max) / Emotion intensity value (0-max)\r\n * @property {number} [max=100] - 최대값 / Maximum value\r\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 미터 크기 / Meter size\r\n * @property {\"blue\" | \"green\" | \"yellow\" | \"red\"} [color=\"blue\"] - 미터 색상 / Meter color\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface EmotionMeterProps extends React.HTMLAttributes<HTMLDivElement> {\r\n value: number\r\n max?: number\r\n size?: \"sm\" | \"md\" | \"lg\"\r\n color?: \"blue\" | \"green\" | \"yellow\" | \"red\" | Color\r\n}\r\n\r\n/**\r\n * EmotionMeter 컴포넌트 / EmotionMeter component\r\n * \r\n * 감정 강도를 표시하는 미터 컴포넌트입니다.\r\n * Progress 컴포넌트와 유사하지만 감정 분석에 특화되어 있습니다.\r\n * \r\n * Meter component that displays emotion intensity.\r\n * Similar to Progress component but specialized for emotion analysis.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <EmotionMeter value={75} />\r\n * \r\n * @example\r\n * // 다양한 색상 / Various colors\r\n * <EmotionMeter \r\n * value={80}\r\n * color=\"green\"\r\n * size=\"lg\"\r\n * />\r\n * \r\n * @param {EmotionMeterProps} props - EmotionMeter 컴포넌트의 props / EmotionMeter component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} EmotionMeter 컴포넌트 / EmotionMeter component\r\n */\r\nconst EmotionMeter = React.forwardRef<HTMLDivElement, EmotionMeterProps>(\r\n ({ className, value, max = 100, size = \"md\", color = \"blue\", ...props }, ref) => {\r\n const sizeClasses = {\r\n sm: \"h-2\",\r\n md: \"h-3\", \r\n lg: \"h-4\"\r\n }\r\n\r\n // EmotionMeter는 특정 색상만 사용 (감정 분석 특화)\r\n const emotionColors: Record<string, string> = {\r\n blue: \"bg-indigo-500\",\r\n green: \"bg-green-500\",\r\n yellow: \"bg-yellow-500\",\r\n red: \"bg-red-500\",\r\n // 추가 색상 지원\r\n purple: \"bg-purple-500\",\r\n orange: \"bg-orange-500\",\r\n indigo: \"bg-indigo-500\",\r\n pink: \"bg-pink-500\",\r\n gray: \"bg-gray-500\",\r\n }\r\n\r\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"w-full bg-gray-200 rounded-full dark:bg-gray-700\",\r\n sizeClasses[size],\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div\r\n className={merge(\r\n \"h-full rounded-full transition-all duration-300\",\r\n emotionColors[color] || emotionColors.blue\r\n )}\r\n style={{ width: `${percentage}%` }}\r\n />\r\n </div>\r\n )\r\n }\r\n)\r\nEmotionMeter.displayName = \"EmotionMeter\"\r\n\r\nexport { EmotionMeter } ","'use client'\r\n\r\nimport React from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"./Card\"\r\nimport { Badge } from \"./Badge\"\r\nimport { EmotionMeter } from \"./EmotionMeter\"\r\n\r\n/**\r\n * EmotionAnalysis 컴포넌트의 props / EmotionAnalysis component props\r\n * @typedef {Object} EmotionAnalysisProps\r\n * @property {Object} [primaryEmotion] - 주요 감정 정보 / Primary emotion information\r\n * @property {string} primaryEmotion.name - 감정 이름 / Emotion name\r\n * @property {number} primaryEmotion.intensity - 감정 강도 (0-100) / Emotion intensity (0-100)\r\n * @property {string} [primaryEmotion.color] - 감정 색상 / Emotion color\r\n * @property {Array<Object>} [emotionDistribution] - 감정 분포 배열 / Emotion distribution array\r\n * @property {string} emotionDistribution[].emotion - 감정 이름 / Emotion name\r\n * @property {number} emotionDistribution[].percentage - 감정 비율 (0-100) / Emotion percentage (0-100)\r\n * @property {string} emotionDistribution[].color - 감정 색상 / Emotion color\r\n * @property {string[]} [keywords] - 키워드 배열 / Keywords array\r\n * @property {number} [intensity=50] - 전체 강도 (0-100) / Overall intensity (0-100)\r\n * @property {number} [positivity=70] - 긍정성 (0-100) / Positivity (0-100)\r\n * @property {number} [energy=60] - 에너지 (0-100) / Energy (0-100)\r\n * @property {boolean} [showMeter=true] - 강도 미터 표시 여부 / Show intensity meter\r\n * @property {boolean} [showDistribution=true] - 분포 표시 여부 / Show distribution\r\n * @property {boolean} [showKeywords=true] - 키워드 표시 여부 / Show keywords\r\n * @property {boolean} [showMetrics=true] - 메트릭 표시 여부 / Show metrics\r\n * @property {\"compact\" | \"detailed\" | \"card\"} [layout=\"detailed\"] - 레이아웃 타입 / Layout type\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\ninterface EmotionAnalysisProps extends React.HTMLAttributes<HTMLDivElement> {\r\n primaryEmotion?: {\r\n name: string\r\n intensity: number\r\n color?: string\r\n }\r\n emotionDistribution?: Array<{\r\n emotion: string\r\n percentage: number\r\n color: string\r\n }>\r\n keywords?: string[]\r\n intensity?: number\r\n positivity?: number\r\n energy?: number\r\n showMeter?: boolean\r\n showDistribution?: boolean\r\n showKeywords?: boolean\r\n showMetrics?: boolean\r\n layout?: \"compact\" | \"detailed\" | \"card\"\r\n}\r\n\r\n/**\r\n * EmotionAnalysis 컴포넌트 / EmotionAnalysis component\r\n * \r\n * 감정 분석 결과를 표시하는 컴포넌트입니다.\r\n * 주요 감정, 감정 분포, 키워드, 메트릭(강도, 긍정성, 에너지)을 표시할 수 있습니다.\r\n * \r\n * Component that displays emotion analysis results.\r\n * Can display primary emotion, emotion distribution, keywords, and metrics (intensity, positivity, energy).\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <EmotionAnalysis\r\n * primaryEmotion={{ name: \"기쁨\", intensity: 80 }}\r\n * keywords={[\"행복\", \"만족\"]}\r\n * />\r\n * \r\n * @example\r\n * // 상세 레이아웃 / Detailed layout\r\n * <EmotionAnalysis\r\n * primaryEmotion={{ name: \"평온\", intensity: 65, color: \"green\" }}\r\n * emotionDistribution={[\r\n * { emotion: \"기쁨\", percentage: 40, color: \"yellow\" },\r\n * { emotion: \"평온\", percentage: 60, color: \"green\" }\r\n * ]}\r\n * keywords={[\"안정\", \"편안\"]}\r\n * intensity={65}\r\n * positivity={75}\r\n * energy={50}\r\n * layout=\"detailed\"\r\n * />\r\n * \r\n * @param {EmotionAnalysisProps} props - EmotionAnalysis 컴포넌트의 props / EmotionAnalysis component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} EmotionAnalysis 컴포넌트 / EmotionAnalysis component\r\n */\r\nconst EmotionAnalysis = React.forwardRef<HTMLDivElement, EmotionAnalysisProps>(\r\n ({ \r\n className, \r\n primaryEmotion,\r\n emotionDistribution = [],\r\n keywords = [],\r\n intensity = 50,\r\n positivity = 70,\r\n energy = 60,\r\n showMeter = true,\r\n showDistribution = true,\r\n showKeywords = true,\r\n showMetrics = true,\r\n layout = \"detailed\",\r\n ...props \r\n }, ref) => {\r\n const getIntensityLabel = (value: number) => {\r\n if (value < 30) return \"약함\"\r\n if (value < 70) return \"보통\"\r\n return \"강함\"\r\n }\r\n\r\n const getPositivityLabel = (value: number) => {\r\n if (value < 30) return \"부정적\"\r\n if (value < 70) return \"중립적\"\r\n return \"긍정적\"\r\n }\r\n\r\n const getEnergyLabel = (value: number) => {\r\n if (value < 30) return \"낮음\"\r\n if (value < 70) return \"보통\"\r\n return \"높음\"\r\n }\r\n\r\n if (layout === \"compact\") {\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\"space-y-3\", className)}\r\n {...props}\r\n >\r\n {primaryEmotion && (\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-sm font-medium\">주요 감정:</span>\r\n <div className=\"flex items-center space-x-2\">\r\n <span className=\"text-sm text-muted-foreground\">\r\n {primaryEmotion.name} ({primaryEmotion.intensity}%)\r\n </span>\r\n {showMeter && (\r\n <EmotionMeter\r\n value={primaryEmotion.intensity}\r\n size=\"sm\"\r\n color=\"blue\"\r\n />\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showMetrics && (\r\n <>\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-sm font-medium\">감정 강도:</span>\r\n <span className=\"text-sm text-muted-foreground\">\r\n {getIntensityLabel(intensity)}\r\n </span>\r\n </div>\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-sm font-medium\">긍정성:</span>\r\n <span className=\"text-sm text-muted-foreground\">\r\n {getPositivityLabel(positivity)}\r\n </span>\r\n </div>\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-sm font-medium\">에너지:</span>\r\n <span className=\"text-sm text-muted-foreground\">\r\n {getEnergyLabel(energy)}\r\n </span>\r\n </div>\r\n </>\r\n )}\r\n\r\n {showKeywords && keywords.length > 0 && (\r\n <div>\r\n <span className=\"text-sm font-medium\">키워드:</span>\r\n <div className=\"flex flex-wrap gap-1 mt-1\">\r\n {keywords.map((keyword) => (\r\n <Badge key={keyword} variant=\"secondary\" className=\"text-xs\">\r\n {keyword}\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n if (layout === \"card\") {\r\n return (\r\n <Card\r\n ref={ref}\r\n className={merge(\"\", className)}\r\n {...props}\r\n >\r\n <CardHeader>\r\n <CardTitle className=\"flex items-center\">\r\n <span className=\"text-2xl mr-2\">✨</span>\r\n AI 분석\r\n </CardTitle>\r\n <CardDescription>\r\n 감정 분석 결과\r\n </CardDescription>\r\n </CardHeader>\r\n <CardContent className=\"space-y-4\">\r\n {primaryEmotion && (\r\n <div className=\"space-y-3\">\r\n <div className=\"text-sm\">\r\n <span className=\"font-medium\">주요 감정:</span>\r\n <span className=\"ml-2 text-muted-foreground\">\r\n {primaryEmotion.name} ({primaryEmotion.intensity}%)\r\n </span>\r\n </div>\r\n {showMeter && (\r\n <div className=\"flex justify-center\">\r\n <EmotionMeter\r\n value={primaryEmotion.intensity}\r\n size=\"md\"\r\n color=\"blue\"\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {showMetrics && (\r\n <>\r\n <div className=\"text-sm\">\r\n <span className=\"font-medium\">감정 강도:</span>\r\n <span className=\"ml-2 text-muted-foreground\">\r\n {getIntensityLabel(intensity)}\r\n </span>\r\n </div>\r\n <div className=\"text-sm\">\r\n <span className=\"font-medium\">긍정성:</span>\r\n <span className=\"ml-2 text-muted-foreground\">\r\n {getPositivityLabel(positivity)}\r\n </span>\r\n </div>\r\n <div className=\"text-sm\">\r\n <span className=\"font-medium\">에너지:</span>\r\n <span className=\"ml-2 text-muted-foreground\">\r\n {getEnergyLabel(energy)}\r\n </span>\r\n </div>\r\n </>\r\n )}\r\n\r\n {showKeywords && keywords.length > 0 && (\r\n <div className=\"text-sm\">\r\n <span className=\"font-medium\">키워드:</span>\r\n <div className=\"flex flex-wrap gap-1 mt-1\">\r\n {keywords.map((keyword) => (\r\n <Badge key={keyword} variant=\"secondary\" className=\"text-xs\">\r\n {keyword}\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n )\r\n }\r\n\r\n // detailed layout (default)\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\"space-y-6\", className)}\r\n {...props}\r\n >\r\n {primaryEmotion && (\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">주요 감정</h3>\r\n <div className=\"flex items-center space-x-4\">\r\n <div className=\"text-center\">\r\n <div className=\"text-2xl font-bold text-primary\">\r\n {primaryEmotion.name}\r\n </div>\r\n <div className=\"text-sm text-muted-foreground\">\r\n {primaryEmotion.intensity}% 강도\r\n </div>\r\n </div>\r\n {showMeter && (\r\n <EmotionMeter\r\n value={primaryEmotion.intensity}\r\n size=\"lg\"\r\n color=\"blue\"\r\n />\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showDistribution && emotionDistribution.length > 0 && (\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">감정 분포</h3>\r\n <div className=\"space-y-3\">\r\n {emotionDistribution.map((item, index) => (\r\n <div key={index} className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-sm font-medium\">{item.emotion}</span>\r\n <span className=\"text-sm text-muted-foreground\">\r\n {item.percentage}%\r\n </span>\r\n </div>\r\n <div className=\"w-full bg-muted rounded-full h-2\">\r\n <div \r\n className={`${item.color} h-2 rounded-full transition-all duration-300`} \r\n style={{ width: `${item.percentage}%` }}\r\n />\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showMetrics && (\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">분석 지표</h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <div className=\"space-y-2\">\r\n <div className=\"text-sm font-medium\">감정 강도</div>\r\n <div className=\"text-2xl font-bold text-primary\">\r\n {getIntensityLabel(intensity)}\r\n </div>\r\n <div className=\"w-full bg-muted rounded-full h-2\">\r\n <div \r\n className=\"bg-primary h-2 rounded-full transition-all duration-300\" \r\n style={{ width: `${intensity}%` }}\r\n />\r\n </div>\r\n </div>\r\n <div className=\"space-y-2\">\r\n <div className=\"text-sm font-medium\">긍정성</div>\r\n <div className=\"text-2xl font-bold text-green-600\">\r\n {getPositivityLabel(positivity)}\r\n </div>\r\n <div className=\"w-full bg-muted rounded-full h-2\">\r\n <div \r\n className=\"bg-green-500 h-2 rounded-full transition-all duration-300\" \r\n style={{ width: `${positivity}%` }}\r\n />\r\n </div>\r\n </div>\r\n <div className=\"space-y-2\">\r\n <div className=\"text-sm font-medium\">에너지</div>\r\n <div className=\"text-2xl font-bold text-orange-600\">\r\n {getEnergyLabel(energy)}\r\n </div>\r\n <div className=\"w-full bg-muted rounded-full h-2\">\r\n <div \r\n className=\"bg-orange-500 h-2 rounded-full transition-all duration-300\" \r\n style={{ width: `${energy}%` }}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showKeywords && keywords.length > 0 && (\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">감정 키워드</h3>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {keywords.map((keyword) => (\r\n <Badge key={keyword} variant=\"outline\" className=\"text-sm\">\r\n {keyword}\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nEmotionAnalysis.displayName = \"EmotionAnalysis\"\r\n\r\nexport { EmotionAnalysis } ","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\n\r\n/**\r\n * EmotionButton 컴포넌트의 props / EmotionButton component props\r\n * @typedef {Object} EmotionButtonProps\r\n * @property {string} emotion - 감정 이모지 또는 텍스트 / Emotion emoji or text\r\n * @property {boolean} [isSelected=false] - 선택 상태 / Selected state\r\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 버튼 크기 / Button size\r\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\r\n */\r\nexport interface EmotionButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n emotion: string\r\n isSelected?: boolean\r\n size?: \"sm\" | \"md\" | \"lg\"\r\n}\r\n\r\n/**\r\n * EmotionButton 컴포넌트 / EmotionButton component\r\n * \r\n * 감정을 선택하는 버튼 컴포넌트입니다.\r\n * 이모지나 텍스트로 감정을 표시하며, 선택 상태를 지원합니다.\r\n * \r\n * Button component for selecting emotions.\r\n * Displays emotion as emoji or text and supports selected state.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <EmotionButton emotion=\"😊\" />\r\n * \r\n * @example\r\n * // 선택 상태 / Selected state\r\n * <EmotionButton \r\n * emotion=\"😊\"\r\n * isSelected\r\n * size=\"lg\"\r\n * />\r\n * \r\n * @param {EmotionButtonProps} props - EmotionButton 컴포넌트의 props / EmotionButton component props\r\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\r\n * @returns {JSX.Element} EmotionButton 컴포넌트 / EmotionButton component\r\n */\r\nconst EmotionButton = React.forwardRef<HTMLButtonElement, EmotionButtonProps>(\r\n ({ className, emotion, isSelected = false, size = \"md\", ...props }, ref) => {\r\n const sizeClasses = {\r\n sm: \"w-8 h-8 text-sm\",\r\n md: \"w-12 h-12 text-lg\",\r\n lg: \"w-16 h-16 text-xl\"\r\n }\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n className={merge(\r\n \"rounded-full border-2 transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-1 focus:ring-ring\",\r\n sizeClasses[size],\r\n isSelected\r\n ? \"border-indigo-500 bg-indigo-50 dark:bg-indigo-900/20\" \r\n : \"border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-800\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {emotion}\r\n </button>\r\n )\r\n }\r\n)\r\nEmotionButton.displayName = \"EmotionButton\"\r\n\r\nexport { EmotionButton } ","'use client'\r\n\r\nimport React from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\nimport { EmotionButton } from \"./EmotionButton\"\r\nimport { EmotionMeter } from \"./EmotionMeter\"\r\n\r\n/**\r\n * EmotionSelector 컴포넌트의 props / EmotionSelector component props\r\n * @typedef {Object} EmotionSelectorProps\r\n * @property {string} [selectedEmotion] - 선택된 감정 키 / Selected emotion key\r\n * @property {(emotion: string) => void} [onEmotionSelect] - 감정 선택 콜백 / Emotion selection callback\r\n * @property {\"grid\" | \"list\" | \"compact\"} [layout=\"grid\"] - 레이아웃 타입 / Layout type\r\n * @property {boolean} [showIntensity=false] - 강도 조절 표시 여부 / Show intensity control\r\n * @property {number} [intensity=50] - 감정 강도 (0-100) / Emotion intensity (0-100)\r\n * @property {(intensity: number) => void} [onIntensityChange] - 강도 변경 콜백 / Intensity change callback\r\n * @property {Array<Object>} [emotions] - 감정 목록 / Emotions list\r\n * @property {string} emotions[].key - 감정 키 / Emotion key\r\n * @property {string} emotions[].label - 감정 라벨 / Emotion label\r\n * @property {string} [emotions[].icon] - 감정 아이콘 / Emotion icon\r\n * @property {string} [emotions[].color] - 감정 색상 / Emotion color\r\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 감정 버튼 크기 / Emotion button size\r\n * @property {\"button\" | \"card\" | \"chip\"} [variant=\"button\"] - 감정 표시 스타일 / Emotion display style\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\ninterface EmotionSelectorProps extends React.HTMLAttributes<HTMLDivElement> {\r\n selectedEmotion?: string\r\n onEmotionSelect?: (emotion: string) => void\r\n layout?: \"grid\" | \"list\" | \"compact\"\r\n showIntensity?: boolean\r\n intensity?: number\r\n onIntensityChange?: (intensity: number) => void\r\n emotions?: Array<{\r\n key: string\r\n label: string\r\n icon?: string\r\n color?: string\r\n }>\r\n size?: \"sm\" | \"md\" | \"lg\"\r\n variant?: \"button\" | \"card\" | \"chip\"\r\n}\r\n\r\nconst defaultEmotions = [\r\n { key: \"joy\", label: \"기쁨\", icon: \"smile\", color: \"yellow\" },\r\n { key: \"sadness\", label: \"슬픔\", icon: \"frown\", color: \"blue\" },\r\n { key: \"anger\", label: \"화남\", icon: \"angry\", color: \"red\" },\r\n { key: \"calm\", label: \"평온\", icon: \"heart\", color: \"green\" },\r\n { key: \"excitement\", label: \"설렘\", icon: \"star\", color: \"pink\" },\r\n { key: \"worry\", label: \"걱정\", icon: \"meh\", color: \"gray\" },\r\n { key: \"gratitude\", label: \"감사\", icon: \"heart\", color: \"purple\" },\r\n { key: \"loneliness\", label: \"외로움\", icon: \"user\", color: \"indigo\" }\r\n]\r\n\r\n/**\r\n * EmotionSelector 컴포넌트 / EmotionSelector component\r\n * \r\n * 감정을 선택하는 컴포넌트입니다.\r\n * 여러 감정 옵션을 제공하며, 강도 조절 기능을 포함할 수 있습니다.\r\n * \r\n * Component for selecting emotions.\r\n * Provides multiple emotion options and can include intensity control.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <EmotionSelector\r\n * selectedEmotion=\"joy\"\r\n * onEmotionSelect={(emotion) => console.log(emotion)}\r\n * />\r\n * \r\n * @example\r\n * // 강도 조절 포함 / With intensity control\r\n * <EmotionSelector\r\n * selectedEmotion=\"calm\"\r\n * onEmotionSelect={handleEmotionSelect}\r\n * showIntensity\r\n * intensity={intensity}\r\n * onIntensityChange={setIntensity}\r\n * variant=\"card\"\r\n * />\r\n * \r\n * @param {EmotionSelectorProps} props - EmotionSelector 컴포넌트의 props / EmotionSelector component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} EmotionSelector 컴포넌트 / EmotionSelector component\r\n */\r\nconst EmotionSelector = React.forwardRef<HTMLDivElement, EmotionSelectorProps>(\r\n ({ \r\n className, \r\n selectedEmotion,\r\n onEmotionSelect,\r\n layout = \"grid\",\r\n showIntensity = false,\r\n intensity = 50,\r\n onIntensityChange,\r\n emotions = defaultEmotions,\r\n size = \"md\",\r\n variant = \"button\",\r\n ...props \r\n }, ref) => {\r\n const handleEmotionClick = (emotionKey: string) => {\r\n onEmotionSelect?.(emotionKey)\r\n }\r\n\r\n const renderEmotionItem = (emotion: typeof emotions[0]) => {\r\n const isSelected = selectedEmotion === emotion.key\r\n \r\n if (variant === \"button\") {\r\n return (\r\n <EmotionButton\r\n key={emotion.key}\r\n emotion={emotion.key}\r\n isSelected={isSelected}\r\n size={size}\r\n onClick={() => handleEmotionClick(emotion.key)}\r\n className={merge(\r\n \"transition-all duration-200\",\r\n isSelected && \"ring-1 ring-offset-2 ring-primary\"\r\n )}\r\n >\r\n {emotion.label}\r\n </EmotionButton>\r\n )\r\n }\r\n\r\n if (variant === \"card\") {\r\n return (\r\n <div\r\n key={emotion.key}\r\n className={merge(\r\n \"p-4 rounded-lg border-2 cursor-pointer transition-all duration-200 hover:shadow-md\",\r\n isSelected \r\n ? \"border-primary bg-primary/5\" \r\n : \"border-border hover:border-primary/50\"\r\n )}\r\n onClick={() => handleEmotionClick(emotion.key)}\r\n >\r\n <div className=\"flex items-center space-x-3\">\r\n <div className={merge(\r\n \"w-8 h-8 rounded-full flex items-center justify-center\",\r\n isSelected ? \"bg-primary text-primary-foreground\" : \"bg-muted\"\r\n )}>\r\n {emotion.icon && (\r\n <span className=\"text-lg\">\r\n {emotion.icon === \"smile\" && \"😊\"}\r\n {emotion.icon === \"frown\" && \"😢\"}\r\n {emotion.icon === \"angry\" && \"😠\"}\r\n {emotion.icon === \"heart\" && \"❤️\"}\r\n {emotion.icon === \"star\" && \"⭐\"}\r\n {emotion.icon === \"meh\" && \"😐\"}\r\n {emotion.icon === \"user\" && \"👤\"}\r\n </span>\r\n )}\r\n </div>\r\n <span className=\"font-medium truncate max-w-[120px]\">{emotion.label}</span>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (variant === \"chip\") {\r\n return (\r\n <div\r\n key={emotion.key}\r\n className={merge(\r\n \"px-3 py-1 rounded-full cursor-pointer transition-all duration-200 text-sm font-medium\",\r\n isSelected \r\n ? \"bg-primary text-primary-foreground\" \r\n : \"bg-muted hover:bg-muted/80\"\r\n )}\r\n onClick={() => handleEmotionClick(emotion.key)}\r\n >\r\n <span className=\"truncate max-w-[100px]\">{emotion.label}</span>\r\n </div>\r\n )\r\n }\r\n\r\n return null\r\n }\r\n\r\n const layoutClasses = {\r\n grid: \"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2 md:gap-3\",\r\n list: \"space-y-2\",\r\n compact: \"flex flex-wrap gap-1\"\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\"space-y-4\", className)}\r\n {...props}\r\n >\r\n <div className={layoutClasses[layout]}>\r\n {emotions.map(renderEmotionItem)}\r\n </div>\r\n\r\n {showIntensity && selectedEmotion && (\r\n <div className=\"space-y-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-sm font-medium\">감정 강도</span>\r\n <span className=\"text-sm text-muted-foreground\">{intensity}%</span>\r\n </div>\r\n <input\r\n type=\"range\"\r\n min=\"0\"\r\n max=\"100\"\r\n value={intensity}\r\n onChange={(e) => onIntensityChange?.(Number(e.target.value))}\r\n className=\"w-full h-2 bg-muted rounded-lg appearance-none cursor-pointer slider\"\r\n />\r\n <div className=\"flex justify-between text-xs text-muted-foreground\">\r\n <span>약함</span>\r\n <span>보통</span>\r\n <span>강함</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {selectedEmotion && showIntensity && (\r\n <div className=\"flex justify-center\">\r\n <EmotionMeter\r\n value={intensity}\r\n size=\"md\"\r\n color=\"blue\"\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nEmotionSelector.displayName = \"EmotionSelector\"\r\n\r\nexport { EmotionSelector } ","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\n\r\n/**\r\n * LanguageToggle 컴포넌트의 props / LanguageToggle component props\r\n * @typedef {Object} LanguageToggleProps\r\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\r\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Toggle 크기 / Toggle size\r\n * @property {\"button\" | \"icon\" | \"dropdown\"} [variant=\"button\"] - Toggle 스타일 변형 / Toggle style variant\r\n * @property {boolean} [showLabel=false] - 라벨 표시 여부 / Show label\r\n * @property {Array<Object>} [languages] - 언어 목록 / Language list\r\n * @property {string} languages[].code - 언어 코드 / Language code\r\n * @property {string} languages[].name - 언어 이름 / Language name\r\n * @property {string} [languages[].flag] - 언어 플래그 이모지 / Language flag emoji\r\n * @property {string} [currentLanguage=\"ko\"] - 현재 선택된 언어 코드 / Currently selected language code\r\n * @property {(language: string) => void} [onLanguageChange] - 언어 변경 콜백 / Language change callback\r\n */\r\nexport interface LanguageToggleProps {\r\n className?: string\r\n size?: \"sm\" | \"md\" | \"lg\"\r\n variant?: \"button\" | \"icon\" | \"dropdown\"\r\n showLabel?: boolean\r\n languages?: Array<{\r\n code: string\r\n name: string\r\n flag?: string\r\n }>\r\n currentLanguage?: string\r\n onLanguageChange?: (language: string) => void\r\n}\r\n\r\n/**\r\n * LanguageToggle 컴포넌트 / LanguageToggle component\r\n * \r\n * 언어를 전환하는 토글 컴포넌트입니다.\r\n * 여러 언어를 지원하며, 버튼, 아이콘, 드롭다운 형태로 표시할 수 있습니다.\r\n * \r\n * Toggle component for switching languages.\r\n * Supports multiple languages and can be displayed as button, icon, or dropdown.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <LanguageToggle />\r\n * \r\n * @example\r\n * // 드롭다운 형태 / Dropdown variant\r\n * <LanguageToggle \r\n * variant=\"dropdown\"\r\n * currentLanguage=\"en\"\r\n * onLanguageChange={(lang) => console.log(lang)}\r\n * />\r\n * \r\n * @param {LanguageToggleProps} props - LanguageToggle 컴포넌트의 props / LanguageToggle component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} LanguageToggle 컴포넌트 / LanguageToggle component\r\n */\r\nconst LanguageToggle = React.forwardRef<HTMLDivElement, LanguageToggleProps>(\r\n ({ \r\n className,\r\n size = \"md\",\r\n variant = \"button\",\r\n showLabel = false,\r\n languages = [\r\n { code: \"ko\", name: \"한국어\", flag: \"🇰🇷\" },\r\n { code: \"en\", name: \"English\", flag: \"🇺🇸\" },\r\n { code: \"ja\", name: \"日本語\", flag: \"🇯🇵\" },\r\n { code: \"zh\", name: \"中文\", flag: \"🇨🇳\" }\r\n ],\r\n currentLanguage = \"ko\",\r\n onLanguageChange,\r\n ...props\r\n }, _ref) => {\r\n const [isOpen, setIsOpen] = React.useState(false)\r\n const dropdownRef = React.useRef<HTMLDivElement>(null)\r\n\r\n const currentLang = languages.find(lang => lang.code === currentLanguage) || languages[0]\r\n\r\n const sizeClasses = {\r\n sm: \"h-10 w-10\", // 40px - 더 넉넉한 크기\r\n md: \"h-12 w-12\", // 48px - 더 넉넉한 크기\r\n lg: \"h-14 w-14\" // 56px - 더 넉넉한 크기\r\n }\r\n\r\n const _iconSizes = {\r\n sm: 16,\r\n md: 20,\r\n lg: 24\r\n }\r\n\r\n // 외부 클릭 시 드롭다운 닫기\r\n React.useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\r\n setIsOpen(false)\r\n }\r\n }\r\n\r\n if (isOpen) {\r\n document.addEventListener(\"mousedown\", handleClickOutside)\r\n }\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside)\r\n }\r\n }, [isOpen])\r\n\r\n const handleLanguageChange = (languageCode: string) => {\r\n onLanguageChange?.(languageCode)\r\n setIsOpen(false)\r\n }\r\n\r\n const renderIcon = () => (\r\n <div className=\"flex items-center justify-center\">\r\n <span className=\"text-lg\">{currentLang.flag}</span>\r\n </div>\r\n )\r\n\r\n if (variant === \"icon\") {\r\n return (\r\n <div ref={dropdownRef} className=\"relative\">\r\n <button\r\n onClick={() => setIsOpen(!isOpen)}\r\n className={merge(\r\n \"inline-flex items-center justify-center rounded-lg transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\",\r\n sizeClasses[size],\r\n className\r\n )}\r\n {...props}\r\n >\r\n {renderIcon()}\r\n </button>\r\n\r\n {isOpen && (\r\n <div className=\"absolute top-full right-0 mt-2 w-48 bg-background rounded-lg shadow-lg border border-border py-2 z-50\">\r\n {languages.map((language) => (\r\n <button\r\n key={language.code}\r\n onClick={() => handleLanguageChange(language.code)}\r\n className={merge(\r\n \"w-full px-4 py-3 text-left hover:bg-muted transition-colors duration-200 flex items-center gap-3\", // 16px, 12px 패딩, 12px 간격\r\n currentLanguage === language.code && \"bg-indigo-50 dark:bg-indigo-900/20 text-indigo-600 dark:text-indigo-400\"\r\n )}\r\n >\r\n <span className=\"text-lg\">{language.flag}</span>\r\n <span className=\"text-sm font-medium\">{language.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n if (variant === \"dropdown\") {\r\n return (\r\n <div ref={dropdownRef} className=\"relative\">\r\n <button\r\n onClick={() => setIsOpen(!isOpen)}\r\n className={merge(\r\n \"inline-flex items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\", // 12px 간격, 16px, 12px 패딩\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"text-lg\">{currentLang.flag}</span>\r\n {showLabel && <span className=\"text-foreground\">{currentLang.name}</span>}\r\n <svg\r\n className={merge(\r\n \"w-4 h-4 transition-transform duration-200\",\r\n isOpen && \"rotate-180\"\r\n )}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n {isOpen && (\r\n <div className=\"absolute top-full right-0 mt-2 w-48 bg-background rounded-lg shadow-lg border border-border py-2 z-50\">\r\n {languages.map((language) => (\r\n <button\r\n key={language.code}\r\n onClick={() => handleLanguageChange(language.code)}\r\n className={merge(\r\n \"w-full px-4 py-3 text-left hover:bg-muted transition-colors duration-200 flex items-center gap-3\", // 16px, 12px 패딩, 12px 간격\r\n currentLanguage === language.code && \"bg-indigo-50 dark:bg-indigo-900/20 text-indigo-600 dark:text-indigo-400\"\r\n )}\r\n >\r\n <span className=\"text-lg\">{language.flag}</span>\r\n <span className=\"text-sm font-medium\">{language.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n // 기본 버튼 형태\r\n return (\r\n <button\r\n onClick={() => {\r\n const currentIndex = languages.findIndex(lang => lang.code === currentLanguage)\r\n const nextIndex = (currentIndex + 1) % languages.length\r\n onLanguageChange?.(languages[nextIndex].code)\r\n }}\r\n className={merge(\r\n \"inline-flex items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\", // 12px 간격, 16px, 12px 패딩\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"text-lg\">{currentLang.flag}</span>\r\n {showLabel && <span className=\"text-foreground\">{currentLang.name}</span>}\r\n </button>\r\n )\r\n }\r\n)\r\nLanguageToggle.displayName = \"LanguageToggle\"\r\n\r\nexport { LanguageToggle } ","'use client'\r\n\r\nimport React, { useState, useEffect } from 'react'\r\nimport { Button } from './Button'\r\nimport { Icon } from './Icon'\r\nimport { merge } from '../lib/utils'\r\nimport type { IconName } from '../lib/icons'\r\n\r\n/**\r\n * ScrollIndicator 컴포넌트의 props / ScrollIndicator component props\r\n * @typedef {Object} ScrollIndicatorProps\r\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\r\n * @property {string} [targetId] - 스크롤 대상 요소 ID / Target element ID to scroll to\r\n * @property {string} [text='Scroll down'] - 표시 텍스트 / Display text\r\n * @property {IconName} [iconName='arrowDown'] - 아이콘 이름 / Icon name\r\n * @property {number} [iconSize=20] - 아이콘 크기 / Icon size\r\n * @property {'bottom-center' | 'bottom-left' | 'bottom-right'} [position='bottom-center'] - 표시 위치 / Display position\r\n * @property {'default' | 'primary' | 'secondary' | 'outline'} [variant='default'] - ScrollIndicator 스타일 변형 / ScrollIndicator style variant\r\n * @property {'sm' | 'md' | 'lg'} [size='md'] - ScrollIndicator 크기 / ScrollIndicator size\r\n * @property {boolean} [animated=true] - 애니메이션 활성화 여부 / Enable animation\r\n * @property {boolean} [autoHide=true] - 자동 숨김 여부 / Auto hide\r\n * @property {number} [hideThreshold=100] - 숨김 임계값 (px) / Hide threshold (px)\r\n */\r\nexport interface ScrollIndicatorProps {\r\n className?: string\r\n targetId?: string\r\n text?: string\r\n iconName?: IconName\r\n iconSize?: number\r\n position?: 'bottom-center' | 'bottom-left' | 'bottom-right'\r\n variant?: 'default' | 'primary' | 'secondary' | 'outline'\r\n size?: 'sm' | 'md' | 'lg'\r\n animated?: boolean\r\n autoHide?: boolean\r\n hideThreshold?: number\r\n}\r\n\r\n/**\r\n * ScrollIndicator 컴포넌트 / ScrollIndicator component\r\n * \r\n * 스크롤 가능함을 나타내는 인디케이터 컴포넌트입니다.\r\n * 클릭 시 지정된 요소로 스크롤하거나 다음 섹션으로 스크롤합니다.\r\n * \r\n * Indicator component that shows scrollability.\r\n * Scrolls to specified element or next section on click.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <ScrollIndicator />\r\n * \r\n * @example\r\n * // 특정 요소로 스크롤 / Scroll to specific element\r\n * <ScrollIndicator \r\n * targetId=\"section-2\"\r\n * text=\"다음 섹션으로\"\r\n * position=\"bottom-right\"\r\n * />\r\n * \r\n * @param {ScrollIndicatorProps} props - ScrollIndicator 컴포넌트의 props / ScrollIndicator component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} ScrollIndicator 컴포넌트 / ScrollIndicator component\r\n */\r\nconst ScrollIndicator = React.forwardRef<HTMLDivElement, ScrollIndicatorProps>(({\r\n className,\r\n targetId,\r\n text = 'Scroll down',\r\n iconName = 'arrowDown',\r\n iconSize = 20,\r\n position = 'bottom-center',\r\n variant = 'default',\r\n size = 'md',\r\n animated = true,\r\n autoHide = true,\r\n hideThreshold = 100,\r\n ...props\r\n}, ref) => {\r\n const [isVisible, setIsVisible] = useState(true)\r\n\r\n useEffect(() => {\r\n if (!autoHide) return\r\n\r\n const handleScroll = () => {\r\n const scrollTop = window.scrollY\r\n setIsVisible(scrollTop < hideThreshold)\r\n }\r\n\r\n // 초기 실행\r\n handleScroll()\r\n\r\n window.addEventListener('scroll', handleScroll, { passive: true })\r\n return () => window.removeEventListener('scroll', handleScroll)\r\n }, [autoHide, hideThreshold])\r\n\r\n const scrollToTarget = () => {\r\n if (targetId) {\r\n const targetElement = document.getElementById(targetId)\r\n if (targetElement) {\r\n targetElement.scrollIntoView({ behavior: 'smooth' })\r\n }\r\n } else {\r\n // 기본적으로 다음 섹션으로 스크롤\r\n const currentSection = ref as React.RefObject<HTMLDivElement>\r\n if (currentSection.current) {\r\n const nextSection = currentSection.current.nextElementSibling\r\n if (nextSection) {\r\n nextSection.scrollIntoView({ behavior: 'smooth' })\r\n }\r\n }\r\n }\r\n }\r\n\r\n const positionClasses = {\r\n 'bottom-center': 'bottom-8 left-1/2 transform -translate-x-1/2',\r\n 'bottom-left': 'bottom-8 left-8',\r\n 'bottom-right': 'bottom-8 right-8'\r\n }\r\n\r\n const sizeClasses = {\r\n sm: 'text-sm',\r\n md: 'text-base',\r\n lg: 'text-lg'\r\n }\r\n\r\n const variantClasses = {\r\n default: 'text-muted-foreground hover:text-foreground',\r\n primary: 'text-primary hover:text-primary/80',\r\n secondary: 'text-secondary-foreground hover:text-secondary-foreground/80',\r\n outline: 'text-foreground hover:text-foreground'\r\n }\r\n\r\n if (!isVisible) return null\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n 'absolute z-10',\r\n positionClasses[position],\r\n className\r\n )}\r\n {...props}\r\n >\r\n <Button\r\n onClick={scrollToTarget}\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className={merge(\r\n 'flex flex-col items-center space-y-2 transition-all duration-300',\r\n sizeClasses[size],\r\n variantClasses[variant],\r\n animated && 'animate-in fade-in-0 slide-in-from-bottom-2 duration-500'\r\n )}\r\n aria-label={text}\r\n >\r\n <span className=\"text-xs opacity-80\">{text}</span>\r\n <Icon\r\n name={iconName}\r\n size={iconSize}\r\n className={merge(\r\n animated && 'animate-bounce'\r\n )}\r\n />\r\n </Button>\r\n </div>\r\n )\r\n})\r\n\r\nScrollIndicator.displayName = 'ScrollIndicator'\r\n\r\nexport { ScrollIndicator } ","'use client'\r\n\r\nimport React, { useState, useEffect } from 'react'\r\nimport { merge } from '../lib/utils'\r\n\r\n/**\r\n * ScrollProgress 컴포넌트의 props / ScrollProgress component props\r\n * @typedef {Object} ScrollProgressProps\r\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\r\n * @property {number} [height=2] - 진행률 바 높이 (px) / Progress bar height (px)\r\n * @property {'default' | 'primary' | 'secondary' | 'gradient'} [color='gradient'] - 진행률 바 색상 / Progress bar color\r\n * @property {'top' | 'bottom'} [position='top'] - 표시 위치 / Display position\r\n * @property {boolean} [animated=true] - 애니메이션 활성화 여부 / Enable animation\r\n * @property {boolean} [showPercentage=false] - 퍼센트 표시 여부 / Show percentage\r\n */\r\nexport interface ScrollProgressProps {\r\n className?: string\r\n height?: number\r\n color?: 'default' | 'primary' | 'secondary' | 'gradient'\r\n position?: 'top' | 'bottom'\r\n animated?: boolean\r\n showPercentage?: boolean\r\n}\r\n\r\n/**\r\n * ScrollProgress 컴포넌트 / ScrollProgress component\r\n * \r\n * 페이지 스크롤 진행률을 표시하는 컴포넌트입니다.\r\n * 페이지 상단 또는 하단에 고정되어 표시됩니다.\r\n * \r\n * Component that displays page scroll progress.\r\n * Fixed at top or bottom of the page.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <ScrollProgress />\r\n * \r\n * @example\r\n * // 하단에 표시, 퍼센트 포함 / Display at bottom with percentage\r\n * <ScrollProgress \r\n * position=\"bottom\"\r\n * color=\"primary\"\r\n * showPercentage\r\n * height={4}\r\n * />\r\n * \r\n * @param {ScrollProgressProps} props - ScrollProgress 컴포넌트의 props / ScrollProgress component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} ScrollProgress 컴포넌트 / ScrollProgress component\r\n */\r\nconst ScrollProgress = React.forwardRef<HTMLDivElement, ScrollProgressProps>(({\r\n className,\r\n height = 2,\r\n color = 'gradient',\r\n position = 'top',\r\n animated: _animated = true,\r\n showPercentage = false,\r\n ...props\r\n}, ref) => {\r\n const [progress, setProgress] = useState(0)\r\n\r\n useEffect(() => {\r\n const updateProgress = () => {\r\n const scrollTop = window.scrollY\r\n const docHeight = document.documentElement.scrollHeight - window.innerHeight\r\n const currentProgress = docHeight > 0 ? (scrollTop / docHeight) * 100 : 0\r\n setProgress(currentProgress)\r\n }\r\n\r\n // 초기 실행\r\n updateProgress()\r\n\r\n window.addEventListener('scroll', updateProgress, { passive: true })\r\n window.addEventListener('resize', updateProgress, { passive: true })\r\n \r\n return () => {\r\n window.removeEventListener('scroll', updateProgress)\r\n window.removeEventListener('resize', updateProgress)\r\n }\r\n }, [])\r\n\r\n // 색상 옵션 (Teal 브랜드 기반)\r\n const progressColors: Record<string, string> = {\r\n default: 'bg-foreground',\r\n primary: 'bg-primary',\r\n secondary: 'bg-muted-foreground',\r\n gradient: 'bg-gradient-to-r from-teal-600 via-cyan-500 to-teal-600'\r\n }\r\n\r\n const positionClasses = {\r\n top: 'top-0 left-0 right-0',\r\n bottom: 'bottom-0 left-0 right-0'\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n 'fixed z-50',\r\n positionClasses[position],\r\n className\r\n )}\r\n style={{ height: `${height}px` }}\r\n {...props}\r\n >\r\n {/* 배경 바 */}\r\n <div className=\"absolute inset-0 w-full h-full bg-border/30\" />\r\n \r\n {/* 진행률 바 - absolute로 배경 위에 표시 */}\r\n <div\r\n className={merge(\r\n 'absolute top-0 left-0 h-full origin-left transition-all duration-100 ease-out',\r\n progressColors[color] || progressColors.gradient\r\n )}\r\n style={{\r\n width: `${progress}%`,\r\n transformOrigin: 'left'\r\n }}\r\n />\r\n \r\n {/* 퍼센트 표시 (선택사항) */}\r\n {showPercentage && (\r\n <div className=\"absolute top-2 right-2 text-xs text-muted-foreground bg-card px-2 py-1 rounded border border-border\">\r\n {Math.round(progress)}%\r\n </div>\r\n )}\r\n </div>\r\n )\r\n})\r\n\r\nScrollProgress.displayName = 'ScrollProgress'\r\n\r\nexport { ScrollProgress } ","import React from \"react\"\r\nimport { merge } from \"../../lib/utils\"\r\n\r\nexport interface ScrollbarProps extends React.HTMLAttributes<HTMLDivElement> {\r\n children: React.ReactNode\r\n variant?: \"default\" | \"glass\" | \"colorful\" | \"minimal\" | \"neon\"\r\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\"\r\n orientation?: \"vertical\" | \"horizontal\" | \"both\"\r\n autoHide?: boolean\r\n smooth?: boolean\r\n}\r\n\r\nconst Scrollbar = React.forwardRef<HTMLDivElement, ScrollbarProps>(\r\n ({ \r\n className, \r\n variant = \"default\", \r\n size = \"md\", \r\n orientation = \"both\", \r\n autoHide = true, \r\n smooth = true, \r\n children, \r\n ...props \r\n }, ref) => {\r\n \r\n const getVariantClasses = () => {\r\n switch (variant) {\r\n case \"glass\":\r\n return \"scrollbar-thumb-white/20 hover:scrollbar-thumb-white/30 backdrop-blur-sm\"\r\n case \"colorful\":\r\n return \"scrollbar-thumb-gradient-to-b scrollbar-thumb-from-indigo-500 scrollbar-thumb-to-purple-500 hover:scrollbar-thumb-from-cyan-600 hover:scrollbar-thumb-to-purple-600\"\r\n case \"minimal\":\r\n return \"scrollbar-thumb-slate-200/50 hover:scrollbar-thumb-slate-300/70 dark:scrollbar-thumb-slate-700/50 dark:hover:scrollbar-thumb-slate-600/70\"\r\n case \"neon\":\r\n return \"scrollbar-thumb-cyan-400/60 hover:scrollbar-thumb-cyan-300/80 scrollbar-thumb-shadow-lg scrollbar-thumb-shadow-cyan-500/25\"\r\n default:\r\n return \"scrollbar-thumb-slate-300 hover:scrollbar-thumb-slate-400 dark:scrollbar-thumb-slate-600 dark:hover:scrollbar-thumb-slate-500\"\r\n }\r\n }\r\n\r\n const getSizeClasses = () => {\r\n switch (size) {\r\n case \"sm\":\r\n return \"scrollbar-w-1\"\r\n case \"lg\":\r\n return \"scrollbar-w-3\"\r\n case \"xl\":\r\n return \"scrollbar-w-4\"\r\n default:\r\n return \"scrollbar-w-2\"\r\n }\r\n }\r\n\r\n const getOrientationClasses = () => {\r\n switch (orientation) {\r\n case \"vertical\":\r\n return \"overflow-y-auto overflow-x-hidden\"\r\n case \"horizontal\":\r\n return \"overflow-x-auto overflow-y-hidden\"\r\n default:\r\n return \"overflow-auto\"\r\n }\r\n }\r\n\r\n const baseClasses = merge(\r\n \"scrollbar-thin scrollbar-track-transparent scrollbar-thumb-rounded-full transition-all duration-200\",\r\n getVariantClasses(),\r\n getSizeClasses(),\r\n getOrientationClasses(),\r\n autoHide && \"scrollbar-hide\",\r\n smooth && \"scroll-smooth\",\r\n className\r\n )\r\n\r\n return (\r\n <div\r\n className={baseClasses}\r\n ref={ref}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n }\r\n)\r\nScrollbar.displayName = \"Scrollbar\"\r\n\r\nexport { Scrollbar } ","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\nimport { Icon } from \"./Icon\"\r\nimport type { AllIconName } from \"../lib/icon-names\"\r\n\r\n/**\r\n * FeatureCard 아이콘 타입 / FeatureCard icon type\r\n * - AllIconName: icons.ts + PROJECT_ICONS의 모든 아이콘 / All icons from icons.ts + PROJECT_ICONS\r\n * - `http${string}`: 이미지 URL / Image URL\r\n */\r\ntype FeatureCardIconType = AllIconName | `http${string}`\r\n\r\n/**\r\n * FeatureCard 컴포넌트의 props / FeatureCard component props\r\n * @typedef {Object} FeatureCardProps\r\n * @property {FeatureCardIconType} [icon] - 아이콘 (IconName, ProjectIconName 또는 이미지 URL) / Icon (IconName, ProjectIconName or image URL)\r\n * @property {string} title - 카드 제목 / Card title\r\n * @property {string} description - 카드 설명 / Card description\r\n * @property {\"default\" | \"gradient\" | \"glass\" | \"neon\"} [variant=\"default\"] - FeatureCard 스타일 변형 / FeatureCard style variant\r\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - FeatureCard 크기 / FeatureCard size\r\n * @property {\"scale\" | \"glow\" | \"slide\" | \"none\"} [hover=\"scale\"] - 호버 효과 / Hover effect\r\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"} [gradient=\"blue\"] - 그라디언트 색상 / Gradient color\r\n * @property {string} [customGradient] - 커스텀 그라디언트 클래스 / Custom gradient class\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface FeatureCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n icon?: FeatureCardIconType\r\n title: string\r\n description: string\r\n variant?: \"default\" | \"gradient\" | \"glass\" | \"neon\"\r\n size?: \"sm\" | \"md\" | \"lg\"\r\n hover?: \"scale\" | \"glow\" | \"slide\" | \"none\"\r\n gradient?: \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"\r\n customGradient?: string\r\n}\r\n\r\n/**\r\n * FeatureCard 컴포넌트 / FeatureCard component\r\n * \r\n * 기능을 소개하는 카드 컴포넌트입니다.\r\n * 아이콘, 제목, 설명을 포함하며, 다양한 스타일과 호버 효과를 지원합니다.\r\n * \r\n * Card component that introduces features.\r\n * Includes icon, title, and description, supports various styles and hover effects.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <FeatureCard\r\n * icon=\"star\"\r\n * title=\"고급 기능\"\r\n * description=\"강력한 기능을 제공합니다\"\r\n * />\r\n * \r\n * @example\r\n * // Gradient 스타일 / Gradient style\r\n * <FeatureCard\r\n * icon=\"zap\"\r\n * title=\"빠른 성능\"\r\n * description=\"최적화된 성능\"\r\n * variant=\"gradient\"\r\n * gradient=\"purple\"\r\n * hover=\"glow\"\r\n * />\r\n * \r\n * @param {FeatureCardProps} props - FeatureCard 컴포넌트의 props / FeatureCard component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} FeatureCard 컴포넌트 / FeatureCard component\r\n */\r\nconst FeatureCard = React.forwardRef<HTMLDivElement, FeatureCardProps>(\r\n ({ \r\n className, \r\n icon, \r\n title, \r\n description, \r\n variant = \"default\", \r\n size = \"md\",\r\n hover = \"scale\",\r\n gradient = \"blue\",\r\n customGradient,\r\n ...props \r\n }, ref) => {\r\n const sizeClasses = {\r\n sm: \"p-4\",\r\n md: \"p-6\",\r\n lg: \"p-8\"\r\n }\r\n\r\n const variantClasses = {\r\n default: \"bg-background/90 backdrop-blur-sm border border-border/50\",\r\n gradient: `bg-gradient-to-br ${customGradient || getGradientClass(gradient)}`,\r\n glass: \"bg-white/10 dark:bg-gray-800/10 backdrop-blur-md border border-white/20 dark:border-gray-700/20\",\r\n neon: \"bg-gray-900/90 dark:bg-gray-900/90 border border-cyan-400/30 dark:border-cyan-400/30 shadow-lg shadow-cyan-400/20\"\r\n }\r\n\r\n const hoverClasses = {\r\n scale: \"hover:scale-105 transition-transform duration-300\",\r\n glow: \"hover:shadow-2xl hover:shadow-cyan-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300\",\r\n slide: \"hover:-translate-y-2 transition-transform duration-300\",\r\n none: \"\"\r\n }\r\n\r\n const iconSize = size === \"lg\" ? \"text-5xl\" : size === \"md\" ? \"text-4xl\" : \"text-3xl\"\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={merge(\r\n \"rounded-2xl shadow-lg transition-all duration-300 flex flex-col items-center text-center\",\r\n sizeClasses[size],\r\n variantClasses[variant],\r\n hoverClasses[hover],\r\n className\r\n )}\r\n {...props}\r\n >\r\n {icon && (\r\n <div className={`mb-4 ${iconSize} ${variant === \"neon\" ? \"text-cyan-400\" : \"\"}`}>\r\n {typeof icon === \"string\" && icon.startsWith(\"http\") ? (\r\n <img src={icon} alt={title} className=\"w-full h-full object-contain\" />\r\n ) : (\r\n <Icon name={icon as AllIconName} className=\"w-full h-full\" />\r\n )}\r\n </div>\r\n )}\r\n \r\n <h3 className={merge(\r\n \"font-bold mb-2\",\r\n size === \"lg\" ? \"text-2xl\" : size === \"md\" ? \"text-xl\" : \"text-lg\",\r\n variant === \"gradient\" ? \"text-white\" : \"text-foreground\"\r\n )}>\r\n {title}\r\n </h3>\r\n \r\n <p className={merge(\r\n size === \"lg\" ? \"text-base\" : \"text-sm\",\r\n variant === \"gradient\" ? \"text-white/90\" : \"text-muted-foreground\"\r\n )}>\r\n {description}\r\n </p>\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nFeatureCard.displayName = \"FeatureCard\"\r\n\r\nfunction getGradientClass(gradient: string): string {\r\n const gradients = {\r\n blue: \"from-indigo-500 via-cyan-500 to-cyan-600\",\r\n purple: \"from-purple-500 via-pink-500 to-purple-600\",\r\n green: \"from-green-500 via-emerald-500 to-green-600\",\r\n orange: \"from-orange-500 via-red-500 to-orange-600\",\r\n pink: \"from-pink-500 via-rose-500 to-pink-600\"\r\n }\r\n return gradients[gradient as keyof typeof gradients] || gradients.blue\r\n}\r\n\r\nexport { FeatureCard } ","\"use client\"\n\nimport React, { useState, useEffect, useCallback } from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Button } from \"./Button\"\n\n/**\n * 슬라이드 아이템 인터페이스\n */\nexport interface HeroSlide {\n title: string\n subtitle?: string\n description: string\n primaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n secondaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n background?: \"none\" | \"gradient\" | \"particles\" | \"image\"\n backgroundImage?: string\n}\n\n/**\n * HeroSection 컴포넌트의 props\n */\nexport interface HeroSectionProps extends React.HTMLAttributes<HTMLElement> {\n // 단일 모드 props\n title?: string\n subtitle?: string\n description?: string\n primaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n secondaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n // 슬라이드 모드 props\n slides?: HeroSlide[]\n autoPlay?: boolean\n interval?: number\n indicator?: \"dots\" | \"line\" | \"numbers\" | \"none\"\n showControls?: boolean\n pauseOnHover?: boolean\n // 공통 props\n background?: \"none\" | \"gradient\" | \"particles\" | \"video\" | \"image\"\n customBackground?: string\n /**\n * 히어로 섹션 크기\n * - sm: 400px, md: 500px, lg: 600px, xl: 700px\n * - full: 100vh (뷰포트 전체)\n */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n /**\n * 헤더 뒤까지 확장 (fixed header가 있을 때)\n * true면 -mt-16 적용되어 헤더 뒤로 들어감\n */\n fullBleed?: boolean\n}\n\n/**\n * HeroSection 컴포넌트\n *\n * 단일 히어로 또는 슬라이드 히어로를 지원합니다.\n * slides prop이 있으면 슬라이드 모드로 동작합니다.\n */\nconst HeroSection = React.forwardRef<HTMLElement, HeroSectionProps>(\n ({\n className,\n // 단일 모드\n title,\n subtitle,\n description,\n primaryAction,\n secondaryAction,\n // 슬라이드 모드\n slides,\n autoPlay = false,\n interval = 5000,\n indicator = \"dots\",\n showControls = true,\n pauseOnHover = true,\n // 공통\n background = \"gradient\",\n customBackground,\n size = \"lg\",\n fullBleed = false,\n ...props\n }, ref) => {\n const [currentSlide, setCurrentSlide] = useState(0)\n const [isPaused, setIsPaused] = useState(false)\n\n // 슬라이드 모드 여부\n const isSlideMode = slides && slides.length > 0\n const slideCount = slides?.length || 0\n\n // 다음 슬라이드\n const nextSlide = useCallback(() => {\n if (!isSlideMode) return\n setCurrentSlide((prev) => (prev + 1) % slideCount)\n }, [isSlideMode, slideCount])\n\n // 이전 슬라이드\n const prevSlide = useCallback(() => {\n if (!isSlideMode) return\n setCurrentSlide((prev) => (prev - 1 + slideCount) % slideCount)\n }, [isSlideMode, slideCount])\n\n // 특정 슬라이드로 이동\n const goToSlide = useCallback((index: number) => {\n setCurrentSlide(index)\n }, [])\n\n // 자동 재생\n useEffect(() => {\n if (!autoPlay || !isSlideMode || isPaused) return\n\n const timer = setInterval(nextSlide, interval)\n return () => clearInterval(timer)\n }, [autoPlay, isSlideMode, isPaused, interval, nextSlide])\n\n // 현재 표시할 콘텐츠\n const currentContent = isSlideMode ? slides[currentSlide] : {\n title: title || \"\",\n subtitle,\n description: description || \"\",\n primaryAction,\n secondaryAction,\n background,\n }\n\n const sizeClasses = {\n sm: \"min-h-[400px]\",\n md: \"min-h-[500px]\",\n lg: \"min-h-[600px]\",\n xl: \"min-h-[700px]\",\n full: \"min-h-screen\"\n }\n\n const titleSizeClasses = {\n sm: \"text-2xl sm:text-3xl md:text-4xl leading-tight\",\n md: \"text-3xl sm:text-4xl md:text-5xl leading-tight\",\n lg: \"text-3xl sm:text-4xl md:text-5xl lg:text-6xl leading-tight\",\n xl: \"text-3xl sm:text-4xl md:text-5xl lg:text-6xl leading-tight\",\n full: \"text-4xl sm:text-5xl md:text-6xl lg:text-7xl leading-tight\"\n }\n\n const subtitleSizeClasses = {\n sm: \"text-base sm:text-lg md:text-xl leading-snug\",\n md: \"text-lg sm:text-xl md:text-2xl leading-snug\",\n lg: \"text-lg sm:text-xl md:text-2xl lg:text-3xl leading-snug\",\n xl: \"text-xl sm:text-2xl md:text-3xl leading-snug\",\n full: \"text-xl sm:text-2xl md:text-3xl lg:text-4xl leading-snug\"\n }\n\n const descriptionSizeClasses = {\n sm: \"text-sm sm:text-base md:text-lg leading-relaxed\",\n md: \"text-base sm:text-lg md:text-xl leading-relaxed\",\n lg: \"text-base sm:text-lg md:text-xl leading-relaxed\",\n xl: \"text-base sm:text-lg md:text-xl leading-relaxed\",\n full: \"text-lg sm:text-xl md:text-2xl leading-relaxed\"\n }\n\n const currentBg = isSlideMode ? (currentContent.background || background) : background\n\n const backgroundContent: Record<string, React.ReactNode> = {\n none: null,\n gradient: (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n {/* 왼쪽 위 - 메인 그라데이션 */}\n <div className=\"absolute top-0 left-0 w-80 h-80 sm:w-96 sm:h-96 md:w-[500px] md:h-[500px] -translate-x-1/3 -translate-y-1/3 rounded-full bg-gradient-to-br from-teal-400 via-cyan-500 to-teal-600 opacity-40 blur-3xl\" />\n {/* 오른쪽 아래 - 보조 그라데이션 */}\n <div className=\"absolute bottom-0 right-0 w-72 h-72 sm:w-80 sm:h-80 md:w-[400px] md:h-[400px] translate-x-1/4 translate-y-1/4 rounded-full bg-gradient-to-tr from-cyan-400 via-teal-500 to-emerald-500 opacity-35 blur-3xl\" />\n {/* 중앙 액센트 */}\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-48 h-48 sm:w-64 sm:h-64 md:w-80 md:h-80 rounded-full bg-teal-500/20 blur-2xl\" />\n </div>\n ),\n particles: (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <div className=\"absolute inset-0 bg-gradient-to-br from-secondary/50 via-background to-secondary/30\" />\n </div>\n ),\n video: customBackground ? (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <video\n autoPlay\n loop\n muted\n playsInline\n className=\"absolute inset-0 w-full h-full object-cover opacity-20\"\n >\n <source src={customBackground} type=\"video/mp4\" />\n </video>\n </div>\n ) : null,\n image: (customBackground || (isSlideMode && (currentContent as HeroSlide).backgroundImage)) ? (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <img\n src={(isSlideMode && (currentContent as HeroSlide).backgroundImage) || customBackground}\n alt=\"\"\n className=\"absolute inset-0 w-full h-full object-cover opacity-30\"\n />\n <div className=\"absolute inset-0 bg-gradient-to-t from-background via-background/50 to-transparent\" />\n </div>\n ) : null,\n }\n\n // 인디케이터 렌더링\n const renderIndicator = () => {\n if (!isSlideMode || indicator === \"none\") return null\n\n switch (indicator) {\n case \"dots\":\n return (\n <div className=\"flex gap-2 justify-center mt-8\">\n {slides.map((_, index) => (\n <button\n key={index}\n onClick={() => goToSlide(index)}\n className={merge(\n \"w-2.5 h-2.5 rounded-full transition-all duration-300\",\n currentSlide === index\n ? \"bg-primary w-8\"\n : \"bg-muted-foreground/30 hover:bg-muted-foreground/50\"\n )}\n aria-label={`Go to slide ${index + 1}`}\n />\n ))}\n </div>\n )\n\n case \"line\":\n return (\n <div className=\"flex gap-1 justify-center mt-8 max-w-xs mx-auto\">\n {slides.map((_, index) => (\n <button\n key={index}\n onClick={() => goToSlide(index)}\n className=\"flex-1 h-1 rounded-full overflow-hidden bg-muted-foreground/20\"\n aria-label={`Go to slide ${index + 1}`}\n >\n <div\n className={merge(\n \"h-full bg-primary transition-all duration-300\",\n currentSlide === index ? \"w-full\" : \"w-0\"\n )}\n />\n </button>\n ))}\n </div>\n )\n\n case \"numbers\":\n return (\n <div className=\"flex items-center justify-center gap-2 mt-8 text-sm text-muted-foreground\">\n <span className=\"text-foreground font-semibold\">{currentSlide + 1}</span>\n <span>/</span>\n <span>{slideCount}</span>\n </div>\n )\n\n default:\n return null\n }\n }\n\n return (\n <section\n ref={ref}\n className={merge(\n \"relative w-full flex flex-col justify-center items-center text-center px-4 sm:px-6 lg:px-8 overflow-hidden\",\n sizeClasses[size],\n fullBleed && \"-mt-16 pt-16\",\n className\n )}\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\n {...props}\n >\n {backgroundContent[currentBg]}\n\n {/* 슬라이드 콘텐츠 */}\n <div className=\"relative z-10 max-w-4xl mx-auto\">\n <div\n key={isSlideMode ? currentSlide : 0}\n className=\"animate-in fade-in slide-in-from-bottom-4 duration-500\"\n >\n <h1 className={merge(\n \"font-extrabold mb-4 sm:mb-6 text-foreground\",\n titleSizeClasses[size]\n )}>\n <span className=\"block gradient-text\">\n {currentContent.title}\n </span>\n {currentContent.subtitle && (\n <span className={merge(\n \"block font-semibold mt-2 sm:mt-4 text-muted-foreground\",\n subtitleSizeClasses[size]\n )}>\n {currentContent.subtitle}\n </span>\n )}\n </h1>\n\n <div className={merge(\n \"text-muted-foreground mb-6 sm:mb-8 md:mb-10 max-w-2xl mx-auto\",\n descriptionSizeClasses[size]\n )}>\n {currentContent.description.split('\\n').map((line, i, arr) => (\n <React.Fragment key={i}>\n {line}\n {i < arr.length - 1 && <br />}\n </React.Fragment>\n ))}\n </div>\n\n {(currentContent.primaryAction || currentContent.secondaryAction) && (\n <div className=\"flex flex-col sm:flex-row gap-4 justify-center\">\n {currentContent.primaryAction && (\n <Button\n href={currentContent.primaryAction.href}\n size={size === \"xl\" || size === \"full\" ? \"lg\" : \"md\"}\n hover=\"scale\"\n className=\"inline-flex items-center gap-2\"\n >\n {currentContent.primaryAction.icon}\n {currentContent.primaryAction.label}\n </Button>\n )}\n\n {currentContent.secondaryAction && (\n <Button\n href={currentContent.secondaryAction.href}\n variant=\"outline\"\n size={size === \"xl\" || size === \"full\" ? \"lg\" : \"md\"}\n hover=\"scale\"\n className=\"inline-flex items-center gap-2\"\n >\n {currentContent.secondaryAction.icon}\n {currentContent.secondaryAction.label}\n </Button>\n )}\n </div>\n )}\n </div>\n\n {/* 인디케이터 */}\n {renderIndicator()}\n </div>\n\n {/* 좌우 컨트롤 */}\n {isSlideMode && showControls && slideCount > 1 && (\n <>\n <button\n onClick={prevSlide}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 z-20 p-2 rounded-full bg-card/80 backdrop-blur-sm border border-border text-foreground hover:bg-card transition-colors\"\n aria-label=\"Previous slide\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <button\n onClick={nextSlide}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 z-20 p-2 rounded-full bg-card/80 backdrop-blur-sm border border-border text-foreground hover:bg-card transition-colors\"\n aria-label=\"Next slide\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </>\n )}\n </section>\n )\n }\n)\n\nHeroSection.displayName = \"HeroSection\"\n\nexport { HeroSection }\n","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { merge } from \"../lib/utils\"\r\nimport { Icon } from \"./Icon\"\r\nimport type { IconName } from \"../lib/icons\"\r\n\r\n/**\r\n * InfoCard 컴포넌트의 props / InfoCard component props\r\n * @typedef {Object} InfoCardProps\r\n * @property {string} title - 카드 제목 / Card title\r\n * @property {IconName} icon - 카드 아이콘 / Card icon\r\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\"} [tone=\"blue\"] - InfoCard 톤 색상 / InfoCard tone color\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface InfoCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n title: string\r\n icon: IconName\r\n tone?: \"blue\" | \"purple\" | \"green\" | \"orange\"\r\n}\r\n\r\nconst toneClasses: Record<NonNullable<InfoCardProps[\"tone\"]>, { container: string; icon: string; title: string; body: string }> = {\r\n blue: {\r\n container: \"bg-gradient-to-r from-indigo-50 to-indigo-50 dark:from-indigo-900/20 dark:to-indigo-900/20 rounded-lg p-4 border border-indigo-200 dark:border-indigo-700\",\r\n icon: \"h-5 w-5 text-indigo-600 dark:text-indigo-400 mr-3 mt-0.5 flex-shrink-0\",\r\n title: \"text-sm font-medium text-indigo-900 dark:text-indigo-100 mb-2 block\",\r\n body: \"text-foreground text-sm leading-relaxed\",\r\n },\r\n purple: {\r\n container: \"bg-gradient-to-r from-purple-50 to-pink-50 dark:from-purple-900/20 dark:to-pink-900/20 rounded-lg p-4 border border-purple-200 dark:border-purple-700\",\r\n icon: \"h-5 w-5 text-purple-600 dark:text-purple-400 mr-3 mt-0.5 flex-shrink-0\",\r\n title: \"text-sm font-medium text-purple-900 dark:text-purple-100 mb-2 block\",\r\n body: \"text-foreground text-sm leading-relaxed\",\r\n },\r\n green: {\r\n container: \"bg-gradient-to-r from-green-50 to-emerald-50 dark:from-green-900/20 dark:to-emerald-900/20 rounded-lg p-4 border border-green-200 dark:border-green-700\",\r\n icon: \"h-5 w-5 text-green-600 dark:text-green-400 mr-3 mt-0.5 flex-shrink-0\",\r\n title: \"text-sm font-medium text-green-900 dark:text-green-100 mb-2 block\",\r\n body: \"text-foreground text-sm leading-relaxed\",\r\n },\r\n orange: {\r\n container: \"bg-gradient-to-r from-orange-50 to-rose-50 dark:from-orange-900/20 dark:to-rose-900/20 rounded-lg p-4 border border-orange-200 dark:border-orange-700\",\r\n icon: \"h-5 w-5 text-orange-600 dark:text-orange-400 mr-3 mt-0.5 flex-shrink-0\",\r\n title: \"text-sm font-medium text-orange-900 dark:text-orange-100 mb-2 block\",\r\n body: \"text-foreground text-sm leading-relaxed\",\r\n },\r\n}\r\n\r\n/**\r\n * InfoCard 컴포넌트 / InfoCard component\r\n * \r\n * 정보를 표시하는 카드 컴포넌트입니다.\r\n * 아이콘, 제목, 내용을 포함하며, 다양한 톤 색상을 지원합니다.\r\n * \r\n * Card component that displays information.\r\n * Includes icon, title, and content, supports various tone colors.\r\n * \r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <InfoCard\r\n * icon=\"info\"\r\n * title=\"정보\"\r\n * tone=\"blue\"\r\n * >\r\n * 이것은 정보 카드입니다.\r\n * </InfoCard>\r\n * \r\n * @example\r\n * // 다양한 톤 / Various tones\r\n * <InfoCard icon=\"check\" title=\"성공\" tone=\"green\">\r\n * 작업이 완료되었습니다.\r\n * </InfoCard>\r\n * \r\n * @param {InfoCardProps} props - InfoCard 컴포넌트의 props / InfoCard component props\r\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\r\n * @returns {JSX.Element} InfoCard 컴포넌트 / InfoCard component\r\n */\r\nexport const InfoCard = React.forwardRef<HTMLDivElement, InfoCardProps>(({ className, title, icon, tone = \"blue\", children, ...props }, ref) => {\r\n const t = toneClasses[tone]\r\n return (\r\n <div ref={ref} className={merge(t.container, className)} {...props}>\r\n <div className=\"flex items-start mb-2\">\r\n <Icon name={icon} className={t.icon} />\r\n <div className=\"flex-1\">\r\n <span className={t.title}>{title}</span>\r\n <div className={t.body}>{children}</div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n})\r\n\r\nInfoCard.displayName = \"InfoCard\"\r\n\r\nexport default InfoCard\r\n\r\n\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { merge } from \"../lib/utils\";\r\nimport { Icon } from \"./Icon\";\r\nimport type { IconName } from \"../lib/icons\";\r\n\r\n/**\r\n * 타임라인 아이템 상태 타입 / Timeline item status type\r\n * @typedef {\"pending\" | \"active\" | \"completed\" | \"error\" | \"warning\" | \"info\"} TimelineStatus\r\n */\r\nexport type TimelineStatus = \"pending\" | \"active\" | \"completed\" | \"error\" | \"warning\" | \"info\";\r\n\r\n/**\r\n * 타임라인 아이템 인터페이스 / TimelineItem interface\r\n * @typedef {Object} TimelineItem\r\n * @property {string} id - 아이템 고유 ID / Item unique ID\r\n * @property {string} title - 제목 / Title\r\n * @property {string} [description] - 설명 / Description\r\n * @property {TimelineStatus} [status=\"pending\"] - 상태 / Status\r\n * @property {string | Date} [date] - 날짜 / Date\r\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\r\n * @property {string} [meta] - 메타 정보 / Meta information\r\n * @property {React.ReactNode} [content] - 추가 컨텐츠 / Additional content\r\n */\r\nexport interface TimelineItem {\r\n id: string;\r\n title: string;\r\n description?: string;\r\n status?: TimelineStatus;\r\n date?: string | Date;\r\n icon?: IconName | React.ReactNode;\r\n meta?: string;\r\n content?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Timeline 컴포넌트의 props / Timeline component props\r\n * @typedef {Object} TimelineProps\r\n * @property {TimelineItem[]} items - 타임라인 아이템 배열 / Timeline items array\r\n * @property {\"vertical\" | \"horizontal\"} [orientation=\"vertical\"] - 방향 / Orientation\r\n * @property {\"left\" | \"right\" | \"alternate\"} [align=\"left\"] - 정렬 / Alignment\r\n * @property {string} [highlightedId] - 강조할 아이템 ID / Highlighted item ID\r\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\r\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\r\n * @property {boolean} [showConnector=true] - 연결선 표시 / Show connector\r\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface TimelineProps extends React.HTMLAttributes<HTMLDivElement> {\r\n items: TimelineItem[];\r\n orientation?: \"vertical\" | \"horizontal\";\r\n align?: \"left\" | \"right\" | \"alternate\";\r\n highlightedId?: string;\r\n locale?: string;\r\n emptyState?: React.ReactNode;\r\n showConnector?: boolean;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\nconst STATUS_CONFIG: Record<\r\n TimelineStatus,\r\n { dot: string; border: string; text: string; label: string; labelEn: string }\r\n> = {\r\n completed: {\r\n dot: \"bg-emerald-500 border-emerald-500 shadow-[0_0_8px_rgba(16,185,129,0.4)]\",\r\n border: \"border-emerald-200 dark:border-emerald-500/40\",\r\n text: \"text-emerald-700 dark:text-emerald-300 bg-emerald-50 dark:bg-emerald-500/10\",\r\n label: \"완료\",\r\n labelEn: \"Completed\",\r\n },\r\n active: {\r\n dot: \"bg-sky-500 border-sky-500 shadow-[0_0_8px_rgba(14,165,233,0.4)] animate-pulse\",\r\n border: \"border-sky-200 dark:border-sky-500/40\",\r\n text: \"text-sky-700 dark:text-sky-200 bg-sky-50 dark:bg-sky-500/10\",\r\n label: \"진행 중\",\r\n labelEn: \"Active\",\r\n },\r\n pending: {\r\n dot: \"bg-muted-foreground/40 border-muted-foreground/40\",\r\n border: \"border-border\",\r\n text: \"text-muted-foreground bg-muted\",\r\n label: \"대기\",\r\n labelEn: \"Pending\",\r\n },\r\n error: {\r\n dot: \"bg-rose-500 border-rose-500 shadow-[0_0_8px_rgba(244,63,94,0.4)]\",\r\n border: \"border-rose-200 dark:border-rose-500/40\",\r\n text: \"text-rose-700 dark:text-rose-300 bg-rose-50 dark:bg-rose-500/10\",\r\n label: \"오류\",\r\n labelEn: \"Error\",\r\n },\r\n warning: {\r\n dot: \"bg-amber-500 border-amber-500 shadow-[0_0_8px_rgba(245,158,11,0.4)]\",\r\n border: \"border-amber-200 dark:border-amber-500/40\",\r\n text: \"text-amber-700 dark:text-amber-300 bg-amber-50 dark:bg-amber-500/10\",\r\n label: \"경고\",\r\n labelEn: \"Warning\",\r\n },\r\n info: {\r\n dot: \"bg-violet-500 border-violet-500 shadow-[0_0_8px_rgba(139,92,246,0.4)]\",\r\n border: \"border-violet-200 dark:border-violet-500/40\",\r\n text: \"text-violet-700 dark:text-violet-300 bg-violet-50 dark:bg-violet-500/10\",\r\n label: \"정보\",\r\n labelEn: \"Info\",\r\n },\r\n};\r\n\r\nconst SIZE_CONFIG = {\r\n sm: { dot: \"h-2.5 w-2.5\", gap: \"gap-3\", padding: \"p-3\", text: \"text-xs\" },\r\n md: { dot: \"h-3.5 w-3.5\", gap: \"gap-4\", padding: \"p-4\", text: \"text-sm\" },\r\n lg: { dot: \"h-4 w-4\", gap: \"gap-5\", padding: \"p-5\", text: \"text-base\" },\r\n};\r\n\r\nconst formatDate = (value?: string | Date, locale = \"ko-KR\") => {\r\n if (!value) return undefined;\r\n const parsed = value instanceof Date ? value : new Date(value);\r\n if (Number.isNaN(parsed.getTime())) return undefined;\r\n return parsed.toLocaleString(locale, { dateStyle: \"medium\", timeStyle: \"short\" });\r\n};\r\n\r\n/**\r\n * Timeline 컴포넌트\r\n *\r\n * 이벤트나 단계를 시간순으로 표시하는 범용 타임라인 컴포넌트입니다.\r\n * 활동 로그, 진행 단계, 히스토리 등 다양한 용도로 사용할 수 있습니다.\r\n *\r\n * Generic timeline component that displays events or steps chronologically.\r\n * Can be used for activity logs, progress steps, history, and more.\r\n *\r\n * @component\r\n * @example\r\n * // 기본 사용 / Basic usage\r\n * <Timeline\r\n * items={[\r\n * { id: \"1\", title: \"작업 시작\", status: \"completed\", date: new Date() },\r\n * { id: \"2\", title: \"검토 중\", status: \"active\" },\r\n * { id: \"3\", title: \"완료 예정\", status: \"pending\" }\r\n * ]}\r\n * />\r\n *\r\n * @example\r\n * // 아이콘과 커스텀 컨텐츠 / With icons and custom content\r\n * <Timeline\r\n * items={[\r\n * {\r\n * id: \"1\",\r\n * title: \"커밋 생성\",\r\n * description: \"feature/timeline 브랜치에 커밋\",\r\n * icon: \"git-commit\",\r\n * status: \"completed\",\r\n * content: <CodeBlock code=\"git commit -m 'Add timeline'\" />\r\n * }\r\n * ]}\r\n * size=\"lg\"\r\n * />\r\n *\r\n * @example\r\n * // 교차 정렬 / Alternate alignment\r\n * <Timeline items={items} align=\"alternate\" />\r\n *\r\n * @param {TimelineProps} props - Timeline 컴포넌트의 props / Timeline component props\r\n * @returns {JSX.Element} Timeline 컴포넌트 / Timeline component\r\n */\r\nexport const Timeline: React.FC<TimelineProps> = ({\r\n items,\r\n orientation = \"vertical\",\r\n align = \"left\",\r\n highlightedId,\r\n locale = \"ko-KR\",\r\n emptyState,\r\n showConnector = true,\r\n size = \"md\",\r\n className,\r\n ...props\r\n}) => {\r\n const hasItems = items.length > 0;\r\n const sizeConfig = SIZE_CONFIG[size];\r\n\r\n if (!hasItems) {\r\n return (\r\n <div className={merge(\"\", className)} {...props}>\r\n {emptyState ?? (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\r\n <Icon name=\"clock\" className=\"h-10 w-10 text-muted-foreground/50 mb-3\" />\r\n <p className=\"text-sm font-medium text-muted-foreground\">타임라인이 비어 있습니다</p>\r\n <p className=\"text-xs text-muted-foreground mt-1\">이벤트가 추가되면 여기에 표시됩니다.</p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n // Horizontal layout\r\n if (orientation === \"horizontal\") {\r\n return (\r\n <div className={merge(\"overflow-x-auto\", className)} {...props}>\r\n <ol className=\"flex min-w-max\" role=\"list\" aria-label=\"타임라인\">\r\n {items.map((item, index) => {\r\n const status = item.status ?? \"pending\";\r\n const statusConfig = STATUS_CONFIG[status];\r\n const date = formatDate(item.date, locale);\r\n const isHighlighted = highlightedId === item.id;\r\n const showLine = showConnector && index !== items.length - 1;\r\n\r\n return (\r\n <li key={item.id} className=\"flex items-start\" role=\"listitem\">\r\n <div className=\"flex flex-col items-center\">\r\n {/* Dot */}\r\n <span\r\n className={merge(\r\n \"rounded-full border-2 shrink-0\",\r\n sizeConfig.dot,\r\n statusConfig.dot,\r\n isHighlighted && \"scale-125 ring-1 ring-offset-2 ring-border\"\r\n )}\r\n aria-label={statusConfig.label}\r\n />\r\n {/* Content below dot */}\r\n <div className={merge(\"mt-3 text-center max-w-[160px]\", sizeConfig.text)}>\r\n <p className=\"font-semibold text-foreground truncate\">{item.title}</p>\r\n {item.description && (\r\n <p className=\"text-muted-foreground mt-0.5 line-clamp-2\">{item.description}</p>\r\n )}\r\n {date && (\r\n <time className=\"text-xs text-muted-foreground mt-1 block\" dateTime={item.date instanceof Date ? item.date.toISOString() : item.date}>\r\n {date}\r\n </time>\r\n )}\r\n </div>\r\n </div>\r\n {/* Connector */}\r\n {showLine && (\r\n <span className=\"h-0.5 w-16 bg-border mt-[0.4375rem] mx-2\" aria-hidden=\"true\" />\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </div>\r\n );\r\n }\r\n\r\n // Vertical layout\r\n return (\r\n <div className={merge(\"\", className)} {...props}>\r\n <ol className=\"space-y-4\" role=\"list\" aria-label=\"타임라인\">\r\n {items.map((item, index) => {\r\n const status = item.status ?? \"pending\";\r\n const statusConfig = STATUS_CONFIG[status];\r\n const date = formatDate(item.date, locale);\r\n const isHighlighted = highlightedId === item.id;\r\n const showLine = showConnector && index !== items.length - 1;\r\n const isAlternateRight = align === \"alternate\" && index % 2 === 1;\r\n const isRight = align === \"right\" || isAlternateRight;\r\n\r\n const renderIcon = () => {\r\n if (!item.icon) return null;\r\n if (typeof item.icon === \"string\") {\r\n return <Icon name={item.icon as IconName} className=\"h-4 w-4\" />;\r\n }\r\n return item.icon;\r\n };\r\n\r\n const itemContent = (\r\n <div\r\n className={merge(\r\n \"flex-1 rounded-xl border transition-all\",\r\n sizeConfig.padding,\r\n statusConfig.border,\r\n isHighlighted && \"border-2 shadow-md ring-1 ring-border\"\r\n )}\r\n >\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n {renderIcon() && (\r\n <span className=\"text-muted-foreground\">{renderIcon()}</span>\r\n )}\r\n <span className={merge(\"font-semibold text-foreground\", sizeConfig.text)}>\r\n {item.title}\r\n </span>\r\n <span className={merge(\"text-xs font-medium rounded-full px-2 py-0.5\", statusConfig.text)}>\r\n {statusConfig.label}\r\n </span>\r\n {item.meta && (\r\n <span className=\"text-xs text-muted-foreground\">{item.meta}</span>\r\n )}\r\n </div>\r\n\r\n {item.description && (\r\n <p className={merge(\"mt-1 text-muted-foreground\", sizeConfig.text)}>\r\n {item.description}\r\n </p>\r\n )}\r\n\r\n {item.content && <div className=\"mt-3\">{item.content}</div>}\r\n\r\n {date && (\r\n <div className=\"mt-3 flex items-center gap-1 text-xs text-muted-foreground\">\r\n <Icon name=\"clock\" className=\"h-3 w-3\" aria-hidden={true} />\r\n <time dateTime={item.date instanceof Date ? item.date.toISOString() : item.date}>\r\n {date}\r\n </time>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <li\r\n key={item.id}\r\n role=\"listitem\"\r\n className={merge(\r\n \"relative flex\",\r\n sizeConfig.gap,\r\n isRight && \"flex-row-reverse\"\r\n )}\r\n >\r\n {/* Dot and Connector */}\r\n <div className=\"flex flex-col items-center\">\r\n <span\r\n className={merge(\r\n \"z-10 rounded-full border-2 shrink-0\",\r\n sizeConfig.dot,\r\n statusConfig.dot,\r\n isHighlighted && \"scale-110\"\r\n )}\r\n aria-label={statusConfig.label}\r\n />\r\n {showLine && (\r\n <span className=\"mt-1 flex-1 w-px bg-border\" aria-hidden=\"true\" />\r\n )}\r\n </div>\r\n\r\n {/* Content */}\r\n {itemContent}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </div>\r\n );\r\n};\r\n\r\nTimeline.displayName = \"Timeline\";\r\n"]}
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/components/advanced/AdvancedPageTransition.tsx","../src/components/advanced/usePageTransition.ts","../src/components/advanced/usePageTransitionManager.ts","../src/components/advanced/Parallax.tsx","../src/components/advanced/Marquee.tsx","../src/components/advanced/GlowCard.tsx","../src/components/advanced/SpotlightCard.tsx","../src/components/advanced/TextReveal.tsx","../src/components/advanced/AnimatedGradient.tsx","../src/components/advanced/TiltCard.tsx","../src/components/advanced/VideoBackground.tsx","../src/components/advanced/Carousel.tsx","../src/components/Card.tsx","../src/components/Badge.tsx","../src/components/advanced/blog-editor/utils/slug.ts","../src/components/advanced/blog-editor/BlogEditorContext.tsx","../src/lib/icons.ts","../src/lib/case-utils.ts","../src/lib/icon-providers.ts","../src/lib/icon-aliases.ts","../src/lib/normalize-icon-name.ts","../src/components/Icon/icon-store.ts","../src/components/Icon/IconProvider.tsx","../src/components/Icon/Icon.tsx","../src/components/advanced/blog-editor/BlogEditorHeader.tsx","../src/components/advanced/blog-editor/BlogEditorMetadata.tsx","../src/components/advanced/blog-editor/BlogEditorLanguageTabs.tsx","../src/components/advanced/blog-editor/BlogEditorContent.tsx","../src/components/advanced/blog-editor/utils/markdown.ts","../src/components/advanced/blog-editor/BlogEditorToolbar.tsx","../src/components/advanced/blog-editor/BlogEditorPreview.tsx","../src/components/advanced/blog-editor/BlogEditorActions.tsx","../src/components/advanced/blog-editor/BlogEditorTranslate.tsx","../src/components/advanced/blog-editor/BlogEditor.tsx","../src/lib/styles/system/tokens.ts","../src/advanced/Logo.tsx","../src/components/Bookmark.tsx","../src/components/Avatar.tsx","../src/components/ChatMessage.tsx","../src/components/Breadcrumb.tsx","../src/components/ComponentLayout.tsx","../src/components/EmotionMeter.tsx","../src/components/EmotionAnalysis.tsx","../src/components/EmotionButton.tsx","../src/components/EmotionSelector.tsx","../src/components/LanguageToggle.tsx","../src/components/Button.variants.ts","../src/lib/Slot.tsx","../src/components/Button.tsx","../src/components/ScrollIndicator.tsx","../src/components/ScrollProgress.tsx","../src/components/scrollbar/scrollbar.tsx","../src/components/FeatureCard.tsx","../src/components/HeroSection.tsx","../src/components/InfoCard.tsx","../src/components/Timeline.tsx"],"names":["merge","inputs","twMerge","clsx","mergeMap","classMap","classes","condition","className","AdvancedPageTransition","React","children","type","duration","easing","delay","autoStart","onStart","onComplete","showProgress","progressClassName","ref","isVisible","setIsVisible","useState","progress","setProgress","_isTransitioning","setIsTransitioning","animationRef","useRef","startTimeRef","getEasingFunction","easingType","t","animate","useCallback","timestamp","elapsed","easingFunction","currentProgress","startTransition","useEffect","timer","transitionStyles","jsxs","jsx","FadePageTransition","props","SlidePageTransition","ScalePageTransition","FlipPageTransition","MorphPageTransition","CubePageTransition","ZoomPageTransition","usePageTransition","initialConfig","state","setState","configRef","_a","config","prev","start","resolve","finalConfig","reverse","pause","resume","reset","usePageTransitionManager","defaultType","defaultDuration","defaultEasing","enableHistory","_enableProgress","enableDebug","activeTransitionsRef","transitionCounterRef","logDebug","message","data","updateStats","newTransition","newHistory","total","average","sum","transitionId","fullConfig","transitionEvent","completedEvent","cancelTransition","id","transition","pauseAll","resumeAll","_id","clearHistory","getTransitionStats","transitionHistory","byType","acc","byStatus","activeTransitions","Parallax","speed","direction","offset","disabled","scale","opacity","rotate","rotateDirection","style","innerRef","transform","setTransform","prefersReducedMotion","useReducedMotion","updateTransform","element","rect","windowHeight","elementCenter","movement","x","y","scaleValue","opacityValue","rotateValue","handleScroll","combinedStyle","mergeRefs","setPrefersReducedMotion","mediaQuery","handleChange","e","refs","value","Marquee","pauseOnHover","pauseOnClick","gap","gradient","gradientColor","gradientWidth","containerRef","contentWidth","setContentWidth","contentHeight","setContentHeight","isPaused","setIsPaused","isHorizontal","isReverse","container","firstChild","updateSize","resizeObserver","animationStyle","gradientStyle","GlowCard","glowColor","glowSize","glowOpacity","border","borderColor","cardRef","mousePosition","setMousePosition","isHovered","setIsHovered","handleMouseMove","glowStyle","borderStyle","SpotlightCard","spotlightColor","spotlightSize","gradientFrom","gradientTo","spotlightStyle","gradientOverlayStyle","TextReveal","text","revealColor","hiddenColor","threshold","byWord","byChar","updateProgress","end","newProgress","renderText","chars","char","index","charProgress","isRevealed","words","word","wordProgress","defaultColors","AnimatedGradient","colors","blur","blurAmount","mounted","setMounted","shouldAnimate","renderGradient","Fragment","color","angle","TiltCard","maxTilt","perspective","glare","maxGlare","glarePosition","setGlarePosition","centerX","centerY","mouseX","mouseY","rotateY","rotateX","glareX","glareY","handleMouseEnter","handleMouseLeave","cardStyle","innerStyle","glareStyle","VideoBackground","src","poster","autoPlay","loop","muted","controls","objectFit","overlay","overlayColor","gradientDirection","playbackRate","fadeIn","videoRef","isLoaded","setIsLoaded","isPlaying","setIsPlaying","handleLoadedData","handlePlaying","getYouTubeUrl","videoId","params","getVimeoUrl","renderVideo","objectFitClass","renderGradientOverlay","gradients","hasPositionClass","Carousel","interval","indicators","indicatorPosition","showArrows","arrowPosition","transitionDuration","onSlideChange","showPlayPause","playPausePosition","getInitialIndex","currentIndex","setCurrentIndex","isManuallyPaused","setIsManuallyPaused","isTransitioning","noTransition","setNoTransition","touchStart","setTouchStart","touchEnd","setTouchEnd","slideCount","getActualIndex","goToSlide","newIndex","actualIndex","nextSlide","prevSlide","togglePlayPause","handleTouchStart","handleTouchMove","handleTouchEnd","distance","handleKeyDown","renderSlides","child","childArray","renderIndicators","isInside","isTop","indicatorContainerClass","handleIndicatorClick","_","isActive","renderPlayPause","PauseIcon","PlayIcon","renderArrows","canGoPrev","canGoNext","arrowBaseClass","prevPosition","nextPosition","ChevronLeft","ChevronRight","cardVariants","cva","Card","variant","shadow","padding","hoverable","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","badgeVariants","Badge","generateSlug","title","isValidSlug","slug","normalizeSlug","input","DEFAULT_LABELS","DEFAULT_FEATURES","DEFAULT_LANGUAGES","createEmptyMultilingualField","languages","field","lang","createInitialData","initialData","_b","_c","_d","_e","_f","_g","_h","BlogEditorContext","createContext","useBlogEditor","context","useContext","BlogEditorProvider","isEditMode","defaultLanguage","userLabels","callbacks","userFeatures","autoSaveKey","autoSaveInterval","primaryLanguage","l","initialLanguage","labels","useMemo","features","formData","setFormData","activeLanguage","setActiveLanguage","showPreview","setShowPreview","submitting","setSubmitting","translating","setTranslating","uploading","setUploading","error","setError","translateSuccess","setTranslateSuccess","slugManuallyEdited","setSlugManuallyEdited","autoSaveStatus","setAutoSaveStatus","autoSaveTimerRef","isInitialMount","storageKey","saved","parsed","clearAutoSave","updateField","updateMultilingualField","language","handleSave","publish","primaryTitle","primaryContent","handleTranslate","primaryExcerpt","translations","newTitle","newContent","newExcerpt","langKey","translation","trans","handleUploadImage","file","handleCancel","icons","House","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","ListIcon","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","Clock","Calendar","CalendarPlus","Bell","Heart","Star","Bookmark","Share","Monitor","Sun","Moon","Lightbulb","Brain","Flag","Square","Sparkle","Globe","DeviceMobile","Ticket","Clipboard","WifiHigh","WifiSlash","Cpu","MaskHappy","TextB","TextItalic","TextStrikethrough","TextHOne","Link","Code","FileCode","Quotes","List","ListNumbers","emotionIcons","statusIcons","toCamelCase","str","PhosphorIcons","LucideIcons","iconsaxResolver","getIconsaxResolver","PROJECT_ICONS","initPhosphorIcons","initLucideIcons","getIconFromProvider","iconName","provider","iconMapping","getIconDirect","mappedName","phosphorName1","phosphorName2","lucideName","camelCaseName","match","getIconNameForProvider","ICON_ALIASES","normalizeIconName","camelCased","aliasTarget","defaultIconConfig","IconContext","useIconContext","IconComponent","name","size","emotion","status","weight","animated","pulse","spin","bounce","ariaLabel","ariaHidden","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","iconsaxVariant","isClient","setIsClient","providerReady","setProviderReady","resolvedIcon","baseName","normalized","providerName","iconsaxIcon","variantClasses","ResolvedIcon","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon","BlogEditorHeader","onBack","backLink","BlogEditorMetadata","tagInput","setTagInput","fileInputRef","containerClasses","inputClasses","labelClasses","addTag","tag","trimmed","removeTag","tagToRemove","handleTagInputChange","parts","part","idx","handleTagKeyDown","url","BlogEditorLanguageTabs","isPrimary","BlogEditorContent","textareaRef","isPrimaryLanguage","currentLang","handleTitleChange","getLangLabel","baseLabel","escapeHtml","parseMarkdown","html","code","stripMarkdown","getMarkdownPreview","maxLength","stripped","insertMarkdown","selectionStart","selectionEnd","before","after","selectedText","beforeText","afterText","newText","cursorPosition","TOOLBAR_ITEMS","BlogEditorToolbar","handleInsert","item","textarea","currentContent","BlogEditorPreview","renderMarkdown","content","renderedContent","BlogEditorActions","cancelLink","BlogEditorTranslate","hint","canTranslate","BlogEditorRoot","translateHint","maxWidth","contentContainerClasses","BlogEditor","BlogEditorCompound","defaultTokens","EMBLEM_PATH","WORDMARK_PATH","getSizeInRem","Logo","sizeInRem","styleId","existingStyle","wordmarkRatio","defaultBookmarked","onBookmarkChange","isBookmarked","setIsBookmarked","savedBookmarks","bookmarks","toggleBookmark","newBookmarked","sizeClasses","avatarVariants","Avatar","alt","fallbackText","imgError","setImgError","getFallbackContent","showImage","AvatarImage","AvatarFallback","ChatMessage","user","assistant","showAvatar","showTimestamp","showEmotion","theme","isUser","getEmotionColor","formatTime","date","Breadcrumb","items","maxItems","showHomeIcon","homeLabel","separator","variantStyles","renderedItems","displayItems","firstItem","lastItems","isCurrent","BreadcrumbItem","itemsCount","href","ComponentLayout","description","prevPage","nextPage","breadcrumbItems","EmotionMeter","max","emotionColors","percentage","EmotionAnalysis","primaryEmotion","emotionDistribution","keywords","intensity","positivity","energy","showMeter","showDistribution","showKeywords","showMetrics","layout","getIntensityLabel","getPositivityLabel","getEnergyLabel","keyword","EmotionButton","isSelected","defaultEmotions","EmotionSelector","selectedEmotion","onEmotionSelect","showIntensity","onIntensityChange","emotions","handleEmotionClick","emotionKey","renderEmotionItem","layoutClasses","LanguageToggle","showLabel","currentLanguage","onLanguageChange","_ref","isOpen","setIsOpen","dropdownRef","handleClickOutside","event","handleLanguageChange","languageCode","renderIcon","nextIndex","springTransition","buttonVariants","gradientPresets","composeRefs","node","composeEventHandlers","parentHandler","childHandler","mergeClassName","slotClassName","childClassName","mergeStyle","slotStyle","childStyle","mergeProps","slotProps","childProps","mergedProps","propName","slotValue","childValue","isSlottable","Slot","forwardedRef","childRef","mergedRef","isBrowser","reduce","setReduce","mq","onChange","ButtonInner","loading","icon","iconPosition","customGradient","rounded","hover","fullWidth","iconOnly","asChild","rest","reduced","gradientClass","base","onClick","target","rel","_ariaLabel","anchorClassName","anchorProps","isDisabled","handleAnchorClick","buttonClassName","btnProps","Button","ScrollIndicator","targetId","position","autoHide","hideThreshold","scrollTop","scrollToTarget","targetElement","currentSection","nextSection","positionClasses","ScrollProgress","height","_animated","showPercentage","docHeight","progressColors","Scrollbar","orientation","smooth","getVariantClasses","getSizeClasses","getOrientationClasses","baseClasses","FeatureCard","getGradientClass","hoverClasses","HeroSection","subtitle","primaryAction","secondaryAction","slides","indicator","showControls","background","customBackground","fullBleed","currentSlide","setCurrentSlide","isSlideMode","titleSizeClasses","subtitleSizeClasses","descriptionSizeClasses","currentBg","backgroundContent","renderIndicator","line","i","arr","toneClasses","InfoCard","tone","STATUS_CONFIG","SIZE_CONFIG","formatDate","locale","Timeline","align","highlightedId","emptyState","showConnector","hasItems","sizeConfig","statusConfig","isHighlighted","showLine","isAlternateRight","isRight","itemContent"],"mappings":"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","file":"advanced.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\n/**\n * HUA UI의 스마트 클래스 병합 유틸리티\n * clsx와 tailwind-merge를 결합하여 중복 클래스를 자동으로 해결합니다.\n * \n * @param inputs - 병합할 클래스 값들\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * merge(\"px-2 py-1\", \"px-4\") // \"py-1 px-4\"\n * merge(\"text-red-500\", \"text-blue-500\") // \"text-blue-500\"\n * merge(\"bg-white\", \"dark:bg-slate-900\") // \"bg-white dark:bg-slate-900\"\n * ```\n */\nexport function merge(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * 조건부 클래스 병합 유틸리티\n * 조건에 따라 클래스를 선택적으로 병합합니다.\n * \n * @param condition - 클래스를 적용할 조건\n * @param trueClass - 조건이 true일 때 적용할 클래스\n * @param falseClass - 조건이 false일 때 적용할 클래스 (선택사항)\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeIf(isActive, \"bg-blue-500\", \"bg-gray-200\")\n * mergeIf(isLoading, \"opacity-50 cursor-not-allowed\")\n * ```\n */\nexport function mergeIf(\n condition: boolean,\n trueClass: ClassValue,\n falseClass?: ClassValue\n) {\n return merge(condition ? trueClass : falseClass || \"\")\n}\n\n/**\n * 상대 시간 포맷팅 유틸리티\n * \n * 날짜를 상대 시간 형식으로 포맷팅합니다 (예: \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * 7일 이상 경과한 경우 절대 날짜를 반환합니다.\n * \n * Formats a date as relative time (e.g., \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * Returns absolute date for dates older than 7 days.\n * \n * @param timestamp - 포맷팅할 날짜 (Date 객체 또는 ISO 문자열) / Date to format (Date object or ISO string)\n * @param locale - 로케일 (기본값: \"ko-KR\") / Locale (default: \"ko-KR\")\n * @returns 포맷팅된 상대 시간 문자열 / Formatted relative time string\n * \n * @example\n * ```tsx\n * formatRelativeTime(new Date()) // \"방금 전\"\n * formatRelativeTime(new Date(Date.now() - 5 * 60000)) // \"5분 전\"\n * formatRelativeTime(new Date(Date.now() - 2 * 3600000)) // \"2시간 전\"\n * formatRelativeTime(new Date(Date.now() - 3 * 86400000)) // \"3일 전\"\n * formatRelativeTime(new Date(\"2024-01-01\")) // \"2024. 1. 1.\" (7일 이상 경과)\n * ```\n */\nexport function formatRelativeTime(timestamp: Date | string, locale = \"ko-KR\"): string {\n const date = typeof timestamp === \"string\" ? new Date(timestamp) : timestamp;\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return locale === \"ko-KR\" ? \"방금 전\" : \"just now\";\n if (minutes < 60) return locale === \"ko-KR\" ? `${minutes}분 전` : `${minutes}m ago`;\n if (hours < 24) return locale === \"ko-KR\" ? `${hours}시간 전` : `${hours}h ago`;\n if (days < 7) return locale === \"ko-KR\" ? `${days}일 전` : `${days}d ago`;\n return date.toLocaleDateString(locale);\n}\n\n/**\n * 객체 기반 클래스 병합 유틸리티\n * 객체의 키-값 쌍을 기반으로 조건부 클래스를 병합합니다.\n * \n * @param classMap - 클래스 맵 객체\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeMap({\n * \"bg-blue-500\": isPrimary,\n * \"bg-gray-500\": !isPrimary,\n * \"text-white\": true,\n * \"opacity-50\": isDisabled\n * })\n * ```\n */\nexport function mergeMap(classMap: Record<string, boolean | undefined | null>) {\n const classes = Object.entries(classMap)\n .filter(([, condition]) => condition)\n .map(([className]) => className)\n \n return merge(...classes)\n}\n\n// 하위 호환성을 위해 cn도 export (점진적 마이그레이션 지원)\nexport const cn = merge ","'use client'\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react'\nimport { merge } from '../../lib/utils'\n\nexport type TransitionType = \n | 'fade' \n | 'slide' \n | 'scale' \n | 'flip' \n | 'morph' \n | 'cube' \n | 'zoom' \n | 'slide-up' \n | 'slide-down' \n | 'slide-left' \n | 'slide-right'\n\nexport type TransitionEasing = \n | 'linear' \n | 'ease-in' \n | 'ease-out' \n | 'ease-in-out' \n | 'bounce' \n | 'elastic' \n | 'smooth'\n\nexport interface AdvancedPageTransitionProps {\n children: React.ReactNode\n className?: string\n type?: TransitionType\n duration?: number\n easing?: TransitionEasing\n delay?: number\n autoStart?: boolean\n onStart?: () => void\n onComplete?: () => void\n showProgress?: boolean\n progressClassName?: string\n}\n\nexport const AdvancedPageTransition = React.forwardRef<HTMLDivElement, AdvancedPageTransitionProps>(({\n children,\n className,\n type = 'fade',\n duration = 500,\n easing = 'smooth',\n delay = 0,\n autoStart = true,\n onStart,\n onComplete,\n showProgress = false,\n progressClassName\n}, ref) => {\n const [isVisible, setIsVisible] = useState(false)\n const [progress, setProgress] = useState(0)\n const [_isTransitioning, setIsTransitioning] = useState(false)\n const animationRef = useRef<number | null>(null)\n const startTimeRef = useRef<number | null>(null)\n\n const getEasingFunction = (easingType: TransitionEasing) => {\n const easingFunctions = {\n linear: (t: number) => t,\n 'ease-in': (t: number) => t * t,\n 'ease-out': (t: number) => 1 - Math.pow(1 - t, 2),\n 'ease-in-out': (t: number) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t: number) => {\n if (t < 1 / 2.75) return 7.5625 * t * t\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375\n },\n elastic: (t: number) => {\n return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1\n },\n smooth: (t: number) => {\n return t * t * (3 - 2 * t)\n }\n }\n return easingFunctions[easingType]\n }\n\n const animate = useCallback((timestamp: number) => {\n if (!startTimeRef.current) {\n startTimeRef.current = timestamp\n }\n\n const elapsed = timestamp - startTimeRef.current\n const easingFunction = getEasingFunction(easing)\n\n let currentProgress = Math.min(elapsed / duration, 1)\n currentProgress = easingFunction(currentProgress)\n\n setProgress(currentProgress)\n setIsVisible(currentProgress > 0.1)\n\n if (currentProgress < 1) {\n animationRef.current = requestAnimationFrame((t) => animate(t))\n } else {\n setIsTransitioning(false)\n setProgress(1)\n onComplete?.()\n }\n }, [duration, easing, onComplete])\n\n const startTransition = useCallback(() => {\n setIsTransitioning(true)\n setProgress(0)\n onStart?.()\n\n startTimeRef.current = null\n animationRef.current = requestAnimationFrame(animate)\n }, [animate, onStart])\n\n useEffect(() => {\n if (autoStart) {\n const timer = setTimeout(() => {\n startTransition()\n }, delay)\n\n return () => clearTimeout(timer)\n }\n }, [autoStart, delay, startTransition])\n\n useEffect(() => {\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }\n }, [])\n\n const getTransitionStyles = () => {\n switch (type) {\n case 'fade':\n return {\n opacity: isVisible ? 1 : 0,\n transform: 'none'\n }\n \n case 'slide':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(${(1 - progress) * 100}%)`\n }\n \n case 'slide-up':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateY(${(1 - progress) * 100}%)`\n }\n \n case 'slide-down':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateY(-${(1 - progress) * 100}%)`\n }\n \n case 'slide-left':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(-${(1 - progress) * 100}%)`\n }\n \n case 'slide-right':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(${(1 - progress) * 100}%)`\n }\n \n case 'scale':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.8 + progress * 0.2})`\n }\n \n case 'flip':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `perspective(1000px) rotateY(${(1 - progress) * 90}deg)`\n }\n \n case 'morph':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.9 + progress * 0.1}) rotate(${(1 - progress) * 5}deg)`\n }\n \n case 'cube':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `perspective(1000px) rotateX(${(1 - progress) * 90}deg) rotateY(${(1 - progress) * 45}deg)`\n }\n \n case 'zoom':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.5 + progress * 0.5})`\n }\n \n default:\n return {\n opacity: isVisible ? 1 : 0,\n transform: 'none'\n }\n }\n }\n\n const transitionStyles = getTransitionStyles()\n\n return (\n <div className=\"relative\">\n {showProgress && (\n <div className={merge(\n 'fixed top-4 right-4 z-50 bg-background rounded-lg px-3 py-2 shadow-lg border',\n progressClassName\n )}>\n <div className=\"text-sm font-medium text-foreground\">\n Progress: {Math.round(progress * 100)}%\n </div>\n <div className=\"w-24 h-2 bg-muted rounded-full mt-2\">\n <div \n className=\"h-full bg-primary rounded-full transition-all duration-100\"\n style={{ width: `${progress * 100}%` }}\n />\n </div>\n </div>\n )}\n \n <div\n ref={ref}\n className={merge(\n 'transition-all duration-500 ease-out',\n className\n )}\n style={{\n ...transitionStyles,\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: easing === 'smooth' \n ? 'cubic-bezier(0.4, 0, 0.2, 1)'\n : easing === 'bounce'\n ? 'cubic-bezier(0.68, -0.55, 0.265, 1.55)'\n : easing === 'elastic'\n ? 'cubic-bezier(0.175, 0.885, 0.32, 1.275)'\n : easing\n }}\n >\n {children}\n </div>\n </div>\n )\n})\n\nAdvancedPageTransition.displayName = 'AdvancedPageTransition'\n\n// 편의 컴포넌트들\nexport const FadePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"fade\" {...props} />\n))\n\nexport const SlidePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"slide\" {...props} />\n))\n\nexport const ScalePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"scale\" {...props} />\n))\n\nexport const FlipPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"flip\" {...props} />\n))\n\nexport const MorphPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"morph\" {...props} />\n))\n\nexport const CubePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"cube\" {...props} />\n))\n\nexport const ZoomPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"zoom\" {...props} />\n))\n\n// displayName 설정\nFadePageTransition.displayName = 'FadePageTransition'\nSlidePageTransition.displayName = 'SlidePageTransition'\nScalePageTransition.displayName = 'ScalePageTransition'\nFlipPageTransition.displayName = 'FlipPageTransition'\nMorphPageTransition.displayName = 'MorphPageTransition'\nCubePageTransition.displayName = 'CubePageTransition'\nZoomPageTransition.displayName = 'ZoomPageTransition'\n","'use client'\n\nimport { useState, useEffect, useCallback, useRef } from 'react'\n\nexport type TransitionType = \n | 'fade' \n | 'slide' \n | 'scale' \n | 'flip' \n | 'morph' \n | 'cube' \n | 'zoom' \n | 'slide-up' \n | 'slide-down' \n | 'slide-left' \n | 'slide-right'\n\nexport type TransitionEasing = \n | 'linear' \n | 'ease-in' \n | 'ease-out' \n | 'ease-in-out' \n | 'bounce' \n | 'elastic' \n | 'smooth'\n\nexport interface TransitionConfig {\n type: TransitionType\n duration: number\n easing: TransitionEasing\n delay?: number\n stagger?: number\n direction?: 'forward' | 'backward'\n onStart?: () => void\n onComplete?: () => void\n onReverse?: () => void\n}\n\nexport interface PageTransitionState {\n isTransitioning: boolean\n isVisible: boolean\n currentStep: number\n progress: number\n}\n\nexport interface PageTransitionControls {\n start: (config?: Partial<TransitionConfig>) => Promise<void>\n reverse: () => Promise<void>\n pause: () => void\n resume: () => void\n reset: () => void\n}\n\nexport const usePageTransition = (\n initialConfig: Partial<TransitionConfig> = {}\n): [PageTransitionState, PageTransitionControls] => {\n const [state, setState] = useState<PageTransitionState>({\n isTransitioning: false,\n isVisible: false,\n currentStep: 0,\n progress: 0\n })\n\n const animationRef = useRef<number | null>(null)\n const startTimeRef = useRef<number | null>(null)\n const configRef = useRef<TransitionConfig>({\n type: 'fade',\n duration: 500,\n easing: 'smooth',\n delay: 0,\n stagger: 0,\n direction: 'forward',\n ...initialConfig\n })\n\n const getEasingFunction = useCallback((easing: TransitionEasing) => {\n const easingFunctions = {\n linear: (t: number) => t,\n 'ease-in': (t: number) => t * t,\n 'ease-out': (t: number) => 1 - Math.pow(1 - t, 2),\n 'ease-in-out': (t: number) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t: number) => {\n if (t < 1 / 2.75) return 7.5625 * t * t\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375\n },\n elastic: (t: number) => {\n return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1\n },\n smooth: (t: number) => {\n return t * t * (3 - 2 * t)\n }\n }\n return easingFunctions[easing]\n }, [])\n\n const animate = useCallback((timestamp: number) => {\n if (!startTimeRef.current) {\n startTimeRef.current = timestamp\n }\n\n const elapsed = timestamp - startTimeRef.current\n const config = configRef.current\n const easing = getEasingFunction(config.easing)\n \n let progress = Math.min(elapsed / config.duration, 1)\n progress = easing(progress)\n\n setState(prev => ({\n ...prev,\n progress,\n isVisible: config.direction === 'forward' ? progress > 0.1 : progress < 0.9,\n currentStep: Math.floor(progress * 10)\n }))\n\n if (progress < 1) {\n animationRef.current = requestAnimationFrame(animate)\n } else {\n setState(prev => ({\n ...prev,\n isTransitioning: false,\n progress: config.direction === 'forward' ? 1 : 0\n }))\n config.onComplete?.()\n }\n }, [getEasingFunction])\n\n const start = useCallback(async (config?: Partial<TransitionConfig>) => {\n return new Promise<void>((resolve) => {\n if (config) {\n configRef.current = { ...configRef.current, ...config }\n }\n\n const finalConfig = configRef.current\n finalConfig.onComplete = () => resolve()\n\n setState(prev => ({\n ...prev,\n isTransitioning: true,\n progress: finalConfig.direction === 'forward' ? 0 : 1\n }))\n\n startTimeRef.current = null\n finalConfig.onStart?.()\n \n if (finalConfig.delay) {\n setTimeout(() => {\n animationRef.current = requestAnimationFrame(animate)\n }, finalConfig.delay)\n } else {\n animationRef.current = requestAnimationFrame(animate)\n }\n })\n }, [animate])\n\n const reverse = useCallback(async () => {\n return new Promise<void>((resolve) => {\n const config = configRef.current\n config.direction = 'backward'\n config.onComplete = () => resolve()\n \n start()\n })\n }, [start])\n\n const pause = useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }, [])\n\n const resume = useCallback(() => {\n if (state.isTransitioning) {\n animationRef.current = requestAnimationFrame(animate)\n }\n }, [state.isTransitioning, animate])\n\n const reset = useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n setState({\n isTransitioning: false,\n isVisible: false,\n currentStep: 0,\n progress: 0\n })\n }, [])\n\n useEffect(() => {\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }\n }, [])\n\n return [state, { start, reverse, pause, resume, reset }]\n}\n\n// 특정 전환 타입을 위한 편의 훅들\nexport const useFadeTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'fade', duration: 400, ...config })\n}\n\nexport const useSlideTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'slide', duration: 600, ...config })\n}\n\nexport const useScaleTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'scale', duration: 500, ...config })\n}\n\nexport const useMorphTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'morph', duration: 800, ...config })\n}\n\nexport const useCubeTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'cube', duration: 1000, ...config })\n}\n","'use client'\n\nimport { useState, useCallback, useRef, useEffect } from 'react'\nimport { TransitionType, TransitionEasing, TransitionConfig } from './usePageTransition'\n\nexport interface PageTransitionManagerConfig {\n defaultType?: TransitionType\n defaultDuration?: number\n defaultEasing?: TransitionEasing\n enableHistory?: boolean\n enableProgress?: boolean\n enableDebug?: boolean\n}\n\nexport interface PageTransitionEvent {\n id: string\n type: TransitionType\n duration: number\n easing: TransitionEasing\n timestamp: number\n status: 'pending' | 'active' | 'completed' | 'failed'\n}\n\nexport interface PageTransitionManagerState {\n isTransitioning: boolean\n currentTransition: PageTransitionEvent | null\n transitionHistory: PageTransitionEvent[]\n totalTransitions: number\n averageDuration: number\n}\n\nexport interface PageTransitionManagerControls {\n startTransition: (config: Partial<TransitionConfig>) => Promise<string>\n cancelTransition: (id: string) => void\n pauseAll: () => void\n resumeAll: () => void\n clearHistory: () => void\n getTransitionStats: () => {\n total: number\n average: number\n byType: Record<TransitionType, number>\n byStatus: Record<string, number>\n }\n}\n\nexport const usePageTransitionManager = (\n config: PageTransitionManagerConfig = {}\n): [PageTransitionManagerState, PageTransitionManagerControls] => {\n const {\n defaultType = 'fade',\n defaultDuration = 500,\n defaultEasing = 'smooth',\n enableHistory = true,\n enableProgress: _enableProgress = true,\n enableDebug = false\n } = config\n\n const [state, setState] = useState<PageTransitionManagerState>({\n isTransitioning: false,\n currentTransition: null,\n transitionHistory: [],\n totalTransitions: 0,\n averageDuration: 0\n })\n\n const activeTransitionsRef = useRef<Map<string, { timer: NodeJS.Timeout; config: TransitionConfig }>>(new Map())\n const transitionCounterRef = useRef(0)\n\n const logDebug = useCallback((message: string, data?: unknown) => {\n if (enableDebug) {\n // eslint-disable-next-line no-console\n console.log(`[PageTransitionManager] ${message}`, data)\n }\n }, [enableDebug])\n\n const updateStats = useCallback((newTransition: PageTransitionEvent) => {\n setState(prev => {\n const newHistory = enableHistory ? [...prev.transitionHistory, newTransition] : prev.transitionHistory\n const total = newHistory.length\n const average = newHistory.reduce((sum, t) => sum + t.duration, 0) / total\n\n return {\n ...prev,\n totalTransitions: total,\n averageDuration: average,\n transitionHistory: newHistory\n }\n })\n }, [enableHistory])\n\n const startTransition = useCallback(async (config: Partial<TransitionConfig>): Promise<string> => {\n const transitionId = `transition_${++transitionCounterRef.current}`\n const fullConfig: TransitionConfig = {\n type: defaultType,\n duration: defaultDuration,\n easing: defaultEasing,\n ...config\n }\n\n const transitionEvent: PageTransitionEvent = {\n id: transitionId,\n type: fullConfig.type,\n duration: fullConfig.duration,\n easing: fullConfig.easing,\n timestamp: Date.now(),\n status: 'pending'\n }\n\n logDebug('Starting transition', { id: transitionId, config: fullConfig })\n\n setState(prev => ({\n ...prev,\n isTransitioning: true,\n currentTransition: transitionEvent\n }))\n\n // 실제 전환 로직을 시뮬레이션 (실제로는 usePageTransition과 연동)\n const timer = setTimeout(() => {\n const completedEvent: PageTransitionEvent = {\n ...transitionEvent,\n status: 'completed'\n }\n\n setState(prev => ({\n ...prev,\n isTransitioning: false,\n currentTransition: null\n }))\n\n updateStats(completedEvent)\n activeTransitionsRef.current.delete(transitionId)\n logDebug('Transition completed', { id: transitionId })\n\n fullConfig.onComplete?.()\n }, fullConfig.duration)\n\n activeTransitionsRef.current.set(transitionId, { timer, config: fullConfig })\n\n // 진행 상태 업데이트\n setTimeout(() => {\n setState(prev => ({\n ...prev,\n currentTransition: {\n ...prev.currentTransition!,\n status: 'active'\n }\n }))\n }, 50)\n\n return transitionId\n }, [defaultType, defaultDuration, defaultEasing, logDebug, updateStats])\n\n const cancelTransition = useCallback((id: string) => {\n const transition = activeTransitionsRef.current.get(id)\n if (transition) {\n clearTimeout(transition.timer)\n activeTransitionsRef.current.delete(id)\n\n setState(prev => ({\n ...prev,\n isTransitioning: activeTransitionsRef.current.size > 0,\n currentTransition: prev.currentTransition?.id === id ? null : prev.currentTransition\n }))\n\n logDebug('Transition cancelled', { id })\n }\n }, [logDebug])\n\n const pauseAll = useCallback(() => {\n activeTransitionsRef.current.forEach(({ timer }, id) => {\n clearTimeout(timer)\n logDebug('Transition paused', { id })\n })\n }, [logDebug])\n\n const resumeAll = useCallback(() => {\n activeTransitionsRef.current.forEach(({ config }, _id) => {\n startTransition(config)\n })\n }, [startTransition])\n\n const clearHistory = useCallback(() => {\n setState(prev => ({\n ...prev,\n transitionHistory: [],\n totalTransitions: 0,\n averageDuration: 0\n }))\n logDebug('History cleared')\n }, [logDebug])\n\n const getTransitionStats = useCallback(() => {\n const { transitionHistory } = state\n const byType = transitionHistory.reduce((acc, t) => {\n acc[t.type] = (acc[t.type] || 0) + 1\n return acc\n }, {} as Record<TransitionType, number>)\n\n const byStatus = transitionHistory.reduce((acc, t) => {\n acc[t.status] = (acc[t.status] || 0) + 1\n return acc\n }, {} as Record<string, number>)\n\n return {\n total: transitionHistory.length,\n average: state.averageDuration,\n byType,\n byStatus\n }\n }, [state])\n\n useEffect(() => {\n const activeTransitions = activeTransitionsRef.current\n return () => {\n // 컴포넌트 언마운트 시 모든 타이머 정리\n activeTransitions.forEach(({ timer }) => {\n clearTimeout(timer)\n })\n activeTransitions.clear()\n }\n }, [])\n\n return [state, {\n startTransition,\n cancelTransition,\n pauseAll,\n resumeAll,\n clearHistory,\n getTransitionStats\n }]\n}\n\n// 특정 전환 타입을 위한 편의 훅들\nexport const useFadeTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'fade' })\n}\n\nexport const useSlideTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'slide' })\n}\n\nexport const useScaleTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'scale' })\n}\n\nexport const useMorphTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'morph' })\n}\n\nexport const useCubeTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'cube' })\n}\n","\"use client\";\n\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * Parallax 컴포넌트의 props / Parallax component props\n * @property {number} [speed=0.5] - 패럴렉스 속도 (0-1, 1이 가장 빠름) / Parallax speed (0-1, 1 is fastest)\n * @property {\"up\" | \"down\" | \"left\" | \"right\"} [direction=\"up\"] - 이동 방향 / Movement direction\n * @property {number} [offset=0] - 시작 오프셋 (px) / Starting offset in pixels\n * @property {boolean} [disabled=false] - 패럴렉스 비활성화 / Disable parallax\n * @property {boolean} [scale=false] - 스케일 효과 추가 / Add scale effect\n * @property {boolean} [opacity=false] - 투명도 효과 추가 / Add opacity effect\n * @property {boolean} [rotate=false] - 회전 효과 추가 / Add rotation effect\n */\nexport interface ParallaxProps extends React.HTMLAttributes<HTMLDivElement> {\n speed?: number;\n direction?: \"up\" | \"down\" | \"left\" | \"right\";\n offset?: number;\n disabled?: boolean;\n scale?: boolean;\n opacity?: boolean;\n rotate?: boolean;\n rotateDirection?: \"cw\" | \"ccw\";\n}\n\n/**\n * Parallax 컴포넌트 / Parallax component\n *\n * 스크롤에 반응하여 패럴렉스 효과를 제공하는 컴포넌트입니다.\n * 다양한 방향과 속도, 추가 효과(스케일, 투명도, 회전)를 지원합니다.\n *\n * Component that provides parallax effect in response to scrolling.\n * Supports various directions, speeds, and additional effects (scale, opacity, rotation).\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Parallax speed={0.3}>\n * <img src=\"/background.jpg\" alt=\"background\" />\n * </Parallax>\n *\n * @example\n * // 다양한 효과 / With effects\n * <Parallax speed={0.5} scale opacity direction=\"up\">\n * <div className=\"h-screen bg-gradient-to-b from-indigo-500 to-purple-600\" />\n * </Parallax>\n */\nconst Parallax = React.forwardRef<HTMLDivElement, ParallaxProps>(\n (\n {\n children,\n className,\n speed = 0.5,\n direction = \"up\",\n offset = 0,\n disabled = false,\n scale = false,\n opacity = false,\n rotate = false,\n rotateDirection = \"cw\",\n style,\n ...props\n },\n ref\n ) => {\n const innerRef = useRef<HTMLDivElement>(null);\n const [transform, setTransform] = useState({\n x: 0,\n y: 0,\n scale: 1,\n opacity: 1,\n rotate: 0,\n });\n\n // Check for reduced motion preference\n const prefersReducedMotion = useReducedMotion();\n\n const updateTransform = useCallback(() => {\n if (disabled || prefersReducedMotion) return;\n\n const element = innerRef.current;\n if (!element) return;\n\n const rect = element.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n const windowWidth = window.innerWidth;\n\n // Calculate how far through the viewport the element is\n const elementCenter = rect.top + rect.height / 2;\n const viewportCenter = windowHeight / 2;\n const progress = (viewportCenter - elementCenter) / windowHeight;\n\n // Calculate movement based on direction\n const movement = progress * speed * 100 + offset;\n\n let x = 0;\n let y = 0;\n\n switch (direction) {\n case \"up\":\n y = -movement;\n break;\n case \"down\":\n y = movement;\n break;\n case \"left\":\n x = -movement;\n break;\n case \"right\":\n x = movement;\n break;\n }\n\n // Calculate additional effects\n const scaleValue = scale ? 1 + Math.abs(progress) * 0.1 : 1;\n const opacityValue = opacity ? Math.max(0.3, 1 - Math.abs(progress) * 0.5) : 1;\n const rotateValue = rotate\n ? progress * 10 * (rotateDirection === \"cw\" ? 1 : -1)\n : 0;\n\n setTransform({ x, y, scale: scaleValue, opacity: opacityValue, rotate: rotateValue });\n }, [disabled, prefersReducedMotion, speed, direction, offset, scale, opacity, rotate, rotateDirection]);\n\n useEffect(() => {\n if (disabled || prefersReducedMotion) return;\n\n // Initial calculation\n updateTransform();\n\n // Listen to scroll events\n const handleScroll = () => {\n requestAnimationFrame(updateTransform);\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n window.addEventListener(\"resize\", handleScroll, { passive: true });\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", handleScroll);\n };\n }, [updateTransform, disabled, prefersReducedMotion]);\n\n const combinedStyle: React.CSSProperties = {\n ...style,\n transform: disabled || prefersReducedMotion\n ? undefined\n : `translate3d(${transform.x}px, ${transform.y}px, 0) scale(${transform.scale}) rotate(${transform.rotate}deg)`,\n opacity: disabled || prefersReducedMotion ? 1 : transform.opacity,\n willChange: disabled || prefersReducedMotion ? undefined : \"transform, opacity\",\n };\n\n return (\n <div\n ref={mergeRefs(ref, innerRef)}\n className={merge(\"transition-none\", className)}\n style={combinedStyle}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nParallax.displayName = \"Parallax\";\n\n// Hook to check for reduced motion preference\nfunction useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setPrefersReducedMotion(mediaQuery.matches);\n\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { Parallax };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * Marquee 컴포넌트의 props / Marquee component props\n * @property {\"left\" | \"right\" | \"up\" | \"down\"} [direction=\"left\"] - 이동 방향 / Movement direction\n * @property {number} [speed=50] - 속도 (px/s) / Speed in pixels per second\n * @property {boolean} [pauseOnHover=true] - 호버시 일시정지 / Pause on hover\n * @property {boolean} [pauseOnClick=false] - 클릭시 일시정지 / Pause on click\n * @property {number} [gap=16] - 아이템 간격 (px) / Gap between items in pixels\n * @property {boolean} [gradient=true] - 양쪽 페이드 그라디언트 / Fade gradient on edges\n * @property {string} [gradientColor=\"hsl(var(--background))\"] - 그라디언트 색상 / Gradient color\n * @property {number} [gradientWidth=100] - 그라디언트 너비 (px) / Gradient width in pixels\n */\nexport interface MarqueeProps extends React.HTMLAttributes<HTMLDivElement> {\n direction?: \"left\" | \"right\" | \"up\" | \"down\";\n speed?: number;\n pauseOnHover?: boolean;\n pauseOnClick?: boolean;\n gap?: number;\n gradient?: boolean;\n gradientColor?: string;\n gradientWidth?: number;\n}\n\n/**\n * Marquee 컴포넌트 / Marquee component\n *\n * 무한 스크롤 애니메이션을 제공하는 컴포넌트입니다.\n * 로고, 텍스트, 이미지 등을 자동으로 흐르게 표시합니다.\n *\n * Component that provides infinite scroll animation.\n * Displays logos, text, images, etc. with automatic scrolling.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Marquee>\n * <span>Item 1</span>\n * <span>Item 2</span>\n * <span>Item 3</span>\n * </Marquee>\n *\n * @example\n * // 로고 캐러셀 / Logo carousel\n * <Marquee speed={30} pauseOnHover gradient>\n * {logos.map(logo => <img key={logo.id} src={logo.src} />)}\n * </Marquee>\n */\nconst Marquee = React.forwardRef<HTMLDivElement, MarqueeProps>(\n (\n {\n children,\n className,\n direction = \"left\",\n speed = 50,\n pauseOnHover = true,\n pauseOnClick = false,\n gap = 16,\n gradient = true,\n gradientColor = \"hsl(var(--background))\",\n gradientWidth = 100,\n style,\n ...props\n },\n ref\n ) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [contentWidth, setContentWidth] = useState(0);\n const [contentHeight, setContentHeight] = useState(0);\n const [isPaused, setIsPaused] = useState(false);\n\n const isHorizontal = direction === \"left\" || direction === \"right\";\n const isReverse = direction === \"right\" || direction === \"down\";\n\n // Measure content size\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const firstChild = container.firstElementChild as HTMLElement;\n if (!firstChild) return;\n\n const updateSize = () => {\n if (isHorizontal) {\n setContentWidth(firstChild.offsetWidth);\n } else {\n setContentHeight(firstChild.offsetHeight);\n }\n };\n\n updateSize();\n\n const resizeObserver = new ResizeObserver(updateSize);\n resizeObserver.observe(firstChild);\n\n return () => resizeObserver.disconnect();\n }, [isHorizontal, children]);\n\n // Calculate animation duration\n const duration = isHorizontal\n ? contentWidth / speed\n : contentHeight / speed;\n\n const animationStyle: React.CSSProperties = {\n [\"--marquee-duration\" as string]: `${duration}s`,\n [\"--marquee-gap\" as string]: `${gap}px`,\n };\n\n // Gradient styles\n const gradientStyle = gradient\n ? {\n [\"--gradient-color\" as string]: gradientColor,\n [\"--gradient-width\" as string]: `${gradientWidth}px`,\n }\n : {};\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative overflow-hidden\",\n gradient && \"marquee-gradient\",\n className\n )}\n style={{ ...style, ...gradientStyle }}\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\n onClick={() => pauseOnClick && setIsPaused(!isPaused)}\n {...props}\n >\n <div\n ref={containerRef}\n className={merge(\n \"flex\",\n isHorizontal ? \"flex-row\" : \"flex-col\",\n isPaused ? \"animate-pause\" : \"\",\n isHorizontal\n ? isReverse\n ? \"animate-marquee-right\"\n : \"animate-marquee-left\"\n : isReverse\n ? \"animate-marquee-down\"\n : \"animate-marquee-up\"\n )}\n style={animationStyle}\n >\n {/* Original content */}\n <div\n className={merge(\n \"flex shrink-0\",\n isHorizontal ? \"flex-row\" : \"flex-col\"\n )}\n style={{ gap }}\n >\n {children}\n </div>\n {/* Duplicated content for seamless loop */}\n <div\n className={merge(\n \"flex shrink-0\",\n isHorizontal ? \"flex-row\" : \"flex-col\"\n )}\n style={{ gap, [isHorizontal ? \"marginLeft\" : \"marginTop\"]: gap }}\n aria-hidden=\"true\"\n >\n {children}\n </div>\n </div>\n\n {/* CSS for animations - injected as style element */}\n <style dangerouslySetInnerHTML={{ __html: `\n @keyframes marquee-left {\n from { transform: translateX(0); }\n to { transform: translateX(calc(-50% - var(--marquee-gap) / 2)); }\n }\n @keyframes marquee-right {\n from { transform: translateX(calc(-50% - var(--marquee-gap) / 2)); }\n to { transform: translateX(0); }\n }\n @keyframes marquee-up {\n from { transform: translateY(0); }\n to { transform: translateY(calc(-50% - var(--marquee-gap) / 2)); }\n }\n @keyframes marquee-down {\n from { transform: translateY(calc(-50% - var(--marquee-gap) / 2)); }\n to { transform: translateY(0); }\n }\n .animate-marquee-left { animation: marquee-left var(--marquee-duration) linear infinite; }\n .animate-marquee-right { animation: marquee-right var(--marquee-duration) linear infinite; }\n .animate-marquee-up { animation: marquee-up var(--marquee-duration) linear infinite; }\n .animate-marquee-down { animation: marquee-down var(--marquee-duration) linear infinite; }\n .animate-pause { animation-play-state: paused !important; }\n .marquee-gradient::before, .marquee-gradient::after {\n content: \"\";\n position: absolute;\n top: 0;\n bottom: 0;\n width: var(--gradient-width);\n z-index: 10;\n pointer-events: none;\n }\n .marquee-gradient::before {\n left: 0;\n background: linear-gradient(to right, var(--gradient-color), transparent);\n }\n .marquee-gradient::after {\n right: 0;\n background: linear-gradient(to left, var(--gradient-color), transparent);\n }\n `}} />\n </div>\n );\n }\n);\n\nMarquee.displayName = \"Marquee\";\n\nexport { Marquee };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * GlowCard 컴포넌트의 props / GlowCard component props\n * @property {string} [glowColor=\"rgba(120, 119, 198, 0.3)\"] - 글로우 색상 / Glow color\n * @property {number} [glowSize=400] - 글로우 크기 (px) / Glow size in pixels\n * @property {number} [glowOpacity=0.6] - 글로우 투명도 / Glow opacity\n * @property {boolean} [border=true] - 글로우 보더 표시 / Show glow border\n * @property {string} [borderColor] - 보더 색상 (기본: glowColor) / Border color (default: glowColor)\n */\nexport interface GlowCardProps extends React.HTMLAttributes<HTMLDivElement> {\n glowColor?: string;\n glowSize?: number;\n glowOpacity?: number;\n border?: boolean;\n borderColor?: string;\n}\n\n/**\n * GlowCard 컴포넌트 / GlowCard component\n *\n * 마우스를 따라다니는 글로우 효과가 있는 카드 컴포넌트입니다.\n * SaaS 랜딩 페이지, 프리미엄 UI에 적합합니다.\n *\n * Card component with mouse-following glow effect.\n * Perfect for SaaS landing pages and premium UI.\n *\n * @component\n * @example\n * <GlowCard glowColor=\"rgba(59, 130, 246, 0.4)\">\n * <h3>Premium Feature</h3>\n * <p>This is a premium feature card</p>\n * </GlowCard>\n */\nconst GlowCard = React.forwardRef<HTMLDivElement, GlowCardProps>(\n (\n {\n children,\n className,\n glowColor = \"rgba(120, 119, 198, 0.3)\",\n glowSize = 400,\n glowOpacity = 0.6,\n border = true,\n borderColor,\n style,\n ...props\n },\n ref\n ) => {\n const cardRef = useRef<HTMLDivElement>(null);\n const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!cardRef.current) return;\n const rect = cardRef.current.getBoundingClientRect();\n setMousePosition({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n });\n },\n []\n );\n\n const glowStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n opacity: isHovered ? glowOpacity : 0,\n background: `radial-gradient(${glowSize}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${glowColor}, transparent 40%)`,\n transition: \"opacity 0.3s ease\",\n pointerEvents: \"none\",\n };\n\n const borderStyle: React.CSSProperties = border\n ? {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n opacity: isHovered ? 1 : 0,\n background: `radial-gradient(${glowSize / 2}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${borderColor || glowColor}, transparent 40%)`,\n transition: \"opacity 0.3s ease\",\n pointerEvents: \"none\",\n mask: \"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n maskComposite: \"exclude\",\n WebkitMaskComposite: \"xor\",\n padding: \"1px\",\n }\n : {};\n\n return (\n <div\n ref={mergeRefs(ref, cardRef)}\n className={merge(\n \"relative overflow-hidden rounded-xl bg-card border border-border p-6\",\n \"transition-all duration-300\",\n isHovered && \"border-transparent\",\n className\n )}\n style={style}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {/* Glow effect */}\n <div style={glowStyle} aria-hidden=\"true\" />\n\n {/* Border glow */}\n {border && <div style={borderStyle as React.CSSProperties} aria-hidden=\"true\" />}\n\n {/* Content */}\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n }\n);\n\nGlowCard.displayName = \"GlowCard\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { GlowCard };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * SpotlightCard 컴포넌트의 props / SpotlightCard component props\n * @property {string} [spotlightColor=\"rgba(255, 255, 255, 0.1)\"] - 스포트라이트 색상 / Spotlight color\n * @property {number} [spotlightSize=300] - 스포트라이트 크기 (px) / Spotlight size in pixels\n * @property {boolean} [gradient=true] - 그라디언트 배경 효과 / Gradient background effect\n * @property {string} [gradientFrom=\"rgba(255, 255, 255, 0.05)\"] - 그라디언트 시작 색상 / Gradient start color\n * @property {string} [gradientTo=\"transparent\"] - 그라디언트 끝 색상 / Gradient end color\n */\nexport interface SpotlightCardProps extends React.HTMLAttributes<HTMLDivElement> {\n spotlightColor?: string;\n spotlightSize?: number;\n gradient?: boolean;\n gradientFrom?: string;\n gradientTo?: string;\n}\n\n/**\n * SpotlightCard 컴포넌트 / SpotlightCard component\n *\n * 마우스 위치에 스포트라이트 효과를 표시하는 프리미엄 카드 컴포넌트입니다.\n * 다크 테마 랜딩 페이지, 프리미엄 UI에 적합합니다.\n *\n * Premium card component that displays a spotlight effect at mouse position.\n * Perfect for dark theme landing pages and premium UI.\n *\n * @component\n * @example\n * <SpotlightCard className=\"bg-gray-900 text-white p-8\">\n * <h3>Premium Feature</h3>\n * <p>Discover our exclusive features</p>\n * </SpotlightCard>\n */\nconst SpotlightCard = React.forwardRef<HTMLDivElement, SpotlightCardProps>(\n (\n {\n children,\n className,\n spotlightColor = \"rgba(255, 255, 255, 0.1)\",\n spotlightSize = 300,\n gradient = true,\n gradientFrom = \"rgba(255, 255, 255, 0.05)\",\n gradientTo = \"transparent\",\n style,\n ...props\n },\n ref\n ) => {\n const cardRef = useRef<HTMLDivElement>(null);\n const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!cardRef.current) return;\n const rect = cardRef.current.getBoundingClientRect();\n setMousePosition({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n });\n },\n []\n );\n\n const spotlightStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n opacity: isHovered ? 1 : 0,\n background: `radial-gradient(${spotlightSize}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${spotlightColor}, transparent 60%)`,\n transition: \"opacity 0.4s ease\",\n pointerEvents: \"none\",\n };\n\n const gradientOverlayStyle: React.CSSProperties = gradient\n ? {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n background: `linear-gradient(135deg, ${gradientFrom} 0%, ${gradientTo} 100%)`,\n pointerEvents: \"none\",\n }\n : {};\n\n return (\n <div\n ref={mergeRefs(ref, cardRef)}\n className={merge(\n \"relative overflow-hidden rounded-xl\",\n \"bg-gray-900 border border-gray-800\",\n \"transition-all duration-300\",\n isHovered && \"border-gray-700 shadow-2xl shadow-black/20\",\n className\n )}\n style={style}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {/* Gradient overlay */}\n {gradient && <div style={gradientOverlayStyle} aria-hidden=\"true\" />}\n\n {/* Spotlight effect */}\n <div style={spotlightStyle} aria-hidden=\"true\" />\n\n {/* Content */}\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n }\n);\n\nSpotlightCard.displayName = \"SpotlightCard\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { SpotlightCard };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * TextReveal 컴포넌트의 props / TextReveal component props\n * @property {string} text - 표시할 텍스트 / Text to display\n * @property {string} [revealColor=\"currentColor\"] - 공개된 텍스트 색상 / Revealed text color\n * @property {string} [hiddenColor=\"rgba(128, 128, 128, 0.3)\"] - 숨겨진 텍스트 색상 / Hidden text color\n * @property {number} [threshold=0.5] - 공개 시작 임계값 (0-1) / Reveal threshold (0-1)\n * @property {boolean} [byWord=false] - 단어별 공개 / Reveal by word\n * @property {boolean} [byChar=false] - 글자별 공개 / Reveal by character\n */\nexport interface TextRevealProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n text: string;\n revealColor?: string;\n hiddenColor?: string;\n threshold?: number;\n byWord?: boolean;\n byChar?: boolean;\n}\n\n/**\n * TextReveal 컴포넌트 / TextReveal component\n *\n * 스크롤에 따라 텍스트가 점진적으로 공개되는 효과를 제공합니다.\n * 히어로 섹션, 스토리텔링 페이지에 적합합니다.\n *\n * Provides a text reveal effect based on scroll position.\n * Perfect for hero sections and storytelling pages.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <TextReveal text=\"Welcome to the future of design\" />\n *\n * @example\n * // 단어별 공개 / Word by word reveal\n * <TextReveal\n * text=\"Build amazing products with our platform\"\n * byWord\n * revealColor=\"#3b82f6\"\n * />\n */\nconst TextReveal = React.forwardRef<HTMLDivElement, TextRevealProps>(\n (\n {\n text,\n className,\n revealColor = \"currentColor\",\n hiddenColor = \"rgba(128, 128, 128, 0.3)\",\n threshold = 0.5,\n byWord = false,\n byChar = false,\n style,\n ...props\n },\n ref\n ) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [progress, setProgress] = useState(0);\n\n // Check for reduced motion preference\n const prefersReducedMotion = useReducedMotion();\n\n const updateProgress = useCallback(() => {\n if (!containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n\n // Calculate progress based on element position\n const start = windowHeight * (1 - threshold);\n const end = windowHeight * threshold;\n const elementCenter = rect.top + rect.height / 2;\n\n let newProgress = 0;\n if (elementCenter <= start && elementCenter >= end) {\n newProgress = (start - elementCenter) / (start - end);\n } else if (elementCenter < end) {\n newProgress = 1;\n }\n\n setProgress(Math.max(0, Math.min(1, newProgress)));\n }, [threshold]);\n\n useEffect(() => {\n if (prefersReducedMotion) {\n setProgress(1);\n return;\n }\n\n updateProgress();\n\n const handleScroll = () => {\n requestAnimationFrame(updateProgress);\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n window.addEventListener(\"resize\", handleScroll, { passive: true });\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", handleScroll);\n };\n }, [updateProgress, prefersReducedMotion]);\n\n // Split text based on mode\n const renderText = () => {\n if (byChar) {\n const chars = text.split(\"\");\n return chars.map((char, index) => {\n const charProgress = progress * chars.length;\n const isRevealed = index < charProgress;\n return (\n <span\n key={index}\n style={{\n color: isRevealed ? revealColor : hiddenColor,\n transition: \"color 0.1s ease-out\",\n }}\n >\n {char}\n </span>\n );\n });\n }\n\n if (byWord) {\n const words = text.split(\" \");\n return words.map((word, index) => {\n const wordProgress = progress * words.length;\n const isRevealed = index < wordProgress;\n return (\n <span key={index}>\n <span\n style={{\n color: isRevealed ? revealColor : hiddenColor,\n transition: \"color 0.15s ease-out\",\n }}\n >\n {word}\n </span>\n {index < words.length - 1 && \" \"}\n </span>\n );\n });\n }\n\n // Default: gradient mask reveal\n return (\n <span\n style={{\n background: `linear-gradient(90deg, ${revealColor} ${progress * 100}%, ${hiddenColor} ${progress * 100}%)`,\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\",\n transition: \"background 0.1s ease-out\",\n }}\n >\n {text}\n </span>\n );\n };\n\n return (\n <div\n ref={mergeRefs(ref, containerRef)}\n className={merge(\"font-medium\", className)}\n style={style}\n {...props}\n >\n {renderText()}\n </div>\n );\n }\n);\n\nTextReveal.displayName = \"TextReveal\";\n\n// Hook to check for reduced motion preference\nfunction useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setPrefersReducedMotion(mediaQuery.matches);\n\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { TextReveal };\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * AnimatedGradient 컴포넌트의 props / AnimatedGradient component props\n * @property {string[]} [colors] - 그라디언트 색상 배열 / Array of gradient colors\n * @property {number} [speed=3] - 애니메이션 속도 (초) / Animation speed in seconds\n * @property {boolean} [blur=true] - 블러 효과 / Blur effect\n * @property {number} [blurAmount=100] - 블러 양 (px) / Blur amount in pixels\n * @property {\"linear\" | \"radial\" | \"conic\" | \"mesh\"} [type=\"mesh\"] - 그라디언트 타입 / Gradient type\n * @property {boolean} [animate=true] - 애니메이션 활성화 / Enable animation\n */\nexport interface AnimatedGradientProps extends React.HTMLAttributes<HTMLDivElement> {\n colors?: string[];\n speed?: number;\n blur?: boolean;\n blurAmount?: number;\n type?: \"linear\" | \"radial\" | \"conic\" | \"mesh\";\n animate?: boolean;\n}\n\nconst defaultColors = [\n \"#ff0080\",\n \"#7928ca\",\n \"#0070f3\",\n \"#00dfd8\",\n];\n\n/**\n * AnimatedGradient 컴포넌트 / AnimatedGradient component\n *\n * 아름다운 애니메이션 그라디언트 배경을 제공합니다.\n * 히어로 섹션, 배경, 오버레이에 적합합니다.\n *\n * Provides beautiful animated gradient backgrounds.\n * Perfect for hero sections, backgrounds, and overlays.\n *\n * @component\n * @example\n * // 메쉬 그라디언트 / Mesh gradient\n * <AnimatedGradient type=\"mesh\" className=\"absolute inset-0 -z-10\" />\n *\n * @example\n * // 커스텀 색상 / Custom colors\n * <AnimatedGradient\n * colors={[\"#667eea\", \"#764ba2\", \"#f093fb\"]}\n * speed={5}\n * type=\"conic\"\n * />\n */\nconst AnimatedGradient = React.forwardRef<HTMLDivElement, AnimatedGradientProps>(\n (\n {\n children,\n className,\n colors = defaultColors,\n speed = 3,\n blur = true,\n blurAmount = 100,\n type = \"mesh\",\n animate = true,\n style,\n ...props\n },\n ref\n ) => {\n const [mounted, setMounted] = useState(false);\n const prefersReducedMotion = useReducedMotion();\n const shouldAnimate = animate && !prefersReducedMotion;\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const renderGradient = () => {\n switch (type) {\n case \"linear\":\n return (\n <div\n className=\"absolute inset-0\"\n style={{\n background: `linear-gradient(\n ${shouldAnimate ? \"var(--gradient-angle, 0deg)\" : \"135deg\"},\n ${colors.join(\", \")}\n )`,\n animation: shouldAnimate ? `gradient-rotate ${speed}s linear infinite` : undefined,\n }}\n />\n );\n\n case \"radial\":\n return (\n <div\n className=\"absolute inset-0\"\n style={{\n background: `radial-gradient(\n circle at ${shouldAnimate ? \"var(--gradient-x, 50%) var(--gradient-y, 50%)\" : \"50% 50%\"},\n ${colors.join(\", \")}\n )`,\n animation: shouldAnimate ? `gradient-move ${speed}s ease-in-out infinite` : undefined,\n }}\n />\n );\n\n case \"conic\":\n return (\n <div\n className=\"absolute inset-0\"\n style={{\n background: `conic-gradient(\n from ${shouldAnimate ? \"var(--gradient-angle, 0deg)\" : \"0deg\"} at 50% 50%,\n ${colors.join(\", \")},\n ${colors[0]}\n )`,\n animation: shouldAnimate ? `gradient-spin ${speed}s linear infinite` : undefined,\n }}\n />\n );\n\n case \"mesh\":\n default:\n return (\n <>\n {colors.map((color, index) => {\n const angle = (360 / colors.length) * index;\n const delay = (speed / colors.length) * index;\n return (\n <div\n key={index}\n className=\"absolute rounded-full mix-blend-screen\"\n style={{\n width: \"60%\",\n height: \"60%\",\n background: `radial-gradient(circle at center, ${color} 0%, transparent 70%)`,\n top: `${30 + Math.sin((angle * Math.PI) / 180) * 20}%`,\n left: `${30 + Math.cos((angle * Math.PI) / 180) * 20}%`,\n animation: shouldAnimate\n ? `gradient-blob ${speed}s ease-in-out infinite`\n : undefined,\n animationDelay: shouldAnimate ? `${-delay}s` : undefined,\n opacity: mounted ? 1 : 0,\n transition: \"opacity 0.5s ease-out\",\n }}\n />\n );\n })}\n </>\n );\n }\n };\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative overflow-hidden\",\n className\n )}\n style={style}\n {...props}\n >\n {/* Gradient layer */}\n <div\n className=\"absolute inset-0\"\n style={{\n filter: blur ? `blur(${blurAmount}px)` : undefined,\n }}\n >\n {renderGradient()}\n </div>\n\n {/* Content */}\n {children && <div className=\"relative z-10\">{children}</div>}\n\n {/* Animation keyframes - injected as style element */}\n <style dangerouslySetInnerHTML={{ __html: `\n @keyframes gradient-rotate {\n 0% { --gradient-angle: 0deg; }\n 100% { --gradient-angle: 360deg; }\n }\n @keyframes gradient-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n @keyframes gradient-move {\n 0%, 100% { --gradient-x: 0%; --gradient-y: 0%; }\n 25% { --gradient-x: 100%; --gradient-y: 0%; }\n 50% { --gradient-x: 100%; --gradient-y: 100%; }\n 75% { --gradient-x: 0%; --gradient-y: 100%; }\n }\n @keyframes gradient-blob {\n 0%, 100% { transform: translate(0, 0) scale(1); }\n 25% { transform: translate(20%, -20%) scale(1.1); }\n 50% { transform: translate(0, 20%) scale(0.9); }\n 75% { transform: translate(-20%, -10%) scale(1.05); }\n }\n `}} />\n </div>\n );\n }\n);\n\nAnimatedGradient.displayName = \"AnimatedGradient\";\n\n// Hook to check for reduced motion preference\nfunction useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setPrefersReducedMotion(mediaQuery.matches);\n\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n\nexport { AnimatedGradient };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * TiltCard 컴포넌트의 props / TiltCard component props\n * @property {number} [maxTilt=15] - 최대 기울기 각도 / Maximum tilt angle in degrees\n * @property {number} [perspective=1000] - 원근감 / Perspective value\n * @property {number} [scale=1.02] - 호버시 스케일 / Scale on hover\n * @property {number} [speed=400] - 전환 속도 (ms) / Transition speed in milliseconds\n * @property {boolean} [glare=true] - 글레어 효과 / Glare effect\n * @property {number} [maxGlare=0.3] - 최대 글레어 투명도 / Maximum glare opacity\n * @property {boolean} [reset=true] - 마우스 떠나면 리셋 / Reset on mouse leave\n */\nexport interface TiltCardProps extends React.HTMLAttributes<HTMLDivElement> {\n maxTilt?: number;\n perspective?: number;\n scale?: number;\n speed?: number;\n glare?: boolean;\n maxGlare?: number;\n reset?: boolean;\n}\n\n/**\n * TiltCard 컴포넌트 / TiltCard component\n *\n * 마우스 움직임에 따라 3D 틸트 효과를 제공하는 카드 컴포넌트입니다.\n * 제품 카드, 프로필 카드, 갤러리에 적합합니다.\n *\n * Card component that provides 3D tilt effect based on mouse movement.\n * Perfect for product cards, profile cards, and galleries.\n *\n * @component\n * @example\n * <TiltCard className=\"bg-white shadow-lg rounded-xl p-6\">\n * <img src=\"/product.jpg\" alt=\"Product\" />\n * <h3>Premium Product</h3>\n * </TiltCard>\n */\nconst TiltCard = React.forwardRef<HTMLDivElement, TiltCardProps>(\n (\n {\n children,\n className,\n maxTilt = 15,\n perspective = 1000,\n scale = 1.02,\n speed = 400,\n glare = true,\n maxGlare = 0.3,\n reset = true,\n style,\n ...props\n },\n ref\n ) => {\n const cardRef = useRef<HTMLDivElement>(null);\n const [transform, setTransform] = useState({\n rotateX: 0,\n rotateY: 0,\n scale: 1,\n });\n const [glarePosition, setGlarePosition] = useState({ x: 50, y: 50 });\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!cardRef.current) return;\n\n const rect = cardRef.current.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n\n // Calculate rotation based on mouse position\n const mouseX = e.clientX - centerX;\n const mouseY = e.clientY - centerY;\n\n const rotateY = (mouseX / (rect.width / 2)) * maxTilt;\n const rotateX = -(mouseY / (rect.height / 2)) * maxTilt;\n\n setTransform({\n rotateX,\n rotateY,\n scale,\n });\n\n // Calculate glare position (0-100%)\n const glareX = ((e.clientX - rect.left) / rect.width) * 100;\n const glareY = ((e.clientY - rect.top) / rect.height) * 100;\n setGlarePosition({ x: glareX, y: glareY });\n },\n [maxTilt, scale]\n );\n\n const handleMouseEnter = () => {\n setIsHovered(true);\n };\n\n const handleMouseLeave = () => {\n setIsHovered(false);\n if (reset) {\n setTransform({\n rotateX: 0,\n rotateY: 0,\n scale: 1,\n });\n }\n };\n\n const cardStyle: React.CSSProperties = {\n ...style,\n perspective: `${perspective}px`,\n };\n\n const innerStyle: React.CSSProperties = {\n transform: `rotateX(${transform.rotateX}deg) rotateY(${transform.rotateY}deg) scale(${transform.scale})`,\n transition: isHovered ? \"none\" : `transform ${speed}ms ease-out`,\n transformStyle: \"preserve-3d\",\n };\n\n const glareStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n background: `linear-gradient(\n ${Math.atan2(glarePosition.y - 50, glarePosition.x - 50) * (180 / Math.PI) + 90}deg,\n rgba(255, 255, 255, ${isHovered ? maxGlare : 0}) 0%,\n transparent 80%\n )`,\n transition: isHovered ? \"opacity 0.1s ease-out\" : `opacity ${speed}ms ease-out`,\n pointerEvents: \"none\",\n opacity: isHovered ? 1 : 0,\n };\n\n return (\n <div\n ref={mergeRefs(ref, cardRef)}\n className={merge(\"relative\", className)}\n style={cardStyle}\n onMouseMove={handleMouseMove}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n <div style={innerStyle} className=\"relative\">\n {children}\n\n {/* Glare effect */}\n {glare && <div style={glareStyle} aria-hidden=\"true\" />}\n </div>\n </div>\n );\n }\n);\n\nTiltCard.displayName = \"TiltCard\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { TiltCard };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * VideoBackground 컴포넌트의 props / VideoBackground component props\n * @property {string} src - 비디오 소스 (URL, YouTube ID, Vimeo ID) / Video source\n * @property {\"native\" | \"youtube\" | \"vimeo\"} [type=\"native\"] - 비디오 타입 / Video type\n * @property {string} [poster] - 포스터 이미지 URL / Poster image URL\n * @property {boolean} [autoPlay=true] - 자동 재생 / Auto play\n * @property {boolean} [loop=true] - 반복 재생 / Loop playback\n * @property {boolean} [muted=true] - 음소거 / Mute audio\n * @property {boolean} [controls=false] - 컨트롤 표시 / Show controls\n * @property {\"cover\" | \"contain\" | \"fill\"} [objectFit=\"cover\"] - 비디오 맞춤 / Video fit\n * @property {boolean} [overlay=true] - 오버레이 표시 / Show overlay\n * @property {string} [overlayColor=\"rgba(0, 0, 0, 0.4)\"] - 오버레이 색상 / Overlay color\n * @property {boolean} [gradient=false] - 그라디언트 오버레이 / Gradient overlay\n * @property {\"top\" | \"bottom\" | \"both\"} [gradientDirection=\"bottom\"] - 그라디언트 방향 / Gradient direction\n * @property {number} [playbackRate=1] - 재생 속도 / Playback rate\n * @property {boolean} [fadeIn=true] - 페이드 인 효과 / Fade in effect\n */\nexport interface VideoBackgroundProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n src: string;\n type?: \"native\" | \"youtube\" | \"vimeo\";\n poster?: string;\n autoPlay?: boolean;\n loop?: boolean;\n muted?: boolean;\n controls?: boolean;\n objectFit?: \"cover\" | \"contain\" | \"fill\";\n overlay?: boolean;\n overlayColor?: string;\n gradient?: boolean;\n gradientDirection?: \"top\" | \"bottom\" | \"both\";\n playbackRate?: number;\n fadeIn?: boolean;\n children?: React.ReactNode;\n}\n\n/**\n * VideoBackground 컴포넌트 / VideoBackground component\n *\n * 페이지 배경으로 사용할 수 있는 비디오 컴포넌트입니다.\n * YouTube, Vimeo, 일반 비디오 소스를 지원합니다.\n *\n * Video component that can be used as page background.\n * Supports YouTube, Vimeo, and native video sources.\n *\n * @component\n * @example\n * // Native video\n * <VideoBackground src=\"/hero-video.mp4\" overlay gradient>\n * <h1>Welcome</h1>\n * </VideoBackground>\n *\n * @example\n * // YouTube video\n * <VideoBackground\n * type=\"youtube\"\n * src=\"dQw4w9WgXcQ\"\n * overlay\n * overlayColor=\"rgba(0, 0, 50, 0.5)\"\n * />\n *\n * @example\n * // Vimeo video\n * <VideoBackground type=\"vimeo\" src=\"123456789\" />\n */\nconst VideoBackground = React.forwardRef<HTMLDivElement, VideoBackgroundProps>(\n (\n {\n src,\n type = \"native\",\n poster,\n autoPlay = true,\n loop = true,\n muted = true,\n controls = false,\n objectFit = \"cover\",\n overlay = true,\n overlayColor = \"rgba(0, 0, 0, 0.4)\",\n gradient = false,\n gradientDirection = \"bottom\",\n playbackRate = 1,\n fadeIn = true,\n children,\n className,\n style,\n ...props\n },\n ref\n ) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isLoaded, setIsLoaded] = useState(false);\n const [isPlaying, setIsPlaying] = useState(false);\n\n // Handle native video playback rate\n useEffect(() => {\n if (type === \"native\" && videoRef.current) {\n videoRef.current.playbackRate = playbackRate;\n }\n }, [playbackRate, type]);\n\n // Handle video loaded\n const handleLoadedData = () => {\n setIsLoaded(true);\n };\n\n const handlePlaying = () => {\n setIsPlaying(true);\n };\n\n // Generate YouTube embed URL\n const getYouTubeUrl = (videoId: string) => {\n const params = new URLSearchParams({\n autoplay: autoPlay ? \"1\" : \"0\",\n mute: muted ? \"1\" : \"0\",\n loop: loop ? \"1\" : \"0\",\n controls: controls ? \"1\" : \"0\",\n playlist: videoId, // Required for loop to work\n modestbranding: \"1\",\n rel: \"0\",\n showinfo: \"0\",\n iv_load_policy: \"3\",\n disablekb: \"1\",\n enablejsapi: \"1\",\n playsinline: \"1\",\n });\n return `https://www.youtube.com/embed/${videoId}?${params.toString()}`;\n };\n\n // Generate Vimeo embed URL\n const getVimeoUrl = (videoId: string) => {\n const params = new URLSearchParams({\n autoplay: autoPlay ? \"1\" : \"0\",\n muted: muted ? \"1\" : \"0\",\n loop: loop ? \"1\" : \"0\",\n controls: controls ? \"1\" : \"0\",\n background: \"1\",\n quality: \"auto\",\n dnt: \"1\",\n });\n return `https://player.vimeo.com/video/${videoId}?${params.toString()}`;\n };\n\n // Render video element based on type\n const renderVideo = () => {\n const objectFitClass = {\n cover: \"object-cover\",\n contain: \"object-contain\",\n fill: \"object-fill\",\n }[objectFit];\n\n switch (type) {\n case \"youtube\":\n return (\n <iframe\n src={getYouTubeUrl(src)}\n className={merge(\n \"absolute inset-0 w-full h-full pointer-events-none\",\n \"scale-[1.2]\" // Scale up to hide YouTube branding\n )}\n style={{\n opacity: isLoaded || !fadeIn ? 1 : 0,\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\n }}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n onLoad={() => setIsLoaded(true)}\n title=\"YouTube video background\"\n />\n );\n\n case \"vimeo\":\n return (\n <iframe\n src={getVimeoUrl(src)}\n className=\"absolute inset-0 w-full h-full pointer-events-none\"\n style={{\n opacity: isLoaded || !fadeIn ? 1 : 0,\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\n }}\n allow=\"autoplay; fullscreen; picture-in-picture\"\n allowFullScreen\n onLoad={() => setIsLoaded(true)}\n title=\"Vimeo video background\"\n />\n );\n\n case \"native\":\n default:\n return (\n <video\n ref={videoRef}\n src={src}\n poster={poster}\n autoPlay={autoPlay}\n loop={loop}\n muted={muted}\n controls={controls}\n playsInline\n className={merge(\n \"absolute inset-0 w-full h-full\",\n objectFitClass\n )}\n style={{\n opacity: isPlaying || !fadeIn ? 1 : 0,\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\n }}\n onLoadedData={handleLoadedData}\n onPlaying={handlePlaying}\n />\n );\n }\n };\n\n // Generate gradient overlay\n const renderGradientOverlay = () => {\n if (!gradient) return null;\n\n const gradients = [];\n\n if (gradientDirection === \"top\" || gradientDirection === \"both\") {\n gradients.push(\n <div\n key=\"top\"\n className=\"absolute top-0 left-0 right-0 h-1/3\"\n style={{\n background: `linear-gradient(to bottom, ${overlayColor}, transparent)`,\n }}\n aria-hidden=\"true\"\n />\n );\n }\n\n if (gradientDirection === \"bottom\" || gradientDirection === \"both\") {\n gradients.push(\n <div\n key=\"bottom\"\n className=\"absolute bottom-0 left-0 right-0 h-1/3\"\n style={{\n background: `linear-gradient(to top, ${overlayColor}, transparent)`,\n }}\n aria-hidden=\"true\"\n />\n );\n }\n\n return <>{gradients}</>;\n };\n\n // Check if className contains position class (fixed, absolute, sticky)\n const hasPositionClass = className && /\\b(fixed|absolute|sticky)\\b/.test(className);\n\n return (\n <div\n ref={ref}\n className={merge(\n \"overflow-hidden\",\n !hasPositionClass && \"relative\",\n className\n )}\n style={style}\n {...props}\n >\n {/* Poster image (shows until video loads) */}\n {poster && fadeIn && !isLoaded && !isPlaying && (\n <div\n className=\"absolute inset-0 bg-cover bg-center\"\n style={{ backgroundImage: `url(${poster})` }}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Video layer */}\n {renderVideo()}\n\n {/* Solid overlay */}\n {overlay && !gradient && (\n <div\n className=\"absolute inset-0\"\n style={{ backgroundColor: overlayColor }}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Gradient overlay */}\n {renderGradientOverlay()}\n\n {/* Content */}\n {children && (\n <div className=\"relative z-10 h-full\">\n {children}\n </div>\n )}\n </div>\n );\n }\n);\n\nVideoBackground.displayName = \"VideoBackground\";\n\nexport { VideoBackground };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback, useEffect } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * Carousel 컴포넌트의 props / Carousel component props\n * @property {boolean} [autoPlay=false] - 자동 재생 / Auto play\n * @property {number} [interval=5000] - 자동 재생 간격 (ms) / Auto play interval\n * @property {boolean} [loop=true] - 무한 루프 / Infinite loop\n * @property {boolean} [pauseOnHover=true] - 호버시 일시정지 / Pause on hover\n * @property {\"dots\" | \"bars\" | \"numbers\" | \"none\"} [indicators=\"dots\"] - 인디케이터 타입 / Indicator type\n * @property {\"bottom\" | \"top\" | \"inside-bottom\" | \"inside-top\"} [indicatorPosition=\"bottom\"] - 인디케이터 위치 / Indicator position\n * @property {boolean} [showArrows=true] - 화살표 버튼 표시 / Show arrow buttons\n * @property {\"inside\" | \"outside\" | \"hidden\"} [arrowPosition=\"inside\"] - 화살표 위치 / Arrow position\n * @property {\"slide\" | \"fade\" | \"scale\"} [transition=\"slide\"] - 전환 효과 / Transition effect\n * @property {number} [transitionDuration=500] - 전환 시간 (ms) / Transition duration\n * @property {(index: number) => void} [onSlideChange] - 슬라이드 변경 콜백 / Slide change callback\n * @property {boolean} [showPlayPause=false] - 재생/일시정지 버튼 표시 / Show play/pause button\n * @property {\"left\" | \"right\" | \"center\"} [playPausePosition=\"right\"] - 재생/일시정지 버튼 위치 / Play/pause button position\n */\nexport interface CarouselProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n children: React.ReactNode[];\n autoPlay?: boolean;\n interval?: number;\n loop?: boolean;\n pauseOnHover?: boolean;\n indicators?: \"dots\" | \"bars\" | \"numbers\" | \"none\";\n indicatorPosition?: \"bottom\" | \"top\" | \"inside-bottom\" | \"inside-top\";\n showArrows?: boolean;\n arrowPosition?: \"inside\" | \"outside\" | \"hidden\";\n transition?: \"slide\" | \"fade\" | \"scale\";\n transitionDuration?: number;\n onSlideChange?: (index: number) => void;\n showPlayPause?: boolean;\n playPausePosition?: \"left\" | \"right\" | \"center\";\n}\n\n/**\n * Carousel 컴포넌트 / Carousel component\n *\n * 슬라이드 캐러셀 컴포넌트입니다.\n * 다양한 인디케이터, 화살표, 전환 효과를 지원합니다.\n *\n * Slide carousel component.\n * Supports various indicators, arrows, and transition effects.\n *\n * @component\n * @example\n * <Carousel autoPlay interval={3000} indicators=\"bars\">\n * <img src=\"/slide1.jpg\" alt=\"Slide 1\" />\n * <img src=\"/slide2.jpg\" alt=\"Slide 2\" />\n * <img src=\"/slide3.jpg\" alt=\"Slide 3\" />\n * </Carousel>\n */\nconst Carousel = React.forwardRef<HTMLDivElement, CarouselProps>(\n (\n {\n children,\n autoPlay = false,\n interval = 5000,\n loop = true,\n pauseOnHover = true,\n indicators = \"dots\",\n indicatorPosition = \"bottom\",\n showArrows = true,\n arrowPosition = \"inside\",\n transition = \"slide\",\n transitionDuration = 500,\n onSlideChange,\n showPlayPause = false,\n playPausePosition = \"right\",\n className,\n style,\n ...props\n },\n ref\n ) => {\n // For slide transition with loop: start at 1 (account for cloned first slide)\n // For fade/scale: always start at 0 (no cloned slides)\n const getInitialIndex = () => {\n if (transition === \"slide\" && loop) return 1;\n return 0;\n };\n const [currentIndex, setCurrentIndex] = useState(getInitialIndex);\n const [isPaused, setIsPaused] = useState(!autoPlay);\n const [isManuallyPaused, setIsManuallyPaused] = useState(false);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [noTransition, setNoTransition] = useState(false);\n const [touchStart, setTouchStart] = useState<number | null>(null);\n const [touchEnd, setTouchEnd] = useState<number | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const slideCount = React.Children.count(children);\n\n // Check for reduced motion preference\n const prefersReducedMotion = useReducedMotion();\n\n // Get actual slide index for display (accounting for cloned slides in loop mode for slide transition)\n const getActualIndex = useCallback((index: number) => {\n // For fade/scale transitions, currentIndex is the actual index\n if (transition !== \"slide\") return index;\n // For slide transition without loop, index is actual\n if (!loop) return index;\n // For slide transition with loop, account for cloned slides\n if (index === 0) return slideCount - 1;\n if (index === slideCount + 1) return 0;\n return index - 1;\n }, [loop, slideCount, transition]);\n\n // Go to specific slide\n const goToSlide = useCallback(\n (index: number) => {\n if (isTransitioning) return;\n\n let newIndex = index;\n if (!loop) {\n newIndex = Math.max(0, Math.min(index, slideCount - 1));\n } else if (transition !== \"slide\") {\n // For fade/scale with loop, wrap around without cloned slides\n if (index < 0) {\n newIndex = slideCount - 1;\n } else if (index >= slideCount) {\n newIndex = 0;\n }\n }\n\n if (newIndex !== currentIndex) {\n setIsTransitioning(true);\n setCurrentIndex(newIndex);\n const actualIndex = loop && transition === \"slide\"\n ? (newIndex === 0 ? slideCount - 1 : newIndex === slideCount + 1 ? 0 : newIndex - 1)\n : newIndex;\n onSlideChange?.(actualIndex);\n setTimeout(() => setIsTransitioning(false), transitionDuration);\n }\n },\n [currentIndex, slideCount, loop, isTransitioning, transitionDuration, transition, onSlideChange]\n );\n\n // Handle infinite loop jump (when reaching cloned slides)\n useEffect(() => {\n if (!loop || isTransitioning || transition !== \"slide\") return;\n\n // Jump to real slide without animation when on cloned slides\n if (currentIndex === 0) {\n // At cloned last slide -> jump to real last slide\n setTimeout(() => {\n setNoTransition(true);\n setCurrentIndex(slideCount);\n setTimeout(() => setNoTransition(false), 50);\n }, transitionDuration);\n } else if (currentIndex === slideCount + 1) {\n // At cloned first slide -> jump to real first slide\n setTimeout(() => {\n setNoTransition(true);\n setCurrentIndex(1);\n setTimeout(() => setNoTransition(false), 50);\n }, transitionDuration);\n }\n }, [currentIndex, slideCount, loop, isTransitioning, transitionDuration, transition]);\n\n // Next slide\n const nextSlide = useCallback(() => {\n goToSlide(currentIndex + 1);\n }, [currentIndex, goToSlide]);\n\n // Previous slide\n const prevSlide = useCallback(() => {\n goToSlide(currentIndex - 1);\n }, [currentIndex, goToSlide]);\n\n // Toggle play/pause manually\n const togglePlayPause = useCallback(() => {\n setIsManuallyPaused(prev => !prev);\n }, []);\n\n // Play function\n const play = useCallback(() => {\n setIsManuallyPaused(false);\n }, []);\n\n // Pause function\n const pause = useCallback(() => {\n setIsManuallyPaused(true);\n }, []);\n\n // Auto play\n useEffect(() => {\n if (!autoPlay || isPaused || isManuallyPaused || prefersReducedMotion) return;\n\n const timer = setInterval(nextSlide, interval);\n return () => clearInterval(timer);\n }, [autoPlay, interval, isPaused, isManuallyPaused, nextSlide, prefersReducedMotion]);\n\n // Touch handlers for swipe\n const handleTouchStart = (e: React.TouchEvent) => {\n setTouchStart(e.targetTouches[0].clientX);\n };\n\n const handleTouchMove = (e: React.TouchEvent) => {\n setTouchEnd(e.targetTouches[0].clientX);\n };\n\n const handleTouchEnd = () => {\n if (!touchStart || !touchEnd) return;\n\n const distance = touchStart - touchEnd;\n const minSwipeDistance = 50;\n\n if (Math.abs(distance) >= minSwipeDistance) {\n if (distance > 0) {\n nextSlide();\n } else {\n prevSlide();\n }\n }\n\n setTouchStart(null);\n setTouchEnd(null);\n };\n\n // Keyboard navigation\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"ArrowLeft\") {\n prevSlide();\n } else if (e.key === \"ArrowRight\") {\n nextSlide();\n }\n };\n\n const container = containerRef.current;\n container?.addEventListener(\"keydown\", handleKeyDown);\n return () => container?.removeEventListener(\"keydown\", handleKeyDown);\n }, [nextSlide, prevSlide]);\n\n // Render slides with transition\n const renderSlides = () => {\n const duration = prefersReducedMotion || noTransition ? 0 : transitionDuration;\n const actualIndex = getActualIndex(currentIndex);\n\n switch (transition) {\n case \"fade\":\n return React.Children.map(children, (child, index) => (\n <div\n key={index}\n className={merge(\n \"absolute inset-0 w-full h-full\",\n index === actualIndex ? \"z-10\" : \"z-0\"\n )}\n style={{\n opacity: index === actualIndex ? 1 : 0,\n transition: `opacity ${duration}ms ease-in-out`,\n }}\n >\n {child}\n </div>\n ));\n\n case \"scale\":\n return React.Children.map(children, (child, index) => (\n <div\n key={index}\n className={merge(\n \"absolute inset-0 w-full h-full\",\n index === actualIndex ? \"z-10\" : \"z-0\"\n )}\n style={{\n opacity: index === actualIndex ? 1 : 0,\n transform: `scale(${index === actualIndex ? 1 : 0.9})`,\n transition: `opacity ${duration}ms ease-in-out, transform ${duration}ms ease-in-out`,\n }}\n >\n {child}\n </div>\n ));\n\n case \"slide\":\n default: {\n const childArray = React.Children.toArray(children);\n // For infinite loop: clone last slide at beginning and first slide at end\n const slides = loop\n ? [childArray[childArray.length - 1], ...childArray, childArray[0]]\n : childArray;\n\n // 각 슬라이드를 fade/scale처럼 absolute로 배치하고 translateX로 위치 조정\n return slides.map((child, index) => (\n <div\n key={index}\n className=\"absolute inset-0 w-full h-full\"\n style={{\n transform: `translateX(${(index - currentIndex) * 100}%)`,\n transition: noTransition ? 'none' : `transform ${duration}ms ease-in-out`,\n }}\n >\n {child}\n </div>\n ));\n }\n }\n };\n\n // Render indicators\n const renderIndicators = () => {\n if (indicators === \"none\") return null;\n\n const isInside = indicatorPosition.includes(\"inside\");\n const isTop = indicatorPosition.includes(\"top\");\n const actualIndex = getActualIndex(currentIndex);\n\n const indicatorContainerClass = merge(\n \"flex items-center justify-center gap-2\",\n isInside\n ? merge(\n \"absolute left-1/2 -translate-x-1/2 z-20\",\n isTop ? \"top-4\" : \"bottom-4\"\n )\n : merge(\n \"mt-4\",\n isTop && \"order-first mb-4 mt-0\"\n )\n );\n\n // Handle indicator click - go to the correct index accounting for loop mode\n const handleIndicatorClick = (index: number) => {\n if (loop && transition === \"slide\") {\n goToSlide(index + 1); // +1 because of cloned first slide (only for slide transition)\n } else {\n goToSlide(index);\n }\n };\n\n return (\n <div className={indicatorContainerClass} role=\"tablist\">\n {Array.from({ length: slideCount }, (_, index) => {\n const isActive = index === actualIndex;\n\n switch (indicators) {\n case \"bars\":\n return (\n <button\n key={index}\n onClick={() => handleIndicatorClick(index)}\n className={merge(\n \"h-1 rounded-full transition-all duration-300\",\n isActive\n ? \"w-8 bg-white\"\n : \"w-4 bg-white/50 hover:bg-white/70\"\n )}\n role=\"tab\"\n aria-selected={isActive}\n aria-label={`슬라이드 ${index + 1}`}\n />\n );\n\n case \"numbers\":\n return (\n <button\n key={index}\n onClick={() => handleIndicatorClick(index)}\n className={merge(\n \"w-8 h-8 rounded-full text-sm font-medium transition-all duration-300\",\n isActive\n ? \"bg-white text-gray-900\"\n : \"bg-white/30 text-white hover:bg-white/50\"\n )}\n role=\"tab\"\n aria-selected={isActive}\n aria-label={`슬라이드 ${index + 1}`}\n >\n {index + 1}\n </button>\n );\n\n case \"dots\":\n default:\n return (\n <button\n key={index}\n onClick={() => handleIndicatorClick(index)}\n className={merge(\n \"w-2.5 h-2.5 rounded-full transition-all duration-300\",\n isActive\n ? \"bg-white scale-125\"\n : \"bg-white/50 hover:bg-white/70\"\n )}\n role=\"tab\"\n aria-selected={isActive}\n aria-label={`슬라이드 ${index + 1}`}\n />\n );\n }\n })}\n </div>\n );\n };\n\n // Render play/pause button\n const renderPlayPause = () => {\n if (!showPlayPause || !autoPlay) return null;\n\n const isPlaying = !isManuallyPaused;\n const positionClasses = {\n left: \"left-4\",\n center: \"left-1/2 -translate-x-1/2\",\n right: \"right-4\"\n };\n\n return (\n <button\n onClick={togglePlayPause}\n className={merge(\n \"absolute bottom-4 z-20\",\n \"w-8 h-8 rounded-full flex items-center justify-center\",\n \"bg-white/80 hover:bg-white text-gray-800\",\n \"transition-all duration-200\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white\",\n positionClasses[playPausePosition]\n )}\n aria-label={isPlaying ? \"일시정지\" : \"재생\"}\n >\n {isPlaying ? <PauseIcon className=\"w-4 h-4\" /> : <PlayIcon className=\"w-4 h-4\" />}\n </button>\n );\n };\n\n // Render arrows\n const renderArrows = () => {\n if (!showArrows || arrowPosition === \"hidden\") return null;\n\n const canGoPrev = loop || currentIndex > 0;\n const canGoNext = loop || currentIndex < slideCount - 1;\n\n const arrowBaseClass = merge(\n \"absolute top-1/2 -translate-y-1/2 z-20\",\n \"w-10 h-10 rounded-full flex items-center justify-center\",\n \"bg-white/80 hover:bg-white text-gray-800\",\n \"transition-all duration-200\",\n \"disabled:opacity-30 disabled:cursor-not-allowed\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white\"\n );\n\n const prevPosition = arrowPosition === \"outside\" ? \"-left-14\" : \"left-4\";\n const nextPosition = arrowPosition === \"outside\" ? \"-right-14\" : \"right-4\";\n\n return (\n <>\n <button\n onClick={prevSlide}\n disabled={!canGoPrev}\n className={merge(arrowBaseClass, prevPosition)}\n aria-label=\"이전 슬라이드\"\n >\n <ChevronLeft className=\"w-5 h-5\" />\n </button>\n <button\n onClick={nextSlide}\n disabled={!canGoNext}\n className={merge(arrowBaseClass, nextPosition)}\n aria-label=\"다음 슬라이드\"\n >\n <ChevronRight className=\"w-5 h-5\" />\n </button>\n </>\n );\n };\n\n return (\n <div\n ref={ref}\n className={merge(\n \"flex flex-col w-full h-full\",\n arrowPosition === \"outside\" && \"px-16\",\n className\n )}\n style={style}\n {...props}\n >\n <div\n ref={containerRef}\n className=\"relative overflow-hidden w-full flex-1\"\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n tabIndex={0}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label=\"이미지 슬라이더\"\n >\n {renderSlides()}\n {renderArrows()}\n {renderPlayPause()}\n {indicatorPosition.includes(\"inside\") && renderIndicators()}\n </div>\n {!indicatorPosition.includes(\"inside\") && renderIndicators()}\n </div>\n );\n }\n);\n\nCarousel.displayName = \"Carousel\";\n\n// Hook to check for reduced motion preference\nfunction useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setPrefersReducedMotion(mediaQuery.matches);\n\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n\n// Simple icon components\nfunction ChevronLeft({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n );\n}\n\nfunction ChevronRight({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n );\n}\n\nfunction PlayIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction PauseIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M6 4h4v16H6V4zm8 0h4v16h-4V4z\" />\n </svg>\n );\n}\n\nexport { Carousel };\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const cardVariants = cva(\n \"rounded-lg\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground border border-border\",\n outline: \"bg-transparent border-2 border-border\",\n elevated: \"bg-card text-card-foreground shadow-lg border border-border\",\n },\n shadow: {\n none: \"shadow-none\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n },\n padding: {\n none: \"\",\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n padding: \"none\",\n },\n }\n)\n\n/**\n * Card 컴포넌트의 props / Card component props\n */\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"outline\" | \"elevated\"\n shadow?: \"none\" | \"sm\" | \"md\" | \"lg\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\"\n hoverable?: boolean\n}\n\n/**\n * Card 컴포넌트 / Card component\n *\n * 콘텐츠를 카드 형태로 표시하는 컴포넌트입니다.\n *\n * @example\n * <Card>\n * <CardHeader><CardTitle>제목</CardTitle></CardHeader>\n * <CardContent><p>내용</p></CardContent>\n * </Card>\n */\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant = \"default\", shadow, padding = \"none\", hoverable, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n cardVariants({ variant, shadow, padding }),\n hoverable && \"transition-shadow hover:shadow-lg cursor-pointer\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nCard.displayName = \"Card\"\n\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex flex-col space-y-1 p-3\", className)}\n {...props}\n />\n )\n)\n\nCardHeader.displayName = \"CardHeader\"\n\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, CardTitleProps>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={merge(\n \"text-base md:text-lg font-semibold leading-tight tracking-tight\",\n className\n )}\n {...props}\n />\n )\n)\n\nCardTitle.displayName = \"CardTitle\"\n\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={merge(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\n\nCardDescription.displayName = \"CardDescription\"\n\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={merge(\"px-3 pb-3\", className)} {...props} />\n )\n)\n\nCardContent.displayName = \"CardContent\"\n\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center px-3 pb-3\", className)}\n {...props}\n />\n )\n)\n\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80\",\n secondary: \"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80\",\n destructive: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n error: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n outline: \"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]\",\n glass: \"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n *\n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n *\n * @example\n * <Badge>New</Badge>\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge }\n","/**\n * 슬러그 생성 유틸리티\n * Slug generation utilities\n */\n\n/**\n * 제목에서 URL 슬러그 생성\n * Generate URL slug from title\n *\n * @param title - 제목 / Title\n * @returns 슬러그 / Slug\n *\n * @example\n * ```ts\n * generateSlug('Hello World') // 'hello-world'\n * generateSlug('안녕하세요') // '안녕하세요'\n * generateSlug('Hello 안녕') // 'hello-안녕'\n * ```\n */\nexport function generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9가-힣ぁ-んァ-ン一-龯_.~\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n .trim()\n}\n\n/**\n * 슬러그 유효성 검사\n * Validate slug\n *\n * @param slug - 슬러그 / Slug\n * @returns 유효 여부 / Whether valid\n */\nexport function isValidSlug(slug: string): boolean {\n if (!slug || slug.length === 0) return false\n if (slug.length > 200) return false\n\n // 슬러그 형식 검사: 영문, 숫자, 한글, 일본어, 하이픈만 허용\n const slugPattern = /^[a-z0-9가-힣ぁ-んァ-ン一-龯_.~-]+$/\n return slugPattern.test(slug)\n}\n\n/**\n * 슬러그 정규화 (입력된 슬러그를 유효한 형식으로 변환)\n * Normalize slug (convert input to valid format)\n *\n * @param input - 입력값 / Input value\n * @returns 정규화된 슬러그 / Normalized slug\n */\nexport function normalizeSlug(input: string): string {\n return input\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9가-힣ぁ-んァ-ン一-龯_.~-]/g, '')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n","\"use client\"\n\nimport React, { createContext, useContext, useState, useCallback, useMemo, useEffect, useRef } from 'react'\nimport type {\n BlogEditorContextValue,\n BlogEditorData,\n BlogEditorProps,\n BlogEditorLabels,\n BlogEditorFeatures,\n LanguageConfig,\n MultilingualField,\n} from './types'\nimport { generateSlug as generateSlugUtil } from './utils/slug'\n\n/**\n * 기본 레이블 / Default labels\n */\nconst DEFAULT_LABELS: BlogEditorLabels = {\n // Header\n pageTitle: '새 글 작성',\n editTitle: '글 수정',\n preview: '미리보기',\n editMode: '편집',\n\n // Metadata\n basicInfo: '기본 정보',\n slug: '슬러그',\n slugPrefix: '/blog/',\n tags: '태그',\n tagsPlaceholder: '개발, 일상, 업데이트',\n coverImage: '커버 이미지 URL',\n coverImagePlaceholder: 'https://example.com/image.jpg',\n publishDate: '발행 예약일시',\n publishDateHint: '비워두면 즉시 발행됨',\n expiresAt: '만료 일시',\n expiresAtHint: '비워두면 만료되지 않음',\n\n // Content\n titleLabel: '제목',\n titlePlaceholder: '제목을 입력하세요',\n excerpt: '요약',\n excerptPlaceholder: '카드에 표시될 짧은 요약',\n contentLabel: '본문',\n contentPlaceholder: '마크다운으로 작성하세요...',\n\n // Actions\n cancel: '취소',\n saveDraft: '임시저장',\n publish: '발행',\n update: '수정 완료',\n saving: '저장 중...',\n\n // Translation\n translateHint: 'AI 번역 기능',\n translateButton: 'AI 번역',\n translating: '번역 중...',\n translateSuccess: '번역 완료!',\n\n // Errors\n requiredFields: '필수 필드를 입력해주세요',\n saveError: '저장 중 오류 발생',\n translateError: '번역 중 오류 발생',\n noTitle: '제목 없음',\n\n // Toolbar\n bold: '굵게',\n italic: '기울임',\n strikethrough: '취소선',\n heading: '제목',\n link: '링크',\n image: '이미지',\n code: '코드',\n codeBlock: '코드블록',\n quote: '인용문',\n list: '목록',\n orderedList: '순서 목록',\n horizontalRule: '수평선',\n}\n\n/**\n * 기본 기능 / Default features\n */\nconst DEFAULT_FEATURES: Required<BlogEditorFeatures> = {\n enableSlug: true,\n enableTags: true,\n enableCoverImage: true,\n enablePublishDate: true,\n enableExcerpt: true,\n enableTranslation: true,\n enablePreview: true,\n enableMarkdownToolbar: true,\n enableAutoSave: true,\n enableExpiresAt: false,\n}\n\n/**\n * 기본 언어 / Default languages\n */\nconst DEFAULT_LANGUAGES: LanguageConfig[] = [\n { key: 'ko', label: '한국어', isPrimary: true, flag: '🇰🇷' },\n { key: 'en', label: 'English', flag: '🇺🇸' },\n { key: 'ja', label: '日本語', flag: '🇯🇵' },\n]\n\n/**\n * 빈 다국어 필드 생성 / Create empty multilingual field\n */\nfunction createEmptyMultilingualField(languages: LanguageConfig[]): MultilingualField {\n const field: MultilingualField = {}\n languages.forEach((lang) => {\n field[lang.key] = ''\n })\n return field\n}\n\n/**\n * 초기 데이터 생성 / Create initial data\n */\nfunction createInitialData(\n languages: LanguageConfig[],\n initialData?: Partial<BlogEditorData>\n): BlogEditorData {\n return {\n slug: initialData?.slug ?? '',\n title: initialData?.title ?? createEmptyMultilingualField(languages),\n excerpt: initialData?.excerpt ?? createEmptyMultilingualField(languages),\n content: initialData?.content ?? createEmptyMultilingualField(languages),\n tags: initialData?.tags ?? [],\n coverImage: initialData?.coverImage ?? '',\n publishedAt: initialData?.publishedAt ?? null,\n expiresAt: initialData?.expiresAt ?? null,\n }\n}\n\n/**\n * BlogEditor 컨텍스트 / BlogEditor context\n */\nconst BlogEditorContext = createContext<BlogEditorContextValue | null>(null)\n\n/**\n * BlogEditor 컨텍스트 훅 / BlogEditor context hook\n */\nexport function useBlogEditor(): BlogEditorContextValue {\n const context = useContext(BlogEditorContext)\n if (!context) {\n throw new Error('useBlogEditor must be used within a BlogEditorProvider')\n }\n return context\n}\n\n/**\n * BlogEditor 프로바이더 Props / BlogEditor provider props\n */\ninterface BlogEditorProviderProps extends BlogEditorProps {\n children: React.ReactNode\n}\n\n/**\n * BlogEditor 프로바이더 / BlogEditor provider\n */\nexport function BlogEditorProvider({\n children,\n initialData,\n isEditMode = false,\n languages = DEFAULT_LANGUAGES,\n defaultLanguage,\n labels: userLabels,\n callbacks,\n features: userFeatures,\n variant = 'default',\n autoSaveKey,\n autoSaveInterval = 3000,\n}: BlogEditorProviderProps) {\n // 언어 설정\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key ?? languages[0]?.key ?? 'ko'\n const initialLanguage = defaultLanguage ?? primaryLanguage\n\n // 병합된 설정\n const labels = useMemo<BlogEditorLabels>(\n () => ({ ...DEFAULT_LABELS, ...userLabels }),\n [userLabels]\n )\n const features = useMemo<Required<BlogEditorFeatures>>(\n () => ({ ...DEFAULT_FEATURES, ...userFeatures }),\n [userFeatures]\n )\n\n // 상태\n const [formData, setFormData] = useState<BlogEditorData>(() =>\n createInitialData(languages, initialData)\n )\n const [activeLanguage, setActiveLanguage] = useState(initialLanguage)\n const [showPreview, setShowPreview] = useState(false)\n const [submitting, setSubmitting] = useState(false)\n const [translating, setTranslating] = useState(false)\n const [uploading, setUploading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [translateSuccess, setTranslateSuccess] = useState(false)\n // 슬러그가 사용자에 의해 수동 편집되었는지 추적\n const [slugManuallyEdited, setSlugManuallyEdited] = useState(isEditMode || !!initialData?.slug)\n const [autoSaveStatus, setAutoSaveStatus] = useState<'idle' | 'saving' | 'saved'>('idle')\n const autoSaveTimerRef = useRef<NodeJS.Timeout | null>(null)\n const isInitialMount = useRef(true)\n\n // 자동저장 키 생성 / Generate auto-save key\n const storageKey = autoSaveKey || (isEditMode ? null : 'blog-editor-draft')\n\n // localStorage에서 복원 (새 글 작성 모드만) / Restore from localStorage (create mode only)\n useEffect(() => {\n if (!features.enableAutoSave || !storageKey || isEditMode) return\n\n try {\n const saved = localStorage.getItem(storageKey)\n if (saved) {\n const parsed = JSON.parse(saved) as BlogEditorData\n setFormData(parsed)\n }\n } catch {\n // 파싱 실패 시 무시\n }\n }, []) // 마운트 시 한 번만 실행\n\n // 자동저장 / Auto-save to localStorage\n useEffect(() => {\n if (!features.enableAutoSave || !storageKey) return\n\n // 초기 마운트 시에는 저장하지 않음\n if (isInitialMount.current) {\n isInitialMount.current = false\n return\n }\n\n // 기존 타이머 취소\n if (autoSaveTimerRef.current) {\n clearTimeout(autoSaveTimerRef.current)\n }\n\n setAutoSaveStatus('saving')\n\n // debounce 저장\n autoSaveTimerRef.current = setTimeout(() => {\n try {\n localStorage.setItem(storageKey, JSON.stringify(formData))\n setAutoSaveStatus('saved')\n // 3초 후 idle로\n setTimeout(() => setAutoSaveStatus('idle'), 2000)\n } catch {\n setAutoSaveStatus('idle')\n }\n }, autoSaveInterval)\n\n return () => {\n if (autoSaveTimerRef.current) {\n clearTimeout(autoSaveTimerRef.current)\n }\n }\n }, [formData, features.enableAutoSave, storageKey, autoSaveInterval])\n\n // 저장 성공 시 localStorage 초기화 / Clear localStorage on successful save\n const clearAutoSave = useCallback(() => {\n if (storageKey) {\n try {\n localStorage.removeItem(storageKey)\n } catch {\n // 무시\n }\n }\n }, [storageKey])\n\n // 필드 업데이트 / Update field\n const updateField = useCallback(\n <K extends keyof BlogEditorData>(field: K, value: BlogEditorData[K]) => {\n setFormData((prev) => ({ ...prev, [field]: value }))\n },\n []\n )\n\n // 다국어 필드 업데이트 / Update multilingual field\n const updateMultilingualField = useCallback(\n (field: 'title' | 'excerpt' | 'content', language: string, value: string) => {\n setFormData((prev) => ({\n ...prev,\n [field]: {\n ...prev[field],\n [language]: value,\n },\n }))\n },\n []\n )\n\n // 슬러그 생성 / Generate slug\n const generateSlug = useCallback((title: string) => {\n return generateSlugUtil(title)\n }, [])\n\n // 저장 핸들러 / Save handler\n const handleSave = useCallback(\n async (publish: boolean) => {\n // 유효성 검사\n const primaryTitle = formData.title[primaryLanguage]\n const primaryContent = formData.content[primaryLanguage]\n\n if (!primaryTitle || !primaryContent) {\n setError(labels.requiredFields)\n return\n }\n\n if (features.enableSlug && !formData.slug) {\n setError(labels.requiredFields)\n return\n }\n\n setSubmitting(true)\n setError(null)\n\n try {\n await callbacks.onSave(formData, publish)\n // 저장 성공 시 자동저장 데이터 삭제\n clearAutoSave()\n } catch (err) {\n setError(labels.saveError)\n } finally {\n setSubmitting(false)\n }\n },\n [formData, primaryLanguage, labels, features, callbacks, clearAutoSave]\n )\n\n // 번역 핸들러 / Translate handler\n const handleTranslate = useCallback(async () => {\n if (!callbacks.onTranslate) return\n\n const primaryTitle = formData.title[primaryLanguage]\n const primaryContent = formData.content[primaryLanguage]\n const primaryExcerpt = formData.excerpt[primaryLanguage]\n\n if (!primaryTitle || !primaryContent) {\n setError(labels.requiredFields)\n return\n }\n\n setTranslating(true)\n setError(null)\n setTranslateSuccess(false)\n\n try {\n const translations = await callbacks.onTranslate({\n sourceLanguage: primaryLanguage,\n title: primaryTitle,\n content: primaryContent,\n excerpt: primaryExcerpt || undefined,\n })\n\n // 번역 결과 적용\n setFormData((prev) => {\n const newTitle = { ...prev.title }\n const newContent = { ...prev.content }\n const newExcerpt = { ...prev.excerpt }\n\n // translations는 { title: MultilingualField, content: MultilingualField, excerpt: MultilingualField } 형태일 수 있음\n // 또는 단순히 { ko: { title, content, excerpt }, en: { ... }, ja: { ... } } 형태일 수 있음\n // 여기서는 콜백이 언어별 번역을 반환한다고 가정\n Object.keys(translations).forEach((langKey) => {\n if (langKey !== primaryLanguage) {\n const translation = translations[langKey]\n if (typeof translation === 'object' && translation !== null) {\n const trans = translation as { title?: string; content?: string; excerpt?: string }\n if (trans.title) newTitle[langKey] = trans.title\n if (trans.content) newContent[langKey] = trans.content\n if (trans.excerpt) newExcerpt[langKey] = trans.excerpt\n }\n }\n })\n\n return {\n ...prev,\n title: newTitle,\n content: newContent,\n excerpt: newExcerpt,\n }\n })\n\n setTranslateSuccess(true)\n setTimeout(() => setTranslateSuccess(false), 3000)\n } catch (err) {\n setError(labels.translateError)\n } finally {\n setTranslating(false)\n }\n }, [formData, primaryLanguage, labels, callbacks])\n\n // 이미지 업로드 핸들러 / Image upload handler\n const handleUploadImage = useCallback(async (file: File): Promise<string | null> => {\n if (!callbacks.onUploadImage) return null\n\n setUploading(true)\n setError(null)\n\n try {\n const url = await callbacks.onUploadImage(file)\n return url\n } catch (err) {\n setError('이미지 업로드 실패')\n return null\n } finally {\n setUploading(false)\n }\n }, [callbacks])\n\n // 취소 핸들러 / Cancel handler\n const handleCancel = useCallback(() => {\n callbacks.onCancel?.()\n }, [callbacks])\n\n // 컨텍스트 값\n const value = useMemo<BlogEditorContextValue>(\n () => ({\n // State\n formData,\n activeLanguage,\n showPreview,\n submitting,\n translating,\n uploading,\n error,\n translateSuccess,\n autoSaveStatus,\n\n // Config\n languages,\n features,\n labels,\n variant,\n isEditMode,\n\n // Actions\n setActiveLanguage,\n setShowPreview,\n updateField,\n updateMultilingualField,\n handleSave,\n handleTranslate,\n handleUploadImage,\n handleCancel,\n setError,\n generateSlug,\n slugManuallyEdited,\n setSlugManuallyEdited,\n }),\n [\n formData,\n activeLanguage,\n showPreview,\n submitting,\n translating,\n uploading,\n error,\n translateSuccess,\n autoSaveStatus,\n languages,\n features,\n labels,\n variant,\n isEditMode,\n updateField,\n updateMultilingualField,\n handleSave,\n handleTranslate,\n handleUploadImage,\n handleCancel,\n generateSlug,\n slugManuallyEdited,\n setSlugManuallyEdited,\n ]\n )\n\n return <BlogEditorContext.Provider value={value}>{children}</BlogEditorContext.Provider>\n}\n\nexport { BlogEditorContext }\n","/**\n * Core Icons (Phosphor Icons)\n *\n * 핵심 아이콘만 포함하여 번들 크기를 최적화합니다.\n * 나머지 아이콘은 동적 fallback으로 처리됩니다.\n *\n * 포함 기준:\n * 1. sum-diary에서 실제 사용 중인 아이콘\n * 2. UI 컴포넌트에서 자주 사용되는 아이콘\n * 3. 각 카테고리의 대표 아이콘\n *\n * 새로운 아이콘이 필요하면 동적 fallback이 자동으로 처리합니다.\n */\n\nimport {\n // Navigation\n House,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowDown,\n List as ListIcon,\n X,\n MagnifyingGlass,\n Gear,\n ArrowSquareOut,\n CaretLeft,\n CaretRight,\n CaretDown,\n CaretUp,\n\n // Actions\n Pencil,\n Trash,\n Plus,\n Minus,\n Download,\n Upload,\n ArrowClockwise,\n FloppyDisk,\n Copy,\n\n // Text Formatting (Markdown Toolbar)\n TextB,\n TextItalic,\n TextStrikethrough,\n TextHOne,\n Link,\n Code,\n FileCode,\n Quotes,\n List,\n ListNumbers,\n\n // Status & Feedback\n SpinnerGap,\n CheckCircle,\n XCircle,\n WarningCircle,\n Info,\n Check,\n Circle,\n Question,\n\n // User & Auth\n User,\n Users,\n UserPlus,\n SignIn,\n SignOut,\n Eye,\n EyeSlash,\n\n // Data & Analytics\n ChartBar,\n TrendUp,\n Pulse,\n Database,\n Lightning,\n\n // Files & Content\n FileText,\n File,\n Folder,\n Book,\n BookOpen,\n\n // Communication\n Envelope,\n ChatCircle,\n Phone,\n\n // Media\n Image,\n Video,\n Camera,\n\n // Emotions\n Smiley,\n SmileySad,\n SmileyMeh,\n\n // Security\n Lock,\n LockOpen,\n Shield,\n Wallet,\n Key,\n\n // Time & Date\n Clock,\n Calendar,\n CalendarPlus,\n\n // UI Elements\n Bell,\n Heart,\n Star,\n Bookmark,\n Share,\n\n // Theme\n Monitor,\n Sun,\n Moon,\n\n // Additional\n Lightbulb,\n Brain,\n Flag,\n Square,\n Sparkle,\n Globe,\n DeviceMobile,\n Ticket,\n Clipboard,\n WifiHigh,\n WifiSlash,\n Cpu,\n MaskHappy,\n} from '@phosphor-icons/react/dist/ssr'\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: ListIcon,\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\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\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 * 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에서 정적 import (SSR-safe /dist/ssr)\n * - PROJECT_ICONS 매핑으로 통합 이름 지원\n * - 폴백: initPhosphorIcons()로 동적 namespace 조회\n *\n * 2. Lucide Icons (https://lucide.dev) - deprecated, backward compat\n * - initLucideIcons() 호출 시에만 로드 / Lazy loaded on demand\n * - 향후 제거 예정 / Will be removed in future\n *\n * 3. Iconsax Icons (https://iconsax.io) - separate entry\n * - '@hua-labs/ui/iconsax'에서 import 시 자동 등록\n * - 코어 번들에 포함되지 않음 / Not in core bundle\n * - registerIconsaxResolver()로 lazy 연결\n */\n\nimport { toPascalCase } from './case-utils'\n\n// Phosphor Icons - lazy loaded (전체 namespace import 방지, createContext SSR 이슈)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet PhosphorIcons: any = null\n\n// Lucide Icons - lazy loaded (하위호환, deprecated)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet LucideIcons: any = null\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 * Initialize Phosphor Icons (lazy load for fallback/dynamic lookup)\n * icons.ts의 개별 import와 별개로, PROJECT_ICONS fallback용\n */\nexport async function initPhosphorIcons() {\n if (typeof window === 'undefined') return null\n\n if (!PhosphorIcons) {\n try {\n const phosphorModule = await import('@phosphor-icons/react')\n PhosphorIcons = phosphorModule\n } catch {\n console.warn('Phosphor Icons not available. Install @phosphor-icons/react to use.')\n return null\n }\n }\n return PhosphorIcons\n}\n\n/**\n * Initialize Lucide Icons (lazy load)\n */\nexport async function initLucideIcons() {\n if (typeof window === 'undefined') return null\n\n if (!LucideIcons) {\n try {\n const lucideModule = await import('lucide-react')\n LucideIcons = lucideModule\n } catch {\n console.warn('Lucide Icons not available. Install lucide-react to use lucide provider.')\n return null\n }\n }\n return LucideIcons\n}\n\n/**\n * Get icon from provider\n * Only resolves icons that are in PROJECT_ICONS for optimal bundle size\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nexport function getIconFromProvider(\n iconName: string,\n provider: IconProvider = 'phosphor'\n): React.ComponentType<Record<string, unknown>> | null {\n // Check if icon is in project icon list\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n\n if (!iconMapping) {\n // Fallback to direct lookup for backward compatibility\n return getIconDirect(iconName, provider)\n }\n\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n\n switch (provider) {\n case 'phosphor':\n if (!mappedName || !PhosphorIcons) return null\n return PhosphorIcons?.[mappedName] || null\n\n case 'lucide':\n if (!mappedName || !LucideIcons) {\n return null\n }\n return LucideIcons?.[mappedName] || null\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = mappedName || toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Direct icon lookup (fallback for icons not in PROJECT_ICONS)\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nfunction getIconDirect(\n iconName: string,\n provider: IconProvider\n): React.ComponentType<Record<string, unknown>> | null {\n switch (provider) {\n case 'phosphor': {\n if (!PhosphorIcons) return null\n const phosphorName1 = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const phosphorName2 = iconName\n .split(/(?=[A-Z])/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n return PhosphorIcons?.[phosphorName1] ||\n PhosphorIcons?.[phosphorName2] ||\n PhosphorIcons?.[iconName] ||\n null\n }\n\n case 'lucide': {\n if (!LucideIcons) {\n return null\n }\n const lucideName = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const camelCaseName = iconName.replace(/([A-Z])/g, (match) =>\n match === iconName[0] ? match.toLowerCase() : match\n )\n return LucideIcons?.[lucideName] ||\n LucideIcons?.[iconName] ||\n LucideIcons?.[camelCaseName] ||\n null\n }\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Get icon name for provider\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 프로바이더별 아이콘 이름 / 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 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 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","/**\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: 'lucide',\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","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, initPhosphorIcons, initLucideIcons, 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 const [providerReady, setProviderReady] = React.useState(false)\n\n React.useEffect(() => {\n setIsClient(true)\n\n // Provider별 lazy load 초기화\n if (iconSet === 'lucide') {\n initLucideIcons().then(() => setProviderReady(true))\n } else if (iconSet === 'phosphor') {\n initPhosphorIcons().then(() => setProviderReady(true))\n } else {\n setProviderReady(true)\n }\n }, [iconSet])\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. 없으면 동적으로 Phosphor namespace에서 가져오기 (fallback, providerReady 필요)\n if (!ResolvedIcon && providerReady) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\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 // iconsax resolver 미등록 시 조용히 처리\n if (iconSet !== 'iconsax' || getIconsaxResolver()) {\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","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorHeader Props\n */\nexport interface BlogEditorHeaderProps {\n /** 뒤로가기 콜백 / Back navigation callback */\n onBack?: () => void\n /** 뒤로가기 링크 컴포넌트 / Back link component */\n backLink?: React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorHeader 컴포넌트\n * 에디터 헤더 (제목 + 미리보기 토글)\n */\nconst BlogEditorHeader = React.forwardRef<HTMLElement, BlogEditorHeaderProps>(\n ({ onBack, backLink, className }, ref) => {\n const { labels, isEditMode, formData } = useBlogEditor()\n\n return (\n <header\n ref={ref}\n className={merge('flex items-center justify-between mb-8', className)}\n >\n <div className=\"flex items-center gap-4\">\n {backLink || (\n onBack && (\n <button\n type=\"button\"\n onClick={onBack}\n className=\"p-2 text-muted-foreground hover:text-foreground transition-colors\"\n aria-label=\"뒤로가기\"\n >\n <Icon name=\"chevronLeft\" size={24} />\n </button>\n )\n )}\n <div>\n <h1 className=\"text-2xl font-bold text-foreground\">\n {isEditMode ? labels.editTitle : labels.pageTitle}\n </h1>\n {isEditMode && formData.slug && (\n <p className=\"text-sm text-muted-foreground\">\n {labels.slugPrefix}{formData.slug}\n </p>\n )}\n </div>\n </div>\n </header>\n )\n }\n)\n\nBlogEditorHeader.displayName = 'BlogEditorHeader'\n\nexport { BlogEditorHeader }\n","\"use client\"\n\nimport React, { useState, useCallback, useRef, KeyboardEvent, ChangeEvent } from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\nimport { normalizeSlug } from './utils/slug'\n\n/**\n * BlogEditorMetadata Props\n */\nexport interface BlogEditorMetadataProps {\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorMetadata 컴포넌트\n * 메타데이터 필드 (슬러그, 태그, 커버 이미지, 발행일)\n */\nconst BlogEditorMetadata = React.forwardRef<HTMLDivElement, BlogEditorMetadataProps>(\n ({ className }, ref) => {\n const { formData, updateField, features, labels, variant, handleUploadImage, uploading, setSlugManuallyEdited } = useBlogEditor()\n const [tagInput, setTagInput] = useState('')\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const containerClasses = merge(\n 'rounded-xl p-6 space-y-4',\n variant === 'glass'\n ? 'bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-background/20 dark:border-border/50'\n : variant === 'minimal'\n ? 'bg-transparent'\n : 'bg-background',\n className\n )\n\n const inputClasses =\n 'w-full px-3 py-2 border border-border rounded-lg bg-background text-foreground focus:ring-1 focus:ring-ring focus:border-transparent transition-colors'\n\n const labelClasses = 'block text-sm font-medium text-foreground mb-1'\n\n // 태그 추가\n const addTag = useCallback((tag: string) => {\n const trimmed = tag.trim()\n if (trimmed && !formData.tags.includes(trimmed)) {\n updateField('tags', [...formData.tags, trimmed])\n }\n setTagInput('')\n }, [formData.tags, updateField])\n\n // 태그 삭제\n const removeTag = useCallback((tagToRemove: string) => {\n updateField('tags', formData.tags.filter((t) => t !== tagToRemove))\n }, [formData.tags, updateField])\n\n // 태그 입력 핸들러\n const handleTagInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n // 쉼표 입력 시 태그 추가\n if (value.includes(',')) {\n const parts = value.split(',')\n parts.forEach((part, idx) => {\n if (idx < parts.length - 1) {\n // 마지막이 아닌 부분들은 태그로 추가\n addTag(part)\n } else {\n // 마지막 부분은 입력창에 유지\n setTagInput(part)\n }\n })\n } else {\n setTagInput(value)\n }\n }, [addTag])\n\n // 키보드 이벤트 핸들러\n const handleTagKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n addTag(tagInput)\n } else if (e.key === 'Backspace' && !tagInput && formData.tags.length > 0) {\n // 입력창이 비어있을 때 Backspace 누르면 마지막 태그 삭제\n removeTag(formData.tags[formData.tags.length - 1])\n }\n }, [tagInput, formData.tags, addTag, removeTag])\n\n return (\n <div ref={ref} className={containerClasses}>\n <h2 className=\"font-semibold text-foreground\">{labels.basicInfo}</h2>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {/* 슬러그 */}\n {features.enableSlug && (\n <div>\n <label className={labelClasses}>\n {labels.slug} *\n </label>\n <div className=\"flex items-center\">\n <span className=\"text-muted-foreground mr-1 text-sm\">\n {labels.slugPrefix}\n </span>\n <input\n type=\"text\"\n value={formData.slug}\n onChange={(e) => {\n updateField('slug', normalizeSlug(e.target.value))\n setSlugManuallyEdited(true)\n }}\n className={merge(inputClasses, 'flex-1')}\n placeholder=\"my-post-slug\"\n />\n </div>\n </div>\n )}\n\n {/* 태그 */}\n {features.enableTags && (\n <div>\n <label className={labelClasses}>{labels.tags}</label>\n <div className={merge(\n 'flex flex-wrap items-center gap-2 min-h-[42px] px-3 py-2 border border-border rounded-lg bg-background focus-within:ring-1 focus-within:ring-ring focus-within:border-transparent transition-colors'\n )}>\n {/* 태그 칩들 */}\n {formData.tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-primary/10 text-primary text-sm rounded-md\"\n >\n {tag}\n <button\n type=\"button\"\n onClick={() => removeTag(tag)}\n className=\"hover:text-primary transition-colors\"\n aria-label={`${tag} 태그 삭제`}\n >\n <Icon name=\"x\" size={14} />\n </button>\n </span>\n ))}\n {/* 입력창 */}\n <input\n type=\"text\"\n value={tagInput}\n onChange={handleTagInputChange}\n onKeyDown={handleTagKeyDown}\n className=\"flex-1 min-w-[100px] bg-transparent outline-none text-foreground text-sm\"\n placeholder={formData.tags.length === 0 ? labels.tagsPlaceholder : '태그 추가...'}\n />\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n 쉼표(,) 또는 Enter로 태그 추가\n </p>\n </div>\n )}\n </div>\n\n {/* 커버 이미지 */}\n {features.enableCoverImage && (\n <div>\n <label className={labelClasses}>{labels.coverImage}</label>\n <div className=\"space-y-3\">\n {/* 이미지 미리보기 */}\n {formData.coverImage && (\n <div className=\"relative w-full h-40 rounded-lg overflow-hidden bg-muted\">\n <img\n src={formData.coverImage}\n alt=\"커버 이미지 미리보기\"\n className=\"w-full h-full object-cover\"\n />\n <button\n type=\"button\"\n onClick={() => updateField('coverImage', '')}\n className=\"absolute top-2 right-2 p-1.5 bg-red-500 text-white rounded-full hover:bg-red-600 transition-colors\"\n aria-label=\"이미지 삭제\"\n >\n <Icon name=\"x\" size={14} />\n </button>\n </div>\n )}\n\n {/* URL 입력 + 파일 업로드 */}\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={formData.coverImage}\n onChange={(e) => updateField('coverImage', e.target.value)}\n className={merge(inputClasses, 'flex-1')}\n placeholder={labels.coverImagePlaceholder}\n />\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={async (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n const url = await handleUploadImage(file)\n if (url) {\n updateField('coverImage', url)\n }\n }\n // 같은 파일 다시 선택할 수 있도록 초기화\n e.target.value = ''\n }}\n />\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={uploading}\n className=\"px-3 py-2 border border-border rounded-lg hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n title=\"이미지 업로드\"\n >\n {uploading ? (\n <Icon name=\"loader\" size={20} spin />\n ) : (\n <Icon name=\"upload\" size={20} />\n )}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* 발행일 & 만료일 */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {features.enablePublishDate && (\n <div>\n <label className={labelClasses}>{labels.publishDate}</label>\n <input\n type=\"datetime-local\"\n value={formData.publishedAt ?? ''}\n onChange={(e) => updateField('publishedAt', e.target.value || null)}\n className={inputClasses}\n />\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {labels.publishDateHint}\n </p>\n </div>\n )}\n\n {features.enableExpiresAt && (\n <div>\n <label className={labelClasses}>{labels.expiresAt}</label>\n <input\n type=\"datetime-local\"\n value={formData.expiresAt ?? ''}\n onChange={(e) => updateField('expiresAt', e.target.value || null)}\n className={inputClasses}\n />\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {labels.expiresAtHint}\n </p>\n </div>\n )}\n </div>\n </div>\n )\n }\n)\n\nBlogEditorMetadata.displayName = 'BlogEditorMetadata'\n\nexport { BlogEditorMetadata }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorLanguageTabs Props\n */\nexport interface BlogEditorLanguageTabsProps {\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorLanguageTabs 컴포넌트\n * 언어 탭 네비게이션 + 미리보기 토글 (sticky)\n */\nconst BlogEditorLanguageTabs = React.forwardRef<HTMLDivElement, BlogEditorLanguageTabsProps>(\n ({ className }, ref) => {\n const { languages, activeLanguage, setActiveLanguage, showPreview, setShowPreview, features, labels } = useBlogEditor()\n\n return (\n <div\n ref={ref}\n className={merge(\n 'flex items-center border-b border-border sticky top-0 z-10 bg-background',\n className\n )}\n role=\"tablist\"\n aria-label=\"언어 선택\"\n >\n <div className=\"flex flex-1\">\n {languages.map((lang) => {\n const isActive = activeLanguage === lang.key\n const isPrimary = lang.isPrimary\n\n return (\n <button\n key={lang.key}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`tabpanel-${lang.key}`}\n id={`tab-${lang.key}`}\n onClick={() => setActiveLanguage(lang.key)}\n className={merge(\n 'flex-1 px-4 py-3 text-sm font-medium transition-colors',\n isActive\n ? 'bg-primary/10 text-primary border-b-2 border-primary'\n : 'text-muted-foreground hover:bg-muted'\n )}\n >\n {lang.flag && <span className=\"mr-1.5\">{lang.flag}</span>}\n {lang.label}\n {isPrimary && ' *'}\n </button>\n )\n })}\n </div>\n\n {features.enablePreview && (\n <button\n type=\"button\"\n onClick={() => setShowPreview(!showPreview)}\n className=\"inline-flex items-center gap-1.5 px-3 py-2 mx-2 text-sm border border-border rounded-lg hover:bg-muted transition-colors shrink-0\"\n >\n <Icon name={showPreview ? 'pencil' : 'eye'} size={14} />\n {showPreview ? labels.editMode : labels.preview}\n </button>\n )}\n </div>\n )\n }\n)\n\nBlogEditorLanguageTabs.displayName = 'BlogEditorLanguageTabs'\n\nexport { BlogEditorLanguageTabs }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorContent Props\n */\nexport interface BlogEditorContentProps {\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** textarea ref 콜백 / textarea ref callback */\n textareaRef?: React.RefObject<HTMLTextAreaElement | null>\n}\n\n/**\n * BlogEditorContent 컴포넌트\n * 제목, 요약, 본문 입력 필드\n */\nconst BlogEditorContent = React.forwardRef<HTMLDivElement, BlogEditorContentProps>(\n ({ className, textareaRef }, ref) => {\n const {\n formData,\n activeLanguage,\n updateMultilingualField,\n updateField,\n features,\n labels,\n languages,\n generateSlug,\n isEditMode,\n slugManuallyEdited,\n } = useBlogEditor()\n\n const isPrimaryLanguage = languages.find((l) => l.isPrimary)?.key === activeLanguage\n const currentLang = languages.find((l) => l.key === activeLanguage)\n\n const inputClasses =\n 'w-full px-3 py-2 border border-border rounded-lg bg-background text-foreground focus:ring-1 focus:ring-ring focus:border-transparent transition-colors'\n\n const labelClasses = 'block text-sm font-medium text-foreground mb-1'\n\n const handleTitleChange = (value: string) => {\n updateMultilingualField('title', activeLanguage, value)\n\n // 영어 탭에서 타이틀 입력 시 슬러그 자동 생성\n // (한국어/일본어보다 영어 슬러그가 URL에 적합)\n if (activeLanguage === 'en' && !isEditMode && !slugManuallyEdited) {\n updateField('slug', generateSlug(value))\n }\n }\n\n // 언어별 레이블 생성\n const getLangLabel = (baseLabel: string) => {\n if (isPrimaryLanguage) {\n return `${baseLabel} *`\n }\n return `${baseLabel} (${currentLang?.label || activeLanguage})`\n }\n\n return (\n <div ref={ref} className={merge('p-6 space-y-4', className)}>\n {/* 제목 */}\n <div>\n <label className={labelClasses}>{getLangLabel(labels.titleLabel)}</label>\n <input\n type=\"text\"\n value={formData.title[activeLanguage] || ''}\n onChange={(e) => handleTitleChange(e.target.value)}\n className={inputClasses}\n placeholder={labels.titlePlaceholder}\n />\n </div>\n\n {/* 요약 */}\n {features.enableExcerpt && (\n <div>\n <label className={labelClasses}>{getLangLabel(labels.excerpt)}</label>\n <textarea\n value={formData.excerpt[activeLanguage] || ''}\n onChange={(e) => updateMultilingualField('excerpt', activeLanguage, e.target.value)}\n rows={2}\n className={merge(inputClasses, 'resize-none')}\n placeholder={labels.excerptPlaceholder}\n />\n </div>\n )}\n\n {/* 본문 */}\n <div>\n <label className={labelClasses}>\n {getLangLabel(labels.contentLabel)} (마크다운)\n </label>\n <textarea\n ref={textareaRef}\n value={formData.content[activeLanguage] || ''}\n onChange={(e) => updateMultilingualField('content', activeLanguage, e.target.value)}\n rows={15}\n className={merge(inputClasses, 'font-mono text-sm resize-y min-h-[300px]')}\n placeholder={labels.contentPlaceholder}\n />\n </div>\n </div>\n )\n }\n)\n\nBlogEditorContent.displayName = 'BlogEditorContent'\n\nexport { BlogEditorContent }\n","/**\n * 마크다운 파서 유틸리티\n * Markdown parser utilities\n *\n * 지원 문법 / Supported syntax:\n * - **볼드**, *이탤릭*, ~~취소선~~\n * - [링크](url)\n * - # 헤딩 (h1-h6)\n * - - 또는 * 리스트\n * - `인라인 코드`\n * - ```코드블록```\n * - > 인용문\n * - --- 수평선\n */\n\n/**\n * HTML 특수문자 이스케이프\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n}\n\n/**\n * 마크다운 텍스트를 HTML로 변환\n * Convert markdown text to HTML\n */\nexport function parseMarkdown(text: string): string {\n if (!text) return ''\n\n let html = text\n\n // 코드블록 먼저 처리 (다른 파싱 방지)\n html = html.replace(/```(\\w*)\\n?([\\s\\S]*?)```/g, (_, lang, code) => {\n const escaped = escapeHtml(code.trim())\n return `<pre class=\"bg-gray-100 dark:bg-gray-800 rounded-lg p-4 overflow-x-auto my-4\"><code class=\"text-sm\">${escaped}</code></pre>`\n })\n\n // 인라인 코드\n html = html.replace(\n /`([^`]+)`/g,\n '<code class=\"bg-gray-100 dark:bg-gray-700 px-1.5 py-0.5 rounded text-sm\">$1</code>'\n )\n\n // 헤딩 (줄 시작에서만)\n html = html.replace(/^######\\s+(.+)$/gm, '<h6 class=\"text-base font-semibold mt-4 mb-2\">$1</h6>')\n html = html.replace(/^#####\\s+(.+)$/gm, '<h5 class=\"text-lg font-semibold mt-4 mb-2\">$1</h5>')\n html = html.replace(/^####\\s+(.+)$/gm, '<h4 class=\"text-xl font-semibold mt-5 mb-2\">$1</h4>')\n html = html.replace(/^###\\s+(.+)$/gm, '<h3 class=\"text-2xl font-semibold mt-5 mb-3\">$1</h3>')\n html = html.replace(/^##\\s+(.+)$/gm, '<h2 class=\"text-2xl font-bold mt-6 mb-3\">$1</h2>')\n html = html.replace(/^#\\s+(.+)$/gm, '<h1 class=\"text-3xl font-bold mt-6 mb-4\">$1</h1>')\n\n // 수평선\n html = html.replace(/^---+$/gm, '<hr class=\"my-6 border-gray-300 dark:border-gray-600\" />')\n\n // 인용문\n html = html.replace(\n /^>\\s+(.+)$/gm,\n '<blockquote class=\"border-l-4 border-gray-300 dark:border-gray-600 pl-4 my-4 italic text-gray-600 dark:text-gray-400\">$1</blockquote>'\n )\n\n // 볼드, 이탤릭, 취소선\n html = html.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n html = html.replace(/\\*(.+?)\\*/g, '<em>$1</em>')\n html = html.replace(/~~(.+?)~~/g, '<del class=\"text-gray-500\">$1</del>')\n\n // 링크\n html = html.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" class=\"text-cyan-600 hover:text-cyan-700 dark:text-cyan-400 dark:hover:text-cyan-300 underline\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>'\n )\n\n // 리스트 (연속된 리스트 아이템을 ul로 감싸기)\n html = html.replace(/^[-*]\\s+(.+)$/gm, '<li class=\"ml-4\">$1</li>')\n html = html.replace(/(<li[^>]*>.*<\\/li>\\n?)+/g, (match) => {\n return `<ul class=\"list-disc list-inside my-4 space-y-1\">${match}</ul>`\n })\n\n // 줄바꿈을 <br>로 변환 (단, 블록 요소 직후는 제외)\n html = html.replace(/\\n(?!<)/g, '<br />\\n')\n\n // 연속된 <br /> 정리\n html = html.replace(/(<br \\/>[\\n\\s]*){3,}/g, '<br /><br />\\n')\n\n return html\n}\n\n/**\n * 마크다운에서 순수 텍스트만 추출 (미리보기용)\n * Extract plain text from markdown (for preview)\n */\nexport function stripMarkdown(text: string): string {\n if (!text) return ''\n\n return text\n // 코드블록 제거\n .replace(/```[\\s\\S]*?```/g, '')\n // 인라인 코드 제거\n .replace(/`[^`]+`/g, '')\n // 헤딩 마크 제거\n .replace(/^#{1,6}\\s+/gm, '')\n // 볼드/이탤릭 마크 제거\n .replace(/\\*\\*(.+?)\\*\\*/g, '$1')\n .replace(/\\*(.+?)\\*/g, '$1')\n .replace(/~~(.+?)~~/g, '$1')\n // 링크에서 텍스트만 추출\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1')\n // 리스트 마크 제거\n .replace(/^[-*]\\s+/gm, '')\n // 인용문 마크 제거\n .replace(/^>\\s+/gm, '')\n // 수평선 제거\n .replace(/^---+$/gm, '')\n // 연속 공백/줄바꿈 정리\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n}\n\n/**\n * 마크다운 텍스트 미리보기 (글자수 제한)\n * Markdown text preview (with character limit)\n */\nexport function getMarkdownPreview(text: string, maxLength: number = 150): string {\n const stripped = stripMarkdown(text)\n if (stripped.length <= maxLength) return stripped\n return stripped.slice(0, maxLength).trim() + '...'\n}\n\n/**\n * 마크다운 삽입 헬퍼\n * Markdown insertion helper\n */\nexport function insertMarkdown(\n text: string,\n selectionStart: number,\n selectionEnd: number,\n before: string,\n after: string\n): { text: string; cursorPosition: number } {\n const selectedText = text.slice(selectionStart, selectionEnd)\n const beforeText = text.slice(0, selectionStart)\n const afterText = text.slice(selectionEnd)\n\n const newText = beforeText + before + selectedText + after + afterText\n const cursorPosition = selectionStart + before.length + selectedText.length + after.length\n\n return { text: newText, cursorPosition }\n}\n","\"use client\"\n\nimport React, { useCallback } from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\nimport { insertMarkdown } from './utils/markdown'\nimport type { ToolbarItem } from './types'\n\n/**\n * BlogEditorToolbar Props\n */\nexport interface BlogEditorToolbarProps {\n /** textarea ref / textarea reference */\n textareaRef: React.RefObject<HTMLTextAreaElement | null>\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * 툴바 아이템 정의 / Toolbar item definitions\n */\nconst TOOLBAR_ITEMS: ToolbarItem[] = [\n {\n icon: 'bold',\n label: 'bold',\n markdown: { before: '**', after: '**' },\n shortcut: 'Ctrl+B',\n },\n {\n icon: 'italic',\n label: 'italic',\n markdown: { before: '*', after: '*' },\n shortcut: 'Ctrl+I',\n },\n {\n icon: 'strikethrough',\n label: 'strikethrough',\n markdown: { before: '~~', after: '~~' },\n },\n {\n icon: 'heading',\n label: 'heading',\n markdown: { before: '## ', after: '' },\n },\n {\n icon: 'link',\n label: 'link',\n markdown: { before: '[', after: '](url)' },\n shortcut: 'Ctrl+K',\n },\n {\n icon: 'image',\n label: 'image',\n markdown: { before: '![alt](', after: ')' },\n },\n {\n icon: 'code',\n label: 'code',\n markdown: { before: '`', after: '`' },\n },\n {\n icon: 'fileCode',\n label: 'codeBlock',\n markdown: { before: '```\\n', after: '\\n```' },\n },\n {\n icon: 'quote',\n label: 'quote',\n markdown: { before: '> ', after: '' },\n },\n {\n icon: 'list',\n label: 'list',\n markdown: { before: '- ', after: '' },\n },\n {\n icon: 'listOrdered',\n label: 'orderedList',\n markdown: { before: '1. ', after: '' },\n },\n {\n icon: 'minus',\n label: 'horizontalRule',\n markdown: { before: '\\n---\\n', after: '' },\n },\n]\n\n/**\n * BlogEditorToolbar 컴포넌트\n * 마크다운 포맷팅 툴바\n */\nconst BlogEditorToolbar = React.forwardRef<HTMLDivElement, BlogEditorToolbarProps>(\n ({ textareaRef, className }, ref) => {\n const { labels, activeLanguage, updateMultilingualField, formData, features } = useBlogEditor()\n\n const handleInsert = useCallback(\n (item: ToolbarItem) => {\n const textarea = textareaRef.current\n if (!textarea) return\n\n const { selectionStart, selectionEnd } = textarea\n const currentContent = formData.content[activeLanguage] || ''\n\n const { text: newText, cursorPosition } = insertMarkdown(\n currentContent,\n selectionStart,\n selectionEnd,\n item.markdown.before,\n item.markdown.after\n )\n\n updateMultilingualField('content', activeLanguage, newText)\n\n // 커서 위치 복원\n requestAnimationFrame(() => {\n textarea.focus()\n textarea.setSelectionRange(cursorPosition, cursorPosition)\n })\n },\n [textareaRef, formData, activeLanguage, updateMultilingualField]\n )\n\n if (!features.enableMarkdownToolbar) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n 'flex flex-wrap gap-1 px-4 py-2 border-b border-border bg-muted',\n className\n )}\n role=\"toolbar\"\n aria-label=\"마크다운 서식\"\n >\n {TOOLBAR_ITEMS.map((item) => (\n <button\n key={item.icon}\n type=\"button\"\n onClick={() => handleInsert(item)}\n className=\"p-2 text-muted-foreground hover:text-foreground hover:bg-muted rounded transition-colors\"\n title={`${labels[item.label as keyof typeof labels] || item.label}${item.shortcut ? ` (${item.shortcut})` : ''}`}\n aria-label={labels[item.label as keyof typeof labels] || item.label}\n >\n <Icon name={item.icon as Parameters<typeof Icon>[0]['name']} size={16} />\n </button>\n ))}\n </div>\n )\n }\n)\n\nBlogEditorToolbar.displayName = 'BlogEditorToolbar'\n\nexport { BlogEditorToolbar }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { useBlogEditor } from './BlogEditorContext'\nimport { parseMarkdown } from './utils/markdown'\n\n/**\n * BlogEditorPreview Props\n */\nexport interface BlogEditorPreviewProps {\n /** 커스텀 마크다운 렌더러 / Custom markdown renderer */\n renderMarkdown?: (content: string) => React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorPreview 컴포넌트\n * 마크다운 미리보기\n */\nconst BlogEditorPreview = React.forwardRef<HTMLDivElement, BlogEditorPreviewProps>(\n ({ renderMarkdown, className }, ref) => {\n const { formData, activeLanguage, languages, labels } = useBlogEditor()\n\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key || languages[0]?.key\n\n // 현재 언어의 콘텐츠, 없으면 기본 언어 콘텐츠\n const title = formData.title[activeLanguage] || formData.title[primaryLanguage] || labels.noTitle\n const content = formData.content[activeLanguage] || formData.content[primaryLanguage] || ''\n\n // 마크다운 렌더링\n const renderedContent = React.useMemo(() => {\n if (renderMarkdown) {\n return renderMarkdown(content)\n }\n // 기본 마크다운 파서 사용\n return (\n <div\n dangerouslySetInnerHTML={{ __html: parseMarkdown(content) }}\n />\n )\n }, [content, renderMarkdown])\n\n return (\n <div ref={ref} className={merge('p-6', className)}>\n <h3 className=\"text-xl font-bold text-foreground mb-4\">\n {title}\n </h3>\n <div className=\"prose dark:prose-invert max-w-none\">\n {renderedContent}\n </div>\n </div>\n )\n }\n)\n\nBlogEditorPreview.displayName = 'BlogEditorPreview'\n\nexport { BlogEditorPreview }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorActions Props\n */\nexport interface BlogEditorActionsProps {\n /** 취소 링크 컴포넌트 / Cancel link component */\n cancelLink?: React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorActions 컴포넌트\n * 저장/발행/취소 버튼\n */\nconst BlogEditorActions = React.forwardRef<HTMLDivElement, BlogEditorActionsProps>(\n ({ cancelLink, className }, ref) => {\n const { labels, submitting, handleSave, handleCancel, isEditMode, autoSaveStatus, features } = useBlogEditor()\n\n return (\n <div\n ref={ref}\n className={merge('flex items-center justify-end gap-3', className)}\n >\n {/* 자동저장 상태 */}\n {features.enableAutoSave && autoSaveStatus !== 'idle' && (\n <span className=\"text-sm text-muted-foreground flex items-center gap-1\">\n {autoSaveStatus === 'saving' && (\n <>\n <Icon name=\"loader\" size={14} spin />\n 저장 중...\n </>\n )}\n {autoSaveStatus === 'saved' && (\n <>\n <Icon name=\"check\" size={14} />\n 자동저장됨\n </>\n )}\n </span>\n )}\n\n {/* 취소 */}\n {cancelLink || (\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"px-4 py-2 text-foreground hover:text-foreground transition-colors\"\n >\n {labels.cancel}\n </button>\n )}\n\n {/* 임시저장 */}\n <button\n type=\"button\"\n onClick={() => handleSave(false)}\n disabled={submitting}\n className=\"px-4 py-2 border border-border rounded-lg hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {labels.saveDraft}\n </button>\n\n {/* 발행/수정 */}\n <button\n type=\"button\"\n onClick={() => handleSave(true)}\n disabled={submitting}\n className=\"px-6 py-2 bg-primary text-white rounded-lg hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center gap-2 transition-colors\"\n >\n {submitting ? (\n <>\n <Icon name=\"loader\" size={16} spin />\n {labels.saving}\n </>\n ) : (\n <>\n <Icon name=\"check\" size={16} />\n {isEditMode ? labels.update : labels.publish}\n </>\n )}\n </button>\n </div>\n )\n }\n)\n\nBlogEditorActions.displayName = 'BlogEditorActions'\n\nexport { BlogEditorActions }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorTranslate Props\n */\nexport interface BlogEditorTranslateProps {\n /** 힌트 메시지 오버라이드 / Hint message override */\n hint?: string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorTranslate 컴포넌트\n * AI 번역 버튼\n */\nconst BlogEditorTranslate = React.forwardRef<HTMLDivElement, BlogEditorTranslateProps>(\n ({ hint, className }, ref) => {\n const {\n labels,\n translating,\n translateSuccess,\n handleTranslate,\n formData,\n languages,\n features,\n } = useBlogEditor()\n\n if (!features.enableTranslation) {\n return null\n }\n\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key || languages[0]?.key\n const primaryTitle = formData.title[primaryLanguage] || ''\n const primaryContent = formData.content[primaryLanguage] || ''\n const canTranslate = primaryTitle && primaryContent\n\n return (\n <div\n ref={ref}\n className={merge(\n 'px-6 py-3 bg-muted border-b border-border flex items-center justify-between',\n className\n )}\n >\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Icon name=\"sparkles\" size={16} />\n <span>{hint || labels.translateHint}</span>\n </div>\n <button\n type=\"button\"\n onClick={handleTranslate}\n disabled={translating || !canTranslate}\n className={merge(\n 'inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',\n translateSuccess\n ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\n : 'bg-primary text-white hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n >\n {translating ? (\n <>\n <Icon name=\"loader\" size={16} spin />\n {labels.translating}\n </>\n ) : translateSuccess ? (\n <>\n <Icon name=\"check\" size={16} />\n {labels.translateSuccess}\n </>\n ) : (\n <>\n <Icon name=\"sparkles\" size={16} />\n {labels.translateButton}\n </>\n )}\n </button>\n </div>\n )\n }\n)\n\nBlogEditorTranslate.displayName = 'BlogEditorTranslate'\n\nexport { BlogEditorTranslate }\n","\"use client\"\n\nimport React, { useRef } from 'react'\nimport { merge } from '../../../lib/utils'\nimport { BlogEditorProvider, useBlogEditor } from './BlogEditorContext'\nimport { BlogEditorHeader, type BlogEditorHeaderProps } from './BlogEditorHeader'\nimport { BlogEditorMetadata, type BlogEditorMetadataProps } from './BlogEditorMetadata'\nimport { BlogEditorLanguageTabs, type BlogEditorLanguageTabsProps } from './BlogEditorLanguageTabs'\nimport { BlogEditorContent, type BlogEditorContentProps } from './BlogEditorContent'\nimport { BlogEditorToolbar, type BlogEditorToolbarProps } from './BlogEditorToolbar'\nimport { BlogEditorPreview, type BlogEditorPreviewProps } from './BlogEditorPreview'\nimport { BlogEditorActions, type BlogEditorActionsProps } from './BlogEditorActions'\nimport { BlogEditorTranslate, type BlogEditorTranslateProps } from './BlogEditorTranslate'\nimport type { BlogEditorProps } from './types'\n\n/**\n * BlogEditorRoot Props (내부 컴포넌트)\n */\ninterface BlogEditorRootProps {\n /** 뒤로가기 콜백 / Back navigation callback */\n onBack?: () => void\n /** 뒤로가기 링크 컴포넌트 / Back link component */\n backLink?: React.ReactNode\n /** 취소 링크 컴포넌트 / Cancel link component */\n cancelLink?: React.ReactNode\n /** 커스텀 마크다운 렌더러 / Custom markdown renderer */\n renderMarkdown?: (content: string) => React.ReactNode\n /** AI 번역 힌트 / AI translation hint */\n translateHint?: string\n /** 최대 너비 / Max width */\n maxWidth?: string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** 자식 요소 / Children */\n children?: React.ReactNode\n}\n\n/**\n * BlogEditorRoot 내부 컴포넌트\n * 기본 레이아웃 제공\n */\nfunction BlogEditorRoot({\n onBack,\n backLink,\n cancelLink,\n renderMarkdown,\n translateHint,\n maxWidth = 'max-w-4xl',\n className,\n children,\n}: BlogEditorRootProps) {\n const { showPreview, error, variant, features } = useBlogEditor()\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n const containerClasses = merge(\n variant === 'glass'\n ? 'bg-gradient-to-br from-gray-100 to-gray-200 dark:from-gray-900 dark:to-gray-800'\n : variant === 'minimal'\n ? ''\n : 'bg-muted'\n )\n\n const contentContainerClasses = merge(\n 'rounded-xl overflow-hidden',\n variant === 'glass'\n ? 'bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/20 dark:border-slate-700/50'\n : variant === 'minimal'\n ? 'bg-transparent border border-border'\n : 'bg-background'\n )\n\n // 커스텀 자식 요소가 있으면 그걸 렌더링\n if (children) {\n return (\n <div className={merge(containerClasses, className)}>\n <div className={merge(maxWidth, 'mx-auto px-4 py-8')}>\n {children}\n </div>\n </div>\n )\n }\n\n // 기본 레이아웃\n return (\n <div className={merge(containerClasses, className)}>\n <div className={merge(maxWidth, 'mx-auto px-4 py-8')}>\n {/* 헤더 */}\n <BlogEditorHeader onBack={onBack} backLink={backLink} />\n\n {/* 에러 메시지 */}\n {error && (\n <div className=\"mb-6 p-4 bg-red-50 dark:bg-red-900/30 border border-red-200 dark:border-red-800 rounded-lg text-red-600 dark:text-red-400\">\n {error}\n </div>\n )}\n\n <div className=\"space-y-6\">\n {/* 메타데이터 */}\n <BlogEditorMetadata />\n\n {/* 콘텐츠 영역 */}\n <div className={contentContainerClasses}>\n {/* AI 번역 */}\n {features.enableTranslation && (\n <BlogEditorTranslate hint={translateHint} />\n )}\n\n {/* 언어 탭 */}\n <BlogEditorLanguageTabs />\n\n {/* 툴바 & 콘텐츠 */}\n {showPreview ? (\n <BlogEditorPreview renderMarkdown={renderMarkdown} />\n ) : (\n <>\n {features.enableMarkdownToolbar && (\n <BlogEditorToolbar textareaRef={textareaRef} />\n )}\n <BlogEditorContent textareaRef={textareaRef} />\n </>\n )}\n </div>\n\n {/* 액션 버튼 */}\n <BlogEditorActions cancelLink={cancelLink} />\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * BlogEditor 컴포넌트\n *\n * 다국어 블로그 에디터 컴포넌트\n * Compound component 패턴으로 유연한 커스터마이징 지원\n *\n * @example\n * ```tsx\n * // 기본 사용\n * <BlogEditor\n * callbacks={{\n * onSave: async (data, publish) => { ... },\n * onCancel: () => router.back(),\n * }}\n * />\n *\n * // 커스텀 레이아웃\n * <BlogEditor callbacks={...}>\n * <BlogEditor.Header backLink={<Link href=\"/admin\">Back</Link>} />\n * <BlogEditor.Metadata />\n * <BlogEditor.LanguageTabs />\n * <BlogEditor.Content />\n * <BlogEditor.Actions />\n * </BlogEditor>\n * ```\n */\nconst BlogEditor = React.forwardRef<\n HTMLDivElement,\n BlogEditorProps & BlogEditorRootProps\n>(\n (\n {\n // BlogEditorProps\n initialData,\n isEditMode,\n languages,\n defaultLanguage,\n labels,\n callbacks,\n features,\n variant,\n\n // BlogEditorRootProps\n onBack,\n backLink,\n cancelLink,\n renderMarkdown,\n translateHint,\n maxWidth,\n className,\n children,\n\n // Auto-save\n autoSaveKey,\n autoSaveInterval,\n },\n ref\n ) => {\n return (\n <BlogEditorProvider\n initialData={initialData}\n isEditMode={isEditMode}\n languages={languages}\n defaultLanguage={defaultLanguage}\n labels={labels}\n callbacks={callbacks}\n features={features}\n variant={variant}\n autoSaveKey={autoSaveKey}\n autoSaveInterval={autoSaveInterval}\n >\n <div ref={ref}>\n <BlogEditorRoot\n onBack={onBack}\n backLink={backLink}\n cancelLink={cancelLink}\n renderMarkdown={renderMarkdown}\n translateHint={translateHint}\n maxWidth={maxWidth}\n className={className}\n >\n {children}\n </BlogEditorRoot>\n </div>\n </BlogEditorProvider>\n )\n }\n)\n\nBlogEditor.displayName = 'BlogEditor'\n\n// Compound component exports\nconst BlogEditorCompound = BlogEditor as typeof BlogEditor & {\n Header: typeof BlogEditorHeader\n Metadata: typeof BlogEditorMetadata\n LanguageTabs: typeof BlogEditorLanguageTabs\n Content: typeof BlogEditorContent\n Toolbar: typeof BlogEditorToolbar\n Preview: typeof BlogEditorPreview\n Actions: typeof BlogEditorActions\n Translate: typeof BlogEditorTranslate\n}\n\nBlogEditorCompound.Header = BlogEditorHeader\nBlogEditorCompound.Metadata = BlogEditorMetadata\nBlogEditorCompound.LanguageTabs = BlogEditorLanguageTabs\nBlogEditorCompound.Content = BlogEditorContent\nBlogEditorCompound.Toolbar = BlogEditorToolbar\nBlogEditorCompound.Preview = BlogEditorPreview\nBlogEditorCompound.Actions = BlogEditorActions\nBlogEditorCompound.Translate = BlogEditorTranslate\n\nexport { BlogEditorCompound as BlogEditor }\n\n// 개별 컴포넌트도 export\nexport {\n BlogEditorHeader,\n BlogEditorMetadata,\n BlogEditorLanguageTabs,\n BlogEditorContent,\n BlogEditorToolbar,\n BlogEditorPreview,\n BlogEditorActions,\n BlogEditorTranslate,\n}\n\n// 타입 export\nexport type {\n BlogEditorHeaderProps,\n BlogEditorMetadataProps,\n BlogEditorLanguageTabsProps,\n BlogEditorContentProps,\n BlogEditorToolbarProps,\n BlogEditorPreviewProps,\n BlogEditorActionsProps,\n BlogEditorTranslateProps,\n}\n","/**\n * HUA UI 디자인 토큰 시스템\n * 중앙화된 디자인 토큰 정의\n */\n\nimport type { Size } from \"../../types/common\";\n\n/**\n * 색상 스케일 타입\n * light/dark 테마별 색상 정의\n */\nexport interface ColorScale {\n light: string;\n dark: string;\n}\n\n/**\n * 디자인 토큰 인터페이스\n */\nexport interface DesignTokens {\n colors: {\n primary: ColorScale;\n secondary: ColorScale;\n accent: ColorScale;\n destructive: ColorScale;\n success: ColorScale;\n warning: ColorScale;\n info: ColorScale;\n muted: ColorScale;\n background: ColorScale;\n foreground: ColorScale;\n border: ColorScale;\n };\n spacing: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n };\n typography: {\n fontFamily: string[];\n fontSize: Record<Size, string>;\n fontWeight: {\n normal: string;\n medium: string;\n semibold: string;\n bold: string;\n };\n };\n borderRadius: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n full: string;\n };\n shadows: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n };\n}\n\n/**\n * 기본 디자인 토큰\n * Tailwind CSS 클래스 기반\n */\nexport const defaultTokens: DesignTokens = {\n colors: {\n primary: {\n light: \"primary\",\n dark: \"primary\",\n },\n secondary: {\n light: \"secondary\",\n dark: \"secondary\",\n },\n accent: {\n light: \"accent\",\n dark: \"accent\",\n },\n destructive: {\n light: \"destructive\",\n dark: \"destructive\",\n },\n success: {\n light: \"green-600\",\n dark: \"green-500\",\n },\n warning: {\n light: \"yellow-600\",\n dark: \"yellow-500\",\n },\n info: {\n light: \"blue-600\",\n dark: \"blue-400\",\n },\n muted: {\n light: \"muted-foreground\",\n dark: \"muted-foreground\",\n },\n background: {\n light: \"background\",\n dark: \"background\",\n },\n foreground: {\n light: \"foreground\",\n dark: \"foreground\",\n },\n border: {\n light: \"border\",\n dark: \"border\",\n },\n },\n spacing: {\n sm: \"0.5rem\", // 8px\n md: \"1rem\", // 16px\n lg: \"1.5rem\", // 24px\n xl: \"2rem\", // 32px\n },\n typography: {\n fontFamily: [\"system-ui\", \"-apple-system\", \"sans-serif\"],\n fontSize: {\n sm: \"text-sm\", // 14px\n md: \"text-base\", // 16px\n lg: \"text-lg\", // 18px\n xl: \"text-xl\", // 20px\n },\n fontWeight: {\n normal: \"font-normal\",\n medium: \"font-medium\",\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n },\n },\n borderRadius: {\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n xl: \"rounded-xl\",\n full: \"rounded-full\",\n },\n shadows: {\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n xl: \"shadow-xl\",\n },\n};\n\n/**\n * 테마별 토큰 가져오기\n * \n * @param theme - 테마 ('light' | 'dark')\n * @param tokens - 디자인 토큰 (기본값: defaultTokens)\n * @returns 테마별 토큰 값\n */\nexport function getThemeTokenValue<T extends keyof DesignTokens>(\n theme: \"light\" | \"dark\",\n tokenPath: T,\n tokens: DesignTokens = defaultTokens\n): DesignTokens[T] {\n const token = tokens[tokenPath];\n \n // 색상 토큰인 경우 light/dark 값 반환\n if (tokenPath === \"colors\") {\n const colorToken = token as DesignTokens[\"colors\"];\n return Object.fromEntries(\n Object.entries(colorToken).map(([key, value]) => [\n key,\n value[theme],\n ])\n ) as DesignTokens[T];\n }\n \n return token;\n}\n\n/**\n * 색상 토큰 가져오기\n * \n * @param theme - 테마\n * @param colorKey - 색상 키\n * @param tokens - 디자인 토큰\n * @returns 색상 클래스 문자열\n */\nexport function getColorToken(\n theme: \"light\" | \"dark\",\n colorKey: keyof DesignTokens[\"colors\"],\n tokens: DesignTokens = defaultTokens\n): string {\n const color = tokens.colors[colorKey];\n return color[theme];\n}\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\nimport { merge } from \"../lib/utils\";\nimport { defaultTokens } from \"../lib/styles/system/tokens\";\n\n/**\n * Logo variant 타입\n * - symbol: 엠블럼만 (기본값)\n * - full: 엠블럼 + 워드마크\n */\nexport type LogoVariant = \"symbol\" | \"full\";\n\n/**\n * Logo size 타입\n * - sm, md, lg: 디자인 토큰 기반 크기\n * - number: 직접 rem 값 지정\n */\nexport type LogoSize = \"sm\" | \"md\" | \"lg\" | number;\n\n/**\n * Logo 컴포넌트 Props\n */\nexport interface LogoProps extends Omit<React.HTMLAttributes<HTMLElement>, \"width\" | \"height\"> {\n /**\n * 로고 변형\n * @default \"symbol\"\n */\n variant?: LogoVariant;\n /**\n * 로고 크기\n * @default \"md\"\n */\n size?: LogoSize;\n /**\n * 애니메이션 활성화 (Path Drawing 효과)\n * @default false\n */\n animated?: boolean;\n /**\n * 추가 className\n */\n className?: string;\n}\n\n/**\n * 엠블럼 SVG Path (viewBox: 0 0 40 40)\n */\nconst EMBLEM_PATH =\n \"M1.83795 0.0849609C3.16041 -0.269391 4.51968 0.515459 4.87408 1.83789L11.7335 27.4395L17.8184 21.3545L13.9464 6.90332C13.5921 5.58102 14.3771 4.22171 15.6993 3.86719C16.2369 3.72314 16.78 3.76987 17.2598 3.96191C17.3834 3.97561 17.5081 3.99515 17.6319 4.02832L38.1182 9.51855C39.4407 9.87293 40.2255 11.2322 39.8712 12.5547C39.5166 13.8769 38.1574 14.6619 36.835 14.3076L32.9249 13.2598L23.3487 22.8359L24.4893 27.0908C24.8437 28.4133 24.0588 29.7735 22.7364 30.1279C21.4141 30.4822 20.0548 29.6972 19.7003 28.375L19.3008 26.8838L13.3506 32.835C13.3068 32.8789 13.2592 32.9181 13.213 32.958L14.2637 36.8789C14.6179 38.2012 13.8331 39.5606 12.5108 39.915C11.1884 40.2694 9.82913 39.4845 9.47467 38.1621L0.085022 3.12109C-0.269246 1.79868 0.515578 0.439365 1.83795 0.0849609ZM21.8672 17.3057L27.3946 11.7773L19.8438 9.75488L21.8672 17.3057Z\";\n\n/**\n * 워드마크 SVG Path (viewBox: 0 0 192 37, x=40부터 시작)\n */\nconst WORDMARK_PATH =\n \"M40.8865 0.0761719C41.2577 0.0762268 41.5614 0.211458 41.7976 0.481445C42.0507 0.751482 42.1605 1.08058 42.1267 1.46875L39.823 23.165C39.5361 25.933 40.042 28.0937 41.3416 29.6465C42.658 31.1823 44.5825 31.9502 47.114 31.9502C49.8482 31.9502 51.9919 31.1984 53.5447 29.6963C55.1142 28.1942 56.059 25.9832 56.3796 23.0635L58.6833 1.19043C58.7171 0.886659 58.8524 0.624671 59.0886 0.405273C59.3418 0.185863 59.6293 0.0761719 59.95 0.0761719H62.6589C63.0132 0.0762861 63.3085 0.211518 63.5447 0.481445C63.7978 0.751463 63.899 1.07211 63.8484 1.44336L61.4685 24.0254C61.0466 28.0084 59.5278 31.1565 56.9119 33.4688C54.2958 35.7641 50.9029 36.9121 46.7341 36.9121C42.6667 36.9121 39.5025 35.7215 37.241 33.3418C34.9794 30.962 34.0593 27.7639 34.4812 23.7471L36.8865 1.21582C36.9034 0.912022 37.0301 0.650074 37.2664 0.430664C37.5195 0.194523 37.8061 0.0761804 38.1267 0.0761719H40.8865ZM157.419 0.0761719C157.756 0.0762579 158.026 0.203032 158.228 0.456055C158.448 0.709181 158.532 1.01283 158.481 1.36719L156.502 12.4541C157.226 11.6092 158.164 10.9091 159.317 10.3545C160.667 9.71319 162.127 9.39258 163.697 9.39258C166.279 9.39262 168.355 10.3468 169.925 12.2539C171.494 14.1611 172.01 16.6756 171.469 19.7979L170.33 26.2539C169.756 29.5448 168.439 32.1437 166.381 34.0508C164.322 35.958 161.941 36.9121 159.241 36.9121C157.553 36.9121 156.102 36.5404 154.886 35.7979C153.815 35.1281 153.052 34.2874 152.597 33.2764L152.127 35.7979C152.093 36.0004 151.983 36.1857 151.798 36.3545C151.612 36.5063 151.393 36.583 151.139 36.583H148.861C148.524 36.5829 148.245 36.4561 148.026 36.2031C147.824 35.9501 147.756 35.6547 147.823 35.3174L153.899 1.0127C153.933 0.75964 154.06 0.540084 154.279 0.354492C154.498 0.168895 154.735 0.0761719 154.988 0.0761719H157.419ZM139.621 9.39258C142.203 9.39258 144.178 10.135 145.545 11.6201C146.929 13.1053 147.401 15.0885 146.963 17.5693L143.748 35.6455C143.714 35.8986 143.587 36.1181 143.368 36.3037C143.165 36.4894 142.92 36.582 142.634 36.582H140.33C140.026 36.582 139.773 36.4723 139.57 36.2529C139.368 36.0336 139.292 35.7723 139.343 35.4688L139.753 33.2568C138.858 34.4755 137.845 35.3911 136.71 36C135.562 36.6076 134.279 36.9111 132.861 36.9111C130.684 36.9111 128.987 36.27 127.772 34.9873C126.574 33.7047 126.161 31.9917 126.532 29.8486L127.09 26.6582C127.478 24.4306 128.515 22.6923 130.203 21.4434C131.891 20.1945 133.992 19.5694 136.507 19.5693C137.452 19.5693 138.389 19.6961 139.317 19.9492C140.245 20.1855 141.047 20.5316 141.722 20.9873L142.304 17.5947C142.541 16.2448 142.296 15.2156 141.57 14.5068C140.844 13.798 139.883 13.4434 138.684 13.4434C137.959 13.4434 137.3 13.5616 136.71 13.7979C136.136 14.0341 135.603 14.3547 135.114 14.7598C134.625 15.1479 134.161 15.6209 133.722 16.1777C133.301 16.7174 132.98 17.004 132.76 17.0381C132.541 17.0718 132.329 17.0293 132.127 16.9111L130.456 15.8486C130.27 15.7305 130.144 15.5527 130.077 15.3164C130.026 15.0801 130.254 14.5742 130.76 13.7979C131.284 13.0046 131.983 12.2613 132.861 11.5693C133.739 10.8605 134.726 10.3205 135.823 9.94922C136.937 9.57791 138.203 9.39258 139.621 9.39258ZM184.457 9.39258C185.587 9.39262 186.592 9.57795 187.469 9.94922C188.347 10.3205 189.064 10.8862 189.621 11.6455C190.195 12.405 190.566 13.1142 190.735 13.7725C190.921 14.4305 190.962 14.878 190.861 15.1143C190.76 15.3503 190.6 15.5104 190.381 15.5947L188.431 16.4307C188.178 16.5319 187.942 16.5489 187.722 16.4814C187.52 16.3971 187.318 16.1181 187.115 15.6455C186.912 15.173 186.659 14.7512 186.355 14.3799C186.068 13.9917 185.714 13.7127 185.292 13.5439C184.87 13.3584 184.355 13.2656 183.748 13.2656C182.803 13.2656 181.975 13.5105 181.266 14C180.574 14.4726 180.144 15.1818 179.975 16.127L179.899 16.5312C179.747 17.4931 179.866 18.2782 180.254 18.8857C180.659 19.4764 181.882 20.3124 183.925 21.3926C186.22 22.5065 187.74 23.6375 188.482 24.7852C189.225 25.9328 189.41 27.5113 189.039 29.5195L189.013 29.6963C188.558 32.2279 187.478 34.0681 185.773 35.2158C184.085 36.3466 182.119 36.9111 179.874 36.9111C178.406 36.9111 177.132 36.6671 176.052 36.1777C174.988 35.6714 174.169 34.9962 173.595 34.1523C173.038 33.3085 172.692 32.4981 172.557 31.7217C172.422 30.9453 172.422 30.4555 172.557 30.2529C172.692 30.0336 172.879 29.8822 173.115 29.7979L175.14 29.0381C175.377 28.9707 175.596 28.9791 175.799 29.0635C176.018 29.1481 176.22 29.4943 176.406 30.1016C176.609 30.6922 176.853 31.2067 177.14 31.6455C177.444 32.0843 177.857 32.4304 178.381 32.6836C178.921 32.9199 179.604 33.0381 180.431 33.0381C181.427 33.038 182.296 32.7761 183.039 32.2529C183.798 31.7297 184.263 30.9788 184.431 30L184.507 29.6709C184.692 28.6584 184.625 27.8232 184.304 27.165C183.984 26.4899 182.954 25.671 181.216 24.709C178.684 23.477 177.004 22.2532 176.177 21.0381C175.367 19.8061 175.115 18.3884 175.419 16.7852L175.545 16.1523C175.916 13.9751 176.879 12.3042 178.431 11.1396C180.001 9.97511 182.01 9.39258 184.457 9.39258ZM7.92456 0.0507812C8.3294 0.0508971 8.6588 0.202195 8.91187 0.505859C9.16494 0.792681 9.26609 1.13054 9.21558 1.51855L7.72632 15.5439H25.7742L27.2917 1.24023C27.3255 0.936656 27.4685 0.666822 27.7214 0.430664C27.9746 0.177499 28.2706 0.0507812 28.6082 0.0507812H31.4685C31.8566 0.0507849 32.1773 0.202255 32.4304 0.505859C32.7004 0.792695 32.81 1.13051 32.7595 1.51855L29.1648 35.418C29.131 35.7217 28.9872 35.9998 28.7341 36.2529C28.481 36.4892 28.1859 36.6074 27.8484 36.6074H24.9871C24.5822 36.6073 24.2528 36.4645 23.9998 36.1777C23.7467 35.874 23.6455 35.5277 23.696 35.1396L25.2371 20.6074H7.18921L5.61987 35.3926C5.60297 35.7131 5.46 35.9999 5.19019 36.2529C4.93702 36.4892 4.64953 36.6074 4.32886 36.6074H1.44312C1.05506 36.6074 0.725803 36.4645 0.455811 36.1777C0.202712 35.874 0.10156 35.5277 0.1521 35.1396L3.74683 1.26562C3.7806 0.945022 3.92439 0.666913 4.17749 0.430664C4.43063 0.177522 4.72572 0.0508046 5.06323 0.0507812H7.92456ZM81.2156 0.0507812C81.57 0.050791 81.8821 0.168994 82.1521 0.405273C82.4389 0.624614 82.6328 0.902832 82.7341 1.24023L92.4304 34.9111C92.5654 35.3837 92.5068 35.7894 92.2537 36.127C92.0005 36.4475 91.6458 36.6074 91.1902 36.6074H88.2283C87.9414 36.6074 87.6709 36.5148 87.4177 36.3291C87.1816 36.1266 87.0301 35.8986 86.9626 35.6455L84.6492 27.3418H69.4958L65.3171 35.8232C65.2159 36.0426 65.055 36.228 64.8357 36.3799C64.6163 36.5149 64.3799 36.582 64.1267 36.582H61.1394C60.6838 36.582 60.3376 36.3967 60.1013 36.0254C59.8651 35.6542 59.8652 35.2407 60.1013 34.7852L77.0632 1.0127C77.2151 0.708897 77.4185 0.472488 77.6716 0.303711C77.9416 0.135061 78.2453 0.0507812 78.5828 0.0507812H81.2156ZM111.368 0.0507812C111.773 0.050882 112.102 0.210697 112.355 0.53125C112.608 0.835009 112.692 1.18973 112.608 1.59473L107.368 31.3672H122.634C123.039 31.3672 123.359 31.511 123.595 31.7979C123.832 32.0847 123.916 32.4139 123.848 32.7852L123.368 35.418C123.334 35.7048 123.19 35.9498 122.937 36.1523C122.701 36.3548 122.439 36.4561 122.152 36.4561H102.405C102.017 36.456 101.696 36.3207 101.443 36.0508C101.207 35.7639 101.123 35.4177 101.19 35.0127L107.19 1.13965C107.241 0.869608 107.393 0.624683 107.646 0.405273C107.899 0.169049 108.177 0.0508458 108.481 0.0507812H111.368ZM136.81 23.0889C135.41 23.0889 134.254 23.384 133.343 23.9746C132.431 24.5653 131.883 25.4346 131.697 26.582L131.165 29.5947C130.979 30.6747 131.182 31.4938 131.772 32.0508C132.363 32.6077 133.283 32.8867 134.532 32.8867C136.085 32.8867 137.418 32.3295 138.532 31.2158C139.663 30.085 140.304 28.9115 140.456 27.6963L141.013 24.6328C140.676 24.1266 140.127 23.7473 139.368 23.4941C138.608 23.2241 137.755 23.0889 136.81 23.0889ZM162.052 13.8232C160.364 13.8232 158.853 14.3972 157.519 15.5449C156.186 16.6757 155.351 18.1946 155.013 20.1016L153.925 26.2793C153.604 28.085 153.857 29.5784 154.684 30.7598C155.511 31.9243 156.836 32.5068 158.659 32.5068C160.296 32.5068 161.782 31.9584 163.115 30.8613C164.465 29.7475 165.3 28.2115 165.621 26.2539L166.71 20.0762C167.047 18.1353 166.785 16.608 165.925 15.4941C165.064 14.3803 163.773 13.8233 162.052 13.8232ZM79.0134 8.02539L71.5916 23.0889H83.4636L79.2664 8.02539L79.1902 7.64551L79.0134 8.02539Z\";\n\n/**\n * size prop을 rem 값으로 변환\n */\nfunction getSizeInRem(size: LogoSize): string {\n if (typeof size === \"number\") {\n return `${size}rem`;\n }\n\n // 디자인 토큰 기반 크기 매핑\n const sizeMap: Record<\"sm\" | \"md\" | \"lg\", string> = {\n sm: defaultTokens.spacing.md, // 1rem (16px)\n md: defaultTokens.spacing.lg, // 1.5rem (24px)\n lg: defaultTokens.spacing.xl, // 2rem (32px)\n };\n\n return sizeMap[size];\n}\n\n/**\n * Logo 컴포넌트\n *\n * HUA Labs 공식 로고 컴포넌트\n *\n * @example\n * ```tsx\n * // 기본 (엠블럼만)\n * <Logo />\n *\n * // 워드마크 포함\n * <Logo variant=\"full\" />\n *\n * // 크기 조정\n * <Logo size=\"lg\" />\n * <Logo size={3} /> // 3rem\n *\n * // 애니메이션\n * <Logo animated />\n * ```\n */\nexport function Logo({\n variant = \"symbol\",\n size = \"md\",\n animated = false,\n className,\n ...props\n}: LogoProps) {\n const sizeInRem = getSizeInRem(size);\n\n // 애니메이션용 스타일 시트 주입 (한 번만)\n useEffect(() => {\n if (!animated) return;\n\n const styleId = \"hua-logo-animation\";\n if (document.getElementById(styleId)) return;\n\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = `\n @keyframes hua-logo-draw {\n from {\n stroke-dashoffset: 1000;\n }\n to {\n stroke-dashoffset: 0;\n }\n }\n @keyframes hua-logo-draw-wordmark {\n from {\n stroke-dashoffset: 2000;\n }\n to {\n stroke-dashoffset: 0;\n }\n }\n .hua-logo-path {\n stroke: currentColor;\n stroke-width: 0.5;\n fill: none;\n animation: hua-logo-draw 2s ease-in-out forwards;\n }\n .hua-logo-wordmark {\n stroke: currentColor;\n stroke-width: 0.5;\n fill: none;\n animation: hua-logo-draw-wordmark 2s ease-in-out 0.5s forwards;\n }\n `;\n document.head.appendChild(style);\n\n return () => {\n const existingStyle = document.getElementById(styleId);\n if (existingStyle) {\n existingStyle.remove();\n }\n };\n }, [animated]);\n\n // Symbol only (엠블럼만)\n if (variant === \"symbol\") {\n return (\n <svg\n width={sizeInRem}\n height={sizeInRem}\n viewBox=\"0 0 40 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={merge(\"text-foreground\", className)}\n >\n <path\n d={EMBLEM_PATH}\n fill={animated ? \"none\" : \"currentColor\"}\n stroke={animated ? \"currentColor\" : \"none\"}\n strokeWidth={animated ? \"0.5\" : undefined}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={animated ? \"hua-logo-path\" : undefined}\n />\n </svg>\n );\n }\n\n // Full variant (엠블럼 + 워드마크 flex 배치)\n // 워드마크 원본: 152x37, 비율 152/37 ≈ 4.1\n const wordmarkRatio = 152 / 37;\n\n return (\n <div\n className={merge(\"inline-flex items-center gap-1 flex-shrink-0 min-w-max\", className)}\n {...(props as React.HTMLAttributes<HTMLDivElement>)}\n >\n {/* 엠블럼 */}\n <svg\n viewBox=\"0 0 40 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"flex-shrink-0\"\n style={{ width: sizeInRem, height: sizeInRem }}\n >\n <path\n d={EMBLEM_PATH}\n fill={animated ? \"none\" : \"currentColor\"}\n stroke={animated ? \"currentColor\" : \"none\"}\n strokeWidth={animated ? \"0.5\" : undefined}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={animated ? \"hua-logo-path\" : undefined}\n />\n </svg>\n {/* 워드마크 */}\n <svg\n viewBox=\"40 0 152 37\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"flex-shrink-0\"\n style={{ \n height: sizeInRem,\n width: `calc(${sizeInRem} * ${wordmarkRatio})`,\n }}\n >\n <path\n d={WORDMARK_PATH}\n fill={animated ? \"none\" : \"currentColor\"}\n stroke={animated ? \"currentColor\" : \"none\"}\n strokeWidth={animated ? \"0.5\" : undefined}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={animated ? \"hua-logo-wordmark\" : undefined}\n />\n </svg>\n </div>\n );\n}\n","\"use client\"\n\nimport React, { useState, useEffect } from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Bookmark 컴포넌트의 props / Bookmark component props\n * @typedef {Object} BookmarkProps\n * @property {string} id - 북마크 고유 ID / Bookmark unique ID\n * @property {string} [storageKey='bookmarks'] - localStorage 키 / localStorage key\n * @property {boolean} [defaultBookmarked=false] - 기본 북마크 상태 / Default bookmarked state\n * @property {(bookmarked: boolean) => void} [onBookmarkChange] - 북마크 상태 변경 콜백 / Bookmark state change callback\n * @property {'sm' | 'md' | 'lg'} [size='md'] - Bookmark 크기 / Bookmark size\n * @property {'default' | 'filled' | 'outline'} [variant='default'] - Bookmark 스타일 변형 / Bookmark style variant\n * @extends {React.HTMLAttributes<HTMLButtonElement>}\n */\nexport interface BookmarkProps extends React.HTMLAttributes<HTMLButtonElement> {\n id: string\n storageKey?: string\n defaultBookmarked?: boolean\n onBookmarkChange?: (bookmarked: boolean) => void\n size?: 'sm' | 'md' | 'lg'\n variant?: 'default' | 'filled' | 'outline'\n}\n\n/**\n * Bookmark 컴포넌트 / Bookmark component\n * \n * 북마크 기능을 제공하는 버튼 컴포넌트입니다.\n * localStorage에 북마크 상태를 저장하며, 여러 항목의 북마크를 관리할 수 있습니다.\n * \n * Button component that provides bookmark functionality.\n * Saves bookmark state to localStorage and can manage bookmarks for multiple items.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Bookmark id=\"article-1\" />\n * \n * @example\n * // 상태 변경 감지 / State change detection\n * <Bookmark \n * id=\"article-1\"\n * onBookmarkChange={(bookmarked) => console.log(bookmarked)}\n * variant=\"filled\"\n * />\n * \n * @param {BookmarkProps} props - Bookmark 컴포넌트의 props / Bookmark component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} Bookmark 컴포넌트 / Bookmark component\n */\nconst Bookmark = React.forwardRef<HTMLButtonElement, BookmarkProps>(\n ({ \n className, \n id, \n storageKey = 'bookmarks',\n defaultBookmarked = false,\n onBookmarkChange,\n size = 'md',\n variant = 'default',\n ...props \n }, ref) => {\n const [isBookmarked, setIsBookmarked] = useState(defaultBookmarked)\n\n // 로컬 스토리지에서 북마크 상태 불러오기\n useEffect(() => {\n const savedBookmarks = localStorage.getItem(storageKey)\n if (savedBookmarks) {\n const bookmarks = JSON.parse(savedBookmarks)\n setIsBookmarked(bookmarks.includes(id))\n }\n }, [id, storageKey])\n\n // 북마크 토글\n const toggleBookmark = () => {\n const newBookmarked = !isBookmarked\n setIsBookmarked(newBookmarked)\n \n // 로컬 스토리지 업데이트\n const savedBookmarks = localStorage.getItem(storageKey)\n const bookmarks = savedBookmarks ? JSON.parse(savedBookmarks) : []\n \n if (newBookmarked) {\n if (!bookmarks.includes(id)) {\n bookmarks.push(id)\n }\n } else {\n const index = bookmarks.indexOf(id)\n if (index > -1) {\n bookmarks.splice(index, 1)\n }\n }\n \n localStorage.setItem(storageKey, JSON.stringify(bookmarks))\n onBookmarkChange?.(newBookmarked)\n }\n\n const sizeClasses = {\n sm: \"w-6 h-6\",\n md: \"w-8 h-8\", \n lg: \"w-10 h-10\"\n }\n\n const variantClasses = {\n default: \"text-muted-foreground hover:text-yellow-500 transition-colors\",\n filled: \"text-yellow-500 hover:text-yellow-600 transition-colors\",\n outline: \"border border-border text-muted-foreground hover:text-yellow-500 hover:border-yellow-500 transition-colors rounded\"\n }\n\n return (\n <button\n ref={ref}\n onClick={toggleBookmark}\n className={merge(\n \"flex items-center justify-center transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-yellow-500 focus-visible:ring-offset-2\",\n sizeClasses[size],\n variantClasses[variant],\n className\n )}\n {...props}\n >\n <Icon \n name=\"star\" \n className={merge(\n \"transition-all duration-200\",\n isBookmarked && \"fill-current\"\n )}\n />\n </button>\n )\n }\n)\n\nBookmark.displayName = \"Bookmark\"\n\nexport { Bookmark } ","\"use client\"\n\nimport React, { useState } from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const avatarVariants = cva(\n \"relative flex shrink-0 overflow-hidden rounded-full\",\n {\n variants: {\n size: {\n sm: \"w-8 h-8 text-xs\",\n md: \"w-10 h-10 text-sm\",\n lg: \"w-12 h-12 text-base\",\n },\n variant: {\n default: \"\",\n glass: \"ring-1 ring-white/30 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\n/**\n * Avatar 컴포넌트의 props / Avatar component props\n */\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"glass\"\n src?: string\n alt?: string\n fallbackText?: string\n}\n\nexport interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {}\nexport interface AvatarFallbackProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Avatar 컴포넌트 / Avatar component\n *\n * 사용자 프로필 이미지를 표시하는 컴포넌트입니다.\n *\n * @example\n * <Avatar src=\"/user.jpg\" alt=\"사용자\" />\n * <Avatar alt=\"홍길동\">홍</Avatar>\n * <Avatar variant=\"glass\" size=\"lg\" src=\"/user.jpg\" alt=\"사용자\" />\n */\nconst Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({ className, size = \"md\", variant = \"default\", src, alt, fallbackText, children, ...props }, ref) => {\n const [imgError, setImgError] = useState(false)\n\n const getFallbackContent = () => {\n if (fallbackText) return fallbackText\n if (children) return children\n if (alt) return alt.charAt(0).toUpperCase()\n return \"U\"\n }\n\n const showImage = src && !imgError\n\n return (\n <div\n ref={ref}\n className={merge(avatarVariants({ size, variant }), className)}\n {...props}\n >\n {showImage ? (\n <AvatarImage\n src={src}\n alt={alt || \"avatar\"}\n onError={() => setImgError(true)}\n />\n ) : (\n <AvatarFallback>\n {getFallbackContent()}\n </AvatarFallback>\n )}\n </div>\n )\n }\n)\nAvatar.displayName = \"Avatar\"\n\nconst AvatarImage = React.forwardRef<HTMLImageElement, AvatarImageProps>(\n ({ className, ...props }, ref) => (\n <img\n ref={ref}\n className={merge(\"aspect-square h-full w-full object-cover object-center\", className)}\n {...props}\n />\n )\n)\nAvatarImage.displayName = \"AvatarImage\"\n\nconst AvatarFallback = React.forwardRef<HTMLDivElement, AvatarFallbackProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\n \"flex h-full w-full items-center justify-center rounded-full bg-primary text-primary-foreground font-semibold\",\n className\n )}\n {...props}\n />\n )\n)\nAvatarFallback.displayName = \"AvatarFallback\"\n\nexport { Avatar, AvatarImage, AvatarFallback } ","'use client'\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Avatar, AvatarImage, AvatarFallback } from \"./Avatar\"\nimport { Badge } from \"./Badge\"\nimport { Card, CardContent } from \"./Card\"\n\n/**\n * ChatMessage 컴포넌트의 props / ChatMessage component props\n * @typedef {Object} ChatMessageProps\n * @property {Object} message - 메시지 데이터 / Message data\n * @property {string} message.id - 메시지 ID / Message ID\n * @property {string} message.content - 메시지 내용 / Message content\n * @property {\"user\" | \"assistant\" | \"system\"} message.role - 메시지 역할 / Message role\n * @property {Date} message.timestamp - 메시지 타임스탬프 / Message timestamp\n * @property {string} [message.emotion] - 감정 정보 / Emotion information\n * @property {number} [message.intensity] - 감정 강도 / Emotion intensity\n * @property {boolean} [message.isTyping] - 타이핑 중 여부 / Typing state\n * @property {Object} [user] - 사용자 정보 / User information\n * @property {string} [user.name=\"사용자\"] - 사용자 이름 / User name\n * @property {string} [user.avatar] - 사용자 아바타 URL / User avatar URL\n * @property {string} [user.color=\"#3b82f6\"] - 사용자 색상 / User color\n * @property {Object} [assistant] - AI 어시스턴트 정보 / AI assistant information\n * @property {string} [assistant.name=\"AI\"] - AI 이름 / AI name\n * @property {string} [assistant.avatar] - AI 아바타 URL / AI avatar URL\n * @property {string} [assistant.color=\"#10b981\"] - AI 색상 / AI color\n * @property {boolean} [showAvatar=true] - 아바타 표시 여부 / Show avatar\n * @property {boolean} [showTimestamp=true] - 타임스탬프 표시 여부 / Show timestamp\n * @property {boolean} [showEmotion=true] - 감정 표시 여부 / Show emotion\n * @property {\"default\" | \"compact\" | \"bubble\"} [variant=\"default\"] - ChatMessage 스타일 변형 / ChatMessage style variant\n * @property {Object} [theme] - 커스텀 테마 / Custom theme\n * @property {string} [theme.userBubbleBg] - 사용자 버블 배경색 / User bubble background color\n * @property {string} [theme.userBubbleText] - 사용자 버블 텍스트 색상 / User bubble text color\n * @property {string} [theme.aiBubbleBg] - AI 버블 배경색 / AI bubble background color\n * @property {string} [theme.aiBubbleText] - AI 버블 텍스트 색상 / AI bubble text color\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface ChatMessageProps extends React.HTMLAttributes<HTMLDivElement> {\n message: {\n id: string\n content: string\n role: \"user\" | \"assistant\" | \"system\"\n timestamp: Date\n emotion?: string\n intensity?: number\n isTyping?: boolean\n }\n user?: {\n name?: string\n avatar?: string\n color?: string\n }\n assistant?: {\n name?: string\n avatar?: string\n color?: string\n }\n showAvatar?: boolean\n showTimestamp?: boolean\n showEmotion?: boolean\n variant?: \"default\" | \"compact\" | \"bubble\"\n theme?: {\n userBubbleBg?: string\n userBubbleText?: string\n aiBubbleBg?: string\n aiBubbleText?: string\n }\n}\n\n/**\n * ChatMessage 컴포넌트\n * \n * 채팅 메시지를 표시하는 컴포넌트입니다.\n * 사용자, AI 어시스턴트, 시스템 메시지를 지원하며, 감정 정보를 표시할 수 있습니다.\n * \n * @component\n * @example\n * // 기본 사용\n * <ChatMessage\n * message={{\n * id: \"1\",\n * content: \"안녕하세요!\",\n * role: \"user\",\n * timestamp: new Date()\n * }}\n * />\n * \n * @example\n * // AI 메시지, 감정 정보 포함\n * <ChatMessage\n * message={{\n * id: \"2\",\n * content: \"안녕하세요! 도와드릴까요?\",\n * role: \"assistant\",\n * timestamp: new Date(),\n * emotion: \"joy\",\n * intensity: 0.8\n * }}\n * variant=\"bubble\"\n * />\n * \n * @param {ChatMessageProps} props - ChatMessage 컴포넌트의 props / ChatMessage component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ChatMessage 컴포넌트 / ChatMessage component\n */\nconst ChatMessage = React.forwardRef<HTMLDivElement, ChatMessageProps>(\n ({ \n className, \n message,\n user = { name: \"사용자\", color: \"#3b82f6\" },\n assistant = { name: \"AI\", color: \"#10b981\" },\n showAvatar = true,\n showTimestamp = true,\n showEmotion = true,\n variant = \"default\",\n theme = {\n userBubbleBg: \"#3b82f6\",\n userBubbleText: \"#ffffff\",\n aiBubbleBg: \"#f3f4f6\",\n aiBubbleText: \"#1f2937\"\n },\n ...props \n }, ref) => {\n const isUser = message.role === \"user\"\n const _isAssistant = message.role === \"assistant\"\n const _isSystem = message.role === \"system\"\n\n const getEmotionColor = (emotion?: string) => {\n if (!emotion) return \"bg-gray-100\"\n \n const emotionColors = {\n joy: \"bg-yellow-100 text-yellow-800\",\n sadness: \"bg-indigo-100 text-cyan-800\",\n anger: \"bg-red-100 text-red-800\",\n calm: \"bg-green-100 text-green-800\",\n excitement: \"bg-pink-100 text-pink-800\",\n worry: \"bg-gray-100 text-gray-800\",\n gratitude: \"bg-purple-100 text-purple-800\",\n loneliness: \"bg-indigo-100 text-indigo-800\"\n }\n \n return emotionColors[emotion as keyof typeof emotionColors] || \"bg-gray-100 text-gray-800\"\n }\n\n const formatTime = (date: Date) => {\n return date.toLocaleTimeString('ko-KR', { \n hour: '2-digit', \n minute: '2-digit' \n })\n }\n\n if (variant === \"bubble\") {\n return (\n <div\n ref={ref}\n className={merge(\n \"flex w-full\",\n isUser ? \"justify-end\" : \"justify-start\",\n className\n )}\n {...props}\n >\n <div className={merge(\n \"flex max-w-[80%] space-x-2\",\n isUser ? \"flex-row-reverse space-x-reverse\" : \"flex-row\"\n )}>\n {showAvatar && (\n <Avatar className=\"w-8 h-8 flex-shrink-0\">\n <AvatarImage\n src={isUser ? user.avatar : assistant.avatar}\n alt={isUser ? user.name : assistant.name}\n />\n <AvatarFallback\n style={{\n backgroundColor: isUser ? user.color : assistant.color\n }}\n >\n {(isUser ? user.name : assistant.name)?.charAt(0)}\n </AvatarFallback>\n </Avatar>\n )}\n \n <div className=\"space-y-1\">\n <div\n className={merge(\n \"px-4 py-2 rounded-2xl max-w-full break-words\",\n isUser \n ? \"rounded-br-md\" \n : \"rounded-bl-md\"\n )}\n style={{\n backgroundColor: isUser ? theme.userBubbleBg : theme.aiBubbleBg,\n color: isUser ? theme.userBubbleText : theme.aiBubbleText\n }}\n >\n {message.isTyping ? (\n <div className=\"flex space-x-1\">\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-100\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-200\" />\n </div>\n ) : (\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\n )}\n </div>\n \n <div className={merge(\n \"flex items-center space-x-2 text-xs text-muted-foreground\",\n isUser ? \"justify-end\" : \"justify-start\"\n )}>\n {showTimestamp && (\n <span>{formatTime(message.timestamp)}</span>\n )}\n {showEmotion && message.emotion && (\n <Badge \n variant=\"secondary\" \n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\n >\n {message.emotion}\n </Badge>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n }\n\n if (variant === \"compact\") {\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-start space-x-3 py-2\",\n className\n )}\n {...props}\n >\n {showAvatar && (\n <Avatar className=\"w-6 h-6 flex-shrink-0\">\n <AvatarImage\n src={isUser ? user.avatar : assistant.avatar}\n alt={isUser ? user.name : assistant.name}\n />\n <AvatarFallback\n style={{\n backgroundColor: isUser ? user.color : assistant.color\n }}\n >\n {(isUser ? user.name : assistant.name)?.charAt(0)}\n </AvatarFallback>\n </Avatar>\n )}\n \n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center space-x-2 mb-1\">\n <span className=\"text-sm font-medium\">\n {isUser ? user.name : assistant.name}\n </span>\n {showTimestamp && (\n <span className=\"text-xs text-muted-foreground\">\n {formatTime(message.timestamp)}\n </span>\n )}\n {showEmotion && message.emotion && (\n <Badge \n variant=\"secondary\" \n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\n >\n {message.emotion}\n </Badge>\n )}\n </div>\n \n <div className=\"text-sm\">\n {message.isTyping ? (\n <div className=\"flex space-x-1\">\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce\" />\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce delay-100\" />\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce delay-200\" />\n </div>\n ) : (\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\n )}\n </div>\n </div>\n </div>\n )\n }\n\n // default variant\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-start space-x-3 py-4\",\n className\n )}\n {...props}\n >\n {showAvatar && (\n <Avatar className=\"w-10 h-10 flex-shrink-0\">\n <AvatarImage\n src={isUser ? user.avatar : assistant.avatar}\n alt={isUser ? user.name : assistant.name}\n />\n <AvatarFallback\n style={{\n backgroundColor: isUser ? user.color : assistant.color\n }}\n >\n {(isUser ? user.name : assistant.name)?.charAt(0)}\n </AvatarFallback>\n </Avatar>\n )}\n \n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center space-x-2 mb-2\">\n <span className=\"font-medium\">\n {isUser ? user.name : assistant.name}\n </span>\n {showTimestamp && (\n <span className=\"text-sm text-muted-foreground\">\n {formatTime(message.timestamp)}\n </span>\n )}\n {showEmotion && message.emotion && (\n <Badge \n variant=\"secondary\" \n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\n >\n {message.emotion}\n </Badge>\n )}\n </div>\n \n <Card className={merge(\n \"inline-block\",\n isUser ? \"bg-primary text-primary-foreground\" : \"bg-muted\"\n )}>\n <CardContent className=\"p-3\">\n {message.isTyping ? (\n <div className=\"flex space-x-1\">\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-100\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-200\" />\n </div>\n ) : (\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\n )}\n </CardContent>\n </Card>\n </div>\n </div>\n )\n }\n)\n\nChatMessage.displayName = \"ChatMessage\"\n\nexport { ChatMessage } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { IconName } from \"../lib/icons\"\n\n/**\n * Breadcrumb 항목 타입 / Breadcrumb item type\n */\nexport interface BreadcrumbItemData {\n label: string\n href?: string\n icon?: IconName\n}\n\n/**\n * Breadcrumb 컴포넌트의 props / Breadcrumb component props\n * @typedef {Object} BreadcrumbProps\n * @property {React.ReactNode} [children] - BreadcrumbItem 컴포넌트들 / BreadcrumbItem components\n * @property {BreadcrumbItemData[]} [items] - Breadcrumb 항목 배열 (children 대신 사용 가능) / Breadcrumb items array (alternative to children)\n * @property {number} [maxItems] - 최대 표시할 항목 수 (긴 경로 처리) / Maximum number of items to display (for long paths)\n * @property {boolean} [showHomeIcon] - 홈 아이콘 표시 여부 / Show home icon\n * @property {string} [homeLabel] - 홈 라벨 (기본: \"Home\") / Home label (default: \"Home\")\n * @property {React.ReactNode} [separator] - 항목 사이 구분자 (기본: chevronRight 아이콘) / Separator between items (default: chevronRight icon)\n * @property {'default' | 'subtle' | 'transparent' | 'glass'} [variant='default'] - Breadcrumb 스타일 변형 / Breadcrumb style variant\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode\n items?: BreadcrumbItemData[]\n maxItems?: number\n showHomeIcon?: boolean\n homeLabel?: string\n separator?: React.ReactNode\n variant?: 'default' | 'subtle' | 'transparent' | 'glass'\n}\n\n/**\n * BreadcrumbItem 컴포넌트의 props / BreadcrumbItem component props\n * @typedef {Object} BreadcrumbItemProps\n * @property {string} [href] - 링크 URL (없으면 일반 텍스트) / Link URL (plain text if not provided)\n * @property {boolean} [isCurrent=false] - 현재 페이지 여부 / Current page indicator\n * @property {React.ReactNode} children - 항목 텍스트 / Item text\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface BreadcrumbItemProps {\n href?: string\n isCurrent?: boolean\n children: React.ReactNode\n className?: string\n}\n\n/**\n * Breadcrumb 컴포넌트 / Breadcrumb component\n * \n * 네비게이션 경로를 표시하는 breadcrumb 컴포넌트입니다.\n * 현재 위치와 경로를 시각적으로 표현합니다.\n * \n * Breadcrumb component for displaying navigation paths.\n * Visually represents current location and path.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Breadcrumb>\n * <BreadcrumbItem href=\"/\">홈</BreadcrumbItem>\n * <BreadcrumbItem href=\"/products\">상품</BreadcrumbItem>\n * <BreadcrumbItem isCurrent>상세</BreadcrumbItem>\n * </Breadcrumb>\n * \n * @example\n * // 커스텀 구분자 / Custom separator\n * <Breadcrumb separator={<span>/</span>}>\n * <BreadcrumbItem href=\"/\">홈</BreadcrumbItem>\n * <BreadcrumbItem isCurrent>현재</BreadcrumbItem>\n * </Breadcrumb>\n * \n * @param {BreadcrumbProps} props - Breadcrumb 컴포넌트의 props / Breadcrumb component props\n * @param {React.Ref<HTMLDivElement>} ref - nav 요소 ref / nav element ref\n * @returns {JSX.Element} Breadcrumb 컴포넌트 / Breadcrumb component\n */\nconst Breadcrumb = React.forwardRef<HTMLDivElement, BreadcrumbProps>(\n ({ \n className, \n children, \n items,\n maxItems,\n showHomeIcon,\n homeLabel = \"Home\",\n separator = <Icon name=\"chevronRight\" className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />, \n variant = 'default', \n ...props \n }, ref) => {\n const variantStyles = {\n default: \"inline-flex items-center text-sm w-fit\",\n subtle: \"inline-flex items-center text-xs bg-background/40 backdrop-blur-md rounded-md px-3 py-2 border border-border/30 w-fit shadow-sm\",\n transparent: \"inline-flex items-center text-xs w-fit\",\n glass: \"inline-flex items-center text-xs bg-background/30 backdrop-blur-lg rounded-lg px-4 py-2 border border-border/25 w-fit shadow-lg\"\n }\n \n // items prop이 있으면 BreadcrumbItem으로 변환\n const renderItems = () => {\n if (items) {\n let displayItems = [...items]\n \n // maxItems 처리\n if (maxItems && displayItems.length > maxItems) {\n const firstItem = displayItems[0]\n const lastItems = displayItems.slice(-(maxItems - 1))\n displayItems = [firstItem, { label: '...', href: undefined }, ...lastItems]\n }\n \n // 마지막 항목은 isCurrent로 표시\n return displayItems.map((item, index) => {\n const isLast = index === displayItems.length - 1\n const isCurrent = isLast && !item.href\n \n return (\n <BreadcrumbItem\n key={index}\n href={item.href}\n isCurrent={isCurrent}\n >\n {item.icon && (\n <Icon name={item.icon} className=\"w-4 h-4 mr-1\" />\n )}\n {item.label}\n </BreadcrumbItem>\n )\n })\n }\n \n // children이 있으면 그대로 사용\n if (children) {\n return React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n return (\n <li key={index} className=\"flex items-center\">\n {child}\n {index < React.Children.count(children) - 1 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n )\n }\n return child\n })\n }\n \n return null\n }\n \n const renderedItems = renderItems()\n const itemsCount = items ? items.length : (children ? React.Children.count(children) : 0)\n \n return (\n <nav\n ref={ref}\n aria-label=\"Breadcrumb\"\n className={merge(variantStyles[variant], className)}\n {...props}\n >\n <ol className=\"inline-flex items-center\">\n {showHomeIcon && (\n <li className=\"flex items-center\">\n <BreadcrumbItem href=\"/\">\n <Icon name=\"home\" className=\"w-4 h-4 mr-1\" />\n {homeLabel}\n </BreadcrumbItem>\n {itemsCount > 0 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n )}\n {items ? (\n renderedItems?.map((item, index) => (\n <li key={index} className=\"flex items-center\">\n {item}\n {index < (renderedItems?.length || 0) - 1 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n ))\n ) : (\n renderedItems\n )}\n </ol>\n </nav>\n )\n }\n)\nBreadcrumb.displayName = \"Breadcrumb\"\n\n/**\n * BreadcrumbItem 컴포넌트\n * Breadcrumb의 개별 항목을 표시합니다.\n * \n * @component\n * @param {BreadcrumbItemProps} props - BreadcrumbItem 컴포넌트의 props\n * @param {React.Ref<HTMLLIElement>} ref - li 요소 ref\n * @returns {JSX.Element} BreadcrumbItem 컴포넌트\n */\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, BreadcrumbItemProps>(\n ({ className, href, isCurrent = false, children, ...props }, ref) => {\n if (isCurrent) {\n return (\n <span\n ref={ref}\n aria-current=\"page\"\n className={merge(\n \"text-muted-foreground font-medium\",\n className\n )}\n {...props}\n >\n {children}\n </span>\n )\n }\n\n if (href) {\n return (\n <a\n href={href}\n className={merge(\n \"text-muted-foreground hover:text-foreground transition-colors\",\n className\n )}\n {...props}\n >\n {children}\n </a>\n )\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n \"text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </span>\n )\n }\n)\nBreadcrumbItem.displayName = \"BreadcrumbItem\"\n\nexport { Breadcrumb, BreadcrumbItem } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Breadcrumb, BreadcrumbItem } from \"./Breadcrumb\"\n\n/**\n * ComponentLayout 컴포넌트의 props / ComponentLayout component props\n * @typedef {Object} ComponentLayoutProps\n * @property {string} title - 페이지 제목 / Page title\n * @property {string} description - 페이지 설명 / Page description\n * @property {React.ReactNode} children - 페이지 내용 / Page content\n * @property {Object} [prevPage] - 이전 페이지 정보 / Previous page information\n * @property {string} prevPage.title - 이전 페이지 제목 / Previous page title\n * @property {string} prevPage.href - 이전 페이지 링크 / Previous page link\n * @property {Object} [nextPage] - 다음 페이지 정보 / Next page information\n * @property {string} nextPage.title - 다음 페이지 제목 / Next page title\n * @property {string} nextPage.href - 다음 페이지 링크 / Next page link\n * @property {Array<Object>} [breadcrumbItems] - Breadcrumb 항목들 / Breadcrumb items\n * @property {string} breadcrumbItems[].label - Breadcrumb 라벨 / Breadcrumb label\n * @property {string} [breadcrumbItems[].href] - Breadcrumb 링크 / Breadcrumb link\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ComponentLayoutProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string\n description: string\n children: React.ReactNode\n prevPage?: {\n title: string\n href: string\n }\n nextPage?: {\n title: string\n href: string\n }\n breadcrumbItems?: Array<{\n label: string\n href?: string\n }>\n}\n\n/**\n * ComponentLayout 컴포넌트 / ComponentLayout component\n * \n * 컴포넌트 문서 페이지 레이아웃을 제공하는 컴포넌트입니다.\n * 제목, 설명, Breadcrumb, 이전/다음 페이지 네비게이션을 포함합니다.\n * \n * Component that provides layout for component documentation pages.\n * Includes title, description, Breadcrumb, and previous/next page navigation.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ComponentLayout\n * title=\"Button 컴포넌트\"\n * description=\"버튼 컴포넌트 사용법\"\n * >\n * <Button>예제</Button>\n * </ComponentLayout>\n * \n * @example\n * // 이전/다음 페이지 네비게이션 포함 / With previous/next page navigation\n * <ComponentLayout\n * title=\"Input 컴포넌트\"\n * description=\"입력 컴포넌트 사용법\"\n * prevPage={{ title: \"Button\", href: \"/components/button\" }}\n * nextPage={{ title: \"Select\", href: \"/components/select\" }}\n * >\n * <Input placeholder=\"입력하세요\" />\n * </ComponentLayout>\n * \n * @param {ComponentLayoutProps} props - ComponentLayout 컴포넌트의 props / ComponentLayout component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ComponentLayout 컴포넌트 / ComponentLayout component\n */\nconst ComponentLayout = React.forwardRef<HTMLDivElement, ComponentLayoutProps>(\n ({ \n className, \n title, \n description, \n children, \n prevPage, \n nextPage,\n breadcrumbItems = [\n { label: \"Components\", href: \"/components\" }\n ],\n ...props \n }, ref) => {\n return (\n <div className=\"relative min-h-screen\">\n {/* 고정된 페이지 네비게이션 - 위쪽 */}\n <div className=\"fixed right-4 top-4 z-50 hidden lg:block\">\n <div className=\"flex flex-col space-y-4\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200\"\n title={`이전: ${prevPage.title}`}\n >\n <svg\n className=\"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n\n {/* 고정된 페이지 네비게이션 - 아래쪽 */}\n <div className=\"fixed right-4 bottom-4 z-50 hidden lg:block\">\n <div className=\"flex flex-col space-y-4\">\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200\"\n title={`다음: ${nextPage.title}`}\n >\n <svg\n className=\"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n\n {/* 메인 콘텐츠 */}\n <div\n ref={ref}\n className={merge(\"container mx-auto px-4 py-8\", className)}\n {...props}\n >\n <div className=\"max-w-4xl mx-auto\">\n {/* 브레드크럼 */}\n <Breadcrumb className=\"mb-6\">\n {breadcrumbItems.map((item, index) => (\n <BreadcrumbItem \n key={index}\n href={item.href}\n isCurrent={index === breadcrumbItems.length - 1}\n >\n {item.label}\n </BreadcrumbItem>\n ))}\n </Breadcrumb>\n\n {/* 페이지 헤더 */}\n <div className=\"mb-8\">\n <h1 className=\"text-4xl font-bold mb-4\">{title}</h1>\n <p className=\"text-lg text-muted-foreground\">\n {description}\n </p>\n </div>\n\n {/* 페이지 콘텐츠 */}\n <div className=\"space-y-8\">\n {children}\n </div>\n\n {/* 모바일 페이지 네비게이션 */}\n <div className=\"mt-12 lg:hidden\">\n <div className=\"flex items-center justify-between py-4 border-t border-border\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <svg className=\"w-4 h-4 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n {prevPage.title}\n </a>\n )}\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n {nextPage.title}\n <svg className=\"w-4 h-4 ml-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n }\n)\nComponentLayout.displayName = \"ComponentLayout\"\n\nexport { ComponentLayout } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport type { Color } from \"../lib/types/common\"\n\n/**\n * EmotionMeter 컴포넌트의 props / EmotionMeter component props\n * @typedef {Object} EmotionMeterProps\n * @property {number} value - 감정 강도 값 (0-max) / Emotion intensity value (0-max)\n * @property {number} [max=100] - 최대값 / Maximum value\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 미터 크기 / Meter size\n * @property {\"blue\" | \"green\" | \"yellow\" | \"red\"} [color=\"blue\"] - 미터 색상 / Meter color\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface EmotionMeterProps extends React.HTMLAttributes<HTMLDivElement> {\n value: number\n max?: number\n size?: \"sm\" | \"md\" | \"lg\"\n color?: \"blue\" | \"green\" | \"yellow\" | \"red\" | Color\n}\n\n/**\n * EmotionMeter 컴포넌트 / EmotionMeter component\n * \n * 감정 강도를 표시하는 미터 컴포넌트입니다.\n * Progress 컴포넌트와 유사하지만 감정 분석에 특화되어 있습니다.\n * \n * Meter component that displays emotion intensity.\n * Similar to Progress component but specialized for emotion analysis.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionMeter value={75} />\n * \n * @example\n * // 다양한 색상 / Various colors\n * <EmotionMeter \n * value={80}\n * color=\"green\"\n * size=\"lg\"\n * />\n * \n * @param {EmotionMeterProps} props - EmotionMeter 컴포넌트의 props / EmotionMeter component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionMeter 컴포넌트 / EmotionMeter component\n */\nconst EmotionMeter = React.forwardRef<HTMLDivElement, EmotionMeterProps>(\n ({ className, value, max = 100, size = \"md\", color = \"blue\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"h-2\",\n md: \"h-3\", \n lg: \"h-4\"\n }\n\n // EmotionMeter는 특정 색상만 사용 (감정 분석 특화)\n const emotionColors: Record<string, string> = {\n blue: \"bg-indigo-500\",\n green: \"bg-green-500\",\n yellow: \"bg-yellow-500\",\n red: \"bg-red-500\",\n // 추가 색상 지원\n purple: \"bg-purple-500\",\n orange: \"bg-orange-500\",\n indigo: \"bg-indigo-500\",\n pink: \"bg-pink-500\",\n gray: \"bg-gray-500\",\n }\n\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n return (\n <div\n ref={ref}\n className={merge(\n \"w-full bg-gray-200 rounded-full dark:bg-gray-700\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n <div\n className={merge(\n \"h-full rounded-full transition-all duration-300\",\n emotionColors[color] || emotionColors.blue\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n )\n }\n)\nEmotionMeter.displayName = \"EmotionMeter\"\n\nexport { EmotionMeter } ","'use client'\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"./Card\"\nimport { Badge } from \"./Badge\"\nimport { EmotionMeter } from \"./EmotionMeter\"\n\n/**\n * EmotionAnalysis 컴포넌트의 props / EmotionAnalysis component props\n * @typedef {Object} EmotionAnalysisProps\n * @property {Object} [primaryEmotion] - 주요 감정 정보 / Primary emotion information\n * @property {string} primaryEmotion.name - 감정 이름 / Emotion name\n * @property {number} primaryEmotion.intensity - 감정 강도 (0-100) / Emotion intensity (0-100)\n * @property {string} [primaryEmotion.color] - 감정 색상 / Emotion color\n * @property {Array<Object>} [emotionDistribution] - 감정 분포 배열 / Emotion distribution array\n * @property {string} emotionDistribution[].emotion - 감정 이름 / Emotion name\n * @property {number} emotionDistribution[].percentage - 감정 비율 (0-100) / Emotion percentage (0-100)\n * @property {string} emotionDistribution[].color - 감정 색상 / Emotion color\n * @property {string[]} [keywords] - 키워드 배열 / Keywords array\n * @property {number} [intensity=50] - 전체 강도 (0-100) / Overall intensity (0-100)\n * @property {number} [positivity=70] - 긍정성 (0-100) / Positivity (0-100)\n * @property {number} [energy=60] - 에너지 (0-100) / Energy (0-100)\n * @property {boolean} [showMeter=true] - 강도 미터 표시 여부 / Show intensity meter\n * @property {boolean} [showDistribution=true] - 분포 표시 여부 / Show distribution\n * @property {boolean} [showKeywords=true] - 키워드 표시 여부 / Show keywords\n * @property {boolean} [showMetrics=true] - 메트릭 표시 여부 / Show metrics\n * @property {\"compact\" | \"detailed\" | \"card\"} [layout=\"detailed\"] - 레이아웃 타입 / Layout type\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface EmotionAnalysisProps extends React.HTMLAttributes<HTMLDivElement> {\n primaryEmotion?: {\n name: string\n intensity: number\n color?: string\n }\n emotionDistribution?: Array<{\n emotion: string\n percentage: number\n color: string\n }>\n keywords?: string[]\n intensity?: number\n positivity?: number\n energy?: number\n showMeter?: boolean\n showDistribution?: boolean\n showKeywords?: boolean\n showMetrics?: boolean\n layout?: \"compact\" | \"detailed\" | \"card\"\n}\n\n/**\n * EmotionAnalysis 컴포넌트 / EmotionAnalysis component\n * \n * 감정 분석 결과를 표시하는 컴포넌트입니다.\n * 주요 감정, 감정 분포, 키워드, 메트릭(강도, 긍정성, 에너지)을 표시할 수 있습니다.\n * \n * Component that displays emotion analysis results.\n * Can display primary emotion, emotion distribution, keywords, and metrics (intensity, positivity, energy).\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionAnalysis\n * primaryEmotion={{ name: \"기쁨\", intensity: 80 }}\n * keywords={[\"행복\", \"만족\"]}\n * />\n * \n * @example\n * // 상세 레이아웃 / Detailed layout\n * <EmotionAnalysis\n * primaryEmotion={{ name: \"평온\", intensity: 65, color: \"green\" }}\n * emotionDistribution={[\n * { emotion: \"기쁨\", percentage: 40, color: \"yellow\" },\n * { emotion: \"평온\", percentage: 60, color: \"green\" }\n * ]}\n * keywords={[\"안정\", \"편안\"]}\n * intensity={65}\n * positivity={75}\n * energy={50}\n * layout=\"detailed\"\n * />\n * \n * @param {EmotionAnalysisProps} props - EmotionAnalysis 컴포넌트의 props / EmotionAnalysis component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionAnalysis 컴포넌트 / EmotionAnalysis component\n */\nconst EmotionAnalysis = React.forwardRef<HTMLDivElement, EmotionAnalysisProps>(\n ({ \n className, \n primaryEmotion,\n emotionDistribution = [],\n keywords = [],\n intensity = 50,\n positivity = 70,\n energy = 60,\n showMeter = true,\n showDistribution = true,\n showKeywords = true,\n showMetrics = true,\n layout = \"detailed\",\n ...props \n }, ref) => {\n const getIntensityLabel = (value: number) => {\n if (value < 30) return \"약함\"\n if (value < 70) return \"보통\"\n return \"강함\"\n }\n\n const getPositivityLabel = (value: number) => {\n if (value < 30) return \"부정적\"\n if (value < 70) return \"중립적\"\n return \"긍정적\"\n }\n\n const getEnergyLabel = (value: number) => {\n if (value < 30) return \"낮음\"\n if (value < 70) return \"보통\"\n return \"높음\"\n }\n\n if (layout === \"compact\") {\n return (\n <div\n ref={ref}\n className={merge(\"space-y-3\", className)}\n {...props}\n >\n {primaryEmotion && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">주요 감정:</span>\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-sm text-muted-foreground\">\n {primaryEmotion.name} ({primaryEmotion.intensity}%)\n </span>\n {showMeter && (\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"sm\"\n color=\"blue\"\n />\n )}\n </div>\n </div>\n )}\n\n {showMetrics && (\n <>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">감정 강도:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getIntensityLabel(intensity)}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">긍정성:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getPositivityLabel(positivity)}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">에너지:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getEnergyLabel(energy)}\n </span>\n </div>\n </>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div>\n <span className=\"text-sm font-medium\">키워드:</span>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"secondary\" className=\"text-xs\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n\n if (layout === \"card\") {\n return (\n <Card\n ref={ref}\n className={merge(\"\", className)}\n {...props}\n >\n <CardHeader>\n <CardTitle className=\"flex items-center\">\n <span className=\"text-2xl mr-2\">✨</span>\n AI 분석\n </CardTitle>\n <CardDescription>\n 감정 분석 결과\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {primaryEmotion && (\n <div className=\"space-y-3\">\n <div className=\"text-sm\">\n <span className=\"font-medium\">주요 감정:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {primaryEmotion.name} ({primaryEmotion.intensity}%)\n </span>\n </div>\n {showMeter && (\n <div className=\"flex justify-center\">\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"md\"\n color=\"blue\"\n />\n </div>\n )}\n </div>\n )}\n\n {showMetrics && (\n <>\n <div className=\"text-sm\">\n <span className=\"font-medium\">감정 강도:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getIntensityLabel(intensity)}\n </span>\n </div>\n <div className=\"text-sm\">\n <span className=\"font-medium\">긍정성:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getPositivityLabel(positivity)}\n </span>\n </div>\n <div className=\"text-sm\">\n <span className=\"font-medium\">에너지:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getEnergyLabel(energy)}\n </span>\n </div>\n </>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div className=\"text-sm\">\n <span className=\"font-medium\">키워드:</span>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"secondary\" className=\"text-xs\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n )\n }\n\n // detailed layout (default)\n return (\n <div\n ref={ref}\n className={merge(\"space-y-6\", className)}\n {...props}\n >\n {primaryEmotion && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">주요 감정</h3>\n <div className=\"flex items-center space-x-4\">\n <div className=\"text-center\">\n <div className=\"text-2xl font-bold text-primary\">\n {primaryEmotion.name}\n </div>\n <div className=\"text-sm text-muted-foreground\">\n {primaryEmotion.intensity}% 강도\n </div>\n </div>\n {showMeter && (\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"lg\"\n color=\"blue\"\n />\n )}\n </div>\n </div>\n )}\n\n {showDistribution && emotionDistribution.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">감정 분포</h3>\n <div className=\"space-y-3\">\n {emotionDistribution.map((item, index) => (\n <div key={index} className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">{item.emotion}</span>\n <span className=\"text-sm text-muted-foreground\">\n {item.percentage}%\n </span>\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div \n className={`${item.color} h-2 rounded-full transition-all duration-300`} \n style={{ width: `${item.percentage}%` }}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {showMetrics && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">분석 지표</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">감정 강도</div>\n <div className=\"text-2xl font-bold text-primary\">\n {getIntensityLabel(intensity)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div \n className=\"bg-primary h-2 rounded-full transition-all duration-300\" \n style={{ width: `${intensity}%` }}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">긍정성</div>\n <div className=\"text-2xl font-bold text-green-600\">\n {getPositivityLabel(positivity)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div \n className=\"bg-green-500 h-2 rounded-full transition-all duration-300\" \n style={{ width: `${positivity}%` }}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">에너지</div>\n <div className=\"text-2xl font-bold text-orange-600\">\n {getEnergyLabel(energy)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div \n className=\"bg-orange-500 h-2 rounded-full transition-all duration-300\" \n style={{ width: `${energy}%` }}\n />\n </div>\n </div>\n </div>\n </div>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">감정 키워드</h3>\n <div className=\"flex flex-wrap gap-2\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"outline\" className=\"text-sm\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\n\nEmotionAnalysis.displayName = \"EmotionAnalysis\"\n\nexport { EmotionAnalysis } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * EmotionButton 컴포넌트의 props / EmotionButton component props\n * @typedef {Object} EmotionButtonProps\n * @property {string} emotion - 감정 이모지 또는 텍스트 / Emotion emoji or text\n * @property {boolean} [isSelected=false] - 선택 상태 / Selected state\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 버튼 크기 / Button size\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface EmotionButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n emotion: string\n isSelected?: boolean\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * EmotionButton 컴포넌트 / EmotionButton component\n * \n * 감정을 선택하는 버튼 컴포넌트입니다.\n * 이모지나 텍스트로 감정을 표시하며, 선택 상태를 지원합니다.\n * \n * Button component for selecting emotions.\n * Displays emotion as emoji or text and supports selected state.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionButton emotion=\"😊\" />\n * \n * @example\n * // 선택 상태 / Selected state\n * <EmotionButton \n * emotion=\"😊\"\n * isSelected\n * size=\"lg\"\n * />\n * \n * @param {EmotionButtonProps} props - EmotionButton 컴포넌트의 props / EmotionButton component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} EmotionButton 컴포넌트 / EmotionButton component\n */\nconst EmotionButton = React.forwardRef<HTMLButtonElement, EmotionButtonProps>(\n ({ className, emotion, isSelected = false, size = \"md\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"w-8 h-8 text-sm\",\n md: \"w-12 h-12 text-lg\",\n lg: \"w-16 h-16 text-xl\"\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n \"rounded-full border-2 transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-1 focus:ring-ring\",\n sizeClasses[size],\n isSelected\n ? \"border-indigo-500 bg-indigo-50 dark:bg-indigo-900/20\" \n : \"border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-800\",\n className\n )}\n {...props}\n >\n {emotion}\n </button>\n )\n }\n)\nEmotionButton.displayName = \"EmotionButton\"\n\nexport { EmotionButton } ","'use client'\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { EmotionButton } from \"./EmotionButton\"\nimport { EmotionMeter } from \"./EmotionMeter\"\n\n/**\n * EmotionSelector 컴포넌트의 props / EmotionSelector component props\n * @typedef {Object} EmotionSelectorProps\n * @property {string} [selectedEmotion] - 선택된 감정 키 / Selected emotion key\n * @property {(emotion: string) => void} [onEmotionSelect] - 감정 선택 콜백 / Emotion selection callback\n * @property {\"grid\" | \"list\" | \"compact\"} [layout=\"grid\"] - 레이아웃 타입 / Layout type\n * @property {boolean} [showIntensity=false] - 강도 조절 표시 여부 / Show intensity control\n * @property {number} [intensity=50] - 감정 강도 (0-100) / Emotion intensity (0-100)\n * @property {(intensity: number) => void} [onIntensityChange] - 강도 변경 콜백 / Intensity change callback\n * @property {Array<Object>} [emotions] - 감정 목록 / Emotions list\n * @property {string} emotions[].key - 감정 키 / Emotion key\n * @property {string} emotions[].label - 감정 라벨 / Emotion label\n * @property {string} [emotions[].icon] - 감정 아이콘 / Emotion icon\n * @property {string} [emotions[].color] - 감정 색상 / Emotion color\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 감정 버튼 크기 / Emotion button size\n * @property {\"button\" | \"card\" | \"chip\"} [variant=\"button\"] - 감정 표시 스타일 / Emotion display style\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface EmotionSelectorProps extends React.HTMLAttributes<HTMLDivElement> {\n selectedEmotion?: string\n onEmotionSelect?: (emotion: string) => void\n layout?: \"grid\" | \"list\" | \"compact\"\n showIntensity?: boolean\n intensity?: number\n onIntensityChange?: (intensity: number) => void\n emotions?: Array<{\n key: string\n label: string\n icon?: string\n color?: string\n }>\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"button\" | \"card\" | \"chip\"\n}\n\nconst defaultEmotions = [\n { key: \"joy\", label: \"기쁨\", icon: \"smile\", color: \"yellow\" },\n { key: \"sadness\", label: \"슬픔\", icon: \"frown\", color: \"blue\" },\n { key: \"anger\", label: \"화남\", icon: \"angry\", color: \"red\" },\n { key: \"calm\", label: \"평온\", icon: \"heart\", color: \"green\" },\n { key: \"excitement\", label: \"설렘\", icon: \"star\", color: \"pink\" },\n { key: \"worry\", label: \"걱정\", icon: \"meh\", color: \"gray\" },\n { key: \"gratitude\", label: \"감사\", icon: \"heart\", color: \"purple\" },\n { key: \"loneliness\", label: \"외로움\", icon: \"user\", color: \"indigo\" }\n]\n\n/**\n * EmotionSelector 컴포넌트 / EmotionSelector component\n * \n * 감정을 선택하는 컴포넌트입니다.\n * 여러 감정 옵션을 제공하며, 강도 조절 기능을 포함할 수 있습니다.\n * \n * Component for selecting emotions.\n * Provides multiple emotion options and can include intensity control.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionSelector\n * selectedEmotion=\"joy\"\n * onEmotionSelect={(emotion) => console.log(emotion)}\n * />\n * \n * @example\n * // 강도 조절 포함 / With intensity control\n * <EmotionSelector\n * selectedEmotion=\"calm\"\n * onEmotionSelect={handleEmotionSelect}\n * showIntensity\n * intensity={intensity}\n * onIntensityChange={setIntensity}\n * variant=\"card\"\n * />\n * \n * @param {EmotionSelectorProps} props - EmotionSelector 컴포넌트의 props / EmotionSelector component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionSelector 컴포넌트 / EmotionSelector component\n */\nconst EmotionSelector = React.forwardRef<HTMLDivElement, EmotionSelectorProps>(\n ({ \n className, \n selectedEmotion,\n onEmotionSelect,\n layout = \"grid\",\n showIntensity = false,\n intensity = 50,\n onIntensityChange,\n emotions = defaultEmotions,\n size = \"md\",\n variant = \"button\",\n ...props \n }, ref) => {\n const handleEmotionClick = (emotionKey: string) => {\n onEmotionSelect?.(emotionKey)\n }\n\n const renderEmotionItem = (emotion: typeof emotions[0]) => {\n const isSelected = selectedEmotion === emotion.key\n \n if (variant === \"button\") {\n return (\n <EmotionButton\n key={emotion.key}\n emotion={emotion.key}\n isSelected={isSelected}\n size={size}\n onClick={() => handleEmotionClick(emotion.key)}\n className={merge(\n \"transition-all duration-200\",\n isSelected && \"ring-1 ring-offset-2 ring-primary\"\n )}\n >\n {emotion.label}\n </EmotionButton>\n )\n }\n\n if (variant === \"card\") {\n return (\n <div\n key={emotion.key}\n className={merge(\n \"p-4 rounded-lg border-2 cursor-pointer transition-all duration-200 hover:shadow-md\",\n isSelected \n ? \"border-primary bg-primary/5\" \n : \"border-border hover:border-primary/50\"\n )}\n onClick={() => handleEmotionClick(emotion.key)}\n >\n <div className=\"flex items-center space-x-3\">\n <div className={merge(\n \"w-8 h-8 rounded-full flex items-center justify-center\",\n isSelected ? \"bg-primary text-primary-foreground\" : \"bg-muted\"\n )}>\n {emotion.icon && (\n <span className=\"text-lg\">\n {emotion.icon === \"smile\" && \"😊\"}\n {emotion.icon === \"frown\" && \"😢\"}\n {emotion.icon === \"angry\" && \"😠\"}\n {emotion.icon === \"heart\" && \"❤️\"}\n {emotion.icon === \"star\" && \"⭐\"}\n {emotion.icon === \"meh\" && \"😐\"}\n {emotion.icon === \"user\" && \"👤\"}\n </span>\n )}\n </div>\n <span className=\"font-medium truncate max-w-[120px]\">{emotion.label}</span>\n </div>\n </div>\n )\n }\n\n if (variant === \"chip\") {\n return (\n <div\n key={emotion.key}\n className={merge(\n \"px-3 py-1 rounded-full cursor-pointer transition-all duration-200 text-sm font-medium\",\n isSelected \n ? \"bg-primary text-primary-foreground\" \n : \"bg-muted hover:bg-muted/80\"\n )}\n onClick={() => handleEmotionClick(emotion.key)}\n >\n <span className=\"truncate max-w-[100px]\">{emotion.label}</span>\n </div>\n )\n }\n\n return null\n }\n\n const layoutClasses = {\n grid: \"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2 md:gap-3\",\n list: \"space-y-2\",\n compact: \"flex flex-wrap gap-1\"\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)}\n {...props}\n >\n <div className={layoutClasses[layout]}>\n {emotions.map(renderEmotionItem)}\n </div>\n\n {showIntensity && selectedEmotion && (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">감정 강도</span>\n <span className=\"text-sm text-muted-foreground\">{intensity}%</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={intensity}\n onChange={(e) => onIntensityChange?.(Number(e.target.value))}\n className=\"w-full h-2 bg-muted rounded-lg appearance-none cursor-pointer slider\"\n />\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>약함</span>\n <span>보통</span>\n <span>강함</span>\n </div>\n </div>\n )}\n\n {selectedEmotion && showIntensity && (\n <div className=\"flex justify-center\">\n <EmotionMeter\n value={intensity}\n size=\"md\"\n color=\"blue\"\n />\n </div>\n )}\n </div>\n )\n }\n)\n\nEmotionSelector.displayName = \"EmotionSelector\"\n\nexport { EmotionSelector } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * LanguageToggle 컴포넌트의 props / LanguageToggle component props\n * @typedef {Object} LanguageToggleProps\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Toggle 크기 / Toggle size\n * @property {\"button\" | \"icon\" | \"dropdown\"} [variant=\"button\"] - Toggle 스타일 변형 / Toggle style variant\n * @property {boolean} [showLabel=false] - 라벨 표시 여부 / Show label\n * @property {Array<Object>} [languages] - 언어 목록 / Language list\n * @property {string} languages[].code - 언어 코드 / Language code\n * @property {string} languages[].name - 언어 이름 / Language name\n * @property {string} [languages[].flag] - 언어 플래그 이모지 / Language flag emoji\n * @property {string} [currentLanguage=\"ko\"] - 현재 선택된 언어 코드 / Currently selected language code\n * @property {(language: string) => void} [onLanguageChange] - 언어 변경 콜백 / Language change callback\n */\nexport interface LanguageToggleProps {\n className?: string\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"button\" | \"icon\" | \"dropdown\"\n showLabel?: boolean\n languages?: Array<{\n code: string\n name: string\n flag?: string\n }>\n currentLanguage?: string\n onLanguageChange?: (language: string) => void\n}\n\n/**\n * LanguageToggle 컴포넌트 / LanguageToggle component\n * \n * 언어를 전환하는 토글 컴포넌트입니다.\n * 여러 언어를 지원하며, 버튼, 아이콘, 드롭다운 형태로 표시할 수 있습니다.\n * \n * Toggle component for switching languages.\n * Supports multiple languages and can be displayed as button, icon, or dropdown.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <LanguageToggle />\n * \n * @example\n * // 드롭다운 형태 / Dropdown variant\n * <LanguageToggle \n * variant=\"dropdown\"\n * currentLanguage=\"en\"\n * onLanguageChange={(lang) => console.log(lang)}\n * />\n * \n * @param {LanguageToggleProps} props - LanguageToggle 컴포넌트의 props / LanguageToggle component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} LanguageToggle 컴포넌트 / LanguageToggle component\n */\nconst LanguageToggle = React.forwardRef<HTMLDivElement, LanguageToggleProps>(\n ({ \n className,\n size = \"md\",\n variant = \"button\",\n showLabel = false,\n languages = [\n { code: \"ko\", name: \"한국어\", flag: \"🇰🇷\" },\n { code: \"en\", name: \"English\", flag: \"🇺🇸\" },\n { code: \"ja\", name: \"日本語\", flag: \"🇯🇵\" },\n { code: \"zh\", name: \"中文\", flag: \"🇨🇳\" }\n ],\n currentLanguage = \"ko\",\n onLanguageChange,\n ...props\n }, _ref) => {\n const [isOpen, setIsOpen] = React.useState(false)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n\n const currentLang = languages.find(lang => lang.code === currentLanguage) || languages[0]\n\n const sizeClasses = {\n sm: \"h-10 w-10\", // 40px - 더 넉넉한 크기\n md: \"h-12 w-12\", // 48px - 더 넉넉한 크기\n lg: \"h-14 w-14\" // 56px - 더 넉넉한 크기\n }\n\n const _iconSizes = {\n sm: 16,\n md: 20,\n lg: 24\n }\n\n // 외부 클릭 시 드롭다운 닫기\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside)\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside)\n }\n }, [isOpen])\n\n const handleLanguageChange = (languageCode: string) => {\n onLanguageChange?.(languageCode)\n setIsOpen(false)\n }\n\n const renderIcon = () => (\n <div className=\"flex items-center justify-center\">\n <span className=\"text-lg\">{currentLang.flag}</span>\n </div>\n )\n\n if (variant === \"icon\") {\n return (\n <div ref={dropdownRef} className=\"relative\">\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={merge(\n \"inline-flex items-center justify-center rounded-lg transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n {renderIcon()}\n </button>\n\n {isOpen && (\n <div className=\"absolute top-full right-0 mt-2 w-48 bg-background rounded-lg shadow-lg border border-border py-2 z-50\">\n {languages.map((language) => (\n <button\n key={language.code}\n onClick={() => handleLanguageChange(language.code)}\n className={merge(\n \"w-full px-4 py-3 text-left hover:bg-muted transition-colors duration-200 flex items-center gap-3\", // 16px, 12px 패딩, 12px 간격\n currentLanguage === language.code && \"bg-indigo-50 dark:bg-indigo-900/20 text-indigo-600 dark:text-indigo-400\"\n )}\n >\n <span className=\"text-lg\">{language.flag}</span>\n <span className=\"text-sm font-medium\">{language.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n\n if (variant === \"dropdown\") {\n return (\n <div ref={dropdownRef} className=\"relative\">\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={merge(\n \"inline-flex items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\", // 12px 간격, 16px, 12px 패딩\n className\n )}\n {...props}\n >\n <span className=\"text-lg\">{currentLang.flag}</span>\n {showLabel && <span className=\"text-foreground\">{currentLang.name}</span>}\n <svg\n className={merge(\n \"w-4 h-4 transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {isOpen && (\n <div className=\"absolute top-full right-0 mt-2 w-48 bg-background rounded-lg shadow-lg border border-border py-2 z-50\">\n {languages.map((language) => (\n <button\n key={language.code}\n onClick={() => handleLanguageChange(language.code)}\n className={merge(\n \"w-full px-4 py-3 text-left hover:bg-muted transition-colors duration-200 flex items-center gap-3\", // 16px, 12px 패딩, 12px 간격\n currentLanguage === language.code && \"bg-indigo-50 dark:bg-indigo-900/20 text-indigo-600 dark:text-indigo-400\"\n )}\n >\n <span className=\"text-lg\">{language.flag}</span>\n <span className=\"text-sm font-medium\">{language.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n\n // 기본 버튼 형태\n return (\n <button\n onClick={() => {\n const currentIndex = languages.findIndex(lang => lang.code === currentLanguage)\n const nextIndex = (currentIndex + 1) % languages.length\n onLanguageChange?.(languages[nextIndex].code)\n }}\n className={merge(\n \"inline-flex items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\", // 12px 간격, 16px, 12px 패딩\n className\n )}\n {...props}\n >\n <span className=\"text-lg\">{currentLang.flag}</span>\n {showLabel && <span className=\"text-foreground\">{currentLang.name}</span>}\n </button>\n )\n }\n)\nLanguageToggle.displayName = \"LanguageToggle\"\n\nexport { LanguageToggle } ","import { cva } from 'class-variance-authority'\n\n/**\n * HUA Spring Easing transition — 시그니처 \"쫀득한\" 느낌\n * cubic-bezier(0.34, 1.56, 0.64, 1)\n */\nconst springTransition =\n '[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]'\n\nexport const buttonVariants = cva(\n // ── base ──\n 'inline-flex items-center justify-center whitespace-nowrap font-medium transition-all duration-200 disabled:pointer-events-none disabled:opacity-50 min-w-fit focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--color-background)]',\n {\n variants: {\n /** 스타일 변형 */\n variant: {\n default:\n 'bg-[var(--color-primary)] text-[var(--color-primary-foreground)] hover:opacity-90',\n destructive:\n 'bg-[var(--color-destructive)] text-[var(--color-destructive-foreground)] hover:opacity-90 focus-visible:ring-[var(--color-destructive)]',\n outline:\n 'border-2 border-[var(--color-border)] bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0',\n secondary:\n 'bg-[var(--color-secondary)] text-[var(--color-secondary-foreground)] hover:opacity-80',\n ghost:\n 'bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0',\n link:\n 'bg-transparent text-[var(--color-primary)] underline hover:opacity-80 focus-visible:ring-offset-0',\n gradient:\n 'bg-gradient-to-r from-[var(--btn-gradient-from,theme(colors.teal.500))] to-[var(--btn-gradient-to,theme(colors.cyan.500))] text-white hover:shadow-lg',\n neon:\n 'bg-slate-900 dark:bg-slate-950 text-teal-400 border border-teal-500/50 shadow-lg shadow-[var(--btn-neon-glow,theme(colors.teal.500/20%))] hover:shadow-[var(--btn-neon-glow,theme(colors.teal.500/40%))] hover:border-teal-400',\n glass:\n 'bg-white/50 dark:bg-slate-900/50 backdrop-blur-md border border-slate-200/50 dark:border-slate-700/50 text-slate-900 dark:text-slate-100 hover:bg-white/70 dark:hover:bg-slate-900/70',\n },\n /** 크기 */\n size: {\n sm: 'h-8 px-4 py-2 text-sm',\n md: 'h-10 px-6 py-2 text-base',\n lg: 'h-12 px-8 py-3 text-lg',\n xl: 'h-14 px-10 py-4 text-xl',\n icon: 'h-10 w-10 p-0',\n },\n /** 모서리 둥글기 */\n rounded: {\n sm: 'rounded',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'rounded-full',\n },\n /** 그림자 */\n shadow: {\n none: '',\n sm: 'shadow-sm',\n md: 'shadow-md',\n lg: 'shadow-lg',\n xl: 'shadow-xl',\n },\n /** 호버 효과 — springy가 HUA-UI 시그니처 */\n hover: {\n springy: `hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${springTransition} transform-gpu`,\n scale:\n 'hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu',\n glow: 'hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200',\n slide: `hover:-translate-y-0.5 hover:shadow-md ${springTransition} transform-gpu`,\n none: '',\n },\n /** 전체 너비 */\n fullWidth: {\n true: 'w-full',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n rounded: 'md',\n shadow: 'md',\n hover: 'springy',\n fullWidth: false,\n },\n }\n)\n\n/** Gradient 프리셋 */\nexport const gradientPresets: Record<string, string> = {\n blue: 'from-teal-500 to-cyan-500',\n purple: 'from-purple-500 to-pink-500',\n green: 'from-green-500 to-emerald-500 dark:from-green-400 dark:to-emerald-400',\n orange: 'from-orange-500 to-red-500 dark:from-orange-300 dark:to-red-300',\n pink: 'from-pink-500 to-rose-500',\n}\n\nexport type { VariantProps } from 'class-variance-authority'\n","\"use client\";\n\nimport React from \"react\";\nimport { clsx } from \"clsx\";\n\n/**\n * Slot 컴포넌트\n *\n * Radix UI의 asChild 패턴을 구현합니다.\n * 자식 요소의 props와 ref를 병합하여 하나의 요소로 렌더링합니다.\n *\n * @example\n * // Button에서 asChild 사용\n * <Button asChild>\n * <Link href=\"/home\">홈으로</Link>\n * </Button>\n *\n * @see https://www.radix-ui.com/primitives/docs/utilities/slot\n */\n\ntype SlotProps = React.HTMLAttributes<HTMLElement> & {\n children?: React.ReactNode;\n};\n\n/**\n * 여러 ref를 하나로 합칩니다\n */\nfunction composeRefs<T>(\n ...refs: (React.Ref<T> | undefined)[]\n): React.RefCallback<T> {\n return (node) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref != null) {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n };\n}\n\n/**\n * 이벤트 핸들러를 합성합니다\n * \n * 부모(slot) 핸들러를 먼저 실행하고, 그 다음 자식 핸들러를 실행합니다.\n * defaultPrevented가 true이면 자식 핸들러는 실행하지 않습니다.\n */\nfunction composeEventHandlers<E>(\n parentHandler?: (event: E) => void,\n childHandler?: (event: E) => void\n): (event: E) => void {\n return (event) => {\n parentHandler?.(event);\n if (!(event as unknown as { defaultPrevented: boolean }).defaultPrevented) {\n childHandler?.(event);\n }\n };\n}\n\n/**\n * className을 병합합니다\n */\nfunction mergeClassName(\n slotClassName?: string,\n childClassName?: string\n): string | undefined {\n if (!slotClassName && !childClassName) return undefined;\n return clsx(slotClassName, childClassName);\n}\n\n/**\n * style을 병합합니다\n */\nfunction mergeStyle(\n slotStyle?: React.CSSProperties,\n childStyle?: React.CSSProperties\n): React.CSSProperties | undefined {\n if (!slotStyle && !childStyle) return undefined;\n return { ...slotStyle, ...childStyle };\n}\n\n/**\n * props를 병합합니다 (이벤트 핸들러, className, style 등)\n */\nfunction mergeProps(\n slotProps: Record<string, unknown>,\n childProps: Record<string, unknown>\n): Record<string, unknown> {\n const mergedProps: Record<string, unknown> = { ...slotProps };\n\n for (const propName in childProps) {\n const slotValue = slotProps[propName];\n const childValue = childProps[propName];\n\n // 이벤트 핸들러 병합 (부모(slot) → 자식 순서)\n if (/^on[A-Z]/.test(propName)) {\n if (slotValue && childValue) {\n mergedProps[propName] = composeEventHandlers(\n slotValue as (event: unknown) => void,\n childValue as (event: unknown) => void\n );\n } else {\n mergedProps[propName] = childValue || slotValue;\n }\n }\n // className 병합\n else if (propName === \"className\") {\n mergedProps[propName] = mergeClassName(\n slotValue as string | undefined,\n childValue as string | undefined\n );\n }\n // style 병합\n else if (propName === \"style\") {\n mergedProps[propName] = mergeStyle(\n slotValue as React.CSSProperties | undefined,\n childValue as React.CSSProperties | undefined\n );\n }\n // 그 외: 자식 값 우선\n else {\n mergedProps[propName] = childValue !== undefined ? childValue : slotValue;\n }\n }\n\n return mergedProps;\n}\n\n/**\n * 유효한 단일 React 요소인지 확인\n */\nfunction isSlottable(child: React.ReactNode): child is React.ReactElement {\n return React.isValidElement(child);\n}\n\n/**\n * Slot 컴포넌트\n *\n * 자식 요소에 부모의 props를 주입합니다.\n * asChild 패턴을 구현할 때 사용합니다.\n */\nconst Slot = React.forwardRef<HTMLElement, SlotProps>(\n ({ children, ...slotProps }, forwardedRef) => {\n const childArray = React.Children.toArray(children);\n\n // 유효한 단일 자식이 있는지 확인\n if (childArray.length !== 1) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[Slot] asChild는 정확히 하나의 자식 요소가 필요합니다.\"\n );\n }\n return null;\n }\n\n const child = childArray[0];\n\n if (!isSlottable(child)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[Slot] 자식은 유효한 React 요소여야 합니다.\");\n }\n return null;\n }\n\n // 자식 요소의 props와 ref 추출\n const childProps = child.props as Record<string, unknown>;\n const childRef = (child as unknown as { ref?: React.Ref<HTMLElement> }).ref;\n\n // props와 ref 병합\n const mergedProps = mergeProps(slotProps, childProps);\n const mergedRef = composeRefs(forwardedRef, childRef);\n\n return React.cloneElement(child, {\n ...mergedProps,\n ref: mergedRef,\n } as React.Attributes);\n }\n);\n\nSlot.displayName = \"Slot\";\n\nexport { Slot, composeRefs, mergeProps };\nexport type { SlotProps };\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\nimport { buttonVariants, gradientPresets } from \"./Button.variants\";\nimport { Slot } from \"../lib/Slot\";\n\n/**\n * 버튼 스타일 변형 / Button style variant\n */\ntype Variant =\n | \"default\" | \"destructive\" | \"outline\" | \"secondary\"\n | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\";\n\n/**\n * 버튼 크기 / Button size\n */\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\";\n\n/**\n * 버튼 모서리 둥글기 / Button border radius\n */\ntype Rounded = \"sm\" | \"md\" | \"lg\" | \"full\";\n\n/**\n * 버튼 그림자 / Button shadow\n */\ntype Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * 버튼 호버 효과 / Button hover effect\n * \"springy\"가 HUA-UI 시그니처 - 공 튕기듯 미세한 반동\n */\ntype Hover = \"springy\" | \"scale\" | \"glow\" | \"slide\" | \"none\";\n\n/**\n * 그라디언트 색상 이름 / Gradient color name\n */\ntype GradientName = \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\";\n\n/**\n * Button 컴포넌트의 공통 props / Common props for Button component\n */\ntype CommonProps = {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n icon?: React.ReactNode;\n iconPosition?: \"left\" | \"right\";\n gradient?: GradientName;\n customGradient?: string;\n rounded?: Rounded;\n shadow?: Shadow;\n hover?: Hover;\n fullWidth?: boolean;\n iconOnly?: boolean;\n \"aria-label\"?: string;\n className?: string;\n disabled?: boolean;\n asChild?: boolean;\n};\n\ntype AnchorProps = CommonProps &\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"className\"> & {\n href: string;\n };\n\ntype NativeButtonProps = CommonProps &\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"className\" | \"type\"> & {\n href?: undefined;\n };\n\n/**\n * Button 컴포넌트의 props 타입 / Button component props type\n * href가 제공되면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n */\nexport type ButtonProps = AnchorProps | NativeButtonProps;\n\ntype AnchorOrButton = HTMLAnchorElement | HTMLButtonElement;\n\nconst isBrowser = typeof window !== \"undefined\";\nfunction useReducedMotion() {\n const [reduce, setReduce] = React.useState(false);\n React.useEffect(() => {\n if (!isBrowser || !(\"matchMedia\" in window)) return;\n const mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const onChange = () => setReduce(!!mq.matches);\n onChange();\n mq.addEventListener?.(\"change\", onChange);\n return () => mq.removeEventListener?.(\"change\", onChange);\n }, []);\n return reduce;\n}\n\n/**\n * Button 컴포넌트 / Button component\n *\n * 다양한 스타일과 크기를 지원하는 범용 버튼 컴포넌트입니다.\n * href prop을 제공하면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n *\n * @example\n * <Button onClick={() => console.log('클릭')}>클릭하세요</Button>\n * <Button variant=\"destructive\" size=\"lg\">삭제</Button>\n * <Button variant=\"gradient\" gradient=\"purple\">그라디언트</Button>\n * <Button href=\"/about\" variant=\"link\">자세히 보기</Button>\n */\nconst ButtonInner = React.forwardRef<AnchorOrButton, ButtonProps>(function ButtonInner(\n {\n variant = \"default\",\n size = \"md\",\n loading = false,\n icon,\n iconPosition = \"left\",\n gradient = \"blue\",\n customGradient,\n rounded = \"md\",\n shadow = \"md\",\n hover = \"springy\",\n fullWidth,\n iconOnly,\n className,\n children,\n disabled,\n asChild = false,\n ...rest\n },\n ref\n) {\n const reduced = useReducedMotion();\n\n // gradient variant: 커스텀 그라디언트 클래스 처리\n const gradientClass =\n variant === \"gradient\"\n ? customGradient\n ? `bg-gradient-to-r ${customGradient}`\n : `bg-gradient-to-r ${gradientPresets[gradient] || gradientPresets.blue}`\n : undefined;\n\n const base = merge(\n buttonVariants({\n variant,\n size,\n rounded,\n shadow,\n hover: reduced ? \"none\" : hover,\n fullWidth: fullWidth ?? false,\n }),\n gradientClass,\n className\n );\n\n const Spinner = (\n <span role=\"status\" aria-live=\"polite\" className=\"-ml-1 mr-2 inline-flex\">\n <svg className=\"animate-spin h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n <span className=\"sr-only\">로딩 중</span>\n </span>\n );\n\n const content = (\n <>\n {loading && Spinner}\n {!loading && icon && iconPosition === \"left\" && <span className=\"mr-2\">{icon}</span>}\n {children}\n {!loading && icon && iconPosition === \"right\" && <span className=\"ml-2\">{icon}</span>}\n </>\n );\n\n if (iconOnly && !(\"aria-label\" in rest) && process.env.NODE_ENV !== \"production\") {\n console.warn(\"[Button] iconOnly 사용 시 aria-label을 제공하세요.\");\n }\n\n // asChild 모드: Slot을 사용하여 자식 요소에 props 병합\n if (asChild) {\n const slotProps = {\n className: base,\n ref,\n disabled: disabled || loading,\n \"aria-busy\": loading || undefined,\n \"aria-disabled\": (disabled || loading) || undefined,\n ...rest,\n };\n return <Slot {...slotProps}>{children}</Slot>;\n }\n\n // 앵커 모드\n if (\"href\" in rest && rest.href) {\n const { onClick, target, rel, href, \"aria-label\": _ariaLabel, className: anchorClassName, ...anchorProps } = rest as AnchorProps;\n const isDisabled = !!disabled || loading;\n\n const handleAnchorClick: React.MouseEventHandler<HTMLAnchorElement> = (e) => {\n if (isDisabled) { e.preventDefault(); e.stopPropagation(); return; }\n onClick?.(e);\n };\n\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={merge(base, anchorClassName)}\n onClick={handleAnchorClick}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled ? -1 : anchorProps.tabIndex}\n target={target}\n rel={target === \"_blank\" ? rel ?? \"noopener noreferrer\" : rel}\n {...anchorProps}\n >\n {content}\n </a>\n );\n }\n\n // 버튼 모드\n const { className: buttonClassName, ...btnProps } = rest as NativeButtonProps;\n const isDisabled = !!disabled || loading;\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n className={merge(base, buttonClassName)}\n type=\"button\"\n disabled={isDisabled}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n {...btnProps}\n >\n {content}\n </button>\n );\n});\n\nButtonInner.displayName = \"Button\";\n\nexport const Button = ButtonInner;\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { Button } from './Button'\nimport { Icon } from './Icon'\nimport { merge } from '../lib/utils'\nimport type { IconName } from '../lib/icons'\n\n/**\n * ScrollIndicator 컴포넌트의 props / ScrollIndicator component props\n * @typedef {Object} ScrollIndicatorProps\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {string} [targetId] - 스크롤 대상 요소 ID / Target element ID to scroll to\n * @property {string} [text='Scroll down'] - 표시 텍스트 / Display text\n * @property {IconName} [iconName='arrowDown'] - 아이콘 이름 / Icon name\n * @property {number} [iconSize=20] - 아이콘 크기 / Icon size\n * @property {'bottom-center' | 'bottom-left' | 'bottom-right'} [position='bottom-center'] - 표시 위치 / Display position\n * @property {'default' | 'primary' | 'secondary' | 'outline'} [variant='default'] - ScrollIndicator 스타일 변형 / ScrollIndicator style variant\n * @property {'sm' | 'md' | 'lg'} [size='md'] - ScrollIndicator 크기 / ScrollIndicator size\n * @property {boolean} [animated=true] - 애니메이션 활성화 여부 / Enable animation\n * @property {boolean} [autoHide=true] - 자동 숨김 여부 / Auto hide\n * @property {number} [hideThreshold=100] - 숨김 임계값 (px) / Hide threshold (px)\n */\nexport interface ScrollIndicatorProps {\n className?: string\n targetId?: string\n text?: string\n iconName?: IconName\n iconSize?: number\n position?: 'bottom-center' | 'bottom-left' | 'bottom-right'\n variant?: 'default' | 'primary' | 'secondary' | 'outline'\n size?: 'sm' | 'md' | 'lg'\n animated?: boolean\n autoHide?: boolean\n hideThreshold?: number\n}\n\n/**\n * ScrollIndicator 컴포넌트 / ScrollIndicator component\n * \n * 스크롤 가능함을 나타내는 인디케이터 컴포넌트입니다.\n * 클릭 시 지정된 요소로 스크롤하거나 다음 섹션으로 스크롤합니다.\n * \n * Indicator component that shows scrollability.\n * Scrolls to specified element or next section on click.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ScrollIndicator />\n * \n * @example\n * // 특정 요소로 스크롤 / Scroll to specific element\n * <ScrollIndicator \n * targetId=\"section-2\"\n * text=\"다음 섹션으로\"\n * position=\"bottom-right\"\n * />\n * \n * @param {ScrollIndicatorProps} props - ScrollIndicator 컴포넌트의 props / ScrollIndicator component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ScrollIndicator 컴포넌트 / ScrollIndicator component\n */\nconst ScrollIndicator = React.forwardRef<HTMLDivElement, ScrollIndicatorProps>(({\n className,\n targetId,\n text = 'Scroll down',\n iconName = 'arrowDown',\n iconSize = 20,\n position = 'bottom-center',\n variant = 'default',\n size = 'md',\n animated = true,\n autoHide = true,\n hideThreshold = 100,\n ...props\n}, ref) => {\n const [isVisible, setIsVisible] = useState(true)\n\n useEffect(() => {\n if (!autoHide) return\n\n const handleScroll = () => {\n const scrollTop = window.scrollY\n setIsVisible(scrollTop < hideThreshold)\n }\n\n // 초기 실행\n handleScroll()\n\n window.addEventListener('scroll', handleScroll, { passive: true })\n return () => window.removeEventListener('scroll', handleScroll)\n }, [autoHide, hideThreshold])\n\n const scrollToTarget = () => {\n if (targetId) {\n const targetElement = document.getElementById(targetId)\n if (targetElement) {\n targetElement.scrollIntoView({ behavior: 'smooth' })\n }\n } else {\n // 기본적으로 다음 섹션으로 스크롤\n const currentSection = ref as React.RefObject<HTMLDivElement>\n if (currentSection.current) {\n const nextSection = currentSection.current.nextElementSibling\n if (nextSection) {\n nextSection.scrollIntoView({ behavior: 'smooth' })\n }\n }\n }\n }\n\n const positionClasses = {\n 'bottom-center': 'bottom-8 left-1/2 transform -translate-x-1/2',\n 'bottom-left': 'bottom-8 left-8',\n 'bottom-right': 'bottom-8 right-8'\n }\n\n const sizeClasses = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg'\n }\n\n const variantClasses = {\n default: 'text-muted-foreground hover:text-foreground',\n primary: 'text-primary hover:text-primary/80',\n secondary: 'text-secondary-foreground hover:text-secondary-foreground/80',\n outline: 'text-foreground hover:text-foreground'\n }\n\n if (!isVisible) return null\n\n return (\n <div\n ref={ref}\n className={merge(\n 'absolute z-10',\n positionClasses[position],\n className\n )}\n {...props}\n >\n <Button\n onClick={scrollToTarget}\n variant=\"ghost\"\n size=\"sm\"\n className={merge(\n 'flex flex-col items-center space-y-2 transition-all duration-300',\n sizeClasses[size],\n variantClasses[variant],\n animated && 'animate-in fade-in-0 slide-in-from-bottom-2 duration-500'\n )}\n aria-label={text}\n >\n <span className=\"text-xs opacity-80\">{text}</span>\n <Icon\n name={iconName}\n size={iconSize}\n className={merge(\n animated && 'animate-bounce'\n )}\n />\n </Button>\n </div>\n )\n})\n\nScrollIndicator.displayName = 'ScrollIndicator'\n\nexport { ScrollIndicator } ","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { merge } from '../lib/utils'\n\n/**\n * ScrollProgress 컴포넌트의 props / ScrollProgress component props\n * @typedef {Object} ScrollProgressProps\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {number} [height=2] - 진행률 바 높이 (px) / Progress bar height (px)\n * @property {'default' | 'primary' | 'secondary' | 'gradient'} [color='gradient'] - 진행률 바 색상 / Progress bar color\n * @property {'top' | 'bottom'} [position='top'] - 표시 위치 / Display position\n * @property {boolean} [animated=true] - 애니메이션 활성화 여부 / Enable animation\n * @property {boolean} [showPercentage=false] - 퍼센트 표시 여부 / Show percentage\n */\nexport interface ScrollProgressProps {\n className?: string\n height?: number\n color?: 'default' | 'primary' | 'secondary' | 'gradient'\n position?: 'top' | 'bottom'\n animated?: boolean\n showPercentage?: boolean\n}\n\n/**\n * ScrollProgress 컴포넌트 / ScrollProgress component\n * \n * 페이지 스크롤 진행률을 표시하는 컴포넌트입니다.\n * 페이지 상단 또는 하단에 고정되어 표시됩니다.\n * \n * Component that displays page scroll progress.\n * Fixed at top or bottom of the page.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ScrollProgress />\n * \n * @example\n * // 하단에 표시, 퍼센트 포함 / Display at bottom with percentage\n * <ScrollProgress \n * position=\"bottom\"\n * color=\"primary\"\n * showPercentage\n * height={4}\n * />\n * \n * @param {ScrollProgressProps} props - ScrollProgress 컴포넌트의 props / ScrollProgress component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ScrollProgress 컴포넌트 / ScrollProgress component\n */\nconst ScrollProgress = React.forwardRef<HTMLDivElement, ScrollProgressProps>(({\n className,\n height = 2,\n color = 'gradient',\n position = 'top',\n animated: _animated = true,\n showPercentage = false,\n ...props\n}, ref) => {\n const [progress, setProgress] = useState(0)\n\n useEffect(() => {\n const updateProgress = () => {\n const scrollTop = window.scrollY\n const docHeight = document.documentElement.scrollHeight - window.innerHeight\n const currentProgress = docHeight > 0 ? (scrollTop / docHeight) * 100 : 0\n setProgress(currentProgress)\n }\n\n // 초기 실행\n updateProgress()\n\n window.addEventListener('scroll', updateProgress, { passive: true })\n window.addEventListener('resize', updateProgress, { passive: true })\n \n return () => {\n window.removeEventListener('scroll', updateProgress)\n window.removeEventListener('resize', updateProgress)\n }\n }, [])\n\n // 색상 옵션 (Teal 브랜드 기반)\n const progressColors: Record<string, string> = {\n default: 'bg-foreground',\n primary: 'bg-primary',\n secondary: 'bg-muted-foreground',\n gradient: 'bg-gradient-to-r from-teal-600 via-cyan-500 to-teal-600'\n }\n\n const positionClasses = {\n top: 'top-0 left-0 right-0',\n bottom: 'bottom-0 left-0 right-0'\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n 'fixed z-50',\n positionClasses[position],\n className\n )}\n style={{ height: `${height}px` }}\n {...props}\n >\n {/* 배경 바 */}\n <div className=\"absolute inset-0 w-full h-full bg-border/30\" />\n \n {/* 진행률 바 - absolute로 배경 위에 표시 */}\n <div\n className={merge(\n 'absolute top-0 left-0 h-full origin-left transition-all duration-100 ease-out',\n progressColors[color] || progressColors.gradient\n )}\n style={{\n width: `${progress}%`,\n transformOrigin: 'left'\n }}\n />\n \n {/* 퍼센트 표시 (선택사항) */}\n {showPercentage && (\n <div className=\"absolute top-2 right-2 text-xs text-muted-foreground bg-card px-2 py-1 rounded border border-border\">\n {Math.round(progress)}%\n </div>\n )}\n </div>\n )\n})\n\nScrollProgress.displayName = 'ScrollProgress'\n\nexport { ScrollProgress } ","import React from \"react\"\nimport { merge } from \"../../lib/utils\"\n\nexport interface ScrollbarProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n variant?: \"default\" | \"glass\" | \"colorful\" | \"minimal\" | \"neon\"\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n orientation?: \"vertical\" | \"horizontal\" | \"both\"\n autoHide?: boolean\n smooth?: boolean\n}\n\nconst Scrollbar = React.forwardRef<HTMLDivElement, ScrollbarProps>(\n ({ \n className, \n variant = \"default\", \n size = \"md\", \n orientation = \"both\", \n autoHide = true, \n smooth = true, \n children, \n ...props \n }, ref) => {\n \n const getVariantClasses = () => {\n switch (variant) {\n case \"glass\":\n return \"scrollbar-thumb-white/20 hover:scrollbar-thumb-white/30 backdrop-blur-sm\"\n case \"colorful\":\n return \"scrollbar-thumb-gradient-to-b scrollbar-thumb-from-indigo-500 scrollbar-thumb-to-purple-500 hover:scrollbar-thumb-from-cyan-600 hover:scrollbar-thumb-to-purple-600\"\n case \"minimal\":\n return \"scrollbar-thumb-slate-200/50 hover:scrollbar-thumb-slate-300/70 dark:scrollbar-thumb-slate-700/50 dark:hover:scrollbar-thumb-slate-600/70\"\n case \"neon\":\n return \"scrollbar-thumb-cyan-400/60 hover:scrollbar-thumb-cyan-300/80 scrollbar-thumb-shadow-lg scrollbar-thumb-shadow-cyan-500/25\"\n default:\n return \"scrollbar-thumb-slate-300 hover:scrollbar-thumb-slate-400 dark:scrollbar-thumb-slate-600 dark:hover:scrollbar-thumb-slate-500\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"scrollbar-w-1\"\n case \"lg\":\n return \"scrollbar-w-3\"\n case \"xl\":\n return \"scrollbar-w-4\"\n default:\n return \"scrollbar-w-2\"\n }\n }\n\n const getOrientationClasses = () => {\n switch (orientation) {\n case \"vertical\":\n return \"overflow-y-auto overflow-x-hidden\"\n case \"horizontal\":\n return \"overflow-x-auto overflow-y-hidden\"\n default:\n return \"overflow-auto\"\n }\n }\n\n const baseClasses = merge(\n \"scrollbar-thin scrollbar-track-transparent scrollbar-thumb-rounded-full transition-all duration-200\",\n getVariantClasses(),\n getSizeClasses(),\n getOrientationClasses(),\n autoHide && \"scrollbar-hide\",\n smooth && \"scroll-smooth\",\n className\n )\n\n return (\n <div\n className={baseClasses}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nScrollbar.displayName = \"Scrollbar\"\n\nexport { Scrollbar } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { AllIconName } from \"../lib/icon-names\"\n\n/**\n * FeatureCard 아이콘 타입 / FeatureCard icon type\n * - AllIconName: icons.ts + PROJECT_ICONS의 모든 아이콘 / All icons from icons.ts + PROJECT_ICONS\n * - `http${string}`: 이미지 URL / Image URL\n */\ntype FeatureCardIconType = AllIconName | `http${string}`\n\n/**\n * FeatureCard 컴포넌트의 props / FeatureCard component props\n * @typedef {Object} FeatureCardProps\n * @property {FeatureCardIconType} [icon] - 아이콘 (IconName, ProjectIconName 또는 이미지 URL) / Icon (IconName, ProjectIconName or image URL)\n * @property {string} title - 카드 제목 / Card title\n * @property {string} description - 카드 설명 / Card description\n * @property {\"default\" | \"gradient\" | \"glass\" | \"neon\"} [variant=\"default\"] - FeatureCard 스타일 변형 / FeatureCard style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - FeatureCard 크기 / FeatureCard size\n * @property {\"scale\" | \"glow\" | \"slide\" | \"none\"} [hover=\"scale\"] - 호버 효과 / Hover effect\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"} [gradient=\"blue\"] - 그라디언트 색상 / Gradient color\n * @property {string} [customGradient] - 커스텀 그라디언트 클래스 / Custom gradient class\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface FeatureCardProps extends React.HTMLAttributes<HTMLDivElement> {\n icon?: FeatureCardIconType\n title: string\n description: string\n variant?: \"default\" | \"gradient\" | \"glass\" | \"neon\"\n size?: \"sm\" | \"md\" | \"lg\"\n hover?: \"scale\" | \"glow\" | \"slide\" | \"none\"\n gradient?: \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"\n customGradient?: string\n}\n\n/**\n * FeatureCard 컴포넌트 / FeatureCard component\n * \n * 기능을 소개하는 카드 컴포넌트입니다.\n * 아이콘, 제목, 설명을 포함하며, 다양한 스타일과 호버 효과를 지원합니다.\n * \n * Card component that introduces features.\n * Includes icon, title, and description, supports various styles and hover effects.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <FeatureCard\n * icon=\"star\"\n * title=\"고급 기능\"\n * description=\"강력한 기능을 제공합니다\"\n * />\n * \n * @example\n * // Gradient 스타일 / Gradient style\n * <FeatureCard\n * icon=\"zap\"\n * title=\"빠른 성능\"\n * description=\"최적화된 성능\"\n * variant=\"gradient\"\n * gradient=\"purple\"\n * hover=\"glow\"\n * />\n * \n * @param {FeatureCardProps} props - FeatureCard 컴포넌트의 props / FeatureCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} FeatureCard 컴포넌트 / FeatureCard component\n */\nconst FeatureCard = React.forwardRef<HTMLDivElement, FeatureCardProps>(\n ({ \n className, \n icon, \n title, \n description, \n variant = \"default\", \n size = \"md\",\n hover = \"scale\",\n gradient = \"blue\",\n customGradient,\n ...props \n }, ref) => {\n const sizeClasses = {\n sm: \"p-4\",\n md: \"p-6\",\n lg: \"p-8\"\n }\n\n const variantClasses = {\n default: \"bg-background/90 backdrop-blur-sm border border-border/50\",\n gradient: `bg-gradient-to-br ${customGradient || getGradientClass(gradient)}`,\n glass: \"bg-white/10 dark:bg-gray-800/10 backdrop-blur-md border border-white/20 dark:border-gray-700/20\",\n neon: \"bg-gray-900/90 dark:bg-gray-900/90 border border-cyan-400/30 dark:border-cyan-400/30 shadow-lg shadow-cyan-400/20\"\n }\n\n const hoverClasses = {\n scale: \"hover:scale-105 transition-transform duration-300\",\n glow: \"hover:shadow-2xl hover:shadow-cyan-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300\",\n slide: \"hover:-translate-y-2 transition-transform duration-300\",\n none: \"\"\n }\n\n const iconSize = size === \"lg\" ? \"text-5xl\" : size === \"md\" ? \"text-4xl\" : \"text-3xl\"\n\n return (\n <div\n ref={ref}\n className={merge(\n \"rounded-2xl shadow-lg transition-all duration-300 flex flex-col items-center text-center\",\n sizeClasses[size],\n variantClasses[variant],\n hoverClasses[hover],\n className\n )}\n {...props}\n >\n {icon && (\n <div className={`mb-4 ${iconSize} ${variant === \"neon\" ? \"text-cyan-400\" : \"\"}`}>\n {typeof icon === \"string\" && icon.startsWith(\"http\") ? (\n <img src={icon} alt={title} className=\"w-full h-full object-contain\" />\n ) : (\n <Icon name={icon as AllIconName} className=\"w-full h-full\" />\n )}\n </div>\n )}\n \n <h3 className={merge(\n \"font-bold mb-2\",\n size === \"lg\" ? \"text-2xl\" : size === \"md\" ? \"text-xl\" : \"text-lg\",\n variant === \"gradient\" ? \"text-white\" : \"text-foreground\"\n )}>\n {title}\n </h3>\n \n <p className={merge(\n size === \"lg\" ? \"text-base\" : \"text-sm\",\n variant === \"gradient\" ? \"text-white/90\" : \"text-muted-foreground\"\n )}>\n {description}\n </p>\n </div>\n )\n }\n)\n\nFeatureCard.displayName = \"FeatureCard\"\n\nfunction getGradientClass(gradient: string): string {\n const gradients = {\n blue: \"from-indigo-500 via-cyan-500 to-cyan-600\",\n purple: \"from-purple-500 via-pink-500 to-purple-600\",\n green: \"from-green-500 via-emerald-500 to-green-600\",\n orange: \"from-orange-500 via-red-500 to-orange-600\",\n pink: \"from-pink-500 via-rose-500 to-pink-600\"\n }\n return gradients[gradient as keyof typeof gradients] || gradients.blue\n}\n\nexport { FeatureCard } ","\"use client\"\n\nimport React, { useState, useEffect, useCallback } from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Button } from \"./Button\"\n\n/**\n * 슬라이드 아이템 인터페이스\n */\nexport interface HeroSlide {\n title: string\n subtitle?: string\n description: string\n primaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n secondaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n background?: \"none\" | \"gradient\" | \"particles\" | \"image\"\n backgroundImage?: string\n}\n\n/**\n * HeroSection 컴포넌트의 props\n */\nexport interface HeroSectionProps extends React.HTMLAttributes<HTMLElement> {\n // 단일 모드 props\n title?: string\n subtitle?: string\n description?: string\n primaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n secondaryAction?: {\n label: string\n href: string\n icon?: React.ReactNode\n }\n // 슬라이드 모드 props\n slides?: HeroSlide[]\n autoPlay?: boolean\n interval?: number\n indicator?: \"dots\" | \"line\" | \"numbers\" | \"none\"\n showControls?: boolean\n pauseOnHover?: boolean\n // 공통 props\n background?: \"none\" | \"gradient\" | \"particles\" | \"video\" | \"image\"\n customBackground?: string\n /**\n * 히어로 섹션 크기\n * - sm: 400px, md: 500px, lg: 600px, xl: 700px\n * - full: 100vh (뷰포트 전체)\n */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n /**\n * 헤더 뒤까지 확장 (fixed header가 있을 때)\n * true면 -mt-16 적용되어 헤더 뒤로 들어감\n */\n fullBleed?: boolean\n}\n\n/**\n * HeroSection 컴포넌트\n *\n * 단일 히어로 또는 슬라이드 히어로를 지원합니다.\n * slides prop이 있으면 슬라이드 모드로 동작합니다.\n */\nconst HeroSection = React.forwardRef<HTMLElement, HeroSectionProps>(\n ({\n className,\n // 단일 모드\n title,\n subtitle,\n description,\n primaryAction,\n secondaryAction,\n // 슬라이드 모드\n slides,\n autoPlay = false,\n interval = 5000,\n indicator = \"dots\",\n showControls = true,\n pauseOnHover = true,\n // 공통\n background = \"gradient\",\n customBackground,\n size = \"lg\",\n fullBleed = false,\n ...props\n }, ref) => {\n const [currentSlide, setCurrentSlide] = useState(0)\n const [isPaused, setIsPaused] = useState(false)\n\n // 슬라이드 모드 여부\n const isSlideMode = slides && slides.length > 0\n const slideCount = slides?.length || 0\n\n // 다음 슬라이드\n const nextSlide = useCallback(() => {\n if (!isSlideMode) return\n setCurrentSlide((prev) => (prev + 1) % slideCount)\n }, [isSlideMode, slideCount])\n\n // 이전 슬라이드\n const prevSlide = useCallback(() => {\n if (!isSlideMode) return\n setCurrentSlide((prev) => (prev - 1 + slideCount) % slideCount)\n }, [isSlideMode, slideCount])\n\n // 특정 슬라이드로 이동\n const goToSlide = useCallback((index: number) => {\n setCurrentSlide(index)\n }, [])\n\n // 자동 재생\n useEffect(() => {\n if (!autoPlay || !isSlideMode || isPaused) return\n\n const timer = setInterval(nextSlide, interval)\n return () => clearInterval(timer)\n }, [autoPlay, isSlideMode, isPaused, interval, nextSlide])\n\n // 현재 표시할 콘텐츠\n const currentContent = isSlideMode ? slides[currentSlide] : {\n title: title || \"\",\n subtitle,\n description: description || \"\",\n primaryAction,\n secondaryAction,\n background,\n }\n\n const sizeClasses = {\n sm: \"min-h-[400px]\",\n md: \"min-h-[500px]\",\n lg: \"min-h-[600px]\",\n xl: \"min-h-[700px]\",\n full: \"min-h-screen\"\n }\n\n const titleSizeClasses = {\n sm: \"text-2xl sm:text-3xl md:text-4xl leading-tight\",\n md: \"text-3xl sm:text-4xl md:text-5xl leading-tight\",\n lg: \"text-3xl sm:text-4xl md:text-5xl lg:text-6xl leading-tight\",\n xl: \"text-3xl sm:text-4xl md:text-5xl lg:text-6xl leading-tight\",\n full: \"text-4xl sm:text-5xl md:text-6xl lg:text-7xl leading-tight\"\n }\n\n const subtitleSizeClasses = {\n sm: \"text-base sm:text-lg md:text-xl leading-snug\",\n md: \"text-lg sm:text-xl md:text-2xl leading-snug\",\n lg: \"text-lg sm:text-xl md:text-2xl lg:text-3xl leading-snug\",\n xl: \"text-xl sm:text-2xl md:text-3xl leading-snug\",\n full: \"text-xl sm:text-2xl md:text-3xl lg:text-4xl leading-snug\"\n }\n\n const descriptionSizeClasses = {\n sm: \"text-sm sm:text-base md:text-lg leading-relaxed\",\n md: \"text-base sm:text-lg md:text-xl leading-relaxed\",\n lg: \"text-base sm:text-lg md:text-xl leading-relaxed\",\n xl: \"text-base sm:text-lg md:text-xl leading-relaxed\",\n full: \"text-lg sm:text-xl md:text-2xl leading-relaxed\"\n }\n\n const currentBg = isSlideMode ? (currentContent.background || background) : background\n\n const backgroundContent: Record<string, React.ReactNode> = {\n none: null,\n gradient: (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n {/* 왼쪽 위 - 메인 그라데이션 */}\n <div className=\"absolute top-0 left-0 w-80 h-80 sm:w-96 sm:h-96 md:w-[500px] md:h-[500px] -translate-x-1/3 -translate-y-1/3 rounded-full bg-gradient-to-br from-teal-400 via-cyan-500 to-teal-600 opacity-40 blur-3xl\" />\n {/* 오른쪽 아래 - 보조 그라데이션 */}\n <div className=\"absolute bottom-0 right-0 w-72 h-72 sm:w-80 sm:h-80 md:w-[400px] md:h-[400px] translate-x-1/4 translate-y-1/4 rounded-full bg-gradient-to-tr from-cyan-400 via-teal-500 to-emerald-500 opacity-35 blur-3xl\" />\n {/* 중앙 액센트 */}\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-48 h-48 sm:w-64 sm:h-64 md:w-80 md:h-80 rounded-full bg-teal-500/20 blur-2xl\" />\n </div>\n ),\n particles: (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <div className=\"absolute inset-0 bg-gradient-to-br from-secondary/50 via-background to-secondary/30\" />\n </div>\n ),\n video: customBackground ? (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <video\n autoPlay\n loop\n muted\n playsInline\n className=\"absolute inset-0 w-full h-full object-cover opacity-20\"\n >\n <source src={customBackground} type=\"video/mp4\" />\n </video>\n </div>\n ) : null,\n image: (customBackground || (isSlideMode && (currentContent as HeroSlide).backgroundImage)) ? (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <img\n src={(isSlideMode && (currentContent as HeroSlide).backgroundImage) || customBackground}\n alt=\"\"\n className=\"absolute inset-0 w-full h-full object-cover opacity-30\"\n />\n <div className=\"absolute inset-0 bg-gradient-to-t from-background via-background/50 to-transparent\" />\n </div>\n ) : null,\n }\n\n // 인디케이터 렌더링\n const renderIndicator = () => {\n if (!isSlideMode || indicator === \"none\") return null\n\n switch (indicator) {\n case \"dots\":\n return (\n <div className=\"flex gap-2 justify-center mt-8\">\n {slides.map((_, index) => (\n <button\n key={index}\n onClick={() => goToSlide(index)}\n className={merge(\n \"w-2.5 h-2.5 rounded-full transition-all duration-300\",\n currentSlide === index\n ? \"bg-primary w-8\"\n : \"bg-muted-foreground/30 hover:bg-muted-foreground/50\"\n )}\n aria-label={`Go to slide ${index + 1}`}\n />\n ))}\n </div>\n )\n\n case \"line\":\n return (\n <div className=\"flex gap-1 justify-center mt-8 max-w-xs mx-auto\">\n {slides.map((_, index) => (\n <button\n key={index}\n onClick={() => goToSlide(index)}\n className=\"flex-1 h-1 rounded-full overflow-hidden bg-muted-foreground/20\"\n aria-label={`Go to slide ${index + 1}`}\n >\n <div\n className={merge(\n \"h-full bg-primary transition-all duration-300\",\n currentSlide === index ? \"w-full\" : \"w-0\"\n )}\n />\n </button>\n ))}\n </div>\n )\n\n case \"numbers\":\n return (\n <div className=\"flex items-center justify-center gap-2 mt-8 text-sm text-muted-foreground\">\n <span className=\"text-foreground font-semibold\">{currentSlide + 1}</span>\n <span>/</span>\n <span>{slideCount}</span>\n </div>\n )\n\n default:\n return null\n }\n }\n\n return (\n <section\n ref={ref}\n className={merge(\n \"relative w-full flex flex-col justify-center items-center text-center px-4 sm:px-6 lg:px-8 overflow-hidden\",\n sizeClasses[size],\n fullBleed && \"-mt-16 pt-16\",\n className\n )}\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\n {...props}\n >\n {backgroundContent[currentBg]}\n\n {/* 슬라이드 콘텐츠 */}\n <div className=\"relative z-10 max-w-4xl mx-auto\">\n <div\n key={isSlideMode ? currentSlide : 0}\n className=\"animate-in fade-in slide-in-from-bottom-4 duration-500\"\n >\n <h1 className={merge(\n \"font-extrabold mb-4 sm:mb-6 text-foreground\",\n titleSizeClasses[size]\n )}>\n <span className=\"block gradient-text\">\n {currentContent.title}\n </span>\n {currentContent.subtitle && (\n <span className={merge(\n \"block font-semibold mt-2 sm:mt-4 text-muted-foreground\",\n subtitleSizeClasses[size]\n )}>\n {currentContent.subtitle}\n </span>\n )}\n </h1>\n\n <div className={merge(\n \"text-muted-foreground mb-6 sm:mb-8 md:mb-10 max-w-2xl mx-auto\",\n descriptionSizeClasses[size]\n )}>\n {currentContent.description.split('\\n').map((line, i, arr) => (\n <React.Fragment key={i}>\n {line}\n {i < arr.length - 1 && <br />}\n </React.Fragment>\n ))}\n </div>\n\n {(currentContent.primaryAction || currentContent.secondaryAction) && (\n <div className=\"flex flex-col sm:flex-row gap-4 justify-center\">\n {currentContent.primaryAction && (\n <Button\n href={currentContent.primaryAction.href}\n size={size === \"xl\" || size === \"full\" ? \"lg\" : \"md\"}\n hover=\"scale\"\n className=\"inline-flex items-center gap-2\"\n >\n {currentContent.primaryAction.icon}\n {currentContent.primaryAction.label}\n </Button>\n )}\n\n {currentContent.secondaryAction && (\n <Button\n href={currentContent.secondaryAction.href}\n variant=\"outline\"\n size={size === \"xl\" || size === \"full\" ? \"lg\" : \"md\"}\n hover=\"scale\"\n className=\"inline-flex items-center gap-2\"\n >\n {currentContent.secondaryAction.icon}\n {currentContent.secondaryAction.label}\n </Button>\n )}\n </div>\n )}\n </div>\n\n {/* 인디케이터 */}\n {renderIndicator()}\n </div>\n\n {/* 좌우 컨트롤 */}\n {isSlideMode && showControls && slideCount > 1 && (\n <>\n <button\n onClick={prevSlide}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 z-20 p-2 rounded-full bg-card/80 backdrop-blur-sm border border-border text-foreground hover:bg-card transition-colors\"\n aria-label=\"Previous slide\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <button\n onClick={nextSlide}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 z-20 p-2 rounded-full bg-card/80 backdrop-blur-sm border border-border text-foreground hover:bg-card transition-colors\"\n aria-label=\"Next slide\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </>\n )}\n </section>\n )\n }\n)\n\nHeroSection.displayName = \"HeroSection\"\n\nexport { HeroSection }\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { IconName } from \"../lib/icons\"\n\n/**\n * InfoCard 컴포넌트의 props / InfoCard component props\n * @typedef {Object} InfoCardProps\n * @property {string} title - 카드 제목 / Card title\n * @property {IconName} icon - 카드 아이콘 / Card icon\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\"} [tone=\"blue\"] - InfoCard 톤 색상 / InfoCard tone color\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface InfoCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string\n icon: IconName\n tone?: \"blue\" | \"purple\" | \"green\" | \"orange\"\n}\n\nconst toneClasses: Record<NonNullable<InfoCardProps[\"tone\"]>, { container: string; icon: string; title: string; body: string }> = {\n blue: {\n container: \"bg-gradient-to-r from-indigo-50 to-indigo-50 dark:from-indigo-900/20 dark:to-indigo-900/20 rounded-lg p-4 border border-indigo-200 dark:border-indigo-700\",\n icon: \"h-5 w-5 text-indigo-600 dark:text-indigo-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-indigo-900 dark:text-indigo-100 mb-2 block\",\n body: \"text-foreground text-sm leading-relaxed\",\n },\n purple: {\n container: \"bg-gradient-to-r from-purple-50 to-pink-50 dark:from-purple-900/20 dark:to-pink-900/20 rounded-lg p-4 border border-purple-200 dark:border-purple-700\",\n icon: \"h-5 w-5 text-purple-600 dark:text-purple-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-purple-900 dark:text-purple-100 mb-2 block\",\n body: \"text-foreground text-sm leading-relaxed\",\n },\n green: {\n container: \"bg-gradient-to-r from-green-50 to-emerald-50 dark:from-green-900/20 dark:to-emerald-900/20 rounded-lg p-4 border border-green-200 dark:border-green-700\",\n icon: \"h-5 w-5 text-green-600 dark:text-green-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-green-900 dark:text-green-100 mb-2 block\",\n body: \"text-foreground text-sm leading-relaxed\",\n },\n orange: {\n container: \"bg-gradient-to-r from-orange-50 to-rose-50 dark:from-orange-900/20 dark:to-rose-900/20 rounded-lg p-4 border border-orange-200 dark:border-orange-700\",\n icon: \"h-5 w-5 text-orange-600 dark:text-orange-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-orange-900 dark:text-orange-100 mb-2 block\",\n body: \"text-foreground text-sm leading-relaxed\",\n },\n}\n\n/**\n * InfoCard 컴포넌트 / InfoCard component\n * \n * 정보를 표시하는 카드 컴포넌트입니다.\n * 아이콘, 제목, 내용을 포함하며, 다양한 톤 색상을 지원합니다.\n * \n * Card component that displays information.\n * Includes icon, title, and content, supports various tone colors.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <InfoCard\n * icon=\"info\"\n * title=\"정보\"\n * tone=\"blue\"\n * >\n * 이것은 정보 카드입니다.\n * </InfoCard>\n * \n * @example\n * // 다양한 톤 / Various tones\n * <InfoCard icon=\"check\" title=\"성공\" tone=\"green\">\n * 작업이 완료되었습니다.\n * </InfoCard>\n * \n * @param {InfoCardProps} props - InfoCard 컴포넌트의 props / InfoCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} InfoCard 컴포넌트 / InfoCard component\n */\nexport const InfoCard = React.forwardRef<HTMLDivElement, InfoCardProps>(({ className, title, icon, tone = \"blue\", children, ...props }, ref) => {\n const t = toneClasses[tone]\n return (\n <div ref={ref} className={merge(t.container, className)} {...props}>\n <div className=\"flex items-start mb-2\">\n <Icon name={icon} className={t.icon} />\n <div className=\"flex-1\">\n <span className={t.title}>{title}</span>\n <div className={t.body}>{children}</div>\n </div>\n </div>\n </div>\n )\n})\n\nInfoCard.displayName = \"InfoCard\"\n\nexport default InfoCard\n\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\nimport { Icon } from \"./Icon\";\nimport type { IconName } from \"../lib/icons\";\n\n/**\n * 타임라인 아이템 상태 타입 / Timeline item status type\n * @typedef {\"pending\" | \"active\" | \"completed\" | \"error\" | \"warning\" | \"info\"} TimelineStatus\n */\nexport type TimelineStatus = \"pending\" | \"active\" | \"completed\" | \"error\" | \"warning\" | \"info\";\n\n/**\n * 타임라인 아이템 인터페이스 / TimelineItem interface\n * @typedef {Object} TimelineItem\n * @property {string} id - 아이템 고유 ID / Item unique ID\n * @property {string} title - 제목 / Title\n * @property {string} [description] - 설명 / Description\n * @property {TimelineStatus} [status=\"pending\"] - 상태 / Status\n * @property {string | Date} [date] - 날짜 / Date\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {string} [meta] - 메타 정보 / Meta information\n * @property {React.ReactNode} [content] - 추가 컨텐츠 / Additional content\n */\nexport interface TimelineItem {\n id: string;\n title: string;\n description?: string;\n status?: TimelineStatus;\n date?: string | Date;\n icon?: IconName | React.ReactNode;\n meta?: string;\n content?: React.ReactNode;\n}\n\n/**\n * Timeline 컴포넌트의 props / Timeline component props\n * @typedef {Object} TimelineProps\n * @property {TimelineItem[]} items - 타임라인 아이템 배열 / Timeline items array\n * @property {\"vertical\" | \"horizontal\"} [orientation=\"vertical\"] - 방향 / Orientation\n * @property {\"left\" | \"right\" | \"alternate\"} [align=\"left\"] - 정렬 / Alignment\n * @property {string} [highlightedId] - 강조할 아이템 ID / Highlighted item ID\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @property {boolean} [showConnector=true] - 연결선 표시 / Show connector\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TimelineProps extends React.HTMLAttributes<HTMLDivElement> {\n items: TimelineItem[];\n orientation?: \"vertical\" | \"horizontal\";\n align?: \"left\" | \"right\" | \"alternate\";\n highlightedId?: string;\n locale?: string;\n emptyState?: React.ReactNode;\n showConnector?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst STATUS_CONFIG: Record<\n TimelineStatus,\n { dot: string; border: string; text: string; label: string; labelEn: string }\n> = {\n completed: {\n dot: \"bg-emerald-500 border-emerald-500 shadow-[0_0_8px_rgba(16,185,129,0.4)]\",\n border: \"border-emerald-200 dark:border-emerald-500/40\",\n text: \"text-emerald-700 dark:text-emerald-300 bg-emerald-50 dark:bg-emerald-500/10\",\n label: \"완료\",\n labelEn: \"Completed\",\n },\n active: {\n dot: \"bg-sky-500 border-sky-500 shadow-[0_0_8px_rgba(14,165,233,0.4)] animate-pulse\",\n border: \"border-sky-200 dark:border-sky-500/40\",\n text: \"text-sky-700 dark:text-sky-200 bg-sky-50 dark:bg-sky-500/10\",\n label: \"진행 중\",\n labelEn: \"Active\",\n },\n pending: {\n dot: \"bg-muted-foreground/40 border-muted-foreground/40\",\n border: \"border-border\",\n text: \"text-muted-foreground bg-muted\",\n label: \"대기\",\n labelEn: \"Pending\",\n },\n error: {\n dot: \"bg-rose-500 border-rose-500 shadow-[0_0_8px_rgba(244,63,94,0.4)]\",\n border: \"border-rose-200 dark:border-rose-500/40\",\n text: \"text-rose-700 dark:text-rose-300 bg-rose-50 dark:bg-rose-500/10\",\n label: \"오류\",\n labelEn: \"Error\",\n },\n warning: {\n dot: \"bg-amber-500 border-amber-500 shadow-[0_0_8px_rgba(245,158,11,0.4)]\",\n border: \"border-amber-200 dark:border-amber-500/40\",\n text: \"text-amber-700 dark:text-amber-300 bg-amber-50 dark:bg-amber-500/10\",\n label: \"경고\",\n labelEn: \"Warning\",\n },\n info: {\n dot: \"bg-violet-500 border-violet-500 shadow-[0_0_8px_rgba(139,92,246,0.4)]\",\n border: \"border-violet-200 dark:border-violet-500/40\",\n text: \"text-violet-700 dark:text-violet-300 bg-violet-50 dark:bg-violet-500/10\",\n label: \"정보\",\n labelEn: \"Info\",\n },\n};\n\nconst SIZE_CONFIG = {\n sm: { dot: \"h-2.5 w-2.5\", gap: \"gap-3\", padding: \"p-3\", text: \"text-xs\" },\n md: { dot: \"h-3.5 w-3.5\", gap: \"gap-4\", padding: \"p-4\", text: \"text-sm\" },\n lg: { dot: \"h-4 w-4\", gap: \"gap-5\", padding: \"p-5\", text: \"text-base\" },\n};\n\nconst formatDate = (value?: string | Date, locale = \"ko-KR\") => {\n if (!value) return undefined;\n const parsed = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(parsed.getTime())) return undefined;\n return parsed.toLocaleString(locale, { dateStyle: \"medium\", timeStyle: \"short\" });\n};\n\n/**\n * Timeline 컴포넌트\n *\n * 이벤트나 단계를 시간순으로 표시하는 범용 타임라인 컴포넌트입니다.\n * 활동 로그, 진행 단계, 히스토리 등 다양한 용도로 사용할 수 있습니다.\n *\n * Generic timeline component that displays events or steps chronologically.\n * Can be used for activity logs, progress steps, history, and more.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Timeline\n * items={[\n * { id: \"1\", title: \"작업 시작\", status: \"completed\", date: new Date() },\n * { id: \"2\", title: \"검토 중\", status: \"active\" },\n * { id: \"3\", title: \"완료 예정\", status: \"pending\" }\n * ]}\n * />\n *\n * @example\n * // 아이콘과 커스텀 컨텐츠 / With icons and custom content\n * <Timeline\n * items={[\n * {\n * id: \"1\",\n * title: \"커밋 생성\",\n * description: \"feature/timeline 브랜치에 커밋\",\n * icon: \"git-commit\",\n * status: \"completed\",\n * content: <CodeBlock code=\"git commit -m 'Add timeline'\" />\n * }\n * ]}\n * size=\"lg\"\n * />\n *\n * @example\n * // 교차 정렬 / Alternate alignment\n * <Timeline items={items} align=\"alternate\" />\n *\n * @param {TimelineProps} props - Timeline 컴포넌트의 props / Timeline component props\n * @returns {JSX.Element} Timeline 컴포넌트 / Timeline component\n */\nexport const Timeline: React.FC<TimelineProps> = ({\n items,\n orientation = \"vertical\",\n align = \"left\",\n highlightedId,\n locale = \"ko-KR\",\n emptyState,\n showConnector = true,\n size = \"md\",\n className,\n ...props\n}) => {\n const hasItems = items.length > 0;\n const sizeConfig = SIZE_CONFIG[size];\n\n if (!hasItems) {\n return (\n <div className={merge(\"\", className)} {...props}>\n {emptyState ?? (\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\n <Icon name=\"clock\" className=\"h-10 w-10 text-muted-foreground/50 mb-3\" />\n <p className=\"text-sm font-medium text-muted-foreground\">타임라인이 비어 있습니다</p>\n <p className=\"text-xs text-muted-foreground mt-1\">이벤트가 추가되면 여기에 표시됩니다.</p>\n </div>\n )}\n </div>\n );\n }\n\n // Horizontal layout\n if (orientation === \"horizontal\") {\n return (\n <div className={merge(\"overflow-x-auto\", className)} {...props}>\n <ol className=\"flex min-w-max\" role=\"list\" aria-label=\"타임라인\">\n {items.map((item, index) => {\n const status = item.status ?? \"pending\";\n const statusConfig = STATUS_CONFIG[status];\n const date = formatDate(item.date, locale);\n const isHighlighted = highlightedId === item.id;\n const showLine = showConnector && index !== items.length - 1;\n\n return (\n <li key={item.id} className=\"flex items-start\" role=\"listitem\">\n <div className=\"flex flex-col items-center\">\n {/* Dot */}\n <span\n className={merge(\n \"rounded-full border-2 shrink-0\",\n sizeConfig.dot,\n statusConfig.dot,\n isHighlighted && \"scale-125 ring-1 ring-offset-2 ring-border\"\n )}\n aria-label={statusConfig.label}\n />\n {/* Content below dot */}\n <div className={merge(\"mt-3 text-center max-w-[160px]\", sizeConfig.text)}>\n <p className=\"font-semibold text-foreground truncate\">{item.title}</p>\n {item.description && (\n <p className=\"text-muted-foreground mt-0.5 line-clamp-2\">{item.description}</p>\n )}\n {date && (\n <time className=\"text-xs text-muted-foreground mt-1 block\" dateTime={item.date instanceof Date ? item.date.toISOString() : item.date}>\n {date}\n </time>\n )}\n </div>\n </div>\n {/* Connector */}\n {showLine && (\n <span className=\"h-0.5 w-16 bg-border mt-[0.4375rem] mx-2\" aria-hidden=\"true\" />\n )}\n </li>\n );\n })}\n </ol>\n </div>\n );\n }\n\n // Vertical layout\n return (\n <div className={merge(\"\", className)} {...props}>\n <ol className=\"space-y-4\" role=\"list\" aria-label=\"타임라인\">\n {items.map((item, index) => {\n const status = item.status ?? \"pending\";\n const statusConfig = STATUS_CONFIG[status];\n const date = formatDate(item.date, locale);\n const isHighlighted = highlightedId === item.id;\n const showLine = showConnector && index !== items.length - 1;\n const isAlternateRight = align === \"alternate\" && index % 2 === 1;\n const isRight = align === \"right\" || isAlternateRight;\n\n const renderIcon = () => {\n if (!item.icon) return null;\n if (typeof item.icon === \"string\") {\n return <Icon name={item.icon as IconName} className=\"h-4 w-4\" />;\n }\n return item.icon;\n };\n\n const itemContent = (\n <div\n className={merge(\n \"flex-1 rounded-xl border transition-all\",\n sizeConfig.padding,\n statusConfig.border,\n isHighlighted && \"border-2 shadow-md ring-1 ring-border\"\n )}\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n {renderIcon() && (\n <span className=\"text-muted-foreground\">{renderIcon()}</span>\n )}\n <span className={merge(\"font-semibold text-foreground\", sizeConfig.text)}>\n {item.title}\n </span>\n <span className={merge(\"text-xs font-medium rounded-full px-2 py-0.5\", statusConfig.text)}>\n {statusConfig.label}\n </span>\n {item.meta && (\n <span className=\"text-xs text-muted-foreground\">{item.meta}</span>\n )}\n </div>\n\n {item.description && (\n <p className={merge(\"mt-1 text-muted-foreground\", sizeConfig.text)}>\n {item.description}\n </p>\n )}\n\n {item.content && <div className=\"mt-3\">{item.content}</div>}\n\n {date && (\n <div className=\"mt-3 flex items-center gap-1 text-xs text-muted-foreground\">\n <Icon name=\"clock\" className=\"h-3 w-3\" aria-hidden={true} />\n <time dateTime={item.date instanceof Date ? item.date.toISOString() : item.date}>\n {date}\n </time>\n </div>\n )}\n </div>\n );\n\n return (\n <li\n key={item.id}\n role=\"listitem\"\n className={merge(\n \"relative flex\",\n sizeConfig.gap,\n isRight && \"flex-row-reverse\"\n )}\n >\n {/* Dot and Connector */}\n <div className=\"flex flex-col items-center\">\n <span\n className={merge(\n \"z-10 rounded-full border-2 shrink-0\",\n sizeConfig.dot,\n statusConfig.dot,\n isHighlighted && \"scale-110\"\n )}\n aria-label={statusConfig.label}\n />\n {showLine && (\n <span className=\"mt-1 flex-1 w-px bg-border\" aria-hidden=\"true\" />\n )}\n </div>\n\n {/* Content */}\n {itemContent}\n </li>\n );\n })}\n </ol>\n </div>\n );\n};\n\nTimeline.displayName = \"Timeline\";\n"]}