@hua-labs/ui 2.1.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (618) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -43
  3. package/dist/{ComponentLayout-DrZpz0yv.d.mts → ComponentLayout-Clf6C2jV.d.mts} +38 -4
  4. package/dist/DashboardSidebar-ZulecqKs.d.mts +54 -0
  5. package/dist/DashboardToolbar-BRZayZNz.d.mts +122 -0
  6. package/dist/EmptyState-SQ3Z6Vf2.d.mts +64 -0
  7. package/dist/{Modal-CrXmb3Ll.d.mts → Modal-DKKtBtbh.d.mts} +12 -6
  8. package/dist/{Section-BWzyshgX.d.mts → Section-DKdIG1sg.d.mts} +11 -12
  9. package/dist/SectionHeader-DHwQ_xh8.d.mts +1653 -0
  10. package/dist/{Switch-Dzm5TLR3.d.mts → Switch-D0l7SJrz.d.mts} +31 -15
  11. package/dist/Tooltip-Cv7nYhPW.d.mts +304 -0
  12. package/dist/advanced/Logo.d.ts +8 -4
  13. package/dist/advanced/Logo.d.ts.map +1 -1
  14. package/dist/advanced/dashboard.d.ts +28 -6
  15. package/dist/advanced/dashboard.d.ts.map +1 -1
  16. package/dist/advanced-dashboard.d.mts +9 -2278
  17. package/dist/advanced-dashboard.mjs +1 -33
  18. package/dist/advanced-dashboard.mjs.map +1 -1
  19. package/dist/advanced-emotion.d.mts +13 -5
  20. package/dist/advanced-emotion.mjs +1 -1
  21. package/dist/advanced-motion.d.mts +144 -61
  22. package/dist/advanced-motion.mjs +1 -1
  23. package/dist/advanced.d.mts +70 -37
  24. package/dist/advanced.mjs +14 -3
  25. package/dist/advanced.mjs.map +1 -1
  26. package/dist/chunk-32OZGTPV.mjs +41 -0
  27. package/dist/chunk-32OZGTPV.mjs.map +1 -0
  28. package/dist/chunk-6WBFZ2KV.mjs +3 -0
  29. package/dist/chunk-6WBFZ2KV.mjs.map +1 -0
  30. package/dist/chunk-7CGJQSJO.mjs +3 -0
  31. package/dist/chunk-7CGJQSJO.mjs.map +1 -0
  32. package/dist/chunk-7T3IUG3G.mjs +3 -0
  33. package/dist/chunk-7T3IUG3G.mjs.map +1 -0
  34. package/dist/chunk-A5YOVVM5.mjs +3 -0
  35. package/dist/chunk-A5YOVVM5.mjs.map +1 -0
  36. package/dist/chunk-AJOGTUWS.mjs +3 -0
  37. package/dist/chunk-AJOGTUWS.mjs.map +1 -0
  38. package/dist/chunk-AQTSQYH2.mjs +3 -0
  39. package/dist/chunk-AQTSQYH2.mjs.map +1 -0
  40. package/dist/chunk-B2MRZJQA.mjs +3 -0
  41. package/dist/chunk-B2MRZJQA.mjs.map +1 -0
  42. package/dist/chunk-BOX4TONF.mjs +3 -0
  43. package/dist/chunk-BOX4TONF.mjs.map +1 -0
  44. package/dist/chunk-C2DOXNBK.mjs +3 -0
  45. package/dist/chunk-C2DOXNBK.mjs.map +1 -0
  46. package/dist/chunk-CQBMR7VU.mjs +3 -0
  47. package/dist/chunk-CQBMR7VU.mjs.map +1 -0
  48. package/dist/chunk-CYAAAEPJ.mjs +3 -0
  49. package/dist/chunk-CYAAAEPJ.mjs.map +1 -0
  50. package/dist/chunk-D7MTTTQY.mjs +8 -0
  51. package/dist/chunk-D7MTTTQY.mjs.map +1 -0
  52. package/dist/chunk-DABVKUJN.mjs +3 -0
  53. package/dist/chunk-DABVKUJN.mjs.map +1 -0
  54. package/dist/chunk-EAZEI74V.mjs +3 -0
  55. package/dist/chunk-EAZEI74V.mjs.map +1 -0
  56. package/dist/chunk-EK6BLFVQ.mjs +3 -0
  57. package/dist/chunk-EK6BLFVQ.mjs.map +1 -0
  58. package/dist/chunk-FVUAVGP5.mjs +3 -0
  59. package/dist/chunk-FVUAVGP5.mjs.map +1 -0
  60. package/dist/chunk-GAIUZVNC.mjs +3 -0
  61. package/dist/chunk-GAIUZVNC.mjs.map +1 -0
  62. package/dist/chunk-HLBIIF4I.mjs +3 -0
  63. package/dist/chunk-HLBIIF4I.mjs.map +1 -0
  64. package/dist/chunk-I6NCGF6E.mjs +3 -0
  65. package/dist/chunk-I6NCGF6E.mjs.map +1 -0
  66. package/dist/chunk-J46VEBVF.mjs +3 -0
  67. package/dist/chunk-J46VEBVF.mjs.map +1 -0
  68. package/dist/chunk-JNW3CLCA.mjs +3 -0
  69. package/dist/chunk-JNW3CLCA.mjs.map +1 -0
  70. package/dist/chunk-JY3QVUGW.mjs +3 -0
  71. package/dist/chunk-JY3QVUGW.mjs.map +1 -0
  72. package/dist/chunk-KHBZOGUU.mjs +3 -0
  73. package/dist/chunk-KHBZOGUU.mjs.map +1 -0
  74. package/dist/chunk-KPNNAQLI.mjs +3 -0
  75. package/dist/chunk-KPNNAQLI.mjs.map +1 -0
  76. package/dist/chunk-L2LGSILS.mjs +13 -0
  77. package/dist/chunk-L2LGSILS.mjs.map +1 -0
  78. package/dist/chunk-LPHUWTQ2.mjs +3 -0
  79. package/dist/chunk-LPHUWTQ2.mjs.map +1 -0
  80. package/dist/chunk-M4JE7TQL.mjs +3 -0
  81. package/dist/chunk-M4JE7TQL.mjs.map +1 -0
  82. package/dist/chunk-MEDKGNLV.mjs +3 -0
  83. package/dist/chunk-MEDKGNLV.mjs.map +1 -0
  84. package/dist/chunk-MR46CSMC.mjs +3 -0
  85. package/dist/chunk-MR46CSMC.mjs.map +1 -0
  86. package/dist/chunk-NSDWT2JM.mjs +3 -0
  87. package/dist/chunk-NSDWT2JM.mjs.map +1 -0
  88. package/dist/chunk-OBMOTQEU.mjs +3 -0
  89. package/dist/chunk-OBMOTQEU.mjs.map +1 -0
  90. package/dist/chunk-QEMPERUK.mjs +3 -0
  91. package/dist/chunk-QEMPERUK.mjs.map +1 -0
  92. package/dist/chunk-RICRFXFP.mjs +3 -0
  93. package/dist/chunk-RICRFXFP.mjs.map +1 -0
  94. package/dist/chunk-SOK7VBSM.mjs +13 -0
  95. package/dist/chunk-SOK7VBSM.mjs.map +1 -0
  96. package/dist/chunk-SPZ7SZH4.mjs +3 -0
  97. package/dist/chunk-SPZ7SZH4.mjs.map +1 -0
  98. package/dist/chunk-TB3DARQO.mjs +3 -0
  99. package/dist/chunk-TB3DARQO.mjs.map +1 -0
  100. package/dist/chunk-TND4HPKW.mjs +51 -0
  101. package/dist/chunk-TND4HPKW.mjs.map +1 -0
  102. package/dist/chunk-TSAXVD2H.mjs +35 -0
  103. package/dist/chunk-TSAXVD2H.mjs.map +1 -0
  104. package/dist/chunk-UR3TIWBS.mjs +3 -0
  105. package/dist/chunk-UR3TIWBS.mjs.map +1 -0
  106. package/dist/chunk-XU2XBAEW.mjs +3 -0
  107. package/dist/chunk-XU2XBAEW.mjs.map +1 -0
  108. package/dist/chunk-XXHDNZTG.mjs +3 -0
  109. package/dist/chunk-XXHDNZTG.mjs.map +1 -0
  110. package/dist/chunk-YW5DA7Q6.mjs +3 -0
  111. package/dist/chunk-YW5DA7Q6.mjs.map +1 -0
  112. package/dist/chunk-ZTHUGQZL.mjs +3 -0
  113. package/dist/chunk-ZTHUGQZL.mjs.map +1 -0
  114. package/dist/chunk-ZVCGC6EV.mjs +3 -0
  115. package/dist/chunk-ZVCGC6EV.mjs.map +1 -0
  116. package/dist/chunk-ZZ67E3M5.mjs +3 -0
  117. package/dist/chunk-ZZ67E3M5.mjs.map +1 -0
  118. package/dist/{common-YLvZxA_K.d.mts → common-Bej8Okcg.d.mts} +1 -1
  119. package/dist/components/Accordion.d.ts +14 -7
  120. package/dist/components/Accordion.d.ts.map +1 -1
  121. package/dist/components/Action.d.ts.map +1 -1
  122. package/dist/components/ActionToolbar.d.ts +10 -6
  123. package/dist/components/ActionToolbar.d.ts.map +1 -1
  124. package/dist/components/Alert.d.ts +16 -2
  125. package/dist/components/Alert.d.ts.map +1 -1
  126. package/dist/components/Autocomplete.d.ts +6 -4
  127. package/dist/components/Autocomplete.d.ts.map +1 -1
  128. package/dist/components/Avatar.d.ts +20 -7
  129. package/dist/components/Avatar.d.ts.map +1 -1
  130. package/dist/components/Badge.d.ts +27 -9
  131. package/dist/components/Badge.d.ts.map +1 -1
  132. package/dist/components/Bookmark.d.ts +4 -2
  133. package/dist/components/Bookmark.d.ts.map +1 -1
  134. package/dist/components/BottomSheet.d.ts +13 -9
  135. package/dist/components/BottomSheet.d.ts.map +1 -1
  136. package/dist/components/Box.d.ts +9 -0
  137. package/dist/components/Box.d.ts.map +1 -0
  138. package/dist/components/Breadcrumb.d.ts +9 -4
  139. package/dist/components/Breadcrumb.d.ts.map +1 -1
  140. package/dist/components/Button.d.ts +3 -29
  141. package/dist/components/Button.d.ts.map +1 -1
  142. package/dist/components/Button.variants.d.ts +54 -10
  143. package/dist/components/Button.variants.d.ts.map +1 -1
  144. package/dist/components/Card.d.ts +49 -14
  145. package/dist/components/Card.d.ts.map +1 -1
  146. package/dist/components/ChatMessage.d.ts +3 -2
  147. package/dist/components/ChatMessage.d.ts.map +1 -1
  148. package/dist/components/Checkbox.d.ts +5 -2
  149. package/dist/components/Checkbox.d.ts.map +1 -1
  150. package/dist/components/CodeBlock.d.ts +8 -5
  151. package/dist/components/CodeBlock.d.ts.map +1 -1
  152. package/dist/components/ColorPicker.d.ts +4 -2
  153. package/dist/components/ColorPicker.d.ts.map +1 -1
  154. package/dist/components/Command.d.ts +28 -14
  155. package/dist/components/Command.d.ts.map +1 -1
  156. package/dist/components/ComponentLayout.d.ts +5 -2
  157. package/dist/components/ComponentLayout.d.ts.map +1 -1
  158. package/dist/components/ConfirmModal.d.ts +4 -0
  159. package/dist/components/ConfirmModal.d.ts.map +1 -1
  160. package/dist/components/Container.d.ts +18 -5
  161. package/dist/components/Container.d.ts.map +1 -1
  162. package/dist/components/ContextMenu.d.ts +36 -36
  163. package/dist/components/ContextMenu.d.ts.map +1 -1
  164. package/dist/components/DatePicker.d.ts +12 -5
  165. package/dist/components/DatePicker.d.ts.map +1 -1
  166. package/dist/components/Divider.d.ts +2 -1
  167. package/dist/components/Divider.d.ts.map +1 -1
  168. package/dist/components/Drawer.d.ts +17 -12
  169. package/dist/components/Drawer.d.ts.map +1 -1
  170. package/dist/components/Dropdown.d.ts +25 -57
  171. package/dist/components/Dropdown.d.ts.map +1 -1
  172. package/dist/components/EmotionAnalysis.d.ts +3 -1
  173. package/dist/components/EmotionAnalysis.d.ts.map +1 -1
  174. package/dist/components/EmotionButton.d.ts +3 -1
  175. package/dist/components/EmotionButton.d.ts.map +1 -1
  176. package/dist/components/EmotionMeter.d.ts +3 -1
  177. package/dist/components/EmotionMeter.d.ts.map +1 -1
  178. package/dist/components/EmotionSelector.d.ts +3 -1
  179. package/dist/components/EmotionSelector.d.ts.map +1 -1
  180. package/dist/components/FeatureCard.d.ts +9 -3
  181. package/dist/components/FeatureCard.d.ts.map +1 -1
  182. package/dist/components/Form.d.ts +20 -54
  183. package/dist/components/Form.d.ts.map +1 -1
  184. package/dist/components/FormControl.d.ts +3 -2
  185. package/dist/components/FormControl.d.ts.map +1 -1
  186. package/dist/components/Grid.d.ts +11 -4
  187. package/dist/components/Grid.d.ts.map +1 -1
  188. package/dist/components/HeroSection.d.ts +4 -2
  189. package/dist/components/HeroSection.d.ts.map +1 -1
  190. package/dist/components/Icon/Icon.d.ts +12 -8
  191. package/dist/components/Icon/Icon.d.ts.map +1 -1
  192. package/dist/components/IconsaxGallery/index.d.ts +8 -5
  193. package/dist/components/IconsaxGallery/index.d.ts.map +1 -1
  194. package/dist/components/InfoCard.d.ts +5 -2
  195. package/dist/components/InfoCard.d.ts.map +1 -1
  196. package/dist/components/Input.d.ts +29 -4
  197. package/dist/components/Input.d.ts.map +1 -1
  198. package/dist/components/Label.d.ts +15 -10
  199. package/dist/components/Label.d.ts.map +1 -1
  200. package/dist/components/LanguageToggle.d.ts +5 -3
  201. package/dist/components/LanguageToggle.d.ts.map +1 -1
  202. package/dist/components/Link.d.ts +17 -6
  203. package/dist/components/Link.d.ts.map +1 -1
  204. package/dist/components/LoadingSpinner.d.ts +7 -3
  205. package/dist/components/LoadingSpinner.d.ts.map +1 -1
  206. package/dist/components/Menu.d.ts +59 -60
  207. package/dist/components/Menu.d.ts.map +1 -1
  208. package/dist/components/Modal.d.ts +12 -6
  209. package/dist/components/Modal.d.ts.map +1 -1
  210. package/dist/components/Navigation.d.ts +26 -11
  211. package/dist/components/Navigation.d.ts.map +1 -1
  212. package/dist/components/NumberInput.d.ts +5 -2
  213. package/dist/components/NumberInput.d.ts.map +1 -1
  214. package/dist/components/PageNavigation.d.ts +6 -3
  215. package/dist/components/PageNavigation.d.ts.map +1 -1
  216. package/dist/components/PageTransition.d.ts +2 -2
  217. package/dist/components/PageTransition.d.ts.map +1 -1
  218. package/dist/components/Pagination.d.ts +5 -2
  219. package/dist/components/Pagination.d.ts.map +1 -1
  220. package/dist/components/Panel.d.ts +1 -7
  221. package/dist/components/Panel.d.ts.map +1 -1
  222. package/dist/components/Popover.d.ts +25 -9
  223. package/dist/components/Popover.d.ts.map +1 -1
  224. package/dist/components/Pressable.d.ts +14 -0
  225. package/dist/components/Pressable.d.ts.map +1 -0
  226. package/dist/components/Progress.d.ts +36 -13
  227. package/dist/components/Progress.d.ts.map +1 -1
  228. package/dist/components/Prose.d.ts +51 -0
  229. package/dist/components/Prose.d.ts.map +1 -0
  230. package/dist/components/Radio.d.ts +29 -33
  231. package/dist/components/Radio.d.ts.map +1 -1
  232. package/dist/components/ScrollArea.d.ts +8 -9
  233. package/dist/components/ScrollArea.d.ts.map +1 -1
  234. package/dist/components/ScrollIndicator.d.ts +9 -8
  235. package/dist/components/ScrollIndicator.d.ts.map +1 -1
  236. package/dist/components/ScrollProgress.d.ts +3 -2
  237. package/dist/components/ScrollProgress.d.ts.map +1 -1
  238. package/dist/components/ScrollToTop.d.ts +5 -5
  239. package/dist/components/ScrollToTop.d.ts.map +1 -1
  240. package/dist/components/Section.d.ts +12 -9
  241. package/dist/components/Section.d.ts.map +1 -1
  242. package/dist/components/SectionHeader.d.ts +3 -2
  243. package/dist/components/SectionHeader.d.ts.map +1 -1
  244. package/dist/components/Select.d.ts +18 -5
  245. package/dist/components/Select.d.ts.map +1 -1
  246. package/dist/components/Skeleton.d.ts +43 -15
  247. package/dist/components/Skeleton.d.ts.map +1 -1
  248. package/dist/components/Slider.d.ts +7 -5
  249. package/dist/components/Slider.d.ts.map +1 -1
  250. package/dist/components/Stack.d.ts +22 -6
  251. package/dist/components/Stack.d.ts.map +1 -1
  252. package/dist/components/StatsPanel.d.ts +4 -2
  253. package/dist/components/StatsPanel.d.ts.map +1 -1
  254. package/dist/components/Switch.d.ts +9 -4
  255. package/dist/components/Switch.d.ts.map +1 -1
  256. package/dist/components/Table.d.ts +43 -18
  257. package/dist/components/Table.d.ts.map +1 -1
  258. package/dist/components/Tabs.d.ts +50 -77
  259. package/dist/components/Tabs.d.ts.map +1 -1
  260. package/dist/components/Text.d.ts +11 -0
  261. package/dist/components/Text.d.ts.map +1 -0
  262. package/dist/components/Textarea.d.ts +24 -6
  263. package/dist/components/Textarea.d.ts.map +1 -1
  264. package/dist/components/ThemeToggle.d.ts +18 -27
  265. package/dist/components/ThemeToggle.d.ts.map +1 -1
  266. package/dist/components/Timeline.d.ts +4 -2
  267. package/dist/components/Timeline.d.ts.map +1 -1
  268. package/dist/components/Toast.d.ts +1 -1
  269. package/dist/components/Toast.d.ts.map +1 -1
  270. package/dist/components/Toggle.d.ts +11 -2
  271. package/dist/components/Toggle.d.ts.map +1 -1
  272. package/dist/components/Tooltip.d.ts +5 -2
  273. package/dist/components/Tooltip.d.ts.map +1 -1
  274. package/dist/components/Upload.d.ts +5 -3
  275. package/dist/components/Upload.d.ts.map +1 -1
  276. package/dist/components/advanced/AdvancedPageTransition.d.ts +7 -5
  277. package/dist/components/advanced/AdvancedPageTransition.d.ts.map +1 -1
  278. package/dist/components/advanced/AnimatedGradient.d.ts +6 -2
  279. package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
  280. package/dist/components/advanced/Carousel.d.ts +3 -1
  281. package/dist/components/advanced/Carousel.d.ts.map +1 -1
  282. package/dist/components/advanced/DotNav.d.ts +12 -5
  283. package/dist/components/advanced/DotNav.d.ts.map +1 -1
  284. package/dist/components/advanced/GlowCard.d.ts +4 -1
  285. package/dist/components/advanced/GlowCard.d.ts.map +1 -1
  286. package/dist/components/advanced/HorizontalScroll.d.ts +4 -1
  287. package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -1
  288. package/dist/components/advanced/ImageReveal.d.ts +23 -1
  289. package/dist/components/advanced/ImageReveal.d.ts.map +1 -1
  290. package/dist/components/advanced/Marquee.d.ts +4 -2
  291. package/dist/components/advanced/Marquee.d.ts.map +1 -1
  292. package/dist/components/advanced/Parallax.d.ts +12 -7
  293. package/dist/components/advanced/Parallax.d.ts.map +1 -1
  294. package/dist/components/advanced/SpotlightCard.d.ts +13 -12
  295. package/dist/components/advanced/SpotlightCard.d.ts.map +1 -1
  296. package/dist/components/advanced/TextReveal.d.ts +5 -1
  297. package/dist/components/advanced/TextReveal.d.ts.map +1 -1
  298. package/dist/components/advanced/TiltCard.d.ts +6 -2
  299. package/dist/components/advanced/TiltCard.d.ts.map +1 -1
  300. package/dist/components/advanced/VideoBackground.d.ts +4 -1
  301. package/dist/components/advanced/VideoBackground.d.ts.map +1 -1
  302. package/dist/components/advanced/blog-editor/BlogEditor.d.ts +4 -2
  303. package/dist/components/advanced/blog-editor/BlogEditor.d.ts.map +1 -1
  304. package/dist/components/advanced/blog-editor/BlogEditorActions.d.ts +4 -2
  305. package/dist/components/advanced/blog-editor/BlogEditorActions.d.ts.map +1 -1
  306. package/dist/components/advanced/blog-editor/BlogEditorContent.d.ts +4 -2
  307. package/dist/components/advanced/blog-editor/BlogEditorContent.d.ts.map +1 -1
  308. package/dist/components/advanced/blog-editor/BlogEditorHeader.d.ts +4 -2
  309. package/dist/components/advanced/blog-editor/BlogEditorHeader.d.ts.map +1 -1
  310. package/dist/components/advanced/blog-editor/BlogEditorLanguageTabs.d.ts +4 -2
  311. package/dist/components/advanced/blog-editor/BlogEditorLanguageTabs.d.ts.map +1 -1
  312. package/dist/components/advanced/blog-editor/BlogEditorMetadata.d.ts +5 -3
  313. package/dist/components/advanced/blog-editor/BlogEditorMetadata.d.ts.map +1 -1
  314. package/dist/components/advanced/blog-editor/BlogEditorPreview.d.ts +5 -3
  315. package/dist/components/advanced/blog-editor/BlogEditorPreview.d.ts.map +1 -1
  316. package/dist/components/advanced/blog-editor/BlogEditorToolbar.d.ts +4 -2
  317. package/dist/components/advanced/blog-editor/BlogEditorToolbar.d.ts.map +1 -1
  318. package/dist/components/advanced/blog-editor/BlogEditorTranslate.d.ts +4 -2
  319. package/dist/components/advanced/blog-editor/BlogEditorTranslate.d.ts.map +1 -1
  320. package/dist/components/advanced/blog-editor/types.d.ts +5 -2
  321. package/dist/components/advanced/blog-editor/types.d.ts.map +1 -1
  322. package/dist/components/advanced/emotion/EmotionAnalysis.d.ts +3 -1
  323. package/dist/components/advanced/emotion/EmotionAnalysis.d.ts.map +1 -1
  324. package/dist/components/advanced/emotion/EmotionButton.d.ts +3 -1
  325. package/dist/components/advanced/emotion/EmotionButton.d.ts.map +1 -1
  326. package/dist/components/advanced/emotion/EmotionMeter.d.ts +4 -2
  327. package/dist/components/advanced/emotion/EmotionMeter.d.ts.map +1 -1
  328. package/dist/components/advanced/emotion/EmotionSelector.d.ts +3 -1
  329. package/dist/components/advanced/emotion/EmotionSelector.d.ts.map +1 -1
  330. package/dist/components/dashboard/ActivityFeed.d.ts +5 -2
  331. package/dist/components/dashboard/ActivityFeed.d.ts.map +1 -1
  332. package/dist/components/dashboard/BarChart.d.ts +3 -2
  333. package/dist/components/dashboard/BarChart.d.ts.map +1 -1
  334. package/dist/components/dashboard/DashboardGrid.d.ts +13 -3
  335. package/dist/components/dashboard/DashboardGrid.d.ts.map +1 -1
  336. package/dist/components/dashboard/DashboardSidebar.d.ts +15 -82
  337. package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -1
  338. package/dist/components/dashboard/DashboardToolbar.d.ts +3 -2
  339. package/dist/components/dashboard/DashboardToolbar.d.ts.map +1 -1
  340. package/dist/components/dashboard/EmptyState.d.ts +3 -2
  341. package/dist/components/dashboard/EmptyState.d.ts.map +1 -1
  342. package/dist/components/dashboard/MembershipBadge.d.ts +3 -2
  343. package/dist/components/dashboard/MembershipBadge.d.ts.map +1 -1
  344. package/dist/components/dashboard/MerchantList.d.ts +3 -2
  345. package/dist/components/dashboard/MerchantList.d.ts.map +1 -1
  346. package/dist/components/dashboard/MetricCard.d.ts +3 -2
  347. package/dist/components/dashboard/MetricCard.d.ts.map +1 -1
  348. package/dist/components/dashboard/MiniBarChart.d.ts +3 -2
  349. package/dist/components/dashboard/MiniBarChart.d.ts.map +1 -1
  350. package/dist/components/dashboard/NotificationCard.d.ts +5 -2
  351. package/dist/components/dashboard/NotificationCard.d.ts.map +1 -1
  352. package/dist/components/dashboard/ProfileCard.d.ts +5 -2
  353. package/dist/components/dashboard/ProfileCard.d.ts.map +1 -1
  354. package/dist/components/dashboard/ProgressCard.d.ts +6 -3
  355. package/dist/components/dashboard/ProgressCard.d.ts.map +1 -1
  356. package/dist/components/dashboard/QuickActionCard.d.ts +22 -27
  357. package/dist/components/dashboard/QuickActionCard.d.ts.map +1 -1
  358. package/dist/components/dashboard/RoutingBreakdownCard.d.ts +3 -2
  359. package/dist/components/dashboard/RoutingBreakdownCard.d.ts.map +1 -1
  360. package/dist/components/dashboard/SettlementTimeline.d.ts +3 -2
  361. package/dist/components/dashboard/SettlementTimeline.d.ts.map +1 -1
  362. package/dist/components/dashboard/StatCard.d.ts +7 -4
  363. package/dist/components/dashboard/StatCard.d.ts.map +1 -1
  364. package/dist/components/dashboard/SummaryCard.d.ts +6 -3
  365. package/dist/components/dashboard/SummaryCard.d.ts.map +1 -1
  366. package/dist/components/dashboard/TransactionDetailDrawer.d.ts +2 -2
  367. package/dist/components/dashboard/TransactionDetailDrawer.d.ts.map +1 -1
  368. package/dist/components/dashboard/TransactionsTable.d.ts +3 -2
  369. package/dist/components/dashboard/TransactionsTable.d.ts.map +1 -1
  370. package/dist/components/dashboard/TrendChart.d.ts +3 -2
  371. package/dist/components/dashboard/TrendChart.d.ts.map +1 -1
  372. package/dist/components/dashboard/YearlyHeatmap.d.ts +4 -2
  373. package/dist/components/dashboard/YearlyHeatmap.d.ts.map +1 -1
  374. package/dist/components/dashboard/kanban/KanbanAddCard.d.ts.map +1 -1
  375. package/dist/components/dashboard/kanban/KanbanAddColumn.d.ts.map +1 -1
  376. package/dist/components/dashboard/kanban/KanbanBoard.d.ts.map +1 -1
  377. package/dist/components/dashboard/kanban/KanbanCard.d.ts.map +1 -1
  378. package/dist/components/dashboard/kanban/KanbanColumn.d.ts.map +1 -1
  379. package/dist/components/dashboard/kanban/KanbanColumnHeader.d.ts.map +1 -1
  380. package/dist/components/dashboard/kanban/KanbanDropIndicator.d.ts.map +1 -1
  381. package/dist/components/dashboard/kanban/index.d.ts +1 -1
  382. package/dist/components/dashboard/kanban/types.d.ts +24 -12
  383. package/dist/components/dashboard/kanban/types.d.ts.map +1 -1
  384. package/dist/components/scrollbar/scrollbar.d.ts +2 -1
  385. package/dist/components/scrollbar/scrollbar.d.ts.map +1 -1
  386. package/dist/context/MotionConfigContext.d.ts +41 -0
  387. package/dist/context/MotionConfigContext.d.ts.map +1 -0
  388. package/dist/data.d.mts +55 -23
  389. package/dist/data.d.ts +45 -3
  390. package/dist/data.d.ts.map +1 -1
  391. package/dist/data.mjs +2 -2
  392. package/dist/data.mjs.map +1 -1
  393. package/dist/feedback.d.mts +6 -293
  394. package/dist/feedback.d.ts +7 -5
  395. package/dist/feedback.d.ts.map +1 -1
  396. package/dist/feedback.mjs +1 -1
  397. package/dist/form.d.mts +99 -114
  398. package/dist/form.mjs +9 -4
  399. package/dist/form.mjs.map +1 -1
  400. package/dist/hooks/index.d.ts +6 -0
  401. package/dist/hooks/index.d.ts.map +1 -1
  402. package/dist/hooks/useAnimatedEntrance.d.ts +24 -0
  403. package/dist/hooks/useAnimatedEntrance.d.ts.map +1 -0
  404. package/dist/hooks/useBreakpoint.d.ts +22 -0
  405. package/dist/hooks/useBreakpoint.d.ts.map +1 -0
  406. package/dist/hooks/useDotEnv.d.ts +12 -0
  407. package/dist/hooks/useDotEnv.d.ts.map +1 -0
  408. package/dist/hooks/useDotMap.d.ts +38 -0
  409. package/dist/hooks/useDotMap.d.ts.map +1 -0
  410. package/dist/{icons-DmhQEH_E.d.mts → icons-DcOBy9Hf.d.mts} +4 -0
  411. package/dist/iconsax-extended.mjs +2 -2
  412. package/dist/iconsax-extended.mjs.map +1 -1
  413. package/dist/iconsax.mjs +2 -2
  414. package/dist/iconsax.mjs.map +1 -1
  415. package/dist/index.d.mts +360 -210
  416. package/dist/index.d.ts +74 -64
  417. package/dist/index.d.ts.map +1 -1
  418. package/dist/index.mjs +15 -15
  419. package/dist/index.mjs.map +1 -1
  420. package/dist/interactive/kanban.d.ts +12 -0
  421. package/dist/interactive/kanban.d.ts.map +1 -0
  422. package/dist/interactive-kanban.d.mts +378 -0
  423. package/dist/interactive-kanban.mjs +3 -0
  424. package/dist/interactive-kanban.mjs.map +1 -0
  425. package/dist/interactive.d.mts +193 -197
  426. package/dist/interactive.d.ts +7 -5
  427. package/dist/interactive.d.ts.map +1 -1
  428. package/dist/interactive.mjs +1 -1
  429. package/dist/interactive.mjs.map +1 -1
  430. package/dist/landing/LandingAbout.d.ts +2 -2
  431. package/dist/landing/LandingAbout.d.ts.map +1 -1
  432. package/dist/landing/LandingCTA.d.ts +2 -2
  433. package/dist/landing/LandingCTA.d.ts.map +1 -1
  434. package/dist/landing/LandingContact.d.ts +2 -2
  435. package/dist/landing/LandingContact.d.ts.map +1 -1
  436. package/dist/landing/LandingExperience.d.ts +1 -1
  437. package/dist/landing/LandingExperience.d.ts.map +1 -1
  438. package/dist/landing/LandingFeatures.d.ts +1 -1
  439. package/dist/landing/LandingFeatures.d.ts.map +1 -1
  440. package/dist/landing/LandingHero.d.ts +2 -2
  441. package/dist/landing/LandingHero.d.ts.map +1 -1
  442. package/dist/landing/LandingLogoCloud.d.ts +2 -2
  443. package/dist/landing/LandingLogoCloud.d.ts.map +1 -1
  444. package/dist/landing/LandingMetrics.d.ts +1 -1
  445. package/dist/landing/LandingMetrics.d.ts.map +1 -1
  446. package/dist/landing/LandingProjects.d.ts +1 -1
  447. package/dist/landing/LandingProjects.d.ts.map +1 -1
  448. package/dist/landing/LandingShowcase.d.ts +2 -2
  449. package/dist/landing/LandingShowcase.d.ts.map +1 -1
  450. package/dist/landing/LandingSkills.d.ts +1 -1
  451. package/dist/landing/LandingSkills.d.ts.map +1 -1
  452. package/dist/landing/LandingStats.d.ts +1 -1
  453. package/dist/landing/LandingStats.d.ts.map +1 -1
  454. package/dist/landing/LandingTestimonials.d.ts +1 -1
  455. package/dist/landing/LandingTestimonials.d.ts.map +1 -1
  456. package/dist/landing/types.d.ts +42 -30
  457. package/dist/landing/types.d.ts.map +1 -1
  458. package/dist/landing.d.mts +47 -37
  459. package/dist/landing.mjs +4 -20
  460. package/dist/landing.mjs.map +1 -1
  461. package/dist/lib/Slot.d.ts.map +1 -1
  462. package/dist/lib/icon-providers.d.ts +25 -27
  463. package/dist/lib/icon-providers.d.ts.map +1 -1
  464. package/dist/lib/icons.d.ts +4 -0
  465. package/dist/lib/icons.d.ts.map +1 -1
  466. package/dist/lib/styles/animation.d.ts +35 -0
  467. package/dist/lib/styles/animation.d.ts.map +1 -0
  468. package/dist/lib/styles/disabled.d.ts +15 -0
  469. package/dist/lib/styles/disabled.d.ts.map +1 -0
  470. package/dist/lib/styles/focus.d.ts +34 -0
  471. package/dist/lib/styles/focus.d.ts.map +1 -0
  472. package/dist/lib/styles/glass.d.ts +18 -0
  473. package/dist/lib/styles/glass.d.ts.map +1 -0
  474. package/dist/lib/styles/hover.d.ts +9 -0
  475. package/dist/lib/styles/hover.d.ts.map +1 -0
  476. package/dist/lib/styles/index.d.ts +6 -0
  477. package/dist/lib/styles/index.d.ts.map +1 -1
  478. package/dist/lib/styles/transition.d.ts +42 -0
  479. package/dist/lib/styles/transition.d.ts.map +1 -0
  480. package/dist/lib/types/common.d.ts +3 -3
  481. package/dist/lib/types/common.d.ts.map +1 -1
  482. package/dist/lib/utils.d.ts.map +1 -1
  483. package/dist/native/Box.d.ts +11 -0
  484. package/dist/native/Box.d.ts.map +1 -0
  485. package/dist/native/Pressable.d.ts +10 -0
  486. package/dist/native/Pressable.d.ts.map +1 -0
  487. package/dist/native/Text.d.ts +11 -0
  488. package/dist/native/Text.d.ts.map +1 -0
  489. package/dist/native/index.d.ts +9 -0
  490. package/dist/native/index.d.ts.map +1 -0
  491. package/dist/native/useDotMap.d.ts +51 -0
  492. package/dist/native/useDotMap.d.ts.map +1 -0
  493. package/dist/native.mjs +2 -0
  494. package/dist/native.mjs.map +1 -0
  495. package/dist/navigation.d.mts +49 -22
  496. package/dist/navigation.d.ts +10 -8
  497. package/dist/navigation.d.ts.map +1 -1
  498. package/dist/navigation.mjs +1 -1
  499. package/dist/navigation.mjs.map +1 -1
  500. package/dist/overlay.d.mts +84 -87
  501. package/dist/overlay.mjs +2 -2
  502. package/dist/overlay.mjs.map +1 -1
  503. package/dist/sdui/SDUIRenderer.d.ts.map +1 -1
  504. package/dist/sdui/core.d.ts +50 -0
  505. package/dist/sdui/core.d.ts.map +1 -0
  506. package/dist/sdui/index.d.ts +3 -1
  507. package/dist/sdui/index.d.ts.map +1 -1
  508. package/dist/sdui/registry.d.ts.map +1 -1
  509. package/dist/sdui/types.d.ts +38 -0
  510. package/dist/sdui/types.d.ts.map +1 -1
  511. package/dist/sdui.d.mts +89 -1
  512. package/dist/sdui.mjs +2 -2
  513. package/dist/sdui.mjs.map +1 -1
  514. package/dist/theme.d.mts +85 -0
  515. package/dist/theme.d.ts +14 -0
  516. package/dist/theme.d.ts.map +1 -0
  517. package/dist/theme.mjs +3 -0
  518. package/dist/theme.mjs.map +1 -0
  519. package/package.json +50 -22
  520. package/src/styles/component-vars.css +503 -69
  521. package/src/styles/landing.css +12 -12
  522. package/src/styles/prose.css +284 -0
  523. package/src/styles/recommended-theme.css +123 -141
  524. package/src/styles/utilities.css +3 -3
  525. package/dist/advanced-dashboard.js +0 -39
  526. package/dist/advanced-dashboard.js.map +0 -1
  527. package/dist/advanced-emotion.js +0 -2
  528. package/dist/advanced-emotion.js.map +0 -1
  529. package/dist/advanced-motion.js +0 -82
  530. package/dist/advanced-motion.js.map +0 -1
  531. package/dist/advanced.js +0 -112
  532. package/dist/advanced.js.map +0 -1
  533. package/dist/chunk-3CCF7U3P.mjs +0 -3
  534. package/dist/chunk-3CCF7U3P.mjs.map +0 -1
  535. package/dist/chunk-3GAUTZXQ.mjs +0 -3
  536. package/dist/chunk-3GAUTZXQ.mjs.map +0 -1
  537. package/dist/chunk-42RGFEL2.mjs +0 -3
  538. package/dist/chunk-42RGFEL2.mjs.map +0 -1
  539. package/dist/chunk-4NJE7D6X.mjs +0 -3
  540. package/dist/chunk-4NJE7D6X.mjs.map +0 -1
  541. package/dist/chunk-6HVJFEDA.mjs +0 -3
  542. package/dist/chunk-6HVJFEDA.mjs.map +0 -1
  543. package/dist/chunk-7OYT3QSY.mjs +0 -3
  544. package/dist/chunk-7OYT3QSY.mjs.map +0 -1
  545. package/dist/chunk-ANYZ56VB.mjs +0 -3
  546. package/dist/chunk-ANYZ56VB.mjs.map +0 -1
  547. package/dist/chunk-AOSXB5JJ.mjs +0 -4
  548. package/dist/chunk-AOSXB5JJ.mjs.map +0 -1
  549. package/dist/chunk-B544MRF7.mjs +0 -3
  550. package/dist/chunk-B544MRF7.mjs.map +0 -1
  551. package/dist/chunk-CVWWS25A.mjs +0 -3
  552. package/dist/chunk-CVWWS25A.mjs.map +0 -1
  553. package/dist/chunk-DYNBM24D.mjs +0 -3
  554. package/dist/chunk-DYNBM24D.mjs.map +0 -1
  555. package/dist/chunk-FX57OSYG.mjs +0 -3
  556. package/dist/chunk-FX57OSYG.mjs.map +0 -1
  557. package/dist/chunk-IJSYSNM5.mjs +0 -3
  558. package/dist/chunk-IJSYSNM5.mjs.map +0 -1
  559. package/dist/chunk-KJZGOL2Z.mjs +0 -3
  560. package/dist/chunk-KJZGOL2Z.mjs.map +0 -1
  561. package/dist/chunk-KYRIUUQP.mjs +0 -3
  562. package/dist/chunk-KYRIUUQP.mjs.map +0 -1
  563. package/dist/chunk-LSA7DU3N.mjs +0 -73
  564. package/dist/chunk-LSA7DU3N.mjs.map +0 -1
  565. package/dist/chunk-MDLCJASB.mjs +0 -3
  566. package/dist/chunk-MDLCJASB.mjs.map +0 -1
  567. package/dist/chunk-N56BUOCD.mjs +0 -3
  568. package/dist/chunk-N56BUOCD.mjs.map +0 -1
  569. package/dist/chunk-OFYITQXI.mjs +0 -13
  570. package/dist/chunk-OFYITQXI.mjs.map +0 -1
  571. package/dist/chunk-OZNST3EZ.mjs +0 -3
  572. package/dist/chunk-OZNST3EZ.mjs.map +0 -1
  573. package/dist/chunk-RS6RKW5U.mjs +0 -13
  574. package/dist/chunk-RS6RKW5U.mjs.map +0 -1
  575. package/dist/chunk-TXBZZJNR.mjs +0 -3
  576. package/dist/chunk-TXBZZJNR.mjs.map +0 -1
  577. package/dist/chunk-TZ4YSHMC.mjs +0 -3
  578. package/dist/chunk-TZ4YSHMC.mjs.map +0 -1
  579. package/dist/chunk-U6CTBZ2U.mjs +0 -3
  580. package/dist/chunk-U6CTBZ2U.mjs.map +0 -1
  581. package/dist/chunk-WP7VFE77.mjs +0 -3
  582. package/dist/chunk-WP7VFE77.mjs.map +0 -1
  583. package/dist/chunk-XCZMLKPK.mjs +0 -3
  584. package/dist/chunk-XCZMLKPK.mjs.map +0 -1
  585. package/dist/chunk-XGHT7WMO.mjs +0 -3
  586. package/dist/chunk-XGHT7WMO.mjs.map +0 -1
  587. package/dist/chunk-XL4KTJ4L.mjs +0 -3
  588. package/dist/chunk-XL4KTJ4L.mjs.map +0 -1
  589. package/dist/chunk-Z74YUUVT.mjs +0 -3
  590. package/dist/chunk-Z74YUUVT.mjs.map +0 -1
  591. package/dist/chunk-ZXZIHU7J.mjs +0 -8
  592. package/dist/chunk-ZXZIHU7J.mjs.map +0 -1
  593. package/dist/components/EmptyState.d.ts +0 -62
  594. package/dist/components/EmptyState.d.ts.map +0 -1
  595. package/dist/data.js +0 -3
  596. package/dist/data.js.map +0 -1
  597. package/dist/feedback.js +0 -12
  598. package/dist/feedback.js.map +0 -1
  599. package/dist/form.js +0 -8
  600. package/dist/form.js.map +0 -1
  601. package/dist/iconsax-extended.js +0 -3
  602. package/dist/iconsax-extended.js.map +0 -1
  603. package/dist/iconsax.js +0 -3
  604. package/dist/iconsax.js.map +0 -1
  605. package/dist/index.js +0 -51
  606. package/dist/index.js.map +0 -1
  607. package/dist/interactive.js +0 -2
  608. package/dist/interactive.js.map +0 -1
  609. package/dist/landing.js +0 -100
  610. package/dist/landing.js.map +0 -1
  611. package/dist/lib/phosphor-icons.d.ts +0 -6
  612. package/dist/lib/phosphor-icons.d.ts.map +0 -1
  613. package/dist/navigation.js +0 -12
  614. package/dist/navigation.js.map +0 -1
  615. package/dist/overlay.js +0 -3
  616. package/dist/overlay.js.map +0 -1
  617. package/dist/sdui.js +0 -9
  618. package/dist/sdui.js.map +0 -1
@@ -1,8 +0,0 @@
1
- "use client";
2
- import {b}from'./chunk-U6CTBZ2U.mjs';import i from'react';import {cva}from'class-variance-authority';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var x=cva("block",{variants:{variant:{text:"rounded w-full h-4",circular:"rounded-full w-10 h-10",rounded:"rounded-lg w-full h-[200px]",rectangular:"rounded-none w-full h-[200px]"},animation:{pulse:"animate-pulse bg-muted",wave:"bg-muted",shimmer:"bg-muted"}},defaultVariants:{variant:"text",animation:"pulse"}}),o=i.forwardRef(({className:t,variant:l="text",width:a,height:c,animation:m="pulse",...p},f)=>{let N=()=>m==="wave"||m==="shimmer"?{background:"linear-gradient(90deg, hsl(var(--muted)) 0%, hsl(var(--muted-foreground) / 0.2) 50%, hsl(var(--muted)) 100%)",backgroundSize:"200% 100%",animation:"shimmer 1.5s ease-in-out infinite"}:{};return jsxs(Fragment,{children:[(m==="wave"||m==="shimmer")&&jsx("style",{children:`
3
- @keyframes shimmer {
4
- 0% { background-position: 200% 0; }
5
- 100% { background-position: -200% 0; }
6
- }
7
- `}),jsx("div",{ref:f,className:b(x({variant:l,animation:m}),t),style:{...a!=null?{width:typeof a=="number"?`${a}px`:a}:{},...c!=null?{height:typeof c=="number"?`${c}px`:c}:{},...N()},...p})]})});o.displayName="Skeleton";var s=i.forwardRef(({className:t,...l},a)=>jsx(o,{ref:a,variant:"text",className:t,...l}));s.displayName="SkeletonText";var d=i.forwardRef(({className:t,...l},a)=>jsx(o,{ref:a,variant:"circular",className:t,...l}));d.displayName="SkeletonCircle";var w=i.forwardRef(({className:t,...l},a)=>jsx(o,{ref:a,variant:"rectangular",className:t,...l}));w.displayName="SkeletonRectangle";var v=i.forwardRef(({className:t,...l},a)=>jsx(o,{ref:a,variant:"rounded",className:t,...l}));v.displayName="SkeletonRounded";var h=i.forwardRef(({className:t,...l},a)=>jsxs("div",{ref:a,className:b("space-y-4 p-6",t),...l,children:[jsxs("div",{className:"flex items-center space-x-4",children:[" ",jsx(d,{className:"w-12 h-12"})," ",jsxs("div",{className:"space-y-2 flex-1",children:[" ",jsx(s,{className:"h-4 w-3/4"})," ",jsx(s,{className:"h-3 w-1/2"})," "]})]}),jsx(v,{className:"w-full h-32"})," ",jsxs("div",{className:"space-y-2",children:[" ",jsx(s,{className:"h-4 w-full"}),jsx(s,{className:"h-4 w-5/6"}),jsx(s,{className:"h-4 w-4/6"})]})]}));h.displayName="SkeletonCard";var k=i.forwardRef(({className:t,...l},a)=>jsxs("div",{ref:a,className:b("flex items-center space-x-4",t),...l,children:[jsx(d,{className:"w-12 h-12"})," ",jsxs("div",{className:"space-y-2 flex-1",children:[" ",jsx(s,{className:"h-4 w-3/4"}),jsx(s,{className:"h-3 w-1/2"})]})]}));k.displayName="SkeletonAvatar";var y=i.forwardRef(({className:t,...l},a)=>jsxs("div",{ref:a,className:b("space-y-2",t),...l,children:[jsx(v,{className:"w-full h-48"})," ",jsx(s,{className:"h-4 w-1/2"})]}));y.displayName="SkeletonImage";var S=i.forwardRef(({className:t,...l},a)=>jsxs("div",{ref:a,className:b("space-y-4",t),...l,children:[jsxs("div",{className:"flex items-center space-x-4",children:[" ",jsx(d,{className:"w-16 h-16"})," ",jsxs("div",{className:"space-y-2 flex-1",children:[" ",jsx(s,{className:"h-5 w-1/2"}),jsx(s,{className:"h-3 w-1/3"})]})]}),jsxs("div",{className:"space-y-2",children:[" ",jsx(s,{className:"h-4 w-full"}),jsx(s,{className:"h-4 w-5/6"})]})]}));S.displayName="SkeletonUserProfile";var T=i.forwardRef(({className:t,...l},a)=>jsx("div",{ref:a,className:b("space-y-4",t),...l,children:Array.from({length:3}).map((c,m)=>jsxs("div",{className:"flex items-center space-x-4",children:[" ",jsx(d,{className:"w-10 h-10"})," ",jsxs("div",{className:"space-y-2 flex-1",children:[" ",jsx(s,{className:"h-4 w-3/4"}),jsx(s,{className:"h-3 w-1/2"})]})]},m))}));T.displayName="SkeletonList";var L=i.forwardRef(({className:t,...l},a)=>jsxs("div",{ref:a,className:b("space-y-4",t),...l,children:[jsxs("div",{className:"flex space-x-4",children:[" ",jsx(s,{className:"h-4 w-1/4"}),jsx(s,{className:"h-4 w-1/4"}),jsx(s,{className:"h-4 w-1/4"}),jsx(s,{className:"h-4 w-1/4"})]}),Array.from({length:5}).map((c,m)=>jsxs("div",{className:"flex space-x-4",children:[" ",jsx(s,{className:"h-4 w-1/4"}),jsx(s,{className:"h-4 w-1/4"}),jsx(s,{className:"h-4 w-1/4"}),jsx(s,{className:"h-4 w-1/4"})]},m))]}));L.displayName="SkeletonTable";export{o as a,s as b,d as c,w as d,v as e,h as f,k as g,y as h,S as i,T as j,L as k};//# sourceMappingURL=chunk-ZXZIHU7J.mjs.map
8
- //# sourceMappingURL=chunk-ZXZIHU7J.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Skeleton.tsx"],"names":["skeletonVariants","cva","Skeleton","React","className","variant","width","height","animation","props","ref","getAnimationStyle","jsxs","Fragment","jsx","merge","SkeletonText","SkeletonCircle","SkeletonRectangle","SkeletonRounded","SkeletonCard","SkeletonAvatar","SkeletonImage","SkeletonUserProfile","SkeletonList","_","index","SkeletonTable"],"mappings":"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","file":"chunk-ZXZIHU7J.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const skeletonVariants = cva(\n \"block\",\n {\n variants: {\n variant: {\n text: \"rounded w-full h-4\",\n circular: \"rounded-full w-10 h-10\",\n rounded: \"rounded-lg w-full h-[200px]\",\n rectangular: \"rounded-none w-full h-[200px]\",\n },\n animation: {\n pulse: \"animate-pulse bg-muted\",\n wave: \"bg-muted\",\n shimmer: \"bg-muted\",\n },\n },\n defaultVariants: {\n variant: \"text\",\n animation: \"pulse\",\n },\n }\n)\n\n/**\n * Skeleton 컴포넌트의 props\n */\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"text\" | \"circular\" | \"rectangular\" | \"rounded\"\n width?: string | number\n height?: string | number\n animation?: \"pulse\" | \"wave\" | \"shimmer\"\n className?: string\n}\n\n/**\n * Skeleton 컴포넌트 / Skeleton component\n *\n * 로딩 중 콘텐츠의 플레이스홀더를 표시하는 스켈레톤 컴포넌트입니다.\n *\n * @example\n * <Skeleton />\n * <Skeleton variant=\"circular\" width={40} height={40} />\n * <Skeleton variant=\"rounded\" width=\"100%\" height={200} animation=\"wave\" />\n */\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({\n className,\n variant = \"text\",\n width,\n height,\n animation = \"pulse\",\n ...props\n }, ref) => {\n const getAnimationStyle = (): React.CSSProperties => {\n if (animation === \"wave\" || animation === \"shimmer\") {\n return {\n background: \"linear-gradient(90deg, hsl(var(--muted)) 0%, hsl(var(--muted-foreground) / 0.2) 50%, hsl(var(--muted)) 100%)\",\n backgroundSize: \"200% 100%\",\n animation: \"shimmer 1.5s ease-in-out infinite\",\n }\n }\n return {}\n }\n\n return (\n <>\n {(animation === \"wave\" || animation === \"shimmer\") && (\n <style>{`\n @keyframes shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n `}</style>\n )}\n <div\n ref={ref}\n className={merge(\n skeletonVariants({ variant, animation }),\n className\n )}\n style={{\n ...(width != null ? { width: typeof width === \"number\" ? `${width}px` : width } : {}),\n ...(height != null ? { height: typeof height === \"number\" ? `${height}px` : height } : {}),\n ...getAnimationStyle(),\n }}\n {...props}\n />\n </>\n )\n }\n)\nSkeleton.displayName = \"Skeleton\"\n\n// 편의 컴포넌트들\nexport const SkeletonText = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"text\" className={className} {...props} />\n )\n)\nSkeletonText.displayName = \"SkeletonText\"\n\nexport const SkeletonCircle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"circular\" className={className} {...props} />\n )\n)\nSkeletonCircle.displayName = \"SkeletonCircle\"\n\nexport const SkeletonRectangle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rectangular\" className={className} {...props} />\n )\n)\nSkeletonRectangle.displayName = \"SkeletonRectangle\"\n\nexport const SkeletonRounded = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rounded\" className={className} {...props} />\n )\n)\nSkeletonRounded.displayName = \"SkeletonRounded\"\n\n// 복합 스켈레톤 컴포넌트들\nexport const SkeletonCard = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4 p-6\", className)} // 16px 간격, 24px 패딩\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" /> {/* 16px 높이, 75% 너비 */}\n <SkeletonText className=\"h-3 w-1/2\" /> {/* 12px 높이, 50% 너비 */}\n </div>\n </div>\n <SkeletonRounded className=\"w-full h-32\" /> {/* 128px 높이 */}\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n <SkeletonText className=\"h-4 w-4/6\" />\n </div>\n </div>\n )\n)\nSkeletonCard.displayName = \"SkeletonCard\"\n\nexport const SkeletonAvatar = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center space-x-4\", className)} // 16px 간격\n {...props}\n >\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n )\n)\nSkeletonAvatar.displayName = \"SkeletonAvatar\"\n\nexport const SkeletonImage = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)} // 8px 간격\n {...props}\n >\n <SkeletonRounded className=\"w-full h-48\" /> {/* 192px 높이 */}\n <SkeletonText className=\"h-4 w-1/2\" />\n </div>\n )\n)\nSkeletonImage.displayName = \"SkeletonImage\"\n\nexport const SkeletonUserProfile = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-16 h-16\" /> {/* 64px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-5 w-1/2\" />\n <SkeletonText className=\"h-3 w-1/3\" />\n </div>\n </div>\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n </div>\n </div>\n )\n)\nSkeletonUserProfile.displayName = \"SkeletonUserProfile\"\n\nexport const SkeletonList = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-10 h-10\" /> {/* 40px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n )\n)\nSkeletonList.displayName = \"SkeletonList\"\n\nexport const SkeletonTable = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {/* 헤더 */}\n <div className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n {/* 행들 */}\n {Array.from({ length: 5 }).map((_, index) => (\n <div key={index} className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n ))}\n </div>\n )\n)\nSkeletonTable.displayName = \"SkeletonTable\"\n\nexport { Skeleton } "]}
@@ -1,62 +0,0 @@
1
- import React from "react";
2
- import type { IconName } from "../lib/icons";
3
- /**
4
- * EmptyState 컴포넌트 Props
5
- * EmptyState component props
6
- */
7
- export interface EmptyStateProps extends React.HTMLAttributes<HTMLDivElement> {
8
- /** 아이콘 (IconName 또는 ReactNode) / Icon (IconName or ReactNode) */
9
- icon?: IconName | React.ReactNode;
10
- /** 제목 / Title */
11
- title: string;
12
- /** 설명 / Description */
13
- description?: string;
14
- /** 액션 버튼 텍스트 / Action button text */
15
- actionText?: string;
16
- /** 액션 버튼 링크 URL / Action button link URL */
17
- actionHref?: string;
18
- /** 액션 버튼 클릭 핸들러 / Action button click handler */
19
- onAction?: () => void;
20
- /** 보조 액션 텍스트 / Secondary action text */
21
- secondaryActionText?: string;
22
- /** 보조 액션 클릭 핸들러 / Secondary action click handler */
23
- onSecondaryAction?: () => void;
24
- /** 스타일 변형 / Style variant */
25
- variant?: "default" | "warning" | "info" | "error" | "success";
26
- /** 크기 / Size */
27
- size?: "sm" | "md" | "lg";
28
- /** 테두리 표시 여부 / Show border */
29
- bordered?: boolean;
30
- }
31
- /**
32
- * EmptyState - 빈 상태 표시 컴포넌트
33
- * Empty state display component
34
- *
35
- * 데이터가 없을 때 사용자에게 안내 메시지와 액션을 제공합니다.
36
- * Displays a message and action when there is no data to show.
37
- *
38
- * @example
39
- * // 기본 사용 / Basic usage
40
- * <EmptyState
41
- * icon="inbox"
42
- * title="데이터가 없습니다"
43
- * description="새로운 데이터를 추가해보세요"
44
- * actionText="데이터 추가"
45
- * onAction={handleAdd}
46
- * />
47
- *
48
- * @example
49
- * // 경고 스타일 / Warning style
50
- * <EmptyState
51
- * icon="warning"
52
- * title="오류가 발생했습니다"
53
- * description="잠시 후 다시 시도해주세요"
54
- * variant="error"
55
- * actionText="다시 시도"
56
- * onAction={handleRetry}
57
- * secondaryActionText="취소"
58
- * onSecondaryAction={handleCancel}
59
- * />
60
- */
61
- export declare const EmptyState: React.ForwardRefExoticComponent<EmptyStateProps & React.RefAttributes<HTMLDivElement>>;
62
- //# sourceMappingURL=EmptyState.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../src/components/EmptyState.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG7C;;;GAGG;AACH,MAAM,WAAW,eAAgB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC3E,iEAAiE;IACjE,IAAI,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,wCAAwC;IACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oDAAoD;IACpD,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,6BAA6B;IAC7B,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC/D,gBAAgB;IAChB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAwDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,UAAU,wFAkGtB,CAAC"}
package/dist/data.js DELETED
@@ -1,3 +0,0 @@
1
- 'use strict';var l=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime'),sugarHigh=require('sugar-high');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var l__default=/*#__PURE__*/_interopDefault(l);function a(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var x=l__default.default.forwardRef(({className:e,variant:t="default",size:r="md",...n},m)=>{let i=()=>{switch(t){case "bordered":return "border border-border divide-x divide-border";case "striped":return "divide-y divide-border";default:return ""}},p=()=>{switch(r){case "sm":return "text-sm";case "lg":return "text-base";default:return "text-sm"}};return jsxRuntime.jsx("div",{className:"w-full overflow-auto",children:jsxRuntime.jsx("table",{ref:m,className:a("w-full caption-bottom",i(),p(),e),...n})})});x.displayName="Table";var h=l__default.default.forwardRef(({className:e,...t},r)=>jsxRuntime.jsx("thead",{ref:r,className:a("[&_tr]:border-b",e),...t}));h.displayName="TableHeader";var N=l__default.default.forwardRef(({className:e,...t},r)=>jsxRuntime.jsx("tbody",{ref:r,className:a("[&_tr:last-child]:border-0",e),...t}));N.displayName="TableBody";var R=l__default.default.forwardRef(({className:e,...t},r)=>jsxRuntime.jsx("tfoot",{ref:r,className:a("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...t}));R.displayName="TableFooter";var w=l__default.default.forwardRef(({className:e,variant:t="default",...r},n)=>jsxRuntime.jsx("tr",{ref:n,className:a("border-b transition-colors data-[state=selected]:bg-muted/50",t==="hover"?"hover:bg-muted/50":"",e),...r}));w.displayName="TableRow";var C=l__default.default.forwardRef(({className:e,...t},r)=>jsxRuntime.jsx("th",{ref:r,className:a("h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",e),...t}));C.displayName="TableHead";var v=l__default.default.forwardRef(({className:e,...t},r)=>jsxRuntime.jsx("td",{ref:r,className:a("p-4 align-middle [&:has([role=checkbox])]:pr-0",e),...t}));v.displayName="TableCell";var y=l__default.default.forwardRef(({className:e,...t},r)=>jsxRuntime.jsx("caption",{ref:r,className:a("mt-4 text-sm text-muted-foreground",e),...t}));y.displayName="TableCaption";function D({code:e,language:t,filename:r,showLineNumbers:n=false,showCopyButton:m=true,onCopy:i,copySuccessMessage:p="Copied!",className:k,maxHeight:L,theme:g="dark"}){let[P,T]=l.useState(false),E=l.useCallback(async()=>{try{await navigator.clipboard.writeText(e),T(!0),i==null||i(),setTimeout(()=>T(!1),2e3);}catch(b){console.error("Failed to copy:",b);}},[e,i]),u=e.split(`
2
- `),B=l.useMemo(()=>u.map(b=>sugarHigh.highlight(b)||"&nbsp;"),[u]),S=l.useMemo(()=>sugarHigh.highlight(e),[e]),d=g==="dark";return jsxRuntime.jsxs("div",{className:a("group relative rounded-lg overflow-hidden",d?"bg-[#0d1117] border border-[#30363d]":"bg-muted/50 border border-border",k),children:[jsxRuntime.jsxs("div",{className:a("flex items-center justify-between px-4 py-2.5 border-b",d?"bg-[#161b22] border-[#30363d]":"bg-muted/30 border-border"),children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-3",children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-1.5",children:[jsxRuntime.jsx("span",{className:"w-3 h-3 rounded-full bg-[#ff5f56]"}),jsxRuntime.jsx("span",{className:"w-3 h-3 rounded-full bg-[#ffbd2e]"}),jsxRuntime.jsx("span",{className:"w-3 h-3 rounded-full bg-[#27c93f]"})]}),r&&jsxRuntime.jsx("span",{className:a("text-sm font-medium",d?"text-[#c9d1d9]":"text-foreground"),children:r}),t&&!r&&jsxRuntime.jsx("span",{className:a("text-xs uppercase tracking-wider",d?"text-[#8b949e]":"text-muted-foreground"),children:t}),t&&r&&jsxRuntime.jsx("span",{className:a("text-xs",d?"text-[#8b949e]":"text-muted-foreground"),children:t})]}),m&&jsxRuntime.jsx(F,{copied:P,onClick:E,theme:g})]}),jsxRuntime.jsx("div",{className:"overflow-auto",style:{maxHeight:L},children:jsxRuntime.jsx("pre",{className:a("p-4 text-sm leading-7 overflow-x-auto",d?"text-[#c9d1d9]":"text-foreground"),children:n?jsxRuntime.jsx("code",{className:"block font-mono",children:u.map((b,f)=>jsxRuntime.jsxs("div",{className:"flex",children:[jsxRuntime.jsx("span",{className:a("select-none w-8 text-right mr-4 flex-shrink-0",d?"text-[#484f58]":"text-muted-foreground"),children:f+1}),jsxRuntime.jsx("span",{dangerouslySetInnerHTML:{__html:B[f]}})]},f))}):jsxRuntime.jsx("code",{className:"font-mono whitespace-pre",dangerouslySetInnerHTML:{__html:S}})})})]})}function F({copied:e,onClick:t,theme:r="dark"}){let n=r==="dark";return jsxRuntime.jsx("button",{type:"button",onClick:t,className:a("inline-flex items-center justify-center w-8 h-8 rounded-md transition-all duration-200",e?n?"bg-green-500/20 text-green-400":"bg-green-100 text-green-700":n?"bg-transparent hover:bg-[#30363d] text-[#8b949e] hover:text-[#c9d1d9]":"bg-transparent hover:bg-secondary/80 text-muted-foreground hover:text-foreground"),"aria-label":e?"Copied":"Copy code",title:e?"Copied!":"Copy code",children:e?jsxRuntime.jsx(K,{className:"w-4 h-4"}):jsxRuntime.jsx($,{className:"w-4 h-4"})})}function $({className:e}){return jsxRuntime.jsxs("svg",{className:e,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",strokeWidth:2,children:[jsxRuntime.jsx("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),jsxRuntime.jsx("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]})}function K({className:e}){return jsxRuntime.jsx("svg",{className:e,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",strokeWidth:2,children:jsxRuntime.jsx("polyline",{points:"20 6 9 17 4 12"})})}function j({children:e,className:t}){return jsxRuntime.jsx("code",{className:a("px-1.5 py-0.5 rounded-md bg-muted text-sm font-mono text-foreground",t),children:e})}exports.CodeBlock=D;exports.InlineCode=j;exports.Table=x;exports.TableBody=N;exports.TableCaption=y;exports.TableCell=v;exports.TableFooter=R;exports.TableHead=C;exports.TableHeader=h;exports.TableRow=w;//# sourceMappingURL=data.js.map
3
- //# sourceMappingURL=data.js.map
package/dist/data.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/components/Table.tsx","../src/components/CodeBlock.tsx"],"names":["merge","inputs","twMerge","clsx","Table","React","className","variant","size","props","ref","getVariantClasses","getSizeClasses","jsx","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","CodeBlock","code","language","filename","showLineNumbers","showCopyButton","onCopy","_copySuccessMessage","maxHeight","theme","copied","setCopied","useState","handleCopy","useCallback","err","lines","highlightedLines","useMemo","line","highlight","highlightedCode","isDark","jsxs","CopyButton","i","onClick","CheckIcon","CopyIcon","InlineCode","children"],"mappings":"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","file":"data.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 from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Table 컴포넌트의 props / Table component props\n * @typedef {Object} TableProps\n * @property {React.ReactNode} children - TableHeader, TableBody, TableFooter 등 / TableHeader, TableBody, TableFooter, etc.\n * @property {\"default\" | \"bordered\" | \"striped\"} [variant=\"default\"] - Table 스타일 변형 / Table style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Table 크기 / Table size\n * @extends {React.HTMLAttributes<HTMLTableElement>}\n */\nexport interface TableProps extends React.HTMLAttributes<HTMLTableElement> {\n children: React.ReactNode\n variant?: \"default\" | \"bordered\" | \"striped\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * TableHeader 컴포넌트의 props / TableHeader component props\n * @typedef {Object} TableHeaderProps\n * @property {React.ReactNode} children - TableHead 컴포넌트들 / TableHead components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableBody 컴포넌트의 props / TableBody component props\n * @typedef {Object} TableBodyProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableFooter 컴포넌트의 props / TableFooter component props\n * @typedef {Object} TableFooterProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableRow 컴포넌트의 props / TableRow component props\n * @typedef {Object} TableRowProps\n * @property {React.ReactNode} children - TableHead 또는 TableCell 컴포넌트들 / TableHead or TableCell components\n * @property {\"default\" | \"hover\"} [variant=\"default\"] - Row 스타일 변형 / Row style variant\n * @extends {React.HTMLAttributes<HTMLTableRowElement>}\n */\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n children: React.ReactNode\n variant?: \"default\" | \"hover\"\n}\n\n/**\n * TableHead 컴포넌트의 props / TableHead component props\n * @typedef {Object} TableHeadProps\n * @property {React.ReactNode} children - 헤더 셀 내용 / Header cell content\n * @extends {React.ThHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * TableCell 컴포넌트의 props / TableCell component props\n * @typedef {Object} TableCellProps\n * @property {React.ReactNode} children - 셀 내용 / Cell content\n * @extends {React.TdHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * Table 컴포넌트 / Table component\n * \n * 데이터를 표 형태로 표시하는 테이블 컴포넌트입니다.\n * TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell과 함께 사용합니다.\n * \n * Table component that displays data in tabular format.\n * Used with TableHeader, TableBody, TableFooter, TableRow, TableHead, and TableCell.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>이름</TableHead>\n * <TableHead>나이</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>홍길동</TableCell>\n * <TableCell>30</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Bordered 스타일 / Bordered style\n * <Table variant=\"bordered\">\n * <TableHeader>\n * <TableRow>\n * <TableHead>항목</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>값</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Striped 스타일, 호버 효과 / Striped style with hover effect\n * <Table variant=\"striped\">\n * <TableBody>\n * <TableRow variant=\"hover\">\n * <TableCell>데이터</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @param {TableProps} props - Table 컴포넌트의 props / Table component props\n * @param {React.Ref<HTMLTableElement>} ref - table 요소 ref / table element ref\n * @returns {JSX.Element} Table 컴포넌트 / Table component\n */\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, variant = \"default\", size = \"md\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"bordered\":\n return \"border border-border divide-x divide-border\"\n case \"striped\":\n return \"divide-y divide-border\"\n default:\n return \"\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-sm\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <div className=\"w-full overflow-auto\">\n <table\n ref={ref}\n className={merge(\n \"w-full caption-bottom\",\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n />\n </div>\n )\n }\n)\nTable.displayName = \"Table\"\n\n/**\n * TableHeader 컴포넌트 / TableHeader component\n * 테이블의 헤더 영역을 표시합니다.\n * Displays the header area of a table.\n * \n * @component\n * @param {TableHeaderProps} props - TableHeader 컴포넌트의 props / TableHeader component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - thead 요소 ref / thead element ref\n * @returns {JSX.Element} TableHeader 컴포넌트 / TableHeader component\n */\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => (\n <thead ref={ref} className={merge(\"[&_tr]:border-b\", className)} {...props} />\n )\n)\nTableHeader.displayName = \"TableHeader\"\n\n/**\n * TableBody 컴포넌트 / TableBody component\n * 테이블의 본문 영역을 표시합니다.\n * Displays the body area of a table.\n * \n * @component\n * @param {TableBodyProps} props - TableBody 컴포넌트의 props / TableBody component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tbody 요소 ref / tbody element ref\n * @returns {JSX.Element} TableBody 컴포넌트 / TableBody component\n */\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={merge(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n)\nTableBody.displayName = \"TableBody\"\n\n/**\n * TableFooter 컴포넌트 / TableFooter component\n * 테이블의 푸터 영역을 표시합니다.\n * Displays the footer area of a table.\n * \n * @component\n * @param {TableFooterProps} props - TableFooter 컴포넌트의 props / TableFooter component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tfoot 요소 ref / tfoot element ref\n * @returns {JSX.Element} TableFooter 컴포넌트 / TableFooter component\n */\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={merge(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableFooter.displayName = \"TableFooter\"\n\n/**\n * TableRow 컴포넌트 / TableRow component\n * 테이블의 행을 표시합니다.\n * Displays a table row.\n * \n * @component\n * @param {TableRowProps} props - TableRow 컴포넌트의 props / TableRow component props\n * @param {React.Ref<HTMLTableRowElement>} ref - tr 요소 ref / tr element ref\n * @returns {JSX.Element} TableRow 컴포넌트 / TableRow component\n */\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"hover\":\n return \"hover:bg-muted/50\"\n default:\n return \"\"\n }\n }\n\n return (\n <tr\n ref={ref}\n className={merge(\n \"border-b transition-colors data-[state=selected]:bg-muted/50\",\n getVariantClasses(),\n className\n )}\n {...props}\n />\n )\n }\n)\nTableRow.displayName = \"TableRow\"\n\n/**\n * TableHead 컴포넌트 / TableHead component\n * 테이블의 헤더 셀을 표시합니다.\n * Displays a table header cell.\n * \n * @component\n * @param {TableHeadProps} props - TableHead 컴포넌트의 props / TableHead component props\n * @param {React.Ref<HTMLTableCellElement>} ref - th 요소 ref / th element ref\n * @returns {JSX.Element} TableHead 컴포넌트 / TableHead component\n */\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={merge(\n \"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableHead.displayName = \"TableHead\"\n\n/**\n * TableCell 컴포넌트 / TableCell component\n * 테이블의 데이터 셀을 표시합니다.\n * Displays a table data cell.\n * \n * @component\n * @param {TableCellProps} props - TableCell 컴포넌트의 props / TableCell component props\n * @param {React.Ref<HTMLTableCellElement>} ref - td 요소 ref / td element ref\n * @returns {JSX.Element} TableCell 컴포넌트 / TableCell component\n */\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={merge(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n)\nTableCell.displayName = \"TableCell\"\n\n/**\n * TableCaption 컴포넌트 / TableCaption component\n * 테이블의 캡션을 표시합니다.\n * Displays a table caption.\n * \n * @component\n * @param {React.HTMLAttributes<HTMLTableCaptionElement>} props - TableCaption 컴포넌트의 props / TableCaption component props\n * @param {React.Ref<HTMLTableCaptionElement>} ref - caption 요소 ref / caption element ref\n * @returns {JSX.Element} TableCaption 컴포넌트 / TableCaption component\n */\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={merge(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} ","\"use client\"\n\nimport React, { useState, useCallback, useMemo } from \"react\"\nimport { highlight } from \"sugar-high\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * CodeBlock 컴포넌트 Props\n */\nexport interface CodeBlockProps {\n /** 표시할 코드 */\n code: string\n /** 프로그래밍 언어 (표시용) */\n language?: string\n /** 파일명 (헤더에 표시) */\n filename?: string\n /** 줄 번호 표시 여부 */\n showLineNumbers?: boolean\n /** 복사 버튼 표시 여부 */\n showCopyButton?: boolean\n /** 복사 성공 시 콜백 */\n onCopy?: () => void\n /** 복사 성공 메시지 */\n copySuccessMessage?: string\n /** 추가 className */\n className?: string\n /** 최대 높이 (스크롤) */\n maxHeight?: string | number\n /** 테마 (기본: dark) */\n theme?: \"dark\" | \"light\"\n}\n\n/**\n * CodeBlock 컴포넌트\n *\n * 코드를 표시하고 복사 기능을 제공하는 컴포넌트입니다.\n * Sugar-high를 사용한 신택스 하이라이팅을 지원합니다.\n *\n * @remarks\n * 신택스 하이라이팅을 위해 CSS 파일을 import하세요:\n * ```tsx\n * import '@hua-labs/ui/styles/codeblock.css';\n * ```\n *\n * @example\n * ```tsx\n * // 기본 사용\n * <CodeBlock code=\"console.log('Hello')\" language=\"javascript\" />\n *\n * // 파일명 표시\n * <CodeBlock\n * code={configCode}\n * language=\"typescript\"\n * filename=\"hua.config.ts\"\n * />\n *\n * // Toast와 함께 사용\n * const { addToast } = useToast()\n * <CodeBlock\n * code={code}\n * onCopy={() => addToast({ type: 'success', message: 'Copied!' })}\n * />\n * ```\n */\nexport function CodeBlock({\n code,\n language,\n filename,\n showLineNumbers = false,\n showCopyButton = true,\n onCopy,\n copySuccessMessage: _copySuccessMessage = \"Copied!\",\n className,\n maxHeight,\n theme = \"dark\",\n}: CodeBlockProps) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(code)\n setCopied(true)\n onCopy?.()\n\n // 2초 후 복사 상태 리셋\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error(\"Failed to copy:\", err)\n }\n }, [code, onCopy])\n\n const lines = code.split(\"\\n\")\n\n // 신택스 하이라이팅\n const highlightedLines = useMemo(() => {\n return lines.map(line => highlight(line) || \"&nbsp;\")\n }, [lines])\n\n const highlightedCode = useMemo(() => highlight(code), [code])\n\n const isDark = theme === \"dark\"\n\n return (\n <div\n className={merge(\n \"group relative rounded-lg overflow-hidden\",\n isDark\n ? \"bg-[#0d1117] border border-[#30363d]\"\n : \"bg-muted/50 border border-border\",\n className\n )}\n >\n {/* 헤더 - 항상 표시 */}\n <div className={merge(\n \"flex items-center justify-between px-4 py-2.5 border-b\",\n isDark\n ? \"bg-[#161b22] border-[#30363d]\"\n : \"bg-muted/30 border-border\"\n )}>\n <div className=\"flex items-center gap-3\">\n {/* Traffic lights (macOS 스타일) */}\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-3 h-3 rounded-full bg-[#ff5f56]\" />\n <span className=\"w-3 h-3 rounded-full bg-[#ffbd2e]\" />\n <span className=\"w-3 h-3 rounded-full bg-[#27c93f]\" />\n </div>\n {filename && (\n <span className={merge(\n \"text-sm font-medium\",\n isDark ? \"text-[#c9d1d9]\" : \"text-foreground\"\n )}>\n {filename}\n </span>\n )}\n {language && !filename && (\n <span className={merge(\n \"text-xs uppercase tracking-wider\",\n isDark ? \"text-[#8b949e]\" : \"text-muted-foreground\"\n )}>\n {language}\n </span>\n )}\n {language && filename && (\n <span className={merge(\n \"text-xs\",\n isDark ? \"text-[#8b949e]\" : \"text-muted-foreground\"\n )}>\n {language}\n </span>\n )}\n </div>\n {showCopyButton && (\n <CopyButton copied={copied} onClick={handleCopy} theme={theme} />\n )}\n </div>\n\n {/* 코드 영역 */}\n <div\n className=\"overflow-auto\"\n style={{ maxHeight: maxHeight }}\n >\n <pre className={merge(\n \"p-4 text-sm leading-7 overflow-x-auto\",\n isDark ? \"text-[#c9d1d9]\" : \"text-foreground\"\n )}>\n {showLineNumbers ? (\n <code className=\"block font-mono\">\n {lines.map((line, i) => (\n <div key={i} className=\"flex\">\n <span className={merge(\n \"select-none w-8 text-right mr-4 flex-shrink-0\",\n isDark ? \"text-[#484f58]\" : \"text-muted-foreground\"\n )}>\n {i + 1}\n </span>\n <span\n dangerouslySetInnerHTML={{ __html: highlightedLines[i] }}\n />\n </div>\n ))}\n </code>\n ) : (\n <code\n className=\"font-mono whitespace-pre\"\n dangerouslySetInnerHTML={{ __html: highlightedCode }}\n />\n )}\n </pre>\n </div>\n\n </div>\n )\n}\n\n/**\n * 복사 버튼 컴포넌트 (아이콘만)\n */\nfunction CopyButton({\n copied,\n onClick,\n theme = \"dark\"\n}: {\n copied: boolean\n onClick: () => void\n theme?: \"dark\" | \"light\"\n}) {\n const isDark = theme === \"dark\"\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={merge(\n \"inline-flex items-center justify-center w-8 h-8 rounded-md transition-all duration-200\",\n copied\n ? isDark\n ? \"bg-green-500/20 text-green-400\"\n : \"bg-green-100 text-green-700\"\n : isDark\n ? \"bg-transparent hover:bg-[#30363d] text-[#8b949e] hover:text-[#c9d1d9]\"\n : \"bg-transparent hover:bg-secondary/80 text-muted-foreground hover:text-foreground\"\n )}\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n title={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? (\n <CheckIcon className=\"w-4 h-4\" />\n ) : (\n <CopyIcon className=\"w-4 h-4\" />\n )}\n </button>\n )\n}\n\n/**\n * 복사 아이콘\n */\nfunction CopyIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )\n}\n\n/**\n * 체크 아이콘\n */\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n/**\n * 인라인 코드 컴포넌트\n *\n * 텍스트 내 인라인 코드 표시용\n *\n * @example\n * ```tsx\n * <p>Use the <InlineCode>npm install</InlineCode> command.</p>\n * ```\n */\nexport function InlineCode({\n children,\n className,\n}: {\n children: React.ReactNode\n className?: string\n}) {\n return (\n <code\n className={merge(\n \"px-1.5 py-0.5 rounded-md bg-muted text-sm font-mono text-foreground\",\n className\n )}\n >\n {children}\n </code>\n )\n}\n"]}
package/dist/feedback.js DELETED
@@ -1,12 +0,0 @@
1
- 'use strict';var v=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var v__default=/*#__PURE__*/_interopDefault(v);function o(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var P=v.createContext(void 0);function X(){let e=v.useContext(P);if(!e)throw new Error("useToast must be used within a ToastProvider");return e}var Z=()=>{},ee=()=>{},te=()=>{};function re(){let e=v.useContext(P);return e||{toasts:[],addToast:Z,removeToast:ee,clearToasts:te}}function oe({children:e,maxToasts:t=5,position:r="top-right"}){let[i,s]=v.useState([]),u=v.useCallback(l=>{s(g=>g.filter(p=>p.id!==l));},[]),a=v.useCallback(l=>{let g=Math.random().toString(36).substr(2,9),p={...l,id:g};s(h=>[...h,p].slice(-t)),l.duration!==0&&setTimeout(()=>{u(g);},l.duration||5e3);},[t,u]),f=v.useCallback(()=>{s([]);},[]);return jsxRuntime.jsxs(P.Provider,{value:{toasts:i,addToast:a,removeToast:u,clearToasts:f},children:[e,jsxRuntime.jsx(se,{toasts:i,removeToast:u,position:r})]})}function se({toasts:e,removeToast:t,position:r}){let i={"top-right":"top-4 right-4","top-left":"top-4 left-4","bottom-right":"bottom-4 right-4","bottom-left":"bottom-4 left-4","top-center":"top-4 left-1/2 transform -translate-x-1/2","bottom-center":"bottom-4 left-1/2 transform -translate-x-1/2"};return e.length===0?null:jsxRuntime.jsx("div",{className:o("fixed z-50 space-y-3 max-w-sm",i[r]),children:e.map(s=>jsxRuntime.jsx(ae,{toast:s,onRemove:t},s.id))})}function ae({toast:e,onRemove:t}){let[r,i]=v.useState(false);v__default.default.useEffect(()=>{i(true);},[]);let s=()=>{i(false),setTimeout(()=>t(e.id),300);},u=l=>{switch(l){case "success":return "bg-[var(--toast-success-bg)] border-green-300 dark:border-green-700 text-green-800 dark:text-green-200 shadow-lg shadow-green-100/50 dark:shadow-none";case "error":return "bg-[var(--toast-error-bg)] border-red-300 dark:border-red-700 text-red-800 dark:text-red-200 shadow-lg shadow-red-100/50 dark:shadow-none";case "warning":return "bg-[var(--toast-warning-bg)] border-yellow-300 dark:border-yellow-700 text-yellow-800 dark:text-yellow-200 shadow-lg shadow-yellow-100/50 dark:shadow-none";case "info":return "bg-[var(--toast-info-bg)] border-indigo-300 dark:border-indigo-700 text-cyan-800 dark:text-cyan-200 shadow-lg shadow-indigo-100/50 dark:shadow-none"}},a=l=>{switch(l){case "success":return "text-green-500 dark:text-green-400";case "error":return "text-red-500 dark:text-red-400";case "warning":return "text-yellow-500 dark:text-yellow-400";case "info":return "text-cyan-500 dark:text-cyan-400"}},f=l=>{switch(l){case "success":return jsxRuntime.jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})});case "error":return jsxRuntime.jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})});case "warning":return jsxRuntime.jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})});case "info":return jsxRuntime.jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})}};return jsxRuntime.jsxs("div",{className:o("flex items-start p-4 rounded-xl border backdrop-blur-sm transition-all duration-300 transform",u(e.type),r?"translate-x-0 opacity-100 scale-100":"translate-x-full opacity-0 scale-95"),style:{animation:r?"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)":void 0},children:[jsxRuntime.jsxs("div",{className:o("flex-shrink-0 mr-3",a(e.type)),children:[" ",f(e.type)]}),jsxRuntime.jsxs("div",{className:"flex-1 min-w-0",children:[e.title&&jsxRuntime.jsxs("h4",{className:"text-sm font-semibold mb-1",children:[" ",e.title]}),jsxRuntime.jsx("p",{className:"text-sm leading-relaxed",children:e.message}),e.action&&jsxRuntime.jsx("button",{onClick:e.action.onClick,className:"mt-3 text-sm font-medium underline hover:no-underline transition-all duration-200",children:e.action.label})]}),jsxRuntime.jsxs("div",{className:"flex-shrink-0 ml-4",children:[" ",jsxRuntime.jsx("button",{onClick:s,className:o("inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2",a(e.type)),"aria-label":"\uB2EB\uAE30",children:jsxRuntime.jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]})]})}var w=v__default.default.forwardRef(({className:e,variant:t="default",title:r,description:i,icon:s,action:u,closable:a=false,onClose:f,children:l,...g},p)=>{let h=()=>{switch(t){case "success":return "bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200";case "warning":return "bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200";case "error":return "bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200";case "info":return "bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200";default:return "bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200"}},y=()=>{switch(t){case "success":return "text-green-500 dark:text-green-400";case "warning":return "text-yellow-500 dark:text-yellow-400";case "error":return "text-red-500 dark:text-red-400";case "info":return "text-cyan-500 dark:text-cyan-400";default:return "text-muted-foreground"}},b=()=>{switch(t){case "success":return jsxRuntime.jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})});case "warning":return jsxRuntime.jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})});case "error":return jsxRuntime.jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})});case "info":return jsxRuntime.jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})});default:return null}};return jsxRuntime.jsx("div",{ref:p,className:o("relative rounded-lg border p-4",h(),e),...g,children:jsxRuntime.jsxs("div",{className:"flex items-start gap-3",children:[" ",(s||b())&&jsxRuntime.jsx("div",{className:o("flex-shrink-0 mt-0.5",y()),children:s||b()}),jsxRuntime.jsxs("div",{className:"flex-1 min-w-0",children:[r&&jsxRuntime.jsxs("h4",{className:"text-sm font-semibold mb-1",children:[" ",r]}),i&&jsxRuntime.jsx("p",{className:"text-sm leading-relaxed",children:i}),l&&jsxRuntime.jsxs("div",{className:"mt-2",children:[" ",l]})]}),(u||a)&&jsxRuntime.jsxs("div",{className:"flex-shrink-0 flex items-center gap-2",children:[" ",u,a&&jsxRuntime.jsx("button",{onClick:f,className:o("inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2",y()),"aria-label":"\uB2EB\uAE30",children:jsxRuntime.jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]})]})})});w.displayName="Alert";var I=v__default.default.forwardRef(({className:e,...t},r)=>jsxRuntime.jsx(w,{ref:r,variant:"success",className:e,...t}));I.displayName="AlertSuccess";var _=v__default.default.forwardRef(({className:e,...t},r)=>jsxRuntime.jsx(w,{ref:r,variant:"warning",className:e,...t}));_.displayName="AlertWarning";var H=v__default.default.forwardRef(({className:e,...t},r)=>jsxRuntime.jsx(w,{ref:r,variant:"error",className:e,...t}));H.displayName="AlertError";var B=v__default.default.forwardRef(({className:e,...t},r)=>jsxRuntime.jsx(w,{ref:r,variant:"info",className:e,...t}));B.displayName="AlertInfo";function ne({className:e,size:t="md",variant:r="default",text:i,color:s="default"}){let u={sm:"w-6 h-6",md:"w-8 h-8",lg:"w-12 h-12",xl:"w-16 h-16"},a={default:"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80",primary:"border-primary/30 border-t-primary dark:border-primary/20 dark:border-t-primary/80",secondary:"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80",success:"border-green-300 border-t-green-600 dark:border-green-500/50 dark:border-t-green-300",warning:"border-yellow-300 border-t-yellow-600 dark:border-yellow-500/50 dark:border-t-yellow-300",error:"border-red-300 border-t-red-600 dark:border-red-500/50 dark:border-t-red-300",glass:"border-white/50 border-t-white/90 dark:border-slate-400/60 dark:border-t-slate-100"},f=()=>{switch(r){case "dots":return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("style",{children:`
2
- @keyframes dotPulse {
3
- 0%, 80%, 100% { opacity: 0.3; }
4
- 40% { opacity: 1; }
5
- }
6
- `}),jsxRuntime.jsxs("div",{className:"flex space-x-1 items-center",children:[jsxRuntime.jsx("div",{className:"w-2 h-2 bg-current rounded-full",style:{animation:"dotPulse 1.4s ease-in-out infinite",animationDelay:"0ms"}}),jsxRuntime.jsx("div",{className:"w-2 h-2 bg-current rounded-full",style:{animation:"dotPulse 1.4s ease-in-out infinite",animationDelay:"200ms"}}),jsxRuntime.jsx("div",{className:"w-2 h-2 bg-current rounded-full",style:{animation:"dotPulse 1.4s ease-in-out infinite",animationDelay:"400ms"}})]})]});case "bars":return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("style",{children:`
7
- @keyframes barWave {
8
- 0%, 40%, 100% { transform: scaleY(0.4); }
9
- 20% { transform: scaleY(1); }
10
- }
11
- `}),jsxRuntime.jsxs("div",{className:"flex space-x-0.5 h-full items-center",children:[jsxRuntime.jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"0ms"}}),jsxRuntime.jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"100ms"}}),jsxRuntime.jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"200ms"}}),jsxRuntime.jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"300ms"}}),jsxRuntime.jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"400ms"}})]})]});case "ring":return jsxRuntime.jsx("div",{className:o("w-full h-full animate-spin rounded-full",t==="xl"?"border-[3px]":t==="lg"?"border-[2.5px]":"border-2",a[s]||a.default)});case "ripple":return jsxRuntime.jsxs("div",{className:"relative w-full h-full",children:[jsxRuntime.jsx("div",{className:o("absolute inset-0 rounded-full border-2 animate-ping",a[s]||a.default)}),jsxRuntime.jsx("div",{className:o("w-full h-full rounded-full border-2",a[s]||a.default)})]});default:return jsxRuntime.jsx("div",{className:o("w-full h-full animate-spin rounded-full",t==="xl"?"border-[3px]":t==="lg"?"border-[2.5px]":"border-2",a[s]||a.default)})}};return jsxRuntime.jsxs("div",{className:o("flex flex-col items-center justify-center",e),children:[jsxRuntime.jsx("div",{className:o(u[t],"text-muted-foreground"),children:f()}),i&&jsxRuntime.jsx("p",{className:"mt-3 text-sm text-muted-foreground text-center",children:i})]})}var R=v__default.default.forwardRef(({className:e,content:t,children:r,position:i="top",variant:s="default",delay:u=300,disabled:a=false,...f},l)=>{let[g,p]=v__default.default.useState(false),[h,y]=v__default.default.useState({x:0,y:0}),b=v__default.default.useRef(void 0),A=v__default.default.useRef(null),z=F=>{var E;if(a)return;let m=F.currentTarget.getBoundingClientRect();(E=A.current)==null?void 0:E.getBoundingClientRect();let T=0,N=0;switch(i){case "top":T=m.left+m.width/2,N=m.top-8;break;case "bottom":T=m.left+m.width/2,N=m.bottom+8;break;case "left":T=m.left-8,N=m.top+m.height/2;break;case "right":T=m.right+8,N=m.top+m.height/2;break}y({x:T,y:N}),b.current=window.setTimeout(()=>{p(true);},u);},K=()=>{b.current&&clearTimeout(b.current),p(false);};v__default.default.useEffect(()=>()=>{b.current&&clearTimeout(b.current);},[]);let Y=()=>{switch(s){case "light":return "bg-popover text-popover-foreground border border-border shadow-lg";case "dark":return "bg-gray-900 text-white shadow-lg";default:return "bg-gray-800 text-white shadow-lg"}},q=()=>{switch(i){case "top":return "top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800";case "bottom":return "bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800";case "left":return "left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800";case "right":return "right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800";default:return "top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800"}};return jsxRuntime.jsxs("div",{ref:l,className:o("relative inline-block",e),onMouseEnter:z,onMouseLeave:K,...f,children:[r,g&&jsxRuntime.jsxs("div",{ref:A,className:o("fixed z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none",Y()),style:{left:`${h.x}px`,top:`${h.y}px`,transform:"translate(-50%, -50%)"},children:[t,jsxRuntime.jsx("div",{className:o("absolute w-0 h-0 border-4 border-transparent",q())})]})]})});R.displayName="Tooltip";var j=v__default.default.forwardRef(({className:e,...t},r)=>jsxRuntime.jsx(R,{ref:r,variant:"light",className:e,...t}));j.displayName="TooltipLight";var $=v__default.default.forwardRef(({className:e,...t},r)=>jsxRuntime.jsx(R,{ref:r,variant:"dark",className:e,...t}));$.displayName="TooltipDark";exports.Alert=w;exports.AlertError=H;exports.AlertInfo=B;exports.AlertSuccess=I;exports.AlertWarning=_;exports.LoadingSpinner=ne;exports.ToastProvider=oe;exports.Tooltip=R;exports.TooltipDark=$;exports.TooltipLight=j;exports.useToast=X;exports.useToastSafe=re;//# sourceMappingURL=feedback.js.map
12
- //# sourceMappingURL=feedback.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/components/Toast.tsx","../src/components/Alert.tsx","../src/components/LoadingSpinner.tsx","../src/components/Tooltip.tsx"],"names":["merge","inputs","twMerge","clsx","ToastContext","createContext","useToast","context","useContext","noopAddToast","noopRemoveToast","noopClearToasts","useToastSafe","ToastProvider","children","maxToasts","position","toasts","setToasts","useState","removeToast","useCallback","id","prev","toast","addToast","newToast","clearToasts","jsxs","jsx","ToastContainer","positionClasses","ToastItem","onRemove","isVisible","setIsVisible","React","handleRemove","getToastStyles","type","getIconStyles","getToastIcon","Alert","className","variant","title","description","icon","action","closable","onClose","props","ref","getVariantClasses","getIconClasses","getDefaultIcon","AlertSuccess","AlertWarning","AlertError","AlertInfo","LoadingSpinner","size","text","color","sizeClasses","spinnerColors","renderSpinner","Fragment","Tooltip","content","delay","disabled","coords","setCoords","timeoutRef","tooltipRef","showTooltip","e","_a","rect","_tooltipRect","x","y","hideTooltip","getArrowClasses","TooltipLight","TooltipDark"],"mappings":"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","file":"feedback.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 from \"react\"\nimport { createContext, useContext, useState, useCallback } from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Toast 메시지 타입 / Toast message type\n * @typedef {Object} Toast\n * @property {string} id - Toast 고유 ID / Toast unique ID\n * @property {\"success\" | \"error\" | \"warning\" | \"info\"} type - Toast 타입 / Toast type\n * @property {string} [title] - Toast 제목 / Toast title\n * @property {string} message - Toast 메시지 / Toast message\n * @property {number} [duration] - 표시 시간(ms), 0이면 자동 제거 안 함 / Display duration (ms), 0 means no auto-remove\n * @property {Object} [action] - 액션 버튼 / Action button\n * @property {string} action.label - 액션 버튼 레이블 / Action button label\n * @property {() => void} action.onClick - 액션 버튼 클릭 핸들러 / Action button click handler\n */\nexport interface Toast {\n id: string\n type: \"success\" | \"error\" | \"warning\" | \"info\"\n title?: string\n message: string\n duration?: number\n action?: {\n label: string\n onClick: () => void\n }\n}\n\n// Toast Context 타입\ninterface ToastContextType {\n toasts: Toast[]\n addToast: (toast: Omit<Toast, \"id\">) => void\n removeToast: (id: string) => void\n clearToasts: () => void\n}\n\n// Toast Context 생성\nconst ToastContext = createContext<ToastContextType | undefined>(undefined)\n\n/**\n * useToast Hook\n *\n * Toast를 추가, 제거, 초기화하는 훅입니다.\n * ToastProvider 내부에서만 사용 가능합니다.\n *\n * Hook for adding, removing, and clearing toasts.\n * Can only be used within ToastProvider.\n *\n * @example\n * const { addToast, removeToast, clearToasts } = useToast()\n *\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * duration: 3000\n * })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 / Toast context value\n * @throws {Error} ToastProvider 외부에서 사용 시 에러 발생 / Error when used outside ToastProvider\n */\nexport function useToast(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\")\n }\n return context\n}\n\n// No-op functions for safe toast hook\nconst noopAddToast = () => {}\nconst noopRemoveToast = () => {}\nconst noopClearToasts = () => {}\n\n/**\n * useToastSafe Hook\n *\n * ToastProvider 없이도 안전하게 사용할 수 있는 useToast 훅입니다.\n * Provider가 없으면 no-op 함수를 반환합니다.\n *\n * Safe version of useToast that works without ToastProvider.\n * Returns no-op functions when used outside ToastProvider.\n *\n * @example\n * const { addToast } = useToastSafe()\n *\n * // 안전하게 호출 가능 - Provider 없으면 아무 일도 안 함\n * addToast({ type: \"success\", message: \"저장됨\" })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 또는 no-op 함수들\n */\nexport function useToastSafe(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n return {\n toasts: [],\n addToast: noopAddToast,\n removeToast: noopRemoveToast,\n clearToasts: noopClearToasts,\n }\n }\n return context\n}\n\n/**\n * ToastProvider 컴포넌트의 props / ToastProvider component props\n * @typedef {Object} ToastProviderProps\n * @property {React.ReactNode} children - 자식 컴포넌트 / Child components\n * @property {number} [maxToasts=5] - 최대 Toast 개수 / Maximum number of toasts\n * @property {\"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"} [position=\"top-right\"] - Toast 표시 위치 / Toast display position\n */\ninterface ToastProviderProps {\n children: React.ReactNode\n maxToasts?: number\n position?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"\n}\n\n/**\n * ToastProvider 컴포넌트 / ToastProvider component\n * \n * Toast 시스템의 컨텍스트를 제공하는 Provider 컴포넌트입니다.\n * 앱의 루트 레벨에서 사용하여 전역 Toast 기능을 활성화합니다.\n * \n * Provider component that provides context for the Toast system.\n * Use at the root level of your app to enable global Toast functionality.\n * \n * @component\n * @example\n * // App.tsx\n * <ToastProvider position=\"top-center\" maxToasts={3}>\n * <App />\n * </ToastProvider>\n * \n * @example\n * // 컴포넌트에서 사용 / Usage in component\n * const { addToast } = useToast()\n * \n * const handleSave = () => {\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * title: \"성공\"\n * })\n * }\n * \n * @param {ToastProviderProps} props - ToastProvider 컴포넌트의 props / ToastProvider component props\n * @returns {JSX.Element} ToastProvider 컴포넌트 / ToastProvider component\n * \n * @todo 접근성 개선: ToastItem에 role=\"alert\" 또는 role=\"status\" 추가 필요 / Accessibility: Add role=\"alert\" or role=\"status\" to ToastItem\n * @todo 접근성 개선: aria-live=\"polite\" 또는 aria-live=\"assertive\" 추가 필요 / Accessibility: Add aria-live=\"polite\" or aria-live=\"assertive\"\n */\nexport function ToastProvider({\n children,\n maxToasts = 5,\n position = \"top-right\"\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<Toast[]>([])\n\n const removeToast = useCallback((id: string) => {\n setToasts(prev => prev.filter(toast => toast.id !== id))\n }, [])\n\n const addToast = useCallback((toast: Omit<Toast, \"id\">) => {\n const id = Math.random().toString(36).substr(2, 9)\n const newToast: Toast = { ...toast, id }\n\n setToasts(prev => {\n const updatedToasts = [...prev, newToast]\n return updatedToasts.slice(-maxToasts) // 최대 개수 제한\n })\n\n // 자동 제거\n if (toast.duration !== 0) {\n setTimeout(() => {\n removeToast(id)\n }, toast.duration || 5000)\n }\n }, [maxToasts, removeToast])\n\n const clearToasts = useCallback(() => {\n setToasts([])\n }, [])\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast, clearToasts }}>\n {children}\n <ToastContainer toasts={toasts} removeToast={removeToast} position={position} />\n </ToastContext.Provider>\n )\n}\n\n// Toast Container Props\ninterface ToastContainerProps {\n toasts: Toast[]\n removeToast: (id: string) => void\n position: string\n}\n\n// Toast Container\nfunction ToastContainer({ toasts, removeToast, position }: ToastContainerProps) {\n const positionClasses = {\n \"top-right\": \"top-4 right-4\",\n \"top-left\": \"top-4 left-4\",\n \"bottom-right\": \"bottom-4 right-4\",\n \"bottom-left\": \"bottom-4 left-4\",\n \"top-center\": \"top-4 left-1/2 transform -translate-x-1/2\",\n \"bottom-center\": \"bottom-4 left-1/2 transform -translate-x-1/2\"\n }\n\n if (toasts.length === 0) return null\n\n return (\n <div className={merge(\n \"fixed z-50 space-y-3 max-w-sm\", // 12px 간격\n positionClasses[position as keyof typeof positionClasses]\n )}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n )\n}\n\n// Toast Item Props\ninterface ToastItemProps {\n toast: Toast\n onRemove: (id: string) => void\n}\n\n// Toast Item\nfunction ToastItem({ toast, onRemove }: ToastItemProps) {\n const [isVisible, setIsVisible] = useState(false)\n\n React.useEffect(() => {\n setIsVisible(true)\n }, [])\n\n const handleRemove = () => {\n setIsVisible(false)\n setTimeout(() => onRemove(toast.id), 300)\n }\n\n // CSS 변수 기반 배경색 (Tailwind v4 dark: variant + bg-color 충돌 우회)\n // 앱에서 --toast-*-bg 변수 정의 필요\n const getToastStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"bg-[var(--toast-success-bg)] border-green-300 dark:border-green-700 text-green-800 dark:text-green-200 shadow-lg shadow-green-100/50 dark:shadow-none\"\n case \"error\":\n return \"bg-[var(--toast-error-bg)] border-red-300 dark:border-red-700 text-red-800 dark:text-red-200 shadow-lg shadow-red-100/50 dark:shadow-none\"\n case \"warning\":\n return \"bg-[var(--toast-warning-bg)] border-yellow-300 dark:border-yellow-700 text-yellow-800 dark:text-yellow-200 shadow-lg shadow-yellow-100/50 dark:shadow-none\"\n case \"info\":\n return \"bg-[var(--toast-info-bg)] border-indigo-300 dark:border-indigo-700 text-cyan-800 dark:text-cyan-200 shadow-lg shadow-indigo-100/50 dark:shadow-none\"\n }\n }\n\n const getIconStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n }\n }\n\n const getToastIcon = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n }\n }\n\n return (\n <div\n className={merge(\n \"flex items-start p-4 rounded-xl border backdrop-blur-sm transition-all duration-300 transform\",\n getToastStyles(toast.type),\n isVisible\n ? \"translate-x-0 opacity-100 scale-100\"\n : \"translate-x-full opacity-0 scale-95\"\n )}\n style={{\n animation: isVisible ? \"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)\" : undefined\n }}\n >\n {/* 아이콘 */}\n <div className={merge(\"flex-shrink-0 mr-3\", getIconStyles(toast.type))}> {/* 12px 여백 */}\n {getToastIcon(toast.type)}\n </div>\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {toast.title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {toast.title}\n </h4>\n )}\n <p className=\"text-sm leading-relaxed\">\n {toast.message}\n </p>\n\n {/* 액션 버튼 */}\n {toast.action && (\n <button\n onClick={toast.action.onClick}\n className=\"mt-3 text-sm font-medium underline hover:no-underline transition-all duration-200\" // 12px 여백\n >\n {toast.action.label}\n </button>\n )}\n </div>\n\n {/* 닫기 버튼 */}\n <div className=\"flex-shrink-0 ml-4\"> {/* 16px 여백 */}\n <button\n onClick={handleRemove}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconStyles(toast.type)\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n )\n}\n\n// 편의 함수들 (ToastProvider 내부에서만 사용 가능 - 스텁 함수)\nexport const showToast = (_toast: Omit<Toast, \"id\">) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showSuccessToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showErrorToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showWarningToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showInfoToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n} ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Alert 컴포넌트의 props\n * @typedef {Object} AlertProps\n * @property {\"default\" | \"success\" | \"warning\" | \"error\" | \"info\"} [variant=\"default\"] - Alert 스타일 변형\n * @property {string} [title] - Alert 제목\n * @property {string} [description] - Alert 설명\n * @property {React.ReactNode} [icon] - 커스텀 아이콘\n * @property {React.ReactNode} [action] - 액션 버튼/요소\n * @property {boolean} [closable=false] - 닫기 버튼 표시 여부\n * @property {() => void} [onClose] - 닫기 버튼 클릭 시 호출되는 콜백\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\"\n title?: string\n description?: string\n icon?: React.ReactNode\n action?: React.ReactNode\n closable?: boolean\n onClose?: () => void\n}\n\n/**\n * Alert 컴포넌트 / Alert component\n * \n * 사용자에게 중요한 정보나 경고를 표시하는 컴포넌트입니다.\n * 다양한 변형(variant)을 지원하며, 아이콘, 제목, 설명, 액션 버튼을 포함할 수 있습니다.\n * \n * Component for displaying important information or warnings to users.\n * Supports various variants and can include icons, titles, descriptions, and action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Alert variant=\"info\" title=\"정보\" description=\"이것은 정보 메시지입니다.\" />\n * \n * @example\n * // 닫기 버튼 포함 / With close button\n * <Alert \n * variant=\"warning\" \n * title=\"경고\" \n * closable \n * onClose={() => console.log('닫기')}\n * />\n * \n * @example\n * // 커스텀 아이콘과 액션 / Custom icon and action\n * <Alert \n * variant=\"success\"\n * icon={<Icon name=\"check\" />}\n * action={<Button size=\"sm\">확인</Button>}\n * >\n * 작업이 완료되었습니다.\n * </Alert>\n * \n * @param {AlertProps} props - Alert 컴포넌트의 props / Alert component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Alert 컴포넌트 / Alert component\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ \n className, \n variant = \"default\",\n title,\n description,\n icon,\n action,\n closable = false,\n onClose,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"success\":\n return \"bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200\"\n case \"warning\":\n return \"bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200\"\n case \"error\":\n return \"bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200\"\n case \"info\":\n return \"bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200\"\n default:\n return \"bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200\"\n }\n }\n\n const getIconClasses = () => {\n switch (variant) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n default:\n return \"text-muted-foreground\"\n }\n }\n\n const getDefaultIcon = () => {\n switch (variant) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n default:\n return null\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative rounded-lg border p-4\", // 16px 패딩\n getVariantClasses(),\n className\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\"> {/* 12px 간격 */}\n {/* 아이콘 */}\n {(icon || getDefaultIcon()) && (\n <div className={merge(\"flex-shrink-0 mt-0.5\", getIconClasses())}>\n {icon || getDefaultIcon()}\n </div>\n )}\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {title}\n </h4>\n )}\n {description && (\n <p className=\"text-sm leading-relaxed\">\n {description}\n </p>\n )}\n {children && (\n <div className=\"mt-2\"> {/* 8px 여백 */}\n {children}\n </div>\n )}\n </div>\n\n {/* 액션 */}\n {(action || closable) && (\n <div className=\"flex-shrink-0 flex items-center gap-2\"> {/* 8px 간격 */}\n {action}\n {closable && (\n <button\n onClick={onClose}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconClasses()\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\nAlert.displayName = \"Alert\"\n\n// 편의 컴포넌트들\nexport const AlertSuccess = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nAlertSuccess.displayName = \"AlertSuccess\"\n\nexport const AlertWarning = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nAlertWarning.displayName = \"AlertWarning\"\n\nexport const AlertError = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nAlertError.displayName = \"AlertError\"\n\nexport const AlertInfo = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nAlertInfo.displayName = \"AlertInfo\"\n\nexport { Alert } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @typedef {Object} LoadingSpinnerProps\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\"} [size=\"md\"] - Spinner 크기 / Spinner size\n * @property {\"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"} [variant=\"default\"] - Spinner 애니메이션 타입 / Spinner animation type\n * @property {string} [text] - Spinner 아래 표시할 텍스트 / Text to display below spinner\n * @property {\"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"} [color=\"default\"] - Spinner 색상 / Spinner color\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface LoadingSpinnerProps {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n variant?: \"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"\n text?: string\n color?: \"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"\n className?: string\n}\n\n/**\n * LoadingSpinner 컴포넌트 / LoadingSpinner component\n * \n * 로딩 상태를 표시하는 스피너 컴포넌트입니다.\n * 다양한 애니메이션 타입과 크기를 지원합니다.\n * \n * Spinner component that displays loading state.\n * Supports various animation types and sizes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <LoadingSpinner />\n * \n * @example\n * // 텍스트와 함께 / With text\n * <LoadingSpinner \n * text=\"로딩 중...\"\n * size=\"lg\"\n * color=\"primary\"\n * />\n * \n * @example\n * // 다양한 애니메이션 / Various animations\n * <LoadingSpinner variant=\"dots\" />\n * <LoadingSpinner variant=\"bars\" color=\"success\" />\n * <LoadingSpinner variant=\"ripple\" size=\"xl\" />\n * \n * @param {LoadingSpinnerProps} props - LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @returns {JSX.Element} LoadingSpinner 컴포넌트 / LoadingSpinner component\n */\nexport function LoadingSpinner({ \n className, \n size = \"md\", \n variant = \"default\", \n text, \n color = \"default\" \n}: LoadingSpinnerProps) {\n const sizeClasses = {\n sm: \"w-6 h-6\", // 24px - 더 넉넉한 크기\n md: \"w-8 h-8\", // 32px - 더 넉넉한 크기\n lg: \"w-12 h-12\", // 48px - 더 넉넉한 크기\n xl: \"w-16 h-16\" // 64px - 더 넉넉한 크기\n }\n\n // LoadingSpinner는 border 색상을 사용하므로 특화 색상 시스템 사용\n // 다크모드: track(배경)은 밝게, spinner(회전부)는 더 밝게 → 대비 확보\n const spinnerColors: Record<string, string> = {\n default: \"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80\",\n primary: \"border-primary/30 border-t-primary dark:border-primary/20 dark:border-t-primary/80\",\n secondary: \"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80\",\n success: \"border-green-300 border-t-green-600 dark:border-green-500/50 dark:border-t-green-300\",\n warning: \"border-yellow-300 border-t-yellow-600 dark:border-yellow-500/50 dark:border-t-yellow-300\",\n error: \"border-red-300 border-t-red-600 dark:border-red-500/50 dark:border-t-red-300\",\n glass: \"border-white/50 border-t-white/90 dark:border-slate-400/60 dark:border-t-slate-100\"\n }\n\n const renderSpinner = () => {\n switch (variant) {\n case \"dots\":\n // 순차 점멸 애니메이션 (... 형태)\n return (\n <>\n <style>{`\n @keyframes dotPulse {\n 0%, 80%, 100% { opacity: 0.3; }\n 40% { opacity: 1; }\n }\n `}</style>\n <div className=\"flex space-x-1 items-center\">\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '0ms' }} />\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '200ms' }} />\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '400ms' }} />\n </div>\n </>\n )\n case \"bars\":\n return (\n <>\n <style>{`\n @keyframes barWave {\n 0%, 40%, 100% { transform: scaleY(0.4); }\n 20% { transform: scaleY(1); }\n }\n `}</style>\n <div className=\"flex space-x-0.5 h-full items-center\">\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '0ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '100ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '200ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '300ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '400ms' }} />\n </div>\n </>\n )\n case \"ring\":\n return (\n <div className={merge(\n \"w-full h-full animate-spin rounded-full\",\n size === \"xl\" ? \"border-[3px]\" : size === \"lg\" ? \"border-[2.5px]\" : \"border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n case \"ripple\":\n return (\n <div className=\"relative w-full h-full\">\n <div className={merge(\n \"absolute inset-0 rounded-full border-2 animate-ping\",\n spinnerColors[color] || spinnerColors.default\n )} />\n <div className={merge(\n \"w-full h-full rounded-full border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n </div>\n )\n default:\n return (\n <div className={merge(\n \"w-full h-full animate-spin rounded-full\",\n size === \"xl\" ? \"border-[3px]\" : size === \"lg\" ? \"border-[2.5px]\" : \"border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n }\n }\n\n return (\n <div className={merge(\"flex flex-col items-center justify-center\", className)}>\n <div className={merge(sizeClasses[size], \"text-muted-foreground\")}>\n {renderSpinner()}\n </div>\n {text && (\n <p className=\"mt-3 text-sm text-muted-foreground text-center\">\n {text}\n </p>\n )}\n </div>\n )\n} ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Tooltip 컴포넌트의 props / Tooltip component props\n * @typedef {Object} TooltipProps\n * @property {string} content - Tooltip 내용 / Tooltip content\n * @property {React.ReactNode} children - Tooltip이 연결될 요소 / Element to attach tooltip to\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [position=\"top\"] - Tooltip 표시 위치 / Tooltip display position\n * @property {\"default\" | \"light\" | \"dark\"} [variant=\"default\"] - Tooltip 스타일 변형 / Tooltip style variant\n * @property {number} [delay=300] - Tooltip 표시 지연 시간(ms) / Tooltip display delay (ms)\n * @property {boolean} [disabled=false] - Tooltip 비활성화 여부 / Disable tooltip\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {\n content: string\n children: React.ReactNode\n position?: \"top\" | \"bottom\" | \"left\" | \"right\"\n variant?: \"default\" | \"light\" | \"dark\"\n delay?: number\n disabled?: boolean\n}\n\n/**\n * Tooltip 컴포넌트 / Tooltip component\n * \n * 호버 시 추가 정보를 표시하는 툴팁 컴포넌트입니다.\n * 마우스 호버 시 지연 시간 후 표시됩니다.\n * \n * Tooltip component that displays additional information on hover.\n * Appears after a delay when the mouse hovers over the element.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Tooltip content=\"이것은 도움말입니다\">\n * <Button>호버하세요</Button>\n * </Tooltip>\n * \n * @example\n * // 다양한 위치 / Different positions\n * <Tooltip content=\"위치 변경\" position=\"bottom\">\n * <Icon name=\"info\" />\n * </Tooltip>\n * \n * @example\n * // 커스텀 스타일 / Custom styles\n * <Tooltip content=\"라이트 스타일\" variant=\"light\" delay={500}>\n * <span>호버</span>\n * </Tooltip>\n * \n * @param {TooltipProps} props - Tooltip 컴포넌트의 props / Tooltip component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Tooltip 컴포넌트 / Tooltip component\n * \n * @todo 접근성 개선: role=\"tooltip\" 추가 필요 / Accessibility: Add role=\"tooltip\"\n * @todo 접근성 개선: aria-describedby 연결 필요 / Accessibility: Connect aria-describedby\n * @todo 접근성 개선: 키보드 포커스 시 Tooltip 표시 필요 / Accessibility: Show tooltip on keyboard focus\n */\nconst Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n ({ \n className, \n content,\n children,\n position = \"top\",\n variant = \"default\",\n delay = 300,\n disabled = false,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const timeoutRef = React.useRef<number | undefined>(undefined)\n const tooltipRef = React.useRef<HTMLDivElement>(null)\n\n const showTooltip = (e: React.MouseEvent) => {\n if (disabled) return\n \n const rect = e.currentTarget.getBoundingClientRect()\n const _tooltipRect = tooltipRef.current?.getBoundingClientRect()\n \n let x = 0\n let y = 0\n \n switch (position) {\n case \"top\":\n x = rect.left + rect.width / 2\n y = rect.top - 8 // 8px 간격\n break\n case \"bottom\":\n x = rect.left + rect.width / 2\n y = rect.bottom + 8 // 8px 간격\n break\n case \"left\":\n x = rect.left - 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n case \"right\":\n x = rect.right + 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n }\n \n setCoords({ x, y })\n \n timeoutRef.current = window.setTimeout(() => {\n setIsVisible(true)\n }, delay)\n }\n\n const hideTooltip = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n setIsVisible(false)\n }\n\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n const getVariantClasses = () => {\n switch (variant) {\n case \"light\":\n return \"bg-popover text-popover-foreground border border-border shadow-lg\"\n case \"dark\":\n return \"bg-gray-900 text-white shadow-lg\"\n default:\n return \"bg-gray-800 text-white shadow-lg\"\n }\n }\n\n const _getPositionClasses = () => {\n switch (position) {\n case \"top\":\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-1/2 -translate-x-1/2 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-1/2 -translate-y-1/2 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-1/2 -translate-y-1/2 ml-2\" // 8px 간격\n default:\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (position) {\n case \"top\":\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800\"\n default:\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"relative inline-block\", className)}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n {...props}\n >\n {children}\n \n {isVisible && (\n <div\n ref={tooltipRef}\n className={merge(\n \"fixed z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none\", // 12px, 8px 패딩\n getVariantClasses()\n )}\n style={{\n left: `${coords.x}px`,\n top: `${coords.y}px`,\n transform: 'translate(-50%, -50%)'\n }}\n >\n {content}\n {/* 화살표 */}\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n </div>\n )}\n </div>\n )\n }\n)\nTooltip.displayName = \"Tooltip\"\n\n// 편의 컴포넌트들\nexport const TooltipLight = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"light\" className={className} {...props} />\n )\n)\nTooltipLight.displayName = \"TooltipLight\"\n\nexport const TooltipDark = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"dark\" className={className} {...props} />\n )\n)\nTooltipDark.displayName = \"TooltipDark\"\n\nexport { Tooltip } "]}