@hua-labs/ui 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -43
  3. package/dist/{ComponentLayout-BhM4VSoq.d.mts → ComponentLayout-Clf6C2jV.d.mts} +37 -3
  4. package/dist/DashboardSidebar-ZulecqKs.d.mts +54 -0
  5. package/dist/DashboardToolbar-BRZayZNz.d.mts +122 -0
  6. package/dist/EmptyState-SQ3Z6Vf2.d.mts +64 -0
  7. package/dist/{Modal-CrXmb3Ll.d.mts → Modal-DKKtBtbh.d.mts} +12 -6
  8. package/dist/{Section-BWzyshgX.d.mts → Section-DKdIG1sg.d.mts} +11 -12
  9. package/dist/SectionHeader-DHwQ_xh8.d.mts +1653 -0
  10. package/dist/{Switch-Dzm5TLR3.d.mts → Switch-D0l7SJrz.d.mts} +31 -15
  11. package/dist/Tooltip-Cv7nYhPW.d.mts +304 -0
  12. package/dist/advanced/Logo.d.ts +8 -4
  13. package/dist/advanced/Logo.d.ts.map +1 -1
  14. package/dist/advanced/dashboard.d.ts +28 -6
  15. package/dist/advanced/dashboard.d.ts.map +1 -1
  16. package/dist/advanced-dashboard.d.mts +9 -2278
  17. package/dist/advanced-dashboard.mjs +1 -33
  18. package/dist/advanced-dashboard.mjs.map +1 -1
  19. package/dist/advanced-emotion.d.mts +13 -5
  20. package/dist/advanced-emotion.mjs +1 -1
  21. package/dist/advanced-motion.d.mts +136 -56
  22. package/dist/advanced-motion.mjs +1 -1
  23. package/dist/advanced.d.mts +69 -36
  24. package/dist/advanced.mjs +14 -3
  25. package/dist/advanced.mjs.map +1 -1
  26. package/dist/chunk-32OZGTPV.mjs +41 -0
  27. package/dist/chunk-32OZGTPV.mjs.map +1 -0
  28. package/dist/chunk-6WBFZ2KV.mjs +3 -0
  29. package/dist/chunk-6WBFZ2KV.mjs.map +1 -0
  30. package/dist/chunk-7CGJQSJO.mjs +3 -0
  31. package/dist/chunk-7CGJQSJO.mjs.map +1 -0
  32. package/dist/chunk-7T3IUG3G.mjs +3 -0
  33. package/dist/chunk-7T3IUG3G.mjs.map +1 -0
  34. package/dist/chunk-AJOGTUWS.mjs +3 -0
  35. package/dist/chunk-AJOGTUWS.mjs.map +1 -0
  36. package/dist/chunk-AQTSQYH2.mjs +3 -0
  37. package/dist/chunk-AQTSQYH2.mjs.map +1 -0
  38. package/dist/chunk-B2MRZJQA.mjs +3 -0
  39. package/dist/chunk-B2MRZJQA.mjs.map +1 -0
  40. package/dist/chunk-BOX4TONF.mjs +3 -0
  41. package/dist/chunk-BOX4TONF.mjs.map +1 -0
  42. package/dist/chunk-C2DOXNBK.mjs +3 -0
  43. package/dist/chunk-C2DOXNBK.mjs.map +1 -0
  44. package/dist/chunk-CQBMR7VU.mjs +3 -0
  45. package/dist/chunk-CQBMR7VU.mjs.map +1 -0
  46. package/dist/chunk-CYAAAEPJ.mjs +3 -0
  47. package/dist/chunk-CYAAAEPJ.mjs.map +1 -0
  48. package/dist/chunk-D7MTTTQY.mjs +8 -0
  49. package/dist/chunk-D7MTTTQY.mjs.map +1 -0
  50. package/dist/chunk-DABVKUJN.mjs +3 -0
  51. package/dist/chunk-DABVKUJN.mjs.map +1 -0
  52. package/dist/chunk-EK6BLFVQ.mjs +3 -0
  53. package/dist/chunk-EK6BLFVQ.mjs.map +1 -0
  54. package/dist/chunk-FVUAVGP5.mjs +3 -0
  55. package/dist/chunk-FVUAVGP5.mjs.map +1 -0
  56. package/dist/chunk-GAIUZVNC.mjs +3 -0
  57. package/dist/chunk-GAIUZVNC.mjs.map +1 -0
  58. package/dist/chunk-HLBIIF4I.mjs +3 -0
  59. package/dist/chunk-HLBIIF4I.mjs.map +1 -0
  60. package/dist/chunk-I6NCGF6E.mjs +3 -0
  61. package/dist/chunk-I6NCGF6E.mjs.map +1 -0
  62. package/dist/chunk-J46VEBVF.mjs +3 -0
  63. package/dist/chunk-J46VEBVF.mjs.map +1 -0
  64. package/dist/chunk-JNW3CLCA.mjs +3 -0
  65. package/dist/chunk-JNW3CLCA.mjs.map +1 -0
  66. package/dist/chunk-JY3QVUGW.mjs +3 -0
  67. package/dist/chunk-JY3QVUGW.mjs.map +1 -0
  68. package/dist/chunk-KHBZOGUU.mjs +3 -0
  69. package/dist/chunk-KHBZOGUU.mjs.map +1 -0
  70. package/dist/chunk-KPNNAQLI.mjs +3 -0
  71. package/dist/chunk-KPNNAQLI.mjs.map +1 -0
  72. package/dist/chunk-L2LGSILS.mjs +13 -0
  73. package/dist/chunk-L2LGSILS.mjs.map +1 -0
  74. package/dist/chunk-LPHUWTQ2.mjs +3 -0
  75. package/dist/chunk-LPHUWTQ2.mjs.map +1 -0
  76. package/dist/chunk-M4JE7TQL.mjs +3 -0
  77. package/dist/chunk-M4JE7TQL.mjs.map +1 -0
  78. package/dist/chunk-MEDKGNLV.mjs +3 -0
  79. package/dist/chunk-MEDKGNLV.mjs.map +1 -0
  80. package/dist/chunk-MR46CSMC.mjs +3 -0
  81. package/dist/chunk-MR46CSMC.mjs.map +1 -0
  82. package/dist/chunk-NSDWT2JM.mjs +3 -0
  83. package/dist/chunk-NSDWT2JM.mjs.map +1 -0
  84. package/dist/chunk-OBMOTQEU.mjs +3 -0
  85. package/dist/chunk-OBMOTQEU.mjs.map +1 -0
  86. package/dist/chunk-RICRFXFP.mjs +3 -0
  87. package/dist/chunk-RICRFXFP.mjs.map +1 -0
  88. package/dist/chunk-SOK7VBSM.mjs +13 -0
  89. package/dist/chunk-SOK7VBSM.mjs.map +1 -0
  90. package/dist/chunk-SPZ7SZH4.mjs +3 -0
  91. package/dist/chunk-SPZ7SZH4.mjs.map +1 -0
  92. package/dist/chunk-TB3DARQO.mjs +3 -0
  93. package/dist/chunk-TB3DARQO.mjs.map +1 -0
  94. package/dist/chunk-TND4HPKW.mjs +51 -0
  95. package/dist/chunk-TND4HPKW.mjs.map +1 -0
  96. package/dist/chunk-TSAXVD2H.mjs +35 -0
  97. package/dist/chunk-TSAXVD2H.mjs.map +1 -0
  98. package/dist/chunk-UR3TIWBS.mjs +3 -0
  99. package/dist/chunk-UR3TIWBS.mjs.map +1 -0
  100. package/dist/chunk-XU2XBAEW.mjs +3 -0
  101. package/dist/chunk-XU2XBAEW.mjs.map +1 -0
  102. package/dist/chunk-XXHDNZTG.mjs +3 -0
  103. package/dist/chunk-XXHDNZTG.mjs.map +1 -0
  104. package/dist/chunk-YW5DA7Q6.mjs +3 -0
  105. package/dist/chunk-YW5DA7Q6.mjs.map +1 -0
  106. package/dist/chunk-ZTHUGQZL.mjs +3 -0
  107. package/dist/chunk-ZTHUGQZL.mjs.map +1 -0
  108. package/dist/chunk-ZVCGC6EV.mjs +3 -0
  109. package/dist/chunk-ZVCGC6EV.mjs.map +1 -0
  110. package/dist/chunk-ZZ67E3M5.mjs +3 -0
  111. package/dist/chunk-ZZ67E3M5.mjs.map +1 -0
  112. package/dist/{common-YLvZxA_K.d.mts → common-Bej8Okcg.d.mts} +1 -1
  113. package/dist/components/Accordion.d.ts +14 -7
  114. package/dist/components/Accordion.d.ts.map +1 -1
  115. package/dist/components/Action.d.ts.map +1 -1
  116. package/dist/components/ActionToolbar.d.ts +10 -6
  117. package/dist/components/ActionToolbar.d.ts.map +1 -1
  118. package/dist/components/Alert.d.ts +16 -2
  119. package/dist/components/Alert.d.ts.map +1 -1
  120. package/dist/components/Autocomplete.d.ts +6 -4
  121. package/dist/components/Autocomplete.d.ts.map +1 -1
  122. package/dist/components/Avatar.d.ts +20 -7
  123. package/dist/components/Avatar.d.ts.map +1 -1
  124. package/dist/components/Badge.d.ts +27 -9
  125. package/dist/components/Badge.d.ts.map +1 -1
  126. package/dist/components/Bookmark.d.ts +4 -2
  127. package/dist/components/Bookmark.d.ts.map +1 -1
  128. package/dist/components/BottomSheet.d.ts +13 -9
  129. package/dist/components/BottomSheet.d.ts.map +1 -1
  130. package/dist/components/Box.d.ts +9 -0
  131. package/dist/components/Box.d.ts.map +1 -0
  132. package/dist/components/Breadcrumb.d.ts +9 -4
  133. package/dist/components/Breadcrumb.d.ts.map +1 -1
  134. package/dist/components/Button.d.ts +3 -29
  135. package/dist/components/Button.d.ts.map +1 -1
  136. package/dist/components/Button.variants.d.ts +54 -10
  137. package/dist/components/Button.variants.d.ts.map +1 -1
  138. package/dist/components/Card.d.ts +49 -14
  139. package/dist/components/Card.d.ts.map +1 -1
  140. package/dist/components/ChatMessage.d.ts +3 -2
  141. package/dist/components/ChatMessage.d.ts.map +1 -1
  142. package/dist/components/Checkbox.d.ts +5 -2
  143. package/dist/components/Checkbox.d.ts.map +1 -1
  144. package/dist/components/CodeBlock.d.ts +8 -5
  145. package/dist/components/CodeBlock.d.ts.map +1 -1
  146. package/dist/components/ColorPicker.d.ts +4 -2
  147. package/dist/components/ColorPicker.d.ts.map +1 -1
  148. package/dist/components/Command.d.ts +28 -14
  149. package/dist/components/Command.d.ts.map +1 -1
  150. package/dist/components/ComponentLayout.d.ts +5 -2
  151. package/dist/components/ComponentLayout.d.ts.map +1 -1
  152. package/dist/components/ConfirmModal.d.ts +4 -0
  153. package/dist/components/ConfirmModal.d.ts.map +1 -1
  154. package/dist/components/Container.d.ts +18 -5
  155. package/dist/components/Container.d.ts.map +1 -1
  156. package/dist/components/ContextMenu.d.ts +36 -36
  157. package/dist/components/ContextMenu.d.ts.map +1 -1
  158. package/dist/components/DatePicker.d.ts +12 -5
  159. package/dist/components/DatePicker.d.ts.map +1 -1
  160. package/dist/components/Divider.d.ts +2 -1
  161. package/dist/components/Divider.d.ts.map +1 -1
  162. package/dist/components/Drawer.d.ts +17 -12
  163. package/dist/components/Drawer.d.ts.map +1 -1
  164. package/dist/components/Dropdown.d.ts +25 -7
  165. package/dist/components/Dropdown.d.ts.map +1 -1
  166. package/dist/components/EmotionAnalysis.d.ts +3 -1
  167. package/dist/components/EmotionAnalysis.d.ts.map +1 -1
  168. package/dist/components/EmotionButton.d.ts +3 -1
  169. package/dist/components/EmotionButton.d.ts.map +1 -1
  170. package/dist/components/EmotionMeter.d.ts +3 -1
  171. package/dist/components/EmotionMeter.d.ts.map +1 -1
  172. package/dist/components/EmotionSelector.d.ts +3 -1
  173. package/dist/components/EmotionSelector.d.ts.map +1 -1
  174. package/dist/components/FeatureCard.d.ts +9 -3
  175. package/dist/components/FeatureCard.d.ts.map +1 -1
  176. package/dist/components/Form.d.ts +20 -54
  177. package/dist/components/Form.d.ts.map +1 -1
  178. package/dist/components/FormControl.d.ts +3 -2
  179. package/dist/components/FormControl.d.ts.map +1 -1
  180. package/dist/components/Grid.d.ts +11 -4
  181. package/dist/components/Grid.d.ts.map +1 -1
  182. package/dist/components/HeroSection.d.ts +4 -2
  183. package/dist/components/HeroSection.d.ts.map +1 -1
  184. package/dist/components/Icon/Icon.d.ts +12 -8
  185. package/dist/components/Icon/Icon.d.ts.map +1 -1
  186. package/dist/components/IconsaxGallery/index.d.ts +8 -5
  187. package/dist/components/IconsaxGallery/index.d.ts.map +1 -1
  188. package/dist/components/InfoCard.d.ts +5 -2
  189. package/dist/components/InfoCard.d.ts.map +1 -1
  190. package/dist/components/Input.d.ts +29 -4
  191. package/dist/components/Input.d.ts.map +1 -1
  192. package/dist/components/Label.d.ts +15 -10
  193. package/dist/components/Label.d.ts.map +1 -1
  194. package/dist/components/LanguageToggle.d.ts +5 -3
  195. package/dist/components/LanguageToggle.d.ts.map +1 -1
  196. package/dist/components/Link.d.ts +17 -6
  197. package/dist/components/Link.d.ts.map +1 -1
  198. package/dist/components/LoadingSpinner.d.ts +7 -3
  199. package/dist/components/LoadingSpinner.d.ts.map +1 -1
  200. package/dist/components/Menu.d.ts +59 -60
  201. package/dist/components/Menu.d.ts.map +1 -1
  202. package/dist/components/Modal.d.ts +12 -6
  203. package/dist/components/Modal.d.ts.map +1 -1
  204. package/dist/components/Navigation.d.ts +26 -11
  205. package/dist/components/Navigation.d.ts.map +1 -1
  206. package/dist/components/NumberInput.d.ts +5 -2
  207. package/dist/components/NumberInput.d.ts.map +1 -1
  208. package/dist/components/PageNavigation.d.ts +6 -3
  209. package/dist/components/PageNavigation.d.ts.map +1 -1
  210. package/dist/components/PageTransition.d.ts +2 -2
  211. package/dist/components/PageTransition.d.ts.map +1 -1
  212. package/dist/components/Pagination.d.ts +5 -2
  213. package/dist/components/Pagination.d.ts.map +1 -1
  214. package/dist/components/Panel.d.ts +1 -7
  215. package/dist/components/Panel.d.ts.map +1 -1
  216. package/dist/components/Popover.d.ts +25 -9
  217. package/dist/components/Popover.d.ts.map +1 -1
  218. package/dist/components/Pressable.d.ts +14 -0
  219. package/dist/components/Pressable.d.ts.map +1 -0
  220. package/dist/components/Progress.d.ts +36 -13
  221. package/dist/components/Progress.d.ts.map +1 -1
  222. package/dist/components/Prose.d.ts +51 -0
  223. package/dist/components/Prose.d.ts.map +1 -0
  224. package/dist/components/Radio.d.ts +29 -33
  225. package/dist/components/Radio.d.ts.map +1 -1
  226. package/dist/components/ScrollArea.d.ts +8 -9
  227. package/dist/components/ScrollArea.d.ts.map +1 -1
  228. package/dist/components/ScrollIndicator.d.ts +9 -8
  229. package/dist/components/ScrollIndicator.d.ts.map +1 -1
  230. package/dist/components/ScrollProgress.d.ts +3 -2
  231. package/dist/components/ScrollProgress.d.ts.map +1 -1
  232. package/dist/components/ScrollToTop.d.ts +5 -5
  233. package/dist/components/ScrollToTop.d.ts.map +1 -1
  234. package/dist/components/Section.d.ts +12 -9
  235. package/dist/components/Section.d.ts.map +1 -1
  236. package/dist/components/SectionHeader.d.ts +3 -2
  237. package/dist/components/SectionHeader.d.ts.map +1 -1
  238. package/dist/components/Select.d.ts +18 -5
  239. package/dist/components/Select.d.ts.map +1 -1
  240. package/dist/components/Skeleton.d.ts +43 -15
  241. package/dist/components/Skeleton.d.ts.map +1 -1
  242. package/dist/components/Slider.d.ts +7 -5
  243. package/dist/components/Slider.d.ts.map +1 -1
  244. package/dist/components/Stack.d.ts +22 -6
  245. package/dist/components/Stack.d.ts.map +1 -1
  246. package/dist/components/StatsPanel.d.ts +4 -2
  247. package/dist/components/StatsPanel.d.ts.map +1 -1
  248. package/dist/components/Switch.d.ts +9 -4
  249. package/dist/components/Switch.d.ts.map +1 -1
  250. package/dist/components/Table.d.ts +43 -18
  251. package/dist/components/Table.d.ts.map +1 -1
  252. package/dist/components/Tabs.d.ts +50 -77
  253. package/dist/components/Tabs.d.ts.map +1 -1
  254. package/dist/components/Text.d.ts +11 -0
  255. package/dist/components/Text.d.ts.map +1 -0
  256. package/dist/components/Textarea.d.ts +24 -6
  257. package/dist/components/Textarea.d.ts.map +1 -1
  258. package/dist/components/ThemeToggle.d.ts +18 -27
  259. package/dist/components/ThemeToggle.d.ts.map +1 -1
  260. package/dist/components/Timeline.d.ts +4 -2
  261. package/dist/components/Timeline.d.ts.map +1 -1
  262. package/dist/components/Toast.d.ts +1 -1
  263. package/dist/components/Toast.d.ts.map +1 -1
  264. package/dist/components/Toggle.d.ts +11 -2
  265. package/dist/components/Toggle.d.ts.map +1 -1
  266. package/dist/components/Tooltip.d.ts +5 -2
  267. package/dist/components/Tooltip.d.ts.map +1 -1
  268. package/dist/components/Upload.d.ts +5 -3
  269. package/dist/components/Upload.d.ts.map +1 -1
  270. package/dist/components/advanced/AdvancedPageTransition.d.ts +7 -5
  271. package/dist/components/advanced/AdvancedPageTransition.d.ts.map +1 -1
  272. package/dist/components/advanced/AnimatedGradient.d.ts +6 -2
  273. package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
  274. package/dist/components/advanced/Carousel.d.ts +3 -1
  275. package/dist/components/advanced/Carousel.d.ts.map +1 -1
  276. package/dist/components/advanced/DotNav.d.ts +12 -5
  277. package/dist/components/advanced/DotNav.d.ts.map +1 -1
  278. package/dist/components/advanced/GlowCard.d.ts +4 -1
  279. package/dist/components/advanced/GlowCard.d.ts.map +1 -1
  280. package/dist/components/advanced/HorizontalScroll.d.ts +4 -1
  281. package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -1
  282. package/dist/components/advanced/ImageReveal.d.ts +23 -1
  283. package/dist/components/advanced/ImageReveal.d.ts.map +1 -1
  284. package/dist/components/advanced/Marquee.d.ts +4 -2
  285. package/dist/components/advanced/Marquee.d.ts.map +1 -1
  286. package/dist/components/advanced/Parallax.d.ts +4 -2
  287. package/dist/components/advanced/Parallax.d.ts.map +1 -1
  288. package/dist/components/advanced/SpotlightCard.d.ts +13 -12
  289. package/dist/components/advanced/SpotlightCard.d.ts.map +1 -1
  290. package/dist/components/advanced/TextReveal.d.ts +5 -1
  291. package/dist/components/advanced/TextReveal.d.ts.map +1 -1
  292. package/dist/components/advanced/TiltCard.d.ts +6 -2
  293. package/dist/components/advanced/TiltCard.d.ts.map +1 -1
  294. package/dist/components/advanced/VideoBackground.d.ts +4 -1
  295. package/dist/components/advanced/VideoBackground.d.ts.map +1 -1
  296. package/dist/components/advanced/blog-editor/BlogEditor.d.ts +4 -2
  297. package/dist/components/advanced/blog-editor/BlogEditor.d.ts.map +1 -1
  298. package/dist/components/advanced/blog-editor/BlogEditorActions.d.ts +4 -2
  299. package/dist/components/advanced/blog-editor/BlogEditorActions.d.ts.map +1 -1
  300. package/dist/components/advanced/blog-editor/BlogEditorContent.d.ts +4 -2
  301. package/dist/components/advanced/blog-editor/BlogEditorContent.d.ts.map +1 -1
  302. package/dist/components/advanced/blog-editor/BlogEditorHeader.d.ts +4 -2
  303. package/dist/components/advanced/blog-editor/BlogEditorHeader.d.ts.map +1 -1
  304. package/dist/components/advanced/blog-editor/BlogEditorLanguageTabs.d.ts +4 -2
  305. package/dist/components/advanced/blog-editor/BlogEditorLanguageTabs.d.ts.map +1 -1
  306. package/dist/components/advanced/blog-editor/BlogEditorMetadata.d.ts +5 -3
  307. package/dist/components/advanced/blog-editor/BlogEditorMetadata.d.ts.map +1 -1
  308. package/dist/components/advanced/blog-editor/BlogEditorPreview.d.ts +5 -3
  309. package/dist/components/advanced/blog-editor/BlogEditorPreview.d.ts.map +1 -1
  310. package/dist/components/advanced/blog-editor/BlogEditorToolbar.d.ts +4 -2
  311. package/dist/components/advanced/blog-editor/BlogEditorToolbar.d.ts.map +1 -1
  312. package/dist/components/advanced/blog-editor/BlogEditorTranslate.d.ts +4 -2
  313. package/dist/components/advanced/blog-editor/BlogEditorTranslate.d.ts.map +1 -1
  314. package/dist/components/advanced/blog-editor/types.d.ts +5 -2
  315. package/dist/components/advanced/blog-editor/types.d.ts.map +1 -1
  316. package/dist/components/advanced/emotion/EmotionAnalysis.d.ts +3 -1
  317. package/dist/components/advanced/emotion/EmotionAnalysis.d.ts.map +1 -1
  318. package/dist/components/advanced/emotion/EmotionButton.d.ts +3 -1
  319. package/dist/components/advanced/emotion/EmotionButton.d.ts.map +1 -1
  320. package/dist/components/advanced/emotion/EmotionMeter.d.ts +4 -2
  321. package/dist/components/advanced/emotion/EmotionMeter.d.ts.map +1 -1
  322. package/dist/components/advanced/emotion/EmotionSelector.d.ts +3 -1
  323. package/dist/components/advanced/emotion/EmotionSelector.d.ts.map +1 -1
  324. package/dist/components/dashboard/ActivityFeed.d.ts +5 -2
  325. package/dist/components/dashboard/ActivityFeed.d.ts.map +1 -1
  326. package/dist/components/dashboard/BarChart.d.ts +3 -2
  327. package/dist/components/dashboard/BarChart.d.ts.map +1 -1
  328. package/dist/components/dashboard/DashboardGrid.d.ts +13 -3
  329. package/dist/components/dashboard/DashboardGrid.d.ts.map +1 -1
  330. package/dist/components/dashboard/DashboardSidebar.d.ts +15 -82
  331. package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -1
  332. package/dist/components/dashboard/DashboardToolbar.d.ts +3 -2
  333. package/dist/components/dashboard/DashboardToolbar.d.ts.map +1 -1
  334. package/dist/components/dashboard/EmptyState.d.ts +3 -2
  335. package/dist/components/dashboard/EmptyState.d.ts.map +1 -1
  336. package/dist/components/dashboard/MembershipBadge.d.ts +3 -2
  337. package/dist/components/dashboard/MembershipBadge.d.ts.map +1 -1
  338. package/dist/components/dashboard/MerchantList.d.ts +3 -2
  339. package/dist/components/dashboard/MerchantList.d.ts.map +1 -1
  340. package/dist/components/dashboard/MetricCard.d.ts +3 -2
  341. package/dist/components/dashboard/MetricCard.d.ts.map +1 -1
  342. package/dist/components/dashboard/MiniBarChart.d.ts +3 -2
  343. package/dist/components/dashboard/MiniBarChart.d.ts.map +1 -1
  344. package/dist/components/dashboard/NotificationCard.d.ts +5 -2
  345. package/dist/components/dashboard/NotificationCard.d.ts.map +1 -1
  346. package/dist/components/dashboard/ProfileCard.d.ts +5 -2
  347. package/dist/components/dashboard/ProfileCard.d.ts.map +1 -1
  348. package/dist/components/dashboard/ProgressCard.d.ts +6 -3
  349. package/dist/components/dashboard/ProgressCard.d.ts.map +1 -1
  350. package/dist/components/dashboard/QuickActionCard.d.ts +22 -27
  351. package/dist/components/dashboard/QuickActionCard.d.ts.map +1 -1
  352. package/dist/components/dashboard/RoutingBreakdownCard.d.ts +3 -2
  353. package/dist/components/dashboard/RoutingBreakdownCard.d.ts.map +1 -1
  354. package/dist/components/dashboard/SettlementTimeline.d.ts +3 -2
  355. package/dist/components/dashboard/SettlementTimeline.d.ts.map +1 -1
  356. package/dist/components/dashboard/StatCard.d.ts +7 -4
  357. package/dist/components/dashboard/StatCard.d.ts.map +1 -1
  358. package/dist/components/dashboard/SummaryCard.d.ts +6 -3
  359. package/dist/components/dashboard/SummaryCard.d.ts.map +1 -1
  360. package/dist/components/dashboard/TransactionDetailDrawer.d.ts +2 -2
  361. package/dist/components/dashboard/TransactionDetailDrawer.d.ts.map +1 -1
  362. package/dist/components/dashboard/TransactionsTable.d.ts +3 -2
  363. package/dist/components/dashboard/TransactionsTable.d.ts.map +1 -1
  364. package/dist/components/dashboard/TrendChart.d.ts +3 -2
  365. package/dist/components/dashboard/TrendChart.d.ts.map +1 -1
  366. package/dist/components/dashboard/YearlyHeatmap.d.ts +4 -2
  367. package/dist/components/dashboard/YearlyHeatmap.d.ts.map +1 -1
  368. package/dist/components/dashboard/kanban/KanbanAddCard.d.ts.map +1 -1
  369. package/dist/components/dashboard/kanban/KanbanAddColumn.d.ts.map +1 -1
  370. package/dist/components/dashboard/kanban/KanbanBoard.d.ts.map +1 -1
  371. package/dist/components/dashboard/kanban/KanbanCard.d.ts.map +1 -1
  372. package/dist/components/dashboard/kanban/KanbanColumn.d.ts.map +1 -1
  373. package/dist/components/dashboard/kanban/KanbanColumnHeader.d.ts.map +1 -1
  374. package/dist/components/dashboard/kanban/KanbanDropIndicator.d.ts.map +1 -1
  375. package/dist/components/dashboard/kanban/index.d.ts +1 -1
  376. package/dist/components/dashboard/kanban/types.d.ts +24 -12
  377. package/dist/components/dashboard/kanban/types.d.ts.map +1 -1
  378. package/dist/components/scrollbar/scrollbar.d.ts +2 -1
  379. package/dist/components/scrollbar/scrollbar.d.ts.map +1 -1
  380. package/dist/context/MotionConfigContext.d.ts +41 -0
  381. package/dist/context/MotionConfigContext.d.ts.map +1 -0
  382. package/dist/data.d.mts +55 -23
  383. package/dist/data.d.ts +45 -3
  384. package/dist/data.d.ts.map +1 -1
  385. package/dist/data.mjs +2 -2
  386. package/dist/data.mjs.map +1 -1
  387. package/dist/feedback.d.mts +6 -293
  388. package/dist/feedback.d.ts +7 -5
  389. package/dist/feedback.d.ts.map +1 -1
  390. package/dist/feedback.mjs +1 -1
  391. package/dist/form.d.mts +99 -114
  392. package/dist/form.mjs +8 -3
  393. package/dist/form.mjs.map +1 -1
  394. package/dist/hooks/index.d.ts +6 -0
  395. package/dist/hooks/index.d.ts.map +1 -1
  396. package/dist/hooks/useAnimatedEntrance.d.ts +24 -0
  397. package/dist/hooks/useAnimatedEntrance.d.ts.map +1 -0
  398. package/dist/hooks/useBreakpoint.d.ts +22 -0
  399. package/dist/hooks/useBreakpoint.d.ts.map +1 -0
  400. package/dist/hooks/useDotEnv.d.ts +12 -0
  401. package/dist/hooks/useDotEnv.d.ts.map +1 -0
  402. package/dist/hooks/useDotMap.d.ts +38 -0
  403. package/dist/hooks/useDotMap.d.ts.map +1 -0
  404. package/dist/iconsax-extended.mjs +2 -2
  405. package/dist/iconsax-extended.mjs.map +1 -1
  406. package/dist/iconsax.mjs +2 -2
  407. package/dist/iconsax.mjs.map +1 -1
  408. package/dist/index.d.mts +358 -127
  409. package/dist/index.d.ts +74 -64
  410. package/dist/index.d.ts.map +1 -1
  411. package/dist/index.mjs +15 -15
  412. package/dist/index.mjs.map +1 -1
  413. package/dist/interactive/kanban.d.ts +12 -0
  414. package/dist/interactive/kanban.d.ts.map +1 -0
  415. package/dist/interactive-kanban.d.mts +378 -0
  416. package/dist/interactive-kanban.mjs +3 -0
  417. package/dist/interactive-kanban.mjs.map +1 -0
  418. package/dist/interactive.d.mts +193 -197
  419. package/dist/interactive.d.ts +7 -5
  420. package/dist/interactive.d.ts.map +1 -1
  421. package/dist/interactive.mjs +1 -1
  422. package/dist/interactive.mjs.map +1 -1
  423. package/dist/landing/LandingAbout.d.ts +2 -2
  424. package/dist/landing/LandingAbout.d.ts.map +1 -1
  425. package/dist/landing/LandingCTA.d.ts +2 -2
  426. package/dist/landing/LandingCTA.d.ts.map +1 -1
  427. package/dist/landing/LandingContact.d.ts +2 -2
  428. package/dist/landing/LandingContact.d.ts.map +1 -1
  429. package/dist/landing/LandingExperience.d.ts +1 -1
  430. package/dist/landing/LandingExperience.d.ts.map +1 -1
  431. package/dist/landing/LandingFeatures.d.ts +1 -1
  432. package/dist/landing/LandingFeatures.d.ts.map +1 -1
  433. package/dist/landing/LandingHero.d.ts +2 -2
  434. package/dist/landing/LandingHero.d.ts.map +1 -1
  435. package/dist/landing/LandingLogoCloud.d.ts +2 -2
  436. package/dist/landing/LandingLogoCloud.d.ts.map +1 -1
  437. package/dist/landing/LandingMetrics.d.ts +1 -1
  438. package/dist/landing/LandingMetrics.d.ts.map +1 -1
  439. package/dist/landing/LandingProjects.d.ts +1 -1
  440. package/dist/landing/LandingProjects.d.ts.map +1 -1
  441. package/dist/landing/LandingShowcase.d.ts +2 -2
  442. package/dist/landing/LandingShowcase.d.ts.map +1 -1
  443. package/dist/landing/LandingSkills.d.ts +1 -1
  444. package/dist/landing/LandingSkills.d.ts.map +1 -1
  445. package/dist/landing/LandingStats.d.ts +1 -1
  446. package/dist/landing/LandingStats.d.ts.map +1 -1
  447. package/dist/landing/LandingTestimonials.d.ts +1 -1
  448. package/dist/landing/LandingTestimonials.d.ts.map +1 -1
  449. package/dist/landing/types.d.ts +42 -30
  450. package/dist/landing/types.d.ts.map +1 -1
  451. package/dist/landing.d.mts +47 -37
  452. package/dist/landing.mjs +4 -20
  453. package/dist/landing.mjs.map +1 -1
  454. package/dist/lib/Slot.d.ts.map +1 -1
  455. package/dist/lib/icon-providers.d.ts +17 -3
  456. package/dist/lib/icon-providers.d.ts.map +1 -1
  457. package/dist/lib/styles/animation.d.ts +35 -0
  458. package/dist/lib/styles/animation.d.ts.map +1 -0
  459. package/dist/lib/styles/disabled.d.ts +15 -0
  460. package/dist/lib/styles/disabled.d.ts.map +1 -0
  461. package/dist/lib/styles/focus.d.ts +34 -0
  462. package/dist/lib/styles/focus.d.ts.map +1 -0
  463. package/dist/lib/styles/glass.d.ts +18 -0
  464. package/dist/lib/styles/glass.d.ts.map +1 -0
  465. package/dist/lib/styles/hover.d.ts +9 -0
  466. package/dist/lib/styles/hover.d.ts.map +1 -0
  467. package/dist/lib/styles/index.d.ts +6 -0
  468. package/dist/lib/styles/index.d.ts.map +1 -1
  469. package/dist/lib/styles/transition.d.ts +42 -0
  470. package/dist/lib/styles/transition.d.ts.map +1 -0
  471. package/dist/lib/types/common.d.ts +3 -3
  472. package/dist/lib/types/common.d.ts.map +1 -1
  473. package/dist/native/Box.d.ts +11 -0
  474. package/dist/native/Box.d.ts.map +1 -0
  475. package/dist/native/Pressable.d.ts +10 -0
  476. package/dist/native/Pressable.d.ts.map +1 -0
  477. package/dist/native/Text.d.ts +11 -0
  478. package/dist/native/Text.d.ts.map +1 -0
  479. package/dist/native/index.d.ts +9 -0
  480. package/dist/native/index.d.ts.map +1 -0
  481. package/dist/native/useDotMap.d.ts +51 -0
  482. package/dist/native/useDotMap.d.ts.map +1 -0
  483. package/dist/native.mjs +2 -0
  484. package/dist/native.mjs.map +1 -0
  485. package/dist/navigation.d.mts +48 -21
  486. package/dist/navigation.d.ts +10 -8
  487. package/dist/navigation.d.ts.map +1 -1
  488. package/dist/navigation.mjs +1 -1
  489. package/dist/navigation.mjs.map +1 -1
  490. package/dist/overlay.d.mts +84 -37
  491. package/dist/overlay.mjs +2 -2
  492. package/dist/overlay.mjs.map +1 -1
  493. package/dist/sdui/SDUIRenderer.d.ts.map +1 -1
  494. package/dist/sdui/core.d.ts +50 -0
  495. package/dist/sdui/core.d.ts.map +1 -0
  496. package/dist/sdui/index.d.ts +3 -1
  497. package/dist/sdui/index.d.ts.map +1 -1
  498. package/dist/sdui/registry.d.ts.map +1 -1
  499. package/dist/sdui/types.d.ts +38 -0
  500. package/dist/sdui/types.d.ts.map +1 -1
  501. package/dist/sdui.d.mts +89 -1
  502. package/dist/sdui.mjs +2 -2
  503. package/dist/sdui.mjs.map +1 -1
  504. package/package.json +39 -15
  505. package/src/styles/component-vars.css +503 -69
  506. package/src/styles/landing.css +12 -12
  507. package/src/styles/prose.css +284 -0
  508. package/src/styles/recommended-theme.css +123 -141
  509. package/src/styles/utilities.css +3 -3
  510. package/dist/chunk-5DPW7SVD.mjs +0 -4
  511. package/dist/chunk-5DPW7SVD.mjs.map +0 -1
  512. package/dist/chunk-5L5HIPKA.mjs +0 -3
  513. package/dist/chunk-5L5HIPKA.mjs.map +0 -1
  514. package/dist/chunk-CNW22G24.mjs +0 -13
  515. package/dist/chunk-CNW22G24.mjs.map +0 -1
  516. package/dist/chunk-CW66UBQG.mjs +0 -3
  517. package/dist/chunk-CW66UBQG.mjs.map +0 -1
  518. package/dist/chunk-EPY3432E.mjs +0 -3
  519. package/dist/chunk-EPY3432E.mjs.map +0 -1
  520. package/dist/chunk-F2M4YDDQ.mjs +0 -3
  521. package/dist/chunk-F2M4YDDQ.mjs.map +0 -1
  522. package/dist/chunk-FHMFDCX2.mjs +0 -3
  523. package/dist/chunk-FHMFDCX2.mjs.map +0 -1
  524. package/dist/chunk-HBIUCLFL.mjs +0 -3
  525. package/dist/chunk-HBIUCLFL.mjs.map +0 -1
  526. package/dist/chunk-HEBXAFRY.mjs +0 -3
  527. package/dist/chunk-HEBXAFRY.mjs.map +0 -1
  528. package/dist/chunk-IG47LMOD.mjs +0 -3
  529. package/dist/chunk-IG47LMOD.mjs.map +0 -1
  530. package/dist/chunk-J47ZEXEL.mjs +0 -3
  531. package/dist/chunk-J47ZEXEL.mjs.map +0 -1
  532. package/dist/chunk-K2FOFIST.mjs +0 -3
  533. package/dist/chunk-K2FOFIST.mjs.map +0 -1
  534. package/dist/chunk-LL6QPRD7.mjs +0 -3
  535. package/dist/chunk-LL6QPRD7.mjs.map +0 -1
  536. package/dist/chunk-NMJLOK6M.mjs +0 -3
  537. package/dist/chunk-NMJLOK6M.mjs.map +0 -1
  538. package/dist/chunk-O24K56OS.mjs +0 -3
  539. package/dist/chunk-O24K56OS.mjs.map +0 -1
  540. package/dist/chunk-OIWG3IJ7.mjs +0 -3
  541. package/dist/chunk-OIWG3IJ7.mjs.map +0 -1
  542. package/dist/chunk-OLLU7ZFH.mjs +0 -3
  543. package/dist/chunk-OLLU7ZFH.mjs.map +0 -1
  544. package/dist/chunk-Q76JW7X5.mjs +0 -73
  545. package/dist/chunk-Q76JW7X5.mjs.map +0 -1
  546. package/dist/chunk-QRM66RQG.mjs +0 -3
  547. package/dist/chunk-QRM66RQG.mjs.map +0 -1
  548. package/dist/chunk-QRRP7TGF.mjs +0 -13
  549. package/dist/chunk-QRRP7TGF.mjs.map +0 -1
  550. package/dist/chunk-SD6XGDAC.mjs +0 -3
  551. package/dist/chunk-SD6XGDAC.mjs.map +0 -1
  552. package/dist/chunk-SDFVGFXT.mjs +0 -3
  553. package/dist/chunk-SDFVGFXT.mjs.map +0 -1
  554. package/dist/chunk-SMLDNOV3.mjs +0 -8
  555. package/dist/chunk-SMLDNOV3.mjs.map +0 -1
  556. package/dist/chunk-TAP6MYDW.mjs +0 -3
  557. package/dist/chunk-TAP6MYDW.mjs.map +0 -1
  558. package/dist/chunk-TBZ645BI.mjs +0 -3
  559. package/dist/chunk-TBZ645BI.mjs.map +0 -1
  560. package/dist/chunk-V2DNYJR6.mjs +0 -3
  561. package/dist/chunk-V2DNYJR6.mjs.map +0 -1
  562. package/dist/chunk-VBABZXL7.mjs +0 -3
  563. package/dist/chunk-VBABZXL7.mjs.map +0 -1
  564. package/dist/chunk-WYBSHTGY.mjs +0 -3
  565. package/dist/chunk-WYBSHTGY.mjs.map +0 -1
  566. package/dist/chunk-ZQUMJQYV.mjs +0 -3
  567. package/dist/chunk-ZQUMJQYV.mjs.map +0 -1
  568. package/dist/chunk-ZY23NOT4.mjs +0 -3
  569. package/dist/chunk-ZY23NOT4.mjs.map +0 -1
  570. package/dist/components/EmptyState.d.ts +0 -62
  571. package/dist/components/EmptyState.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Dropdown.tsx","../src/components/Drawer.tsx"],"names":["resolveFloatingPlacement","placement","align","ARROW_SIZE","Dropdown","React","className","trigger","children","controlledOpen","onOpenChange","offset","disabled","showArrow","props","ref","internalOpen","setInternalOpen","arrowRef","isControlled","isOpen","handleOpenChange","newOpen","floatingPlacement","middleware","offsetMiddleware","flip","shift","arrowMiddleware","refs","floatingStyles","context","useFloating","autoUpdate","click","useClick","dismiss","useDismiss","role","useRole","getReferenceProps","getFloatingProps","useInteractions","jsxs","merge","jsx","FloatingPortal","FloatingArrow","DropdownItem","icon","variant","DropdownSeparator","DropdownLabel","DropdownMenu","DropdownGroup","Drawer","onClose","side","size","showBackdrop","backdropClassName","closeOnBackdropClick","closeOnEscape","closable","_isOpen","handleClose","isVisible","setIsVisible","isAnimating","setIsAnimating","timer","handleEscapeKey","e","sizeClasses","sideClasses","transformClasses","DrawerHeader","showCloseButton","Icon","DrawerContent","DrawerFooter"],"mappings":"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","file":"chunk-OIWG3IJ7.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport {\n useFloating,\n autoUpdate,\n offset as offsetMiddleware,\n flip,\n shift,\n arrow as arrowMiddleware,\n useClick,\n useDismiss,\n useRole,\n useInteractions,\n FloatingPortal,\n FloatingArrow,\n type Placement,\n} from \"@floating-ui/react\"\nimport { merge } from \"../lib/utils\"\n\nexport interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {\n trigger: React.ReactNode\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\"\n align?: \"start\" | \"center\" | \"end\"\n offset?: number\n disabled?: boolean\n showArrow?: boolean\n}\n\nfunction resolveFloatingPlacement(\n placement: \"top\" | \"bottom\" | \"left\" | \"right\",\n align: \"start\" | \"center\" | \"end\"\n): Placement {\n if (align === \"center\") return placement\n return `${placement}-${align}`\n}\n\nconst ARROW_SIZE = 8\n\nconst Dropdown = React.forwardRef<HTMLDivElement, DropdownProps>(\n ({\n className,\n trigger,\n children,\n open: controlledOpen,\n onOpenChange,\n placement = \"bottom\",\n align = \"start\",\n offset = 8,\n disabled = false,\n showArrow = false,\n ...props\n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const arrowRef = React.useRef<SVGSVGElement>(null)\n\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const handleOpenChange = React.useCallback((newOpen: boolean) => {\n if (disabled && newOpen) return\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }, [disabled, isControlled, onOpenChange])\n\n const floatingPlacement = resolveFloatingPlacement(placement, align)\n\n const middleware = [\n offsetMiddleware(offset),\n flip(),\n shift({ padding: 8 }),\n ]\n if (showArrow) {\n middleware.push(arrowMiddleware({ element: arrowRef, padding: 8 }))\n }\n\n const { refs, floatingStyles, context } = useFloating({\n open: isOpen,\n onOpenChange: handleOpenChange,\n placement: floatingPlacement,\n middleware,\n whileElementsMounted: autoUpdate,\n })\n\n const click = useClick(context)\n const dismiss = useDismiss(context)\n const role = useRole(context, { role: \"menu\" })\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n click,\n dismiss,\n role,\n ])\n\n return (\n <div ref={ref} className={merge(\"relative inline-block\", className)} {...props}>\n {/* Trigger */}\n <div\n ref={refs.setReference}\n className=\"inline-block cursor-pointer\"\n {...getReferenceProps()}\n >\n {trigger}\n </div>\n\n {/* Dropdown via Portal */}\n {isOpen && (\n <FloatingPortal>\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n className={merge(\n \"z-50 bg-[var(--dropdown-bg,_#fff)] dark:bg-[var(--dropdown-bg,_rgb(31,41,55))] rounded-lg shadow-lg border border-border\",\n \"min-w-[var(--reference-width)] w-max py-1\"\n )}\n {...getFloatingProps()}\n >\n {showArrow && (\n <FloatingArrow\n ref={arrowRef}\n context={context}\n width={ARROW_SIZE * 2}\n height={ARROW_SIZE}\n className=\"fill-[var(--dropdown-bg,_#fff)] dark:fill-[var(--dropdown-bg,_rgb(31,41,55))] [&>path:first-of-type]:stroke-border\"\n />\n )}\n {children}\n </div>\n </FloatingPortal>\n )}\n </div>\n )\n }\n)\nDropdown.displayName = \"Dropdown\"\n\n// Sub-components (unchanged)\nexport interface DropdownItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n variant?: \"default\" | \"destructive\" | \"disabled\"\n}\n\nconst DropdownItem = React.forwardRef<HTMLButtonElement, DropdownItemProps>(\n ({\n className,\n icon,\n variant = \"default\",\n children,\n disabled,\n ...props\n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"destructive\":\n return \"text-destructive hover:bg-destructive/10\"\n case \"disabled\":\n return \"text-muted-foreground cursor-not-allowed\"\n default:\n return \"text-foreground hover:bg-muted\"\n }\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n \"w-full flex items-center gap-2 px-3 py-2 text-sm font-medium transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:bg-muted\",\n getVariantClasses(),\n className\n )}\n disabled={disabled || variant === \"disabled\"}\n {...props}\n >\n {icon && (\n <div className=\"flex-shrink-0 w-4 h-4\">\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-left\">{children}</span>\n </button>\n )\n }\n)\nDropdownItem.displayName = \"DropdownItem\"\n\nexport interface DropdownSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst DropdownSeparator = React.forwardRef<HTMLDivElement, DropdownSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"h-px bg-border my-2\", className)}\n {...props}\n />\n )\n)\nDropdownSeparator.displayName = \"DropdownSeparator\"\n\nexport interface DropdownLabelProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst DropdownLabel = React.forwardRef<HTMLDivElement, DropdownLabelProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"px-4 py-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownLabel.displayName = \"DropdownLabel\"\n\nconst DropdownMenu = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"py-1\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownMenu.displayName = \"DropdownMenu\"\n\nconst DropdownGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-1\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownGroup.displayName = \"DropdownGroup\"\n\nexport { Dropdown, DropdownItem, DropdownSeparator, DropdownLabel, DropdownMenu, DropdownGroup }\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Drawer 컴포넌트의 props / Drawer component props\n * @typedef {Object} DrawerProps\n * @property {boolean} open - Drawer 열림/닫힘 상태 / Drawer open/close state\n * @property {(open: boolean) => void} onOpenChange - 상태 변경 콜백 / State change callback\n * @property {React.ReactNode} children - Drawer 내용 / Drawer content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"left\" | \"right\" | \"top\" | \"bottom\"} [side=\"right\"] - Drawer 표시 위치 / Drawer display position\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"} [size=\"md\"] - Drawer 크기 / Drawer size\n * @property {boolean} [showBackdrop=true] - 배경 오버레이 표시 여부 / Show backdrop overlay\n * @property {string} [backdropClassName] - 배경 오버레이 추가 CSS 클래스 / Backdrop overlay additional CSS class\n * @property {boolean} [closeOnBackdropClick=true] - 배경 클릭 시 닫기 여부 / Close on backdrop click\n * @property {boolean} [closeOnEscape=true] - ESC 키로 닫기 여부 / Close on ESC key\n */\ninterface DrawerProps {\n /** Drawer 열림/닫힘 상태 / Drawer open/close state */\n isOpen?: boolean\n /** Drawer 닫기 콜백 / Drawer close callback */\n onClose?: () => void\n /** Drawer 내용 / Drawer content */\n children: React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS class */\n className?: string\n /** Drawer 표시 위치 / Drawer display position */\n side?: \"left\" | \"right\" | \"top\" | \"bottom\"\n /** Drawer 크기 / Drawer size */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n /** 배경 오버레이 표시 여부 / Show backdrop overlay */\n showBackdrop?: boolean\n /** 배경 오버레이 추가 CSS 클래스 / Backdrop overlay additional CSS class */\n backdropClassName?: string\n /** 배경 클릭 시 닫기 여부 / Close on backdrop click */\n closeOnBackdropClick?: boolean\n /** ESC 키로 닫기 여부 / Close on ESC key */\n closeOnEscape?: boolean\n /** 닫기 버튼 표시 여부 / Show close button */\n closable?: boolean\n}\n\n/**\n * Drawer 컴포넌트 / Drawer component\n * \n * 사이드에서 슬라이드되는 패널 컴포넌트입니다.\n * Modal과 유사하지만 특정 방향에서 슬라이드되는 애니메이션을 제공합니다.\n * ESC 키로 닫기, 배경 클릭으로 닫기 기능을 지원합니다.\n * \n * Panel component that slides from the side.\n * Similar to Modal but provides slide animation from a specific direction.\n * Supports closing with ESC key and backdrop click.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [open, setOpen] = useState(false)\n * \n * <Drawer open={open} onOpenChange={setOpen}>\n * <DrawerHeader>제목</DrawerHeader>\n * <DrawerContent>내용</DrawerContent>\n * <DrawerFooter>\n * <Button onClick={() => setOpen(false)}>닫기</Button>\n * </DrawerFooter>\n * </Drawer>\n * \n * @example\n * // 왼쪽에서 열기 / Open from left\n * <Drawer open={open} onOpenChange={setOpen} side=\"left\" size=\"lg\">\n * <DrawerContent>사이드바 내용</DrawerContent>\n * </Drawer>\n * \n * @param {DrawerProps} props - Drawer 컴포넌트의 props / Drawer component props\n * @param {React.Ref<HTMLDivElement>} ref - Drawer 컨테이너 ref / Drawer container ref\n * @returns {JSX.Element} Drawer 컴포넌트 / Drawer component\n * \n * @todo 접근성 개선: role=\"dialog\", aria-modal=\"true\" 추가 필요 / Accessibility: Add role=\"dialog\", aria-modal=\"true\"\n * @todo 접근성 개선: aria-labelledby, aria-describedby 연결 필요 / Accessibility: Connect aria-labelledby, aria-describedby\n */\nconst Drawer = React.forwardRef<HTMLDivElement, DrawerProps>(\n ({\n isOpen,\n onClose,\n children,\n className,\n side = \"right\",\n size = \"md\",\n showBackdrop = true,\n backdropClassName,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n closable = true,\n ...props\n }, ref) => {\n const _isOpen = isOpen ?? false\n const handleClose = () => {\n onClose?.()\n }\n\n const [isVisible, setIsVisible] = React.useState(false)\n const [isAnimating, setIsAnimating] = React.useState(false)\n\n React.useEffect(() => {\n if (_isOpen) {\n setIsVisible(true)\n setIsAnimating(true)\n // 애니메이션 시작을 위한 지연\n const timer = setTimeout(() => setIsAnimating(false), 50)\n return () => clearTimeout(timer)\n } else {\n setIsAnimating(true)\n const timer = setTimeout(() => {\n setIsVisible(false)\n setIsAnimating(false)\n }, 300) // 애니메이션 완료 후 숨김\n return () => clearTimeout(timer)\n }\n }, [_isOpen])\n\n React.useEffect(() => {\n if (!closeOnEscape) return\n\n const handleEscapeKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && _isOpen) {\n handleClose()\n }\n }\n\n if (_isOpen) {\n document.addEventListener(\"keydown\", handleEscapeKey)\n document.body.style.overflow = \"hidden\"\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscapeKey)\n document.body.style.overflow = \"\"\n }\n }, [_isOpen, closeOnEscape])\n\n if (!isVisible) return null\n\n const sizeClasses = {\n sm: side === \"left\" || side === \"right\" ? \"w-80\" : \"h-64\",\n md: side === \"left\" || side === \"right\" ? \"w-96\" : \"h-96\",\n lg: side === \"left\" || side === \"right\" ? \"w-[28rem]\" : \"h-[32rem]\",\n xl: side === \"left\" || side === \"right\" ? \"w-[32rem]\" : \"h-[40rem]\",\n full: side === \"left\" || side === \"right\" ? \"w-full\" : \"h-full\"\n }\n\n const sideClasses = {\n left: \"left-0 top-0 h-full\",\n right: \"right-0 top-0 h-full\",\n top: \"top-0 left-0 w-full\",\n bottom: \"bottom-0 left-0 w-full\"\n }\n\n // Transform: _isOpen=true -> visible position, _isOpen=false -> hidden position\n const transformClasses = {\n left: _isOpen ? \"translate-x-0\" : \"-translate-x-full\",\n right: _isOpen ? \"translate-x-0\" : \"translate-x-full\",\n top: _isOpen ? \"translate-y-0\" : \"-translate-y-full\",\n bottom: _isOpen ? \"translate-y-0\" : \"translate-y-full\"\n }\n\n return (\n <div className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n {showBackdrop && (\n <div\n className={merge(\n \"absolute inset-0 bg-black/85 backdrop-blur-md transition-opacity duration-300\",\n isAnimating ? (_isOpen ? \"opacity-100\" : \"opacity-0\") : \"\",\n backdropClassName\n )}\n onClick={closeOnBackdropClick ? handleClose : undefined}\n />\n )}\n\n {/* Drawer Content */}\n <div\n ref={ref}\n className={merge(\n \"absolute bg-background/95 backdrop-blur-xl border border-border/50 shadow-2xl transition-transform duration-300 ease-out\",\n sizeClasses[size],\n sideClasses[side],\n transformClasses[side],\n className\n )}\n {...props}\n >\n {children}\n </div>\n </div>\n )\n }\n)\nDrawer.displayName = \"Drawer\"\n\n/**\n * DrawerHeader 컴포넌트의 props / DrawerHeader component props\n * @typedef {Object} DrawerHeaderProps\n * @property {React.ReactNode} children - 헤더 내용 / Header content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [showCloseButton=true] - 닫기 버튼 표시 여부 / Show close button\n * @property {() => void} [onClose] - 닫기 버튼 클릭 콜백 / Close button click callback\n */\ninterface DrawerHeaderProps {\n children: React.ReactNode\n className?: string\n showCloseButton?: boolean\n onClose?: () => void\n}\n\n/**\n * DrawerHeader 컴포넌트 / DrawerHeader component\n * Drawer의 헤더 영역을 표시합니다.\n * Displays the header area of a Drawer.\n * \n * @component\n * @param {DrawerHeaderProps} props - DrawerHeader 컴포넌트의 props / DrawerHeader component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerHeader 컴포넌트 / DrawerHeader component\n */\nconst DrawerHeader = React.forwardRef<HTMLDivElement, DrawerHeaderProps>(\n ({ children, className, showCloseButton = true, onClose, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex items-center justify-between p-6 border-b border-border/50\", className)}\n {...props}\n >\n <div className=\"flex-1\">{children}</div>\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-muted transition-colors\"\n >\n <Icon name=\"close\" size={20} />\n </button>\n )}\n </div>\n )\n }\n)\nDrawerHeader.displayName = \"DrawerHeader\"\n\n/**\n * DrawerContent 컴포넌트의 props / DrawerContent component props\n * @typedef {Object} DrawerContentProps\n * @property {React.ReactNode} children - 콘텐츠 / Content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface DrawerContentProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * DrawerContent 컴포넌트 / DrawerContent component\n * Drawer의 메인 콘텐츠 영역을 표시합니다.\n * Displays the main content area of a Drawer.\n * \n * @component\n * @param {DrawerContentProps} props - DrawerContent 컴포넌트의 props / DrawerContent component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerContent 컴포넌트 / DrawerContent component\n */\nconst DrawerContent = React.forwardRef<HTMLDivElement, DrawerContentProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex-1 p-6 overflow-y-auto\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nDrawerContent.displayName = \"DrawerContent\"\n\n/**\n * DrawerFooter 컴포넌트의 props / DrawerFooter component props\n * @typedef {Object} DrawerFooterProps\n * @property {React.ReactNode} children - 푸터 내용 / Footer content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface DrawerFooterProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * DrawerFooter 컴포넌트 / DrawerFooter component\n * Drawer의 푸터 영역을 표시합니다. 주로 액션 버튼을 배치합니다.\n * Displays the footer area of a Drawer. Typically used for action buttons.\n * \n * @component\n * @param {DrawerFooterProps} props - DrawerFooter 컴포넌트의 props / DrawerFooter component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerFooter 컴포넌트 / DrawerFooter component\n */\nconst DrawerFooter = React.forwardRef<HTMLDivElement, DrawerFooterProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex items-center justify-end gap-3 p-6 border-t border-border/50\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nDrawerFooter.displayName = \"DrawerFooter\"\n\nexport { Drawer, DrawerHeader, DrawerContent, DrawerFooter } "]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {a}from'./chunk-QEMPERUK.mjs';import w from'react';import {jsxs,jsx}from'react/jsx-runtime';var R=w.forwardRef(({value:r,defaultValue:B=0,min:n,max:a$1,step:k=1,onChange:p,disabled:s=false,size:E="md",showButtons:N=true,buttonLayout:H="horizontal",className:y,...c},x)=>{let[V,z]=w.useState(B),f=r!==void 0,i=f?r:V,l=w.useCallback(o=>{let t=o;n!==void 0&&(t=Math.max(n,t)),a$1!==void 0&&(t=Math.min(a$1,t)),f||z(t),p==null||p(t);},[f,n,a$1,p]),v=()=>{s||l(i+k);},m=()=>{s||l(i-k);},C=o=>{let t=o.target.value;if(t===""||t==="-")return;let g=parseFloat(t);isNaN(g)||(n!==void 0&&g<n?l(n):l(g));},I=o=>{var t;n!==void 0&&i<n&&l(n),a$1!==void 0&&i>a$1&&l(a$1),(t=c.onBlur)==null||t.call(c,o);},L=o=>{o.key==="ArrowUp"?(o.preventDefault(),v()):o.key==="ArrowDown"&&(o.preventDefault(),m());},d={sm:{input:"h-8 text-sm px-2 py-1",button:"w-8 h-8 text-sm",wrapper:"gap-1"},md:{input:"h-10 text-sm px-3 py-2",button:"w-10 h-10 text-sm",wrapper:"gap-2"},lg:{input:"h-12 text-base px-4 py-2.5",button:"w-12 h-12 text-base",wrapper:"gap-2"}}[E],b=a("flex items-center justify-center rounded-md border border-input bg-background","hover:bg-secondary hover:border-primary/50 active:scale-95","transition-all duration-150","disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-background","focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2",d.button),M=n===void 0||i>n,D=a$1===void 0||i<a$1;return H==="vertical"?jsxs("div",{className:a("inline-flex items-center",d.wrapper,y),children:[jsxs("div",{className:"flex flex-col gap-0.5",children:[jsx("button",{type:"button",onClick:v,disabled:s||!D,className:a(b,"rounded-b-none h-[calc(50%-1px)]"),"aria-label":"Increase",children:jsx(K,{className:"w-3 h-3"})}),jsx("button",{type:"button",onClick:m,disabled:s||!M,className:a(b,"rounded-t-none h-[calc(50%-1px)]"),"aria-label":"Decrease",children:jsx(W,{className:"w-3 h-3"})})]}),jsx("input",{ref:x,type:"text",inputMode:"numeric",pattern:n!==void 0&&n>=0?"[0-9]*":"-?[0-9]*",value:i,onChange:C,onKeyDown:L,onBlur:I,disabled:s,className:a("w-16 text-center rounded-md border border-input bg-background","focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50","[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",d.input),...c})]}):jsxs("div",{className:a("inline-flex items-center",d.wrapper,y),children:[N&&jsx("button",{type:"button",onClick:m,disabled:s||!M,className:b,"aria-label":"Decrease",children:jsx(T,{className:"w-3.5 h-3.5"})}),jsx("input",{ref:x,type:"text",inputMode:"numeric",pattern:n!==void 0&&n>=0?"[0-9]*":"-?[0-9]*",value:i,onChange:C,onKeyDown:L,onBlur:I,disabled:s,className:a("w-16 text-center rounded-md border border-input bg-background","focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50","[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",d.input),...c}),N&&jsx("button",{type:"button",onClick:v,disabled:s||!D,className:b,"aria-label":"Increase",children:jsx(j,{className:"w-3.5 h-3.5"})})]})});R.displayName="NumberInput";function T({className:r}){return jsx("svg",{className:r,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M20 12H4"})})}function j({className:r}){return jsx("svg",{className:r,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 4v16m8-8H4"})})}function K({className:r}){return jsx("svg",{className:r,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 15l7-7 7 7"})})}function W({className:r}){return jsx("svg",{className:r,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})}export{R as a};//# sourceMappingURL=chunk-OLLU7ZFH.mjs.map
3
- //# sourceMappingURL=chunk-OLLU7ZFH.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/NumberInput.tsx"],"names":["NumberInput","React","controlledValue","defaultValue","min","max","step","onChange","disabled","size","showButtons","buttonLayout","className","props","ref","internalValue","setInternalValue","isControlled","currentValue","updateValue","newValue","clampedValue","increment","decrement","handleInputChange","e","inputValue","handleBlur","_a","handleKeyDown","sizes","buttonBase","merge","canDecrement","canIncrement","jsxs","jsx","ChevronUp","ChevronDown","Minus","Plus"],"mappings":"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","file":"chunk-OLLU7ZFH.mjs","sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\n\n/**\n * NumberInput 컴포넌트의 props / NumberInput component props\n * @typedef {Object} NumberInputProps\n * @property {number} [value] - 현재 값 / Current value\n * @property {number} [defaultValue=0] - 기본 값 / Default value\n * @property {number} [min] - 최소 값 / Minimum value\n * @property {number} [max] - 최대 값 / Maximum value\n * @property {number} [step=1] - 증감 단위 / Step amount\n * @property {(value: number) => void} [onChange] - 값 변경 콜백 / Value change callback\n * @property {boolean} [disabled=false] - 비활성화 / Disabled state\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {boolean} [showButtons=true] - +/- 버튼 표시 / Show +/- buttons\n * @property {\"horizontal\" | \"vertical\"} [buttonLayout=\"horizontal\"] - 버튼 배치 / Button layout\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface NumberInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"value\" | \"defaultValue\" | \"size\" | \"type\"> {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n showButtons?: boolean;\n buttonLayout?: \"horizontal\" | \"vertical\";\n}\n\n/**\n * NumberInput 컴포넌트 / NumberInput component\n *\n * 숫자 입력을 위한 컴포넌트로, 커스텀 +/- 버튼을 제공합니다.\n * 브라우저 기본 스피너 대신 스타일링된 버튼을 사용합니다.\n *\n * Number input component with custom +/- buttons.\n * Uses styled buttons instead of browser default spinners.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <NumberInput value={count} onChange={setCount} />\n *\n * @example\n * // 범위 지정 / With range\n * <NumberInput min={0} max={100} step={5} />\n *\n * @example\n * // 세로 버튼 / Vertical buttons\n * <NumberInput buttonLayout=\"vertical\" />\n */\nconst NumberInput = React.forwardRef<HTMLInputElement, NumberInputProps>(\n (\n {\n value: controlledValue,\n defaultValue = 0,\n min,\n max,\n step = 1,\n onChange,\n disabled = false,\n size = \"md\",\n showButtons = true,\n buttonLayout = \"horizontal\",\n className,\n ...props\n },\n ref\n ) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n const updateValue = React.useCallback(\n (newValue: number) => {\n // Clamp to min/max\n let clampedValue = newValue;\n if (min !== undefined) clampedValue = Math.max(min, clampedValue);\n if (max !== undefined) clampedValue = Math.min(max, clampedValue);\n\n if (!isControlled) {\n setInternalValue(clampedValue);\n }\n onChange?.(clampedValue);\n },\n [isControlled, min, max, onChange]\n );\n\n const increment = () => {\n if (disabled) return;\n updateValue(currentValue + step);\n };\n\n const decrement = () => {\n if (disabled) return;\n updateValue(currentValue - step);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n // Allow empty string, minus sign alone (for typing negative numbers), or valid numbers\n if (inputValue === \"\" || inputValue === \"-\") {\n return;\n }\n const newValue = parseFloat(inputValue);\n if (!isNaN(newValue)) {\n // If min is set, enforce it on direct input\n if (min !== undefined && newValue < min) {\n updateValue(min);\n } else {\n updateValue(newValue);\n }\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n // On blur, ensure value is within bounds\n if (min !== undefined && currentValue < min) {\n updateValue(min);\n }\n if (max !== undefined && currentValue > max) {\n updateValue(max);\n }\n props.onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n increment();\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n decrement();\n }\n };\n\n // Spacing system: 4px grid\n // sm: h-8 (32px), px-2 (8px), gap-1 (4px)\n // md: h-10 (40px), px-3 (12px), gap-2 (8px)\n // lg: h-12 (48px), px-4 (16px), gap-2 (8px)\n const sizeClasses = {\n sm: {\n input: \"h-8 text-sm px-2 py-1\",\n button: \"w-8 h-8 text-sm\",\n wrapper: \"gap-1\",\n },\n md: {\n input: \"h-10 text-sm px-3 py-2\",\n button: \"w-10 h-10 text-sm\",\n wrapper: \"gap-2\",\n },\n lg: {\n input: \"h-12 text-base px-4 py-2.5\",\n button: \"w-12 h-12 text-base\",\n wrapper: \"gap-2\",\n },\n };\n\n const sizes = sizeClasses[size];\n\n const buttonBase = merge(\n \"flex items-center justify-center rounded-md border border-input bg-background\",\n \"hover:bg-secondary hover:border-primary/50 active:scale-95\",\n \"transition-all duration-150\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-background\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n sizes.button\n );\n\n const canDecrement = min === undefined || currentValue > min;\n const canIncrement = max === undefined || currentValue < max;\n\n if (buttonLayout === \"vertical\") {\n return (\n <div className={merge(\"inline-flex items-center\", sizes.wrapper, className)}>\n <div className=\"flex flex-col gap-0.5\">\n <button\n type=\"button\"\n onClick={increment}\n disabled={disabled || !canIncrement}\n className={merge(buttonBase, \"rounded-b-none h-[calc(50%-1px)]\")}\n aria-label=\"Increase\"\n >\n <ChevronUp className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={decrement}\n disabled={disabled || !canDecrement}\n className={merge(buttonBase, \"rounded-t-none h-[calc(50%-1px)]\")}\n aria-label=\"Decrease\"\n >\n <ChevronDown className=\"w-3 h-3\" />\n </button>\n </div>\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n pattern={min !== undefined && min >= 0 ? \"[0-9]*\" : \"-?[0-9]*\"}\n value={currentValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n disabled={disabled}\n className={merge(\n \"w-16 text-center rounded-md border border-input bg-background\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\",\n sizes.input\n )}\n {...props}\n />\n </div>\n );\n }\n\n return (\n <div className={merge(\"inline-flex items-center\", sizes.wrapper, className)}>\n {showButtons && (\n <button\n type=\"button\"\n onClick={decrement}\n disabled={disabled || !canDecrement}\n className={buttonBase}\n aria-label=\"Decrease\"\n >\n <Minus className=\"w-3.5 h-3.5\" />\n </button>\n )}\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n pattern={min !== undefined && min >= 0 ? \"[0-9]*\" : \"-?[0-9]*\"}\n value={currentValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n disabled={disabled}\n className={merge(\n \"w-16 text-center rounded-md border border-input bg-background\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\",\n sizes.input\n )}\n {...props}\n />\n {showButtons && (\n <button\n type=\"button\"\n onClick={increment}\n disabled={disabled || !canIncrement}\n className={buttonBase}\n aria-label=\"Increase\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n );\n }\n);\n\nNumberInput.displayName = \"NumberInput\";\n\n// Simple icon components to avoid external dependency\nfunction Minus({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 12H4\" />\n </svg>\n );\n}\n\nfunction Plus({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n );\n}\n\nfunction ChevronUp({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n );\n}\n\nfunction ChevronDown({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\nexport { NumberInput };\n"]}
@@ -1,73 +0,0 @@
1
- "use client";
2
- import {a as a$1}from'./chunk-SD6XGDAC.mjs';import {a}from'./chunk-QEMPERUK.mjs';import W,{useRef,useState,useEffect,useCallback}from'react';import {jsxs,jsx,Fragment}from'react/jsx-runtime';var Me=W.forwardRef(({children:a$1,className:u,direction:t="left",speed:n=50,pauseOnHover:y=true,pauseOnClick:R=false,gap:g=16,gradient:C=true,gradientColor:w="hsl(var(--background))",gradientWidth:d=100,style:c,...m},T)=>{let v=useRef(null),[f,N]=useState(0),[E,k]=useState(0),[h,s]=useState(false),M=t==="left"||t==="right",X=t==="right"||t==="down";useEffect(()=>{let L=v.current;if(!L)return;let S=L.firstElementChild;if(!S)return;let B=()=>{M?N(S.offsetWidth):k(S.offsetHeight);};B();let P=new ResizeObserver(B);return P.observe(S),()=>P.disconnect()},[M,a$1]);let O={"--marquee-duration":`${M?f/n:E/n}s`,"--marquee-gap":`${g}px`},j=C?{"--gradient-color":w,"--gradient-width":`${d}px`}:{};return jsxs("div",{ref:T,className:a("relative overflow-hidden",C&&"marquee-gradient",u),style:{...c,...j},onMouseEnter:()=>y&&s(true),onMouseLeave:()=>y&&s(false),onClick:()=>R&&s(!h),...m,children:[jsxs("div",{ref:v,className:a("flex",M?"flex-row":"flex-col",h?"animate-pause":"",M?X?"animate-marquee-right":"animate-marquee-left":X?"animate-marquee-down":"animate-marquee-up"),style:O,children:[jsx("div",{className:a("flex shrink-0",M?"flex-row":"flex-col"),style:{gap:g},children:a$1}),jsx("div",{className:a("flex shrink-0",M?"flex-row":"flex-col"),style:{gap:g,[M?"marginLeft":"marginTop"]:g},"aria-hidden":"true",children:a$1})]}),jsx("style",{dangerouslySetInnerHTML:{__html:`
3
- @keyframes marquee-left {
4
- from { transform: translateX(0); }
5
- to { transform: translateX(calc(-50% - var(--marquee-gap) / 2)); }
6
- }
7
- @keyframes marquee-right {
8
- from { transform: translateX(calc(-50% - var(--marquee-gap) / 2)); }
9
- to { transform: translateX(0); }
10
- }
11
- @keyframes marquee-up {
12
- from { transform: translateY(0); }
13
- to { transform: translateY(calc(-50% - var(--marquee-gap) / 2)); }
14
- }
15
- @keyframes marquee-down {
16
- from { transform: translateY(calc(-50% - var(--marquee-gap) / 2)); }
17
- to { transform: translateY(0); }
18
- }
19
- .animate-marquee-left { animation: marquee-left var(--marquee-duration) linear infinite; }
20
- .animate-marquee-right { animation: marquee-right var(--marquee-duration) linear infinite; }
21
- .animate-marquee-up { animation: marquee-up var(--marquee-duration) linear infinite; }
22
- .animate-marquee-down { animation: marquee-down var(--marquee-duration) linear infinite; }
23
- .animate-pause { animation-play-state: paused !important; }
24
- .marquee-gradient::before, .marquee-gradient::after {
25
- content: "";
26
- position: absolute;
27
- top: 0;
28
- bottom: 0;
29
- width: var(--gradient-width);
30
- z-index: 10;
31
- pointer-events: none;
32
- }
33
- .marquee-gradient::before {
34
- left: 0;
35
- background: linear-gradient(to right, var(--gradient-color), transparent);
36
- }
37
- .marquee-gradient::after {
38
- right: 0;
39
- background: linear-gradient(to left, var(--gradient-color), transparent);
40
- }
41
- `}})]})});Me.displayName="Marquee";var Ce=W.forwardRef(({children:a$1,className:u,glowColor:t="rgba(120, 119, 198, 0.3)",glowSize:n=400,glowOpacity:y=.6,border:R=true,borderColor:g,style:C,...w},d)=>{let c=useRef(null),[m,T]=useState({x:0,y:0}),[v,f]=useState(false),N=useCallback(h=>{if(!c.current)return;let s=c.current.getBoundingClientRect();T({x:h.clientX-s.left,y:h.clientY-s.top});},[]),E={position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:"inherit",opacity:v?y:0,background:`radial-gradient(${n}px circle at ${m.x}px ${m.y}px, ${t}, transparent 40%)`,transition:"opacity 0.3s ease",pointerEvents:"none"},k=R?{position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:"inherit",opacity:v?1:0,background:`radial-gradient(${n/2}px circle at ${m.x}px ${m.y}px, ${g||t}, transparent 40%)`,transition:"opacity 0.3s ease",pointerEvents:"none",mask:"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",maskComposite:"exclude",WebkitMaskComposite:"xor",padding:"1px"}:{};return jsxs("div",{ref:Te(d,c),className:a("relative overflow-hidden rounded-xl bg-card border border-border p-6","transition-all duration-300",v&&"border-transparent",u),style:C,onMouseMove:N,onMouseEnter:()=>f(true),onMouseLeave:()=>f(false),...w,children:[jsx("div",{style:E,"aria-hidden":"true"}),R&&jsx("div",{style:k,"aria-hidden":"true"}),jsx("div",{className:"relative z-10",children:a$1})]})});Ce.displayName="GlowCard";function Te(...a){return u=>{a.forEach(t=>{typeof t=="function"?t(u):t&&typeof t=="object"&&(t.current=u);});}}var Se=W.forwardRef(({children:a$1,className:u,spotlightColor:t="rgba(255, 255, 255, 0.1)",spotlightSize:n=300,gradient:y=true,gradientFrom:R="rgba(255, 255, 255, 0.05)",gradientTo:g="transparent",style:C,...w},d)=>{let c=useRef(null),[m,T]=useState({x:0,y:0}),[v,f]=useState(false),N=useCallback(h=>{if(!c.current)return;let s=c.current.getBoundingClientRect();T({x:h.clientX-s.left,y:h.clientY-s.top});},[]),E={position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:"inherit",opacity:v?1:0,background:`radial-gradient(${n}px circle at ${m.x}px ${m.y}px, ${t}, transparent 60%)`,transition:"opacity 0.4s ease",pointerEvents:"none"},k=y?{position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:"inherit",background:`linear-gradient(135deg, ${R} 0%, ${g} 100%)`,pointerEvents:"none"}:{};return jsxs("div",{ref:Pe(d,c),className:a("relative overflow-hidden rounded-xl","bg-gray-900 border border-gray-800","transition-all duration-300",v&&"border-gray-700 shadow-2xl shadow-black/20",u),style:C,onMouseMove:N,onMouseEnter:()=>f(true),onMouseLeave:()=>f(false),...w,children:[y&&jsx("div",{style:k,"aria-hidden":"true"}),jsx("div",{style:E,"aria-hidden":"true"}),jsx("div",{className:"relative z-10",children:a$1})]})});Se.displayName="SpotlightCard";function Pe(...a){return u=>{a.forEach(t=>{typeof t=="function"?t(u):t&&typeof t=="object"&&(t.current=u);});}}var ze=["#ff0080","#7928ca","#0070f3","#00dfd8"],De=W.forwardRef(({children:a$2,className:u,colors:t=ze,speed:n=3,blur:y=true,blurAmount:R=100,type:g="mesh",animate:C=true,style:w,...d},c)=>{let[m,T]=useState(false),v=a$1(),f=C&&!v;useEffect(()=>{T(true);},[]);let N=()=>{switch(g){case "linear":return jsx("div",{className:"absolute inset-0",style:{background:`linear-gradient(
42
- ${f?"var(--gradient-angle, 0deg)":"135deg"},
43
- ${t.join(", ")}
44
- )`,animation:f?`gradient-rotate ${n}s linear infinite`:void 0}});case "radial":return jsx("div",{className:"absolute inset-0",style:{background:`radial-gradient(
45
- circle at ${f?"var(--gradient-x, 50%) var(--gradient-y, 50%)":"50% 50%"},
46
- ${t.join(", ")}
47
- )`,animation:f?`gradient-move ${n}s ease-in-out infinite`:void 0}});case "conic":return jsx("div",{className:"absolute inset-0",style:{background:`conic-gradient(
48
- from ${f?"var(--gradient-angle, 0deg)":"0deg"} at 50% 50%,
49
- ${t.join(", ")},
50
- ${t[0]}
51
- )`,animation:f?`gradient-spin ${n}s linear infinite`:void 0}});default:return m?jsx(Fragment,{children:t.map((E,k)=>{let h=360/t.length*k,s=n/t.length*k;return jsx("div",{className:"absolute rounded-full mix-blend-screen",style:{width:"60%",height:"60%",background:`radial-gradient(circle at center, ${E} 0%, transparent 70%)`,top:`${30+Math.sin(h*Math.PI/180)*20}%`,left:`${30+Math.cos(h*Math.PI/180)*20}%`,animation:f?`gradient-blob ${n}s ease-in-out infinite`:void 0,animationDelay:f?`${-s}s`:void 0}},k)})}):null}};return jsxs("div",{ref:c,className:a("relative overflow-hidden",u),style:w,...d,children:[jsx("div",{className:"absolute inset-0",style:{filter:y?`blur(${R}px)`:void 0},children:N()}),a$2&&jsx("div",{className:"relative z-10",children:a$2}),jsx("style",{dangerouslySetInnerHTML:{__html:`
52
- @keyframes gradient-rotate {
53
- 0% { --gradient-angle: 0deg; }
54
- 100% { --gradient-angle: 360deg; }
55
- }
56
- @keyframes gradient-spin {
57
- 0% { transform: rotate(0deg); }
58
- 100% { transform: rotate(360deg); }
59
- }
60
- @keyframes gradient-move {
61
- 0%, 100% { --gradient-x: 0%; --gradient-y: 0%; }
62
- 25% { --gradient-x: 100%; --gradient-y: 0%; }
63
- 50% { --gradient-x: 100%; --gradient-y: 100%; }
64
- 75% { --gradient-x: 0%; --gradient-y: 100%; }
65
- }
66
- @keyframes gradient-blob {
67
- 0%, 100% { transform: translate(0, 0) scale(1); }
68
- 25% { transform: translate(20%, -20%) scale(1.1); }
69
- 50% { transform: translate(0, 20%) scale(0.9); }
70
- 75% { transform: translate(-20%, -10%) scale(1.05); }
71
- }
72
- `}})]})});De.displayName="AnimatedGradient";var je=W.forwardRef(({children:a$2,autoPlay:u=false,interval:t=5e3,loop:n=true,pauseOnHover:y=true,indicators:R="dots",indicatorPosition:g="bottom",showArrows:C=true,arrowPosition:w="inside",transition:d="slide",transitionDuration:c=500,onSlideChange:m,showPlayPause:T=false,playPausePosition:v="right",className:f,style:N,...E},k)=>{let h=()=>d==="slide"&&n?1:0,[s,M]=useState(h),[X,K]=useState(!u),[O,j]=useState(false),[L,S]=useState(false),[B,P]=useState(false),[te,re]=useState(null),[ae,ne]=useState(null),se=useRef(null),b=W.Children.count(a$2),V=a$1(),ie=useCallback(e=>d!=="slide"||!n?e:e===0?b-1:e===b+1?0:e-1,[n,b,d]),A=useCallback(e=>{if(L)return;let r=e;if(n?d!=="slide"&&(e<0?r=b-1:e>=b&&(r=0)):r=Math.max(0,Math.min(e,b-1)),r!==s){S(true),M(r);let l=n&&d==="slide"?r===0?b-1:r===b+1?0:r-1:r;m==null||m(l),setTimeout(()=>S(false),c);}},[s,b,n,L,c,d,m]);useEffect(()=>{!n||L||d!=="slide"||(s===0?setTimeout(()=>{P(true),M(b),setTimeout(()=>P(false),50);},c):s===b+1&&setTimeout(()=>{P(true),M(1),setTimeout(()=>P(false),50);},c));},[s,b,n,L,c,d]);let z=useCallback(()=>{A(s+1);},[s,A]),Y=useCallback(()=>{A(s-1);},[s,A]),ce=useCallback(()=>{j(e=>!e);},[]);useCallback(()=>{j(false);},[]);useCallback(()=>{j(true);},[]);useEffect(()=>{if(!u||X||O||V)return;let e=setInterval(z,t);return ()=>clearInterval(e)},[u,t,X,O,z,V]);let fe=e=>{re(e.targetTouches[0].clientX);},me=e=>{ne(e.targetTouches[0].clientX);},ge=()=>{if(!te||!ae)return;let e=te-ae;Math.abs(e)>=50&&(e>0?z():Y()),re(null),ne(null);};useEffect(()=>{let e=l=>{l.key==="ArrowLeft"?Y():l.key==="ArrowRight"&&z();},r=se.current;return r==null||r.addEventListener("keydown",e),()=>r==null?void 0:r.removeEventListener("keydown",e)},[z,Y]);let be=()=>{let e=V||B?0:c,r=ie(s);switch(d){case "fade":return W.Children.map(a$2,(l,p)=>jsx("div",{className:a("absolute inset-0 w-full h-full",p===r?"z-10":"z-0"),style:{opacity:p===r?1:0,transition:`opacity ${e}ms ease-in-out`},children:l},p));case "scale":return W.Children.map(a$2,(l,p)=>jsx("div",{className:a("absolute inset-0 w-full h-full",p===r?"z-10":"z-0"),style:{opacity:p===r?1:0,transform:`scale(${p===r?1:.9})`,transition:`opacity ${e}ms ease-in-out, transform ${e}ms ease-in-out`},children:l},p));default:{let l=W.Children.toArray(a$2);return (n?[l[l.length-1],...l,l[0]]:l).map((q,D)=>jsx("div",{className:"absolute inset-0 w-full h-full",style:{transform:`translateX(${(D-s)*100}%)`,transition:B?"none":`transform ${e}ms ease-in-out`},children:q},D))}}},oe=()=>{if(R==="none")return null;let e=g.includes("inside"),r=g.includes("top"),l=ie(s),p=a("flex items-center justify-center gap-2",e?a("absolute left-1/2 -translate-x-1/2 z-20",r?"top-4":"bottom-4"):a("mt-4",r&&"order-first mb-4 mt-0")),q=D=>{A(n&&d==="slide"?D+1:D);};return jsx("div",{className:p,role:"tablist",children:Array.from({length:b},(D,x)=>{let G=x===l;switch(R){case "bars":return jsx("button",{onClick:()=>q(x),className:a("h-1 rounded-full transition-all duration-300",G?"w-8 bg-white":"w-4 bg-white/50 hover:bg-white/70"),role:"tab","aria-selected":G,"aria-label":`\uC2AC\uB77C\uC774\uB4DC ${x+1}`},x);case "numbers":return jsx("button",{onClick:()=>q(x),className:a("w-8 h-8 rounded-full text-sm font-medium transition-all duration-300",G?"bg-white text-gray-900":"bg-white/30 text-white hover:bg-white/50"),role:"tab","aria-selected":G,"aria-label":`\uC2AC\uB77C\uC774\uB4DC ${x+1}`,children:x+1},x);default:return jsx("button",{onClick:()=>q(x),className:a("w-2.5 h-2.5 rounded-full transition-all duration-300",G?"bg-white scale-125":"bg-white/50 hover:bg-white/70"),role:"tab","aria-selected":G,"aria-label":`\uC2AC\uB77C\uC774\uB4DC ${x+1}`},x)}})})},ve=()=>{if(!T||!u)return null;let e=!O;return jsx("button",{onClick:ce,className:a("absolute bottom-4 z-20","w-8 h-8 rounded-full flex items-center justify-center","bg-white/80 hover:bg-white text-gray-800","transition-all duration-200","focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white",{left:"left-4",center:"left-1/2 -translate-x-1/2",right:"right-4"}[v]),"aria-label":e?"\uC77C\uC2DC\uC815\uC9C0":"\uC7AC\uC0DD",children:e?jsx(_e,{className:"w-4 h-4"}):jsx(Ye,{className:"w-4 h-4"})})},he=()=>{if(!C||w==="hidden")return null;let e=n||s>0,r=n||s<b-1,l=a("absolute top-1/2 -translate-y-1/2 z-20","w-10 h-10 rounded-full flex items-center justify-center","bg-white/80 hover:bg-white text-gray-800","transition-all duration-200","disabled:opacity-30 disabled:cursor-not-allowed","focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white"),p=w==="outside"?"-left-14":"left-4",q=w==="outside"?"-right-14":"right-4";return jsxs(Fragment,{children:[jsx("button",{onClick:Y,disabled:!e,className:a(l,p),"aria-label":"\uC774\uC804 \uC2AC\uB77C\uC774\uB4DC",children:jsx(Be,{className:"w-5 h-5"})}),jsx("button",{onClick:z,disabled:!r,className:a(l,q),"aria-label":"\uB2E4\uC74C \uC2AC\uB77C\uC774\uB4DC",children:jsx(We,{className:"w-5 h-5"})})]})};return jsxs("div",{ref:k,className:a("flex flex-col w-full h-full",w==="outside"&&"px-16",f),style:N,...E,children:[jsxs("div",{ref:se,className:"relative overflow-hidden w-full flex-1",onMouseEnter:()=>y&&K(true),onMouseLeave:()=>y&&K(false),onTouchStart:fe,onTouchMove:me,onTouchEnd:ge,tabIndex:0,role:"region","aria-roledescription":"carousel","aria-label":"\uC774\uBBF8\uC9C0 \uC2AC\uB77C\uC774\uB354",children:[be(),he(),ve(),g.includes("inside")&&oe()]}),!g.includes("inside")&&oe()]})});je.displayName="Carousel";function Be({className:a}){return jsx("svg",{className:a,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 19l-7-7 7-7"})})}function We({className:a}){return jsx("svg",{className:a,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})})}function Ye({className:a}){return jsx("svg",{className:a,fill:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{d:"M8 5v14l11-7z"})})}function _e({className:a}){return jsx("svg",{className:a,fill:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{d:"M6 4h4v16H6V4zm8 0h4v16h-4V4z"})})}export{Me as a,Ce as b,Se as c,De as d,je as e};//# sourceMappingURL=chunk-Q76JW7X5.mjs.map
73
- //# sourceMappingURL=chunk-Q76JW7X5.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/advanced/Marquee.tsx","../src/components/advanced/GlowCard.tsx","../src/components/advanced/SpotlightCard.tsx","../src/components/advanced/AnimatedGradient.tsx","../src/components/advanced/Carousel.tsx"],"names":["Marquee","React","children","className","direction","speed","pauseOnHover","pauseOnClick","gap","gradient","gradientColor","gradientWidth","style","props","ref","containerRef","useRef","contentWidth","setContentWidth","useState","contentHeight","setContentHeight","isPaused","setIsPaused","isHorizontal","isReverse","useEffect","container","firstChild","updateSize","resizeObserver","animationStyle","gradientStyle","jsxs","merge","jsx","GlowCard","glowColor","glowSize","glowOpacity","border","borderColor","cardRef","mousePosition","setMousePosition","isHovered","setIsHovered","handleMouseMove","useCallback","e","rect","glowStyle","borderStyle","mergeRefs","refs","value","SpotlightCard","spotlightColor","spotlightSize","gradientFrom","gradientTo","spotlightStyle","gradientOverlayStyle","defaultColors","AnimatedGradient","colors","blur","blurAmount","type","animate","mounted","setMounted","prefersReducedMotion","useReducedMotion","shouldAnimate","renderGradient","Fragment","color","index","angle","delay","Carousel","autoPlay","interval","loop","indicators","indicatorPosition","showArrows","arrowPosition","transition","transitionDuration","onSlideChange","showPlayPause","playPausePosition","getInitialIndex","currentIndex","setCurrentIndex","isManuallyPaused","setIsManuallyPaused","isTransitioning","setIsTransitioning","noTransition","setNoTransition","touchStart","setTouchStart","touchEnd","setTouchEnd","slideCount","getActualIndex","goToSlide","newIndex","actualIndex","nextSlide","prevSlide","togglePlayPause","prev","timer","handleTouchStart","handleTouchMove","handleTouchEnd","distance","handleKeyDown","renderSlides","duration","child","childArray","renderIndicators","isInside","isTop","indicatorContainerClass","handleIndicatorClick","_","isActive","renderPlayPause","isPlaying","PauseIcon","PlayIcon","renderArrows","canGoPrev","canGoNext","arrowBaseClass","prevPosition","nextPosition","ChevronLeft","ChevronRight"],"mappings":"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","file":"chunk-Q76JW7X5.mjs","sourcesContent":["\"use client\";\n\nimport React, { useRef, useEffect, useState } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * Marquee 컴포넌트의 props / Marquee component props\n * @property {\"left\" | \"right\" | \"up\" | \"down\"} [direction=\"left\"] - 이동 방향 / Movement direction\n * @property {number} [speed=50] - 속도 (px/s) / Speed in pixels per second\n * @property {boolean} [pauseOnHover=true] - 호버시 일시정지 / Pause on hover\n * @property {boolean} [pauseOnClick=false] - 클릭시 일시정지 / Pause on click\n * @property {number} [gap=16] - 아이템 간격 (px) / Gap between items in pixels\n * @property {boolean} [gradient=true] - 양쪽 페이드 그라디언트 / Fade gradient on edges\n * @property {string} [gradientColor=\"hsl(var(--background))\"] - 그라디언트 색상 / Gradient color\n * @property {number} [gradientWidth=100] - 그라디언트 너비 (px) / Gradient width in pixels\n */\nexport interface MarqueeProps extends React.HTMLAttributes<HTMLDivElement> {\n direction?: \"left\" | \"right\" | \"up\" | \"down\";\n speed?: number;\n pauseOnHover?: boolean;\n pauseOnClick?: boolean;\n gap?: number;\n gradient?: boolean;\n gradientColor?: string;\n gradientWidth?: number;\n}\n\n/**\n * Marquee 컴포넌트 / Marquee component\n *\n * 무한 스크롤 애니메이션을 제공하는 컴포넌트입니다.\n * 로고, 텍스트, 이미지 등을 자동으로 흐르게 표시합니다.\n *\n * Component that provides infinite scroll animation.\n * Displays logos, text, images, etc. with automatic scrolling.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Marquee>\n * <span>Item 1</span>\n * <span>Item 2</span>\n * <span>Item 3</span>\n * </Marquee>\n *\n * @example\n * // 로고 캐러셀 / Logo carousel\n * <Marquee speed={30} pauseOnHover gradient>\n * {logos.map(logo => <img key={logo.id} src={logo.src} />)}\n * </Marquee>\n */\nconst Marquee = React.forwardRef<HTMLDivElement, MarqueeProps>(\n (\n {\n children,\n className,\n direction = \"left\",\n speed = 50,\n pauseOnHover = true,\n pauseOnClick = false,\n gap = 16,\n gradient = true,\n gradientColor = \"hsl(var(--background))\",\n gradientWidth = 100,\n style,\n ...props\n },\n ref\n ) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [contentWidth, setContentWidth] = useState(0);\n const [contentHeight, setContentHeight] = useState(0);\n const [isPaused, setIsPaused] = useState(false);\n\n const isHorizontal = direction === \"left\" || direction === \"right\";\n const isReverse = direction === \"right\" || direction === \"down\";\n\n // Measure content size\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const firstChild = container.firstElementChild as HTMLElement;\n if (!firstChild) return;\n\n const updateSize = () => {\n if (isHorizontal) {\n setContentWidth(firstChild.offsetWidth);\n } else {\n setContentHeight(firstChild.offsetHeight);\n }\n };\n\n updateSize();\n\n const resizeObserver = new ResizeObserver(updateSize);\n resizeObserver.observe(firstChild);\n\n return () => resizeObserver.disconnect();\n }, [isHorizontal, children]);\n\n // Calculate animation duration\n const duration = isHorizontal\n ? contentWidth / speed\n : contentHeight / speed;\n\n const animationStyle: React.CSSProperties = {\n [\"--marquee-duration\" as string]: `${duration}s`,\n [\"--marquee-gap\" as string]: `${gap}px`,\n };\n\n // Gradient styles\n const gradientStyle = gradient\n ? {\n [\"--gradient-color\" as string]: gradientColor,\n [\"--gradient-width\" as string]: `${gradientWidth}px`,\n }\n : {};\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative overflow-hidden\",\n gradient && \"marquee-gradient\",\n className\n )}\n style={{ ...style, ...gradientStyle }}\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\n onClick={() => pauseOnClick && setIsPaused(!isPaused)}\n {...props}\n >\n <div\n ref={containerRef}\n className={merge(\n \"flex\",\n isHorizontal ? \"flex-row\" : \"flex-col\",\n isPaused ? \"animate-pause\" : \"\",\n isHorizontal\n ? isReverse\n ? \"animate-marquee-right\"\n : \"animate-marquee-left\"\n : isReverse\n ? \"animate-marquee-down\"\n : \"animate-marquee-up\"\n )}\n style={animationStyle}\n >\n {/* Original content */}\n <div\n className={merge(\n \"flex shrink-0\",\n isHorizontal ? \"flex-row\" : \"flex-col\"\n )}\n style={{ gap }}\n >\n {children}\n </div>\n {/* Duplicated content for seamless loop */}\n <div\n className={merge(\n \"flex shrink-0\",\n isHorizontal ? \"flex-row\" : \"flex-col\"\n )}\n style={{ gap, [isHorizontal ? \"marginLeft\" : \"marginTop\"]: gap }}\n aria-hidden=\"true\"\n >\n {children}\n </div>\n </div>\n\n {/* CSS for animations - injected as style element */}\n <style dangerouslySetInnerHTML={{ __html: `\n @keyframes marquee-left {\n from { transform: translateX(0); }\n to { transform: translateX(calc(-50% - var(--marquee-gap) / 2)); }\n }\n @keyframes marquee-right {\n from { transform: translateX(calc(-50% - var(--marquee-gap) / 2)); }\n to { transform: translateX(0); }\n }\n @keyframes marquee-up {\n from { transform: translateY(0); }\n to { transform: translateY(calc(-50% - var(--marquee-gap) / 2)); }\n }\n @keyframes marquee-down {\n from { transform: translateY(calc(-50% - var(--marquee-gap) / 2)); }\n to { transform: translateY(0); }\n }\n .animate-marquee-left { animation: marquee-left var(--marquee-duration) linear infinite; }\n .animate-marquee-right { animation: marquee-right var(--marquee-duration) linear infinite; }\n .animate-marquee-up { animation: marquee-up var(--marquee-duration) linear infinite; }\n .animate-marquee-down { animation: marquee-down var(--marquee-duration) linear infinite; }\n .animate-pause { animation-play-state: paused !important; }\n .marquee-gradient::before, .marquee-gradient::after {\n content: \"\";\n position: absolute;\n top: 0;\n bottom: 0;\n width: var(--gradient-width);\n z-index: 10;\n pointer-events: none;\n }\n .marquee-gradient::before {\n left: 0;\n background: linear-gradient(to right, var(--gradient-color), transparent);\n }\n .marquee-gradient::after {\n right: 0;\n background: linear-gradient(to left, var(--gradient-color), transparent);\n }\n `}} />\n </div>\n );\n }\n);\n\nMarquee.displayName = \"Marquee\";\n\nexport { Marquee };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * GlowCard 컴포넌트의 props / GlowCard component props\n * @property {string} [glowColor=\"rgba(120, 119, 198, 0.3)\"] - 글로우 색상 / Glow color\n * @property {number} [glowSize=400] - 글로우 크기 (px) / Glow size in pixels\n * @property {number} [glowOpacity=0.6] - 글로우 투명도 / Glow opacity\n * @property {boolean} [border=true] - 글로우 보더 표시 / Show glow border\n * @property {string} [borderColor] - 보더 색상 (기본: glowColor) / Border color (default: glowColor)\n */\nexport interface GlowCardProps extends React.HTMLAttributes<HTMLDivElement> {\n glowColor?: string;\n glowSize?: number;\n glowOpacity?: number;\n border?: boolean;\n borderColor?: string;\n}\n\n/**\n * GlowCard 컴포넌트 / GlowCard component\n *\n * 마우스를 따라다니는 글로우 효과가 있는 카드 컴포넌트입니다.\n * SaaS 랜딩 페이지, 프리미엄 UI에 적합합니다.\n *\n * Card component with mouse-following glow effect.\n * Perfect for SaaS landing pages and premium UI.\n *\n * @component\n * @example\n * <GlowCard glowColor=\"rgba(59, 130, 246, 0.4)\">\n * <h3>Premium Feature</h3>\n * <p>This is a premium feature card</p>\n * </GlowCard>\n */\nconst GlowCard = React.forwardRef<HTMLDivElement, GlowCardProps>(\n (\n {\n children,\n className,\n glowColor = \"rgba(120, 119, 198, 0.3)\",\n glowSize = 400,\n glowOpacity = 0.6,\n border = true,\n borderColor,\n style,\n ...props\n },\n ref\n ) => {\n const cardRef = useRef<HTMLDivElement>(null);\n const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!cardRef.current) return;\n const rect = cardRef.current.getBoundingClientRect();\n setMousePosition({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n });\n },\n []\n );\n\n const glowStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n opacity: isHovered ? glowOpacity : 0,\n background: `radial-gradient(${glowSize}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${glowColor}, transparent 40%)`,\n transition: \"opacity 0.3s ease\",\n pointerEvents: \"none\",\n };\n\n const borderStyle: React.CSSProperties = border\n ? {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n opacity: isHovered ? 1 : 0,\n background: `radial-gradient(${glowSize / 2}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${borderColor || glowColor}, transparent 40%)`,\n transition: \"opacity 0.3s ease\",\n pointerEvents: \"none\",\n mask: \"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n maskComposite: \"exclude\",\n WebkitMaskComposite: \"xor\",\n padding: \"1px\",\n }\n : {};\n\n return (\n <div\n ref={mergeRefs(ref, cardRef)}\n className={merge(\n \"relative overflow-hidden rounded-xl bg-card border border-border p-6\",\n \"transition-all duration-300\",\n isHovered && \"border-transparent\",\n className\n )}\n style={style}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {/* Glow effect */}\n <div style={glowStyle} aria-hidden=\"true\" />\n\n {/* Border glow */}\n {border && <div style={borderStyle as React.CSSProperties} aria-hidden=\"true\" />}\n\n {/* Content */}\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n }\n);\n\nGlowCard.displayName = \"GlowCard\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { GlowCard };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * SpotlightCard 컴포넌트의 props / SpotlightCard component props\n * @property {string} [spotlightColor=\"rgba(255, 255, 255, 0.1)\"] - 스포트라이트 색상 / Spotlight color\n * @property {number} [spotlightSize=300] - 스포트라이트 크기 (px) / Spotlight size in pixels\n * @property {boolean} [gradient=true] - 그라디언트 배경 효과 / Gradient background effect\n * @property {string} [gradientFrom=\"rgba(255, 255, 255, 0.05)\"] - 그라디언트 시작 색상 / Gradient start color\n * @property {string} [gradientTo=\"transparent\"] - 그라디언트 끝 색상 / Gradient end color\n */\nexport interface SpotlightCardProps extends React.HTMLAttributes<HTMLDivElement> {\n spotlightColor?: string;\n spotlightSize?: number;\n gradient?: boolean;\n gradientFrom?: string;\n gradientTo?: string;\n}\n\n/**\n * SpotlightCard 컴포넌트 / SpotlightCard component\n *\n * 마우스 위치에 스포트라이트 효과를 표시하는 프리미엄 카드 컴포넌트입니다.\n * 다크 테마 랜딩 페이지, 프리미엄 UI에 적합합니다.\n *\n * Premium card component that displays a spotlight effect at mouse position.\n * Perfect for dark theme landing pages and premium UI.\n *\n * @component\n * @example\n * <SpotlightCard className=\"bg-gray-900 text-white p-8\">\n * <h3>Premium Feature</h3>\n * <p>Discover our exclusive features</p>\n * </SpotlightCard>\n */\nconst SpotlightCard = React.forwardRef<HTMLDivElement, SpotlightCardProps>(\n (\n {\n children,\n className,\n spotlightColor = \"rgba(255, 255, 255, 0.1)\",\n spotlightSize = 300,\n gradient = true,\n gradientFrom = \"rgba(255, 255, 255, 0.05)\",\n gradientTo = \"transparent\",\n style,\n ...props\n },\n ref\n ) => {\n const cardRef = useRef<HTMLDivElement>(null);\n const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!cardRef.current) return;\n const rect = cardRef.current.getBoundingClientRect();\n setMousePosition({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n });\n },\n []\n );\n\n const spotlightStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n opacity: isHovered ? 1 : 0,\n background: `radial-gradient(${spotlightSize}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${spotlightColor}, transparent 60%)`,\n transition: \"opacity 0.4s ease\",\n pointerEvents: \"none\",\n };\n\n const gradientOverlayStyle: React.CSSProperties = gradient\n ? {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n background: `linear-gradient(135deg, ${gradientFrom} 0%, ${gradientTo} 100%)`,\n pointerEvents: \"none\",\n }\n : {};\n\n return (\n <div\n ref={mergeRefs(ref, cardRef)}\n className={merge(\n \"relative overflow-hidden rounded-xl\",\n \"bg-gray-900 border border-gray-800\",\n \"transition-all duration-300\",\n isHovered && \"border-gray-700 shadow-2xl shadow-black/20\",\n className\n )}\n style={style}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {/* Gradient overlay */}\n {gradient && <div style={gradientOverlayStyle} aria-hidden=\"true\" />}\n\n {/* Spotlight effect */}\n <div style={spotlightStyle} aria-hidden=\"true\" />\n\n {/* Content */}\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n }\n);\n\nSpotlightCard.displayName = \"SpotlightCard\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { SpotlightCard };\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\n\n/**\n * AnimatedGradient 컴포넌트의 props / AnimatedGradient component props\n * @property {string[]} [colors] - 그라디언트 색상 배열 / Array of gradient colors\n * @property {number} [speed=3] - 애니메이션 속도 (초) / Animation speed in seconds\n * @property {boolean} [blur=true] - 블러 효과 / Blur effect\n * @property {number} [blurAmount=100] - 블러 양 (px) / Blur amount in pixels\n * @property {\"linear\" | \"radial\" | \"conic\" | \"mesh\"} [type=\"mesh\"] - 그라디언트 타입 / Gradient type\n * @property {boolean} [animate=true] - 애니메이션 활성화 / Enable animation\n */\nexport interface AnimatedGradientProps extends React.HTMLAttributes<HTMLDivElement> {\n colors?: string[];\n speed?: number;\n blur?: boolean;\n blurAmount?: number;\n type?: \"linear\" | \"radial\" | \"conic\" | \"mesh\";\n animate?: boolean;\n}\n\nconst defaultColors = [\n \"#ff0080\",\n \"#7928ca\",\n \"#0070f3\",\n \"#00dfd8\",\n];\n\n/**\n * AnimatedGradient 컴포넌트 / AnimatedGradient component\n *\n * 아름다운 애니메이션 그라디언트 배경을 제공합니다.\n * 히어로 섹션, 배경, 오버레이에 적합합니다.\n *\n * Provides beautiful animated gradient backgrounds.\n * Perfect for hero sections, backgrounds, and overlays.\n *\n * @component\n * @example\n * // 메쉬 그라디언트 / Mesh gradient\n * <AnimatedGradient type=\"mesh\" className=\"absolute inset-0 -z-10\" />\n *\n * @example\n * // 커스텀 색상 / Custom colors\n * <AnimatedGradient\n * colors={[\"#667eea\", \"#764ba2\", \"#f093fb\"]}\n * speed={5}\n * type=\"conic\"\n * />\n */\nconst AnimatedGradient = React.forwardRef<HTMLDivElement, AnimatedGradientProps>(\n (\n {\n children,\n className,\n colors = defaultColors,\n speed = 3,\n blur = true,\n blurAmount = 100,\n type = \"mesh\",\n animate = true,\n style,\n ...props\n },\n ref\n ) => {\n const [mounted, setMounted] = useState(false);\n const prefersReducedMotion = useReducedMotion();\n const shouldAnimate = animate && !prefersReducedMotion;\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const renderGradient = () => {\n switch (type) {\n case \"linear\":\n return (\n <div\n className=\"absolute inset-0\"\n style={{\n background: `linear-gradient(\n ${shouldAnimate ? \"var(--gradient-angle, 0deg)\" : \"135deg\"},\n ${colors.join(\", \")}\n )`,\n animation: shouldAnimate ? `gradient-rotate ${speed}s linear infinite` : undefined,\n }}\n />\n );\n\n case \"radial\":\n return (\n <div\n className=\"absolute inset-0\"\n style={{\n background: `radial-gradient(\n circle at ${shouldAnimate ? \"var(--gradient-x, 50%) var(--gradient-y, 50%)\" : \"50% 50%\"},\n ${colors.join(\", \")}\n )`,\n animation: shouldAnimate ? `gradient-move ${speed}s ease-in-out infinite` : undefined,\n }}\n />\n );\n\n case \"conic\":\n return (\n <div\n className=\"absolute inset-0\"\n style={{\n background: `conic-gradient(\n from ${shouldAnimate ? \"var(--gradient-angle, 0deg)\" : \"0deg\"} at 50% 50%,\n ${colors.join(\", \")},\n ${colors[0]}\n )`,\n animation: shouldAnimate ? `gradient-spin ${speed}s linear infinite` : undefined,\n }}\n />\n );\n\n case \"mesh\":\n default:\n // Render blobs only after mount to prevent SSR hydration mismatch\n // (Math.sin/cos produce floating-point values that differ between server and client)\n if (!mounted) return null;\n return (\n <>\n {colors.map((color, index) => {\n const angle = (360 / colors.length) * index;\n const delay = (speed / colors.length) * index;\n return (\n <div\n key={index}\n className=\"absolute rounded-full mix-blend-screen\"\n style={{\n width: \"60%\",\n height: \"60%\",\n background: `radial-gradient(circle at center, ${color} 0%, transparent 70%)`,\n top: `${30 + Math.sin((angle * Math.PI) / 180) * 20}%`,\n left: `${30 + Math.cos((angle * Math.PI) / 180) * 20}%`,\n animation: shouldAnimate\n ? `gradient-blob ${speed}s ease-in-out infinite`\n : undefined,\n animationDelay: shouldAnimate ? `${-delay}s` : undefined,\n }}\n />\n );\n })}\n </>\n );\n }\n };\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative overflow-hidden\",\n className\n )}\n style={style}\n {...props}\n >\n {/* Gradient layer */}\n <div\n className=\"absolute inset-0\"\n style={{\n filter: blur ? `blur(${blurAmount}px)` : undefined,\n }}\n >\n {renderGradient()}\n </div>\n\n {/* Content */}\n {children && <div className=\"relative z-10\">{children}</div>}\n\n {/* Animation keyframes - injected as style element */}\n <style dangerouslySetInnerHTML={{ __html: `\n @keyframes gradient-rotate {\n 0% { --gradient-angle: 0deg; }\n 100% { --gradient-angle: 360deg; }\n }\n @keyframes gradient-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n @keyframes gradient-move {\n 0%, 100% { --gradient-x: 0%; --gradient-y: 0%; }\n 25% { --gradient-x: 100%; --gradient-y: 0%; }\n 50% { --gradient-x: 100%; --gradient-y: 100%; }\n 75% { --gradient-x: 0%; --gradient-y: 100%; }\n }\n @keyframes gradient-blob {\n 0%, 100% { transform: translate(0, 0) scale(1); }\n 25% { transform: translate(20%, -20%) scale(1.1); }\n 50% { transform: translate(0, 20%) scale(0.9); }\n 75% { transform: translate(-20%, -10%) scale(1.05); }\n }\n `}} />\n </div>\n );\n }\n);\n\nAnimatedGradient.displayName = \"AnimatedGradient\";\n\nexport { AnimatedGradient };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback, useEffect } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\n\n/**\n * Carousel 컴포넌트의 props / Carousel component props\n * @property {boolean} [autoPlay=false] - 자동 재생 / Auto play\n * @property {number} [interval=5000] - 자동 재생 간격 (ms) / Auto play interval\n * @property {boolean} [loop=true] - 무한 루프 / Infinite loop\n * @property {boolean} [pauseOnHover=true] - 호버시 일시정지 / Pause on hover\n * @property {\"dots\" | \"bars\" | \"numbers\" | \"none\"} [indicators=\"dots\"] - 인디케이터 타입 / Indicator type\n * @property {\"bottom\" | \"top\" | \"inside-bottom\" | \"inside-top\"} [indicatorPosition=\"bottom\"] - 인디케이터 위치 / Indicator position\n * @property {boolean} [showArrows=true] - 화살표 버튼 표시 / Show arrow buttons\n * @property {\"inside\" | \"outside\" | \"hidden\"} [arrowPosition=\"inside\"] - 화살표 위치 / Arrow position\n * @property {\"slide\" | \"fade\" | \"scale\"} [transition=\"slide\"] - 전환 효과 / Transition effect\n * @property {number} [transitionDuration=500] - 전환 시간 (ms) / Transition duration\n * @property {(index: number) => void} [onSlideChange] - 슬라이드 변경 콜백 / Slide change callback\n * @property {boolean} [showPlayPause=false] - 재생/일시정지 버튼 표시 / Show play/pause button\n * @property {\"left\" | \"right\" | \"center\"} [playPausePosition=\"right\"] - 재생/일시정지 버튼 위치 / Play/pause button position\n */\nexport interface CarouselProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n children: React.ReactNode[];\n autoPlay?: boolean;\n interval?: number;\n loop?: boolean;\n pauseOnHover?: boolean;\n indicators?: \"dots\" | \"bars\" | \"numbers\" | \"none\";\n indicatorPosition?: \"bottom\" | \"top\" | \"inside-bottom\" | \"inside-top\";\n showArrows?: boolean;\n arrowPosition?: \"inside\" | \"outside\" | \"hidden\";\n transition?: \"slide\" | \"fade\" | \"scale\";\n transitionDuration?: number;\n onSlideChange?: (index: number) => void;\n showPlayPause?: boolean;\n playPausePosition?: \"left\" | \"right\" | \"center\";\n}\n\n/**\n * Carousel 컴포넌트 / Carousel component\n *\n * 슬라이드 캐러셀 컴포넌트입니다.\n * 다양한 인디케이터, 화살표, 전환 효과를 지원합니다.\n *\n * Slide carousel component.\n * Supports various indicators, arrows, and transition effects.\n *\n * @component\n * @example\n * <Carousel autoPlay interval={3000} indicators=\"bars\">\n * <img src=\"/slide1.jpg\" alt=\"Slide 1\" />\n * <img src=\"/slide2.jpg\" alt=\"Slide 2\" />\n * <img src=\"/slide3.jpg\" alt=\"Slide 3\" />\n * </Carousel>\n */\nconst Carousel = React.forwardRef<HTMLDivElement, CarouselProps>(\n (\n {\n children,\n autoPlay = false,\n interval = 5000,\n loop = true,\n pauseOnHover = true,\n indicators = \"dots\",\n indicatorPosition = \"bottom\",\n showArrows = true,\n arrowPosition = \"inside\",\n transition = \"slide\",\n transitionDuration = 500,\n onSlideChange,\n showPlayPause = false,\n playPausePosition = \"right\",\n className,\n style,\n ...props\n },\n ref\n ) => {\n // For slide transition with loop: start at 1 (account for cloned first slide)\n // For fade/scale: always start at 0 (no cloned slides)\n const getInitialIndex = () => {\n if (transition === \"slide\" && loop) return 1;\n return 0;\n };\n const [currentIndex, setCurrentIndex] = useState(getInitialIndex);\n const [isPaused, setIsPaused] = useState(!autoPlay);\n const [isManuallyPaused, setIsManuallyPaused] = useState(false);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [noTransition, setNoTransition] = useState(false);\n const [touchStart, setTouchStart] = useState<number | null>(null);\n const [touchEnd, setTouchEnd] = useState<number | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const slideCount = React.Children.count(children);\n\n // Check for reduced motion preference\n const prefersReducedMotion = useReducedMotion();\n\n // Get actual slide index for display (accounting for cloned slides in loop mode for slide transition)\n const getActualIndex = useCallback((index: number) => {\n // For fade/scale transitions, currentIndex is the actual index\n if (transition !== \"slide\") return index;\n // For slide transition without loop, index is actual\n if (!loop) return index;\n // For slide transition with loop, account for cloned slides\n if (index === 0) return slideCount - 1;\n if (index === slideCount + 1) return 0;\n return index - 1;\n }, [loop, slideCount, transition]);\n\n // Go to specific slide\n const goToSlide = useCallback(\n (index: number) => {\n if (isTransitioning) return;\n\n let newIndex = index;\n if (!loop) {\n newIndex = Math.max(0, Math.min(index, slideCount - 1));\n } else if (transition !== \"slide\") {\n // For fade/scale with loop, wrap around without cloned slides\n if (index < 0) {\n newIndex = slideCount - 1;\n } else if (index >= slideCount) {\n newIndex = 0;\n }\n }\n\n if (newIndex !== currentIndex) {\n setIsTransitioning(true);\n setCurrentIndex(newIndex);\n const actualIndex = loop && transition === \"slide\"\n ? (newIndex === 0 ? slideCount - 1 : newIndex === slideCount + 1 ? 0 : newIndex - 1)\n : newIndex;\n onSlideChange?.(actualIndex);\n setTimeout(() => setIsTransitioning(false), transitionDuration);\n }\n },\n [currentIndex, slideCount, loop, isTransitioning, transitionDuration, transition, onSlideChange]\n );\n\n // Handle infinite loop jump (when reaching cloned slides)\n useEffect(() => {\n if (!loop || isTransitioning || transition !== \"slide\") return;\n\n // Jump to real slide without animation when on cloned slides\n if (currentIndex === 0) {\n // At cloned last slide -> jump to real last slide\n setTimeout(() => {\n setNoTransition(true);\n setCurrentIndex(slideCount);\n setTimeout(() => setNoTransition(false), 50);\n }, transitionDuration);\n } else if (currentIndex === slideCount + 1) {\n // At cloned first slide -> jump to real first slide\n setTimeout(() => {\n setNoTransition(true);\n setCurrentIndex(1);\n setTimeout(() => setNoTransition(false), 50);\n }, transitionDuration);\n }\n }, [currentIndex, slideCount, loop, isTransitioning, transitionDuration, transition]);\n\n // Next slide\n const nextSlide = useCallback(() => {\n goToSlide(currentIndex + 1);\n }, [currentIndex, goToSlide]);\n\n // Previous slide\n const prevSlide = useCallback(() => {\n goToSlide(currentIndex - 1);\n }, [currentIndex, goToSlide]);\n\n // Toggle play/pause manually\n const togglePlayPause = useCallback(() => {\n setIsManuallyPaused(prev => !prev);\n }, []);\n\n // Play function\n const play = useCallback(() => {\n setIsManuallyPaused(false);\n }, []);\n\n // Pause function\n const pause = useCallback(() => {\n setIsManuallyPaused(true);\n }, []);\n\n // Auto play\n useEffect(() => {\n if (!autoPlay || isPaused || isManuallyPaused || prefersReducedMotion) return;\n\n const timer = setInterval(nextSlide, interval);\n return () => clearInterval(timer);\n }, [autoPlay, interval, isPaused, isManuallyPaused, nextSlide, prefersReducedMotion]);\n\n // Touch handlers for swipe\n const handleTouchStart = (e: React.TouchEvent) => {\n setTouchStart(e.targetTouches[0].clientX);\n };\n\n const handleTouchMove = (e: React.TouchEvent) => {\n setTouchEnd(e.targetTouches[0].clientX);\n };\n\n const handleTouchEnd = () => {\n if (!touchStart || !touchEnd) return;\n\n const distance = touchStart - touchEnd;\n const minSwipeDistance = 50;\n\n if (Math.abs(distance) >= minSwipeDistance) {\n if (distance > 0) {\n nextSlide();\n } else {\n prevSlide();\n }\n }\n\n setTouchStart(null);\n setTouchEnd(null);\n };\n\n // Keyboard navigation\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"ArrowLeft\") {\n prevSlide();\n } else if (e.key === \"ArrowRight\") {\n nextSlide();\n }\n };\n\n const container = containerRef.current;\n container?.addEventListener(\"keydown\", handleKeyDown);\n return () => container?.removeEventListener(\"keydown\", handleKeyDown);\n }, [nextSlide, prevSlide]);\n\n // Render slides with transition\n const renderSlides = () => {\n const duration = prefersReducedMotion || noTransition ? 0 : transitionDuration;\n const actualIndex = getActualIndex(currentIndex);\n\n switch (transition) {\n case \"fade\":\n return React.Children.map(children, (child, index) => (\n <div\n key={index}\n className={merge(\n \"absolute inset-0 w-full h-full\",\n index === actualIndex ? \"z-10\" : \"z-0\"\n )}\n style={{\n opacity: index === actualIndex ? 1 : 0,\n transition: `opacity ${duration}ms ease-in-out`,\n }}\n >\n {child}\n </div>\n ));\n\n case \"scale\":\n return React.Children.map(children, (child, index) => (\n <div\n key={index}\n className={merge(\n \"absolute inset-0 w-full h-full\",\n index === actualIndex ? \"z-10\" : \"z-0\"\n )}\n style={{\n opacity: index === actualIndex ? 1 : 0,\n transform: `scale(${index === actualIndex ? 1 : 0.9})`,\n transition: `opacity ${duration}ms ease-in-out, transform ${duration}ms ease-in-out`,\n }}\n >\n {child}\n </div>\n ));\n\n case \"slide\":\n default: {\n const childArray = React.Children.toArray(children);\n // For infinite loop: clone last slide at beginning and first slide at end\n const slides = loop\n ? [childArray[childArray.length - 1], ...childArray, childArray[0]]\n : childArray;\n\n // 각 슬라이드를 fade/scale처럼 absolute로 배치하고 translateX로 위치 조정\n return slides.map((child, index) => (\n <div\n key={index}\n className=\"absolute inset-0 w-full h-full\"\n style={{\n transform: `translateX(${(index - currentIndex) * 100}%)`,\n transition: noTransition ? 'none' : `transform ${duration}ms ease-in-out`,\n }}\n >\n {child}\n </div>\n ));\n }\n }\n };\n\n // Render indicators\n const renderIndicators = () => {\n if (indicators === \"none\") return null;\n\n const isInside = indicatorPosition.includes(\"inside\");\n const isTop = indicatorPosition.includes(\"top\");\n const actualIndex = getActualIndex(currentIndex);\n\n const indicatorContainerClass = merge(\n \"flex items-center justify-center gap-2\",\n isInside\n ? merge(\n \"absolute left-1/2 -translate-x-1/2 z-20\",\n isTop ? \"top-4\" : \"bottom-4\"\n )\n : merge(\n \"mt-4\",\n isTop && \"order-first mb-4 mt-0\"\n )\n );\n\n // Handle indicator click - go to the correct index accounting for loop mode\n const handleIndicatorClick = (index: number) => {\n if (loop && transition === \"slide\") {\n goToSlide(index + 1); // +1 because of cloned first slide (only for slide transition)\n } else {\n goToSlide(index);\n }\n };\n\n return (\n <div className={indicatorContainerClass} role=\"tablist\">\n {Array.from({ length: slideCount }, (_, index) => {\n const isActive = index === actualIndex;\n\n switch (indicators) {\n case \"bars\":\n return (\n <button\n key={index}\n onClick={() => handleIndicatorClick(index)}\n className={merge(\n \"h-1 rounded-full transition-all duration-300\",\n isActive\n ? \"w-8 bg-white\"\n : \"w-4 bg-white/50 hover:bg-white/70\"\n )}\n role=\"tab\"\n aria-selected={isActive}\n aria-label={`슬라이드 ${index + 1}`}\n />\n );\n\n case \"numbers\":\n return (\n <button\n key={index}\n onClick={() => handleIndicatorClick(index)}\n className={merge(\n \"w-8 h-8 rounded-full text-sm font-medium transition-all duration-300\",\n isActive\n ? \"bg-white text-gray-900\"\n : \"bg-white/30 text-white hover:bg-white/50\"\n )}\n role=\"tab\"\n aria-selected={isActive}\n aria-label={`슬라이드 ${index + 1}`}\n >\n {index + 1}\n </button>\n );\n\n case \"dots\":\n default:\n return (\n <button\n key={index}\n onClick={() => handleIndicatorClick(index)}\n className={merge(\n \"w-2.5 h-2.5 rounded-full transition-all duration-300\",\n isActive\n ? \"bg-white scale-125\"\n : \"bg-white/50 hover:bg-white/70\"\n )}\n role=\"tab\"\n aria-selected={isActive}\n aria-label={`슬라이드 ${index + 1}`}\n />\n );\n }\n })}\n </div>\n );\n };\n\n // Render play/pause button\n const renderPlayPause = () => {\n if (!showPlayPause || !autoPlay) return null;\n\n const isPlaying = !isManuallyPaused;\n const positionClasses = {\n left: \"left-4\",\n center: \"left-1/2 -translate-x-1/2\",\n right: \"right-4\"\n };\n\n return (\n <button\n onClick={togglePlayPause}\n className={merge(\n \"absolute bottom-4 z-20\",\n \"w-8 h-8 rounded-full flex items-center justify-center\",\n \"bg-white/80 hover:bg-white text-gray-800\",\n \"transition-all duration-200\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white\",\n positionClasses[playPausePosition]\n )}\n aria-label={isPlaying ? \"일시정지\" : \"재생\"}\n >\n {isPlaying ? <PauseIcon className=\"w-4 h-4\" /> : <PlayIcon className=\"w-4 h-4\" />}\n </button>\n );\n };\n\n // Render arrows\n const renderArrows = () => {\n if (!showArrows || arrowPosition === \"hidden\") return null;\n\n const canGoPrev = loop || currentIndex > 0;\n const canGoNext = loop || currentIndex < slideCount - 1;\n\n const arrowBaseClass = merge(\n \"absolute top-1/2 -translate-y-1/2 z-20\",\n \"w-10 h-10 rounded-full flex items-center justify-center\",\n \"bg-white/80 hover:bg-white text-gray-800\",\n \"transition-all duration-200\",\n \"disabled:opacity-30 disabled:cursor-not-allowed\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white\"\n );\n\n const prevPosition = arrowPosition === \"outside\" ? \"-left-14\" : \"left-4\";\n const nextPosition = arrowPosition === \"outside\" ? \"-right-14\" : \"right-4\";\n\n return (\n <>\n <button\n onClick={prevSlide}\n disabled={!canGoPrev}\n className={merge(arrowBaseClass, prevPosition)}\n aria-label=\"이전 슬라이드\"\n >\n <ChevronLeft className=\"w-5 h-5\" />\n </button>\n <button\n onClick={nextSlide}\n disabled={!canGoNext}\n className={merge(arrowBaseClass, nextPosition)}\n aria-label=\"다음 슬라이드\"\n >\n <ChevronRight className=\"w-5 h-5\" />\n </button>\n </>\n );\n };\n\n return (\n <div\n ref={ref}\n className={merge(\n \"flex flex-col w-full h-full\",\n arrowPosition === \"outside\" && \"px-16\",\n className\n )}\n style={style}\n {...props}\n >\n <div\n ref={containerRef}\n className=\"relative overflow-hidden w-full flex-1\"\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n tabIndex={0}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label=\"이미지 슬라이더\"\n >\n {renderSlides()}\n {renderArrows()}\n {renderPlayPause()}\n {indicatorPosition.includes(\"inside\") && renderIndicators()}\n </div>\n {!indicatorPosition.includes(\"inside\") && renderIndicators()}\n </div>\n );\n }\n);\n\nCarousel.displayName = \"Carousel\";\n\n// Simple icon components\nfunction ChevronLeft({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n );\n}\n\nfunction ChevronRight({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n );\n}\n\nfunction PlayIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction PauseIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M6 4h4v16H6V4zm8 0h4v16h-4V4z\" />\n </svg>\n );\n}\n\nexport { Carousel };\n"]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {l}from'./chunk-ZQUMJQYV.mjs';import {a}from'./chunk-QEMPERUK.mjs';import f from'react';import {jsx,jsxs}from'react/jsx-runtime';var M=f.forwardRef(({children:s,className:r,type:o="single",defaultValue:a$1,value:n,onValueChange:c,collapsible:u=false,...v},m)=>{let[l,d]=f.useState(n?Array.isArray(n)?n:[n]:a$1?Array.isArray(a$1)?a$1:[a$1]:[]);f.useEffect(()=>{n!==void 0&&d(Array.isArray(n)?n:[n]);},[n]);let y=e=>{let t;o==="single"?l.includes(e)?t=u?[]:l:t=[e]:l.includes(e)?t=l.filter(i=>i!==e):t=[...l,e],d(t),c==null||c(o==="single"?t[0]||"":t);},p=f.useMemo(()=>{let e=[];return f.Children.forEach(s,t=>{if(f.isValidElement(t)){let i=t.props;i.value&&e.push(i.value);}}),e},[s]),h=e=>{var D;let t=e.target;if(!t.hasAttribute("data-accordion-trigger"))return;let i=t.getAttribute("data-accordion-value");if(!i)return;let x=p.indexOf(i);if(x===-1)return;let T=x;if(e.key==="ArrowDown"?(e.preventDefault(),T=x<p.length-1?x+1:0):e.key==="ArrowUp"?(e.preventDefault(),T=x>0?x-1:p.length-1):e.key==="Home"?(e.preventDefault(),T=0):e.key==="End"&&(e.preventDefault(),T=p.length-1),T!==x&&p[T]){let P=(D=t.closest("[data-accordion-item]"))==null?void 0:D.querySelector(`[data-accordion-value="${p[T]}"]`);P==null||P.focus();}};return jsx("div",{ref:m,className:a("space-y-2",r),onKeyDown:h,...v,children:f.Children.map(s,e=>f.isValidElement(e)?f.cloneElement(e,{openItems:l,onToggle:y}):e)})});M.displayName="Accordion";var k=f.forwardRef(({value:s,children:r,className:o,disabled:a$1=false,openItems:n=[],onToggle:c,...u},v)=>{let m=n.includes(s);return jsx("div",{ref:v,"data-accordion-item":true,className:a("border border-border/50 rounded-lg overflow-hidden",a$1&&"opacity-50 pointer-events-none",o),...u,children:f.Children.map(r,l=>f.isValidElement(l)?f.cloneElement(l,{value:s,isOpen:m,disabled:a$1,onToggle:()=>c==null?void 0:c(s),"data-accordion-value":s}):l)})});k.displayName="AccordionItem";var I=f.forwardRef(({children:s,className:r,icon:o,iconPosition:a$1="right",value:n,isOpen:c=false,disabled:u=false,onToggle:v,...m},l$1)=>{let d=jsx(l,{name:"chevronDown",size:20,className:a("transition-transform duration-300 ease-out text-muted-foreground",c&&"rotate-180")}),y=`accordion-content-${n}`,p=`accordion-trigger-${n}`;return jsxs("button",{ref:l$1,id:p,"data-accordion-trigger":true,"data-accordion-value":n,"aria-expanded":c,"aria-controls":y,onClick:v,disabled:u,className:a("flex w-full items-center justify-between px-6 py-4 text-left font-medium transition-all hover:bg-muted/80 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",r),...m,children:[jsxs("div",{className:"flex items-center gap-3 flex-1",children:[a$1==="left"&&(o||d),jsx("span",{className:"flex-1",children:s})]}),a$1==="right"&&(o||d)]})});I.displayName="AccordionTrigger";var C=f.forwardRef(({children:s,className:r,isOpen:o=false,value:a$1,"data-accordion-value":n,...c},u)=>{let[v,m]=f.useState(0),l=f.useRef(null),d=a$1||n||"unknown";f.useEffect(()=>{l.current&&m(o?l.current.scrollHeight:0);},[o,s]);let y=`accordion-trigger-${d}`,p=`accordion-content-${d}`;return jsx("div",{ref:u,id:p,role:"region","aria-labelledby":y,hidden:!o,className:"overflow-hidden transition-all duration-300 ease-out",style:{height:`${v}px`},...c,children:jsx("div",{ref:l,className:a("px-6 pt-2 pb-4",r),children:s})})});C.displayName="AccordionContent";var L=f.forwardRef(({className:s,value:r,active:o,children:a$1,...n},c)=>o===false?null:jsx("div",{ref:c,role:"tabpanel",id:`tabpanel-${r}`,"aria-labelledby":`tab-${r}`,hidden:!o,className:a("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2",s),...n,children:a$1}));L.displayName="TabsContent";var A=f.forwardRef(({className:s,value:r,defaultValue:o,onValueChange:a$1,orientation:n="horizontal",variant:c="default",size:u="md",children:v,...m},l)=>{let[d,y]=f.useState(r||o||""),p=r!==void 0,h=p?r:d,e=t=>{p||y(t),a$1==null||a$1(t);};return f.useEffect(()=>{r!==void 0&&y(r);},[r]),jsx("div",{ref:l,className:a("w-full",n==="vertical"&&"flex",s),...m,children:f.Children.map(v,t=>{if(f.isValidElement(t)){if(t.type===L){let i=t.props;return f.cloneElement(t,{active:i.value===h})}if(t.type===N)return f.cloneElement(t,{value:h,onValueChange:e,orientation:n,variant:c,size:u});if(typeof t.type!="string")return f.cloneElement(t,{value:h,onValueChange:e,orientation:n,variant:c,size:u})}return t})})});A.displayName="Tabs";var N=f.forwardRef(({className:s,value:r,onValueChange:o,orientation:a$1="horizontal",variant:n="default",size:c="md",children:u,...v},m)=>{let l=f.useRef(null);f.useImperativeHandle(m,()=>l.current);let d=f.useMemo(()=>{let e=[];return f.Children.forEach(u,t=>{if(f.isValidElement(t)){let i=t.props;i.value&&e.push(i.value);}}),e},[u]),y=e=>{var x;if(!r||d.length===0)return;let t=d.indexOf(r);if(t===-1)return;let i=t;if(a$1==="horizontal"?e.key==="ArrowLeft"?(e.preventDefault(),i=t>0?t-1:d.length-1):e.key==="ArrowRight"?(e.preventDefault(),i=t<d.length-1?t+1:0):e.key==="Home"?(e.preventDefault(),i=0):e.key==="End"&&(e.preventDefault(),i=d.length-1):e.key==="ArrowUp"?(e.preventDefault(),i=t>0?t-1:d.length-1):e.key==="ArrowDown"?(e.preventDefault(),i=t<d.length-1?t+1:0):e.key==="Home"?(e.preventDefault(),i=0):e.key==="End"&&(e.preventDefault(),i=d.length-1),i!==t&&d[i]){o==null||o(d[i]);let T=(x=l.current)==null?void 0:x.querySelector(`[data-tab-value="${d[i]}"]`);T==null||T.focus();}},p=()=>{switch(n){case "pills":return "bg-muted p-3 rounded-xl border border-border/50";case "underline":return "border-b border-border";case "cards":return "bg-muted/80 p-3 rounded-xl border border-border/50";default:return "bg-muted p-3 rounded-xl border border-border/50"}},h=()=>{switch(c){case "sm":return "h-12";case "lg":return "h-16";default:return "h-14"}};return jsx("div",{ref:l,role:"tablist","aria-orientation":a$1,onKeyDown:y,className:a("flex items-center justify-center",a$1==="vertical"&&"flex-col",p(),h(),s),...v,children:f.Children.map(u,e=>{if(f.isValidElement(e)){if(typeof e.type=="string")return e;let t=e.props;return f.cloneElement(e,{onValueChange:o,orientation:a$1,variant:n,size:c,active:t.value===r})}return e})})});N.displayName="TabsList";var z=f.forwardRef(({className:s,value:r,onValueChange:o,orientation:a$1="horizontal",variant:n="default",size:c="md",active:u=false,children:v,...m},l)=>{let d=()=>{switch(n){case "pills":return a("inline-flex items-center justify-center whitespace-nowrap rounded-lg px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",u?"bg-background text-foreground shadow-md":"text-muted-foreground hover:text-foreground hover:bg-muted");case "underline":return a("inline-flex items-center justify-center whitespace-nowrap border-b-2 px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",u?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground");case "cards":return a("inline-flex items-center justify-center whitespace-nowrap rounded-lg px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",u?"bg-background text-foreground shadow-md":"text-muted-foreground hover:text-foreground hover:bg-muted");default:return a("inline-flex items-center justify-center whitespace-nowrap rounded-lg px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",u?"bg-background text-foreground shadow-md":"text-muted-foreground hover:text-foreground hover:bg-muted")}},y=()=>{switch(c){case "sm":return "h-10 px-4 py-2 text-xs";case "lg":return "h-14 px-6 py-3 text-base";default:return "h-12 px-5 py-2.5 text-sm"}},p=()=>{o&&o(r);};return jsx("button",{ref:l,role:"tab","aria-selected":u,"aria-controls":`tabpanel-${r}`,id:`tab-${r}`,"data-tab-value":r,tabIndex:u?0:-1,className:a(d(),y(),s),onClick:p,type:"button",...m,children:v})});z.displayName="TabsTrigger";var $=f.forwardRef((s,r)=>jsx(A,{ref:r,variant:"pills",...s}));$.displayName="TabsPills";var S=f.forwardRef((s,r)=>jsx(A,{ref:r,variant:"underline",...s}));S.displayName="TabsUnderline";var K=f.forwardRef((s,r)=>jsx(A,{ref:r,variant:"cards",...s}));K.displayName="TabsCards";export{M as a,k as b,I as c,C as d,L as e,A as f,N as g,z as h,$ as i,S as j,K as k};//# sourceMappingURL=chunk-QRM66RQG.mjs.map
3
- //# sourceMappingURL=chunk-QRM66RQG.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Accordion.tsx","../src/components/Tabs.tsx"],"names":["Accordion","React","children","className","type","defaultValue","value","onValueChange","collapsible","props","ref","openItems","setOpenItems","handleItemToggle","itemValue","newOpenItems","item","itemValues","values","child","childProps","handleKeyDown","_a","target","currentValue","currentIndex","newIndex","triggerElement","jsx","merge","AccordionItem","disabled","onToggle","isOpen","AccordionTrigger","icon","iconPosition","defaultIcon","Icon","contentId","triggerId","jsxs","AccordionContent","dataValue","height","setHeight","contentRef","TabsContent","active","Tabs","orientation","variant","size","activeTab","setActiveTab","isControlled","handleTabChange","newValue","TabsList","listRef","tabValues","getVariantClasses","getSizeClasses","TabsTrigger","_orientation","handleClick","TabsPills","TabsUnderline","TabsCards"],"mappings":"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","file":"chunk-QRM66RQG.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Accordion 컴포넌트의 props / Accordion component props\n * @typedef {Object} AccordionProps\n * @property {React.ReactNode} children - AccordionItem 컴포넌트들 / AccordionItem components\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"single\" | \"multiple\"} [type=\"single\"] - 단일 또는 다중 아이템 열기 허용 / Allow single or multiple items to be open\n * @property {string | string[]} [defaultValue] - 초기 열린 아이템 값 (비제어 컴포넌트) / Initial open item value (uncontrolled component)\n * @property {string | string[]} [value] - 현재 열린 아이템 값 (제어 컴포넌트) / Current open item value (controlled component)\n * @property {(value: string | string[]) => void} [onValueChange] - 아이템 열림/닫힘 콜백 / Item open/close callback\n * @property {boolean} [collapsible=false] - 단일 모드에서 열린 아이템을 닫을 수 있는지 여부 / Whether open item can be closed in single mode\n */\ninterface AccordionProps {\n children: React.ReactNode\n className?: string\n type?: \"single\" | \"multiple\"\n defaultValue?: string | string[]\n value?: string | string[]\n onValueChange?: (value: string | string[]) => void\n collapsible?: boolean\n}\n\n/**\n * Accordion 컴포넌트 / Accordion component\n * \n * 접을 수 있는 콘텐츠 섹션을 제공하는 컴포넌트입니다.\n * 키보드 네비게이션(Arrow keys, Home/End)을 지원하며, ARIA 속성을 자동으로 설정합니다.\n * \n * Component that provides collapsible content sections.\n * Supports keyboard navigation (Arrow keys, Home/End) and automatically sets ARIA attributes.\n * \n * @component\n * @example\n * // 기본 사용 (단일 열기) / Basic usage (single open)\n * <Accordion type=\"single\">\n * <AccordionItem value=\"item1\">\n * <AccordionTrigger>제목 1</AccordionTrigger>\n * <AccordionContent>내용 1</AccordionContent>\n * </AccordionItem>\n * <AccordionItem value=\"item2\">\n * <AccordionTrigger>제목 2</AccordionTrigger>\n * <AccordionContent>내용 2</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * \n * @example\n * // 다중 열기 / Multiple open\n * <Accordion type=\"multiple\" defaultValue={[\"item1\", \"item2\"]}>\n * <AccordionItem value=\"item1\">\n * <AccordionTrigger>제목 1</AccordionTrigger>\n * <AccordionContent>내용 1</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [openItems, setOpenItems] = useState<string[]>([])\n * <Accordion type=\"multiple\" value={openItems} onValueChange={setOpenItems}>\n * <AccordionItem value=\"item1\">\n * <AccordionTrigger>제목</AccordionTrigger>\n * <AccordionContent>내용</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * \n * @param {AccordionProps} props - Accordion 컴포넌트의 props / Accordion component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Accordion 컴포넌트 / Accordion component\n */\nconst Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(\n ({ \n children, \n className,\n type = \"single\",\n defaultValue,\n value,\n onValueChange,\n collapsible = false,\n ...props \n }, ref) => {\n const [openItems, setOpenItems] = React.useState<string[]>(\n value ? (Array.isArray(value) ? value : [value]) : \n defaultValue ? (Array.isArray(defaultValue) ? defaultValue : [defaultValue]) : []\n )\n\n React.useEffect(() => {\n if (value !== undefined) {\n setOpenItems(Array.isArray(value) ? value : [value])\n }\n }, [value])\n\n const handleItemToggle = (itemValue: string) => {\n let newOpenItems: string[]\n\n if (type === \"single\") {\n if (openItems.includes(itemValue)) {\n newOpenItems = collapsible ? [] : openItems\n } else {\n newOpenItems = [itemValue]\n }\n } else {\n if (openItems.includes(itemValue)) {\n newOpenItems = openItems.filter(item => item !== itemValue)\n } else {\n newOpenItems = [...openItems, itemValue]\n }\n }\n\n setOpenItems(newOpenItems)\n onValueChange?.(type === \"single\" ? newOpenItems[0] || \"\" : newOpenItems)\n }\n\n // 모든 아이템의 value를 수집\n const itemValues = React.useMemo(() => {\n const values: string[] = []\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n const childProps = child.props as { value?: string }\n if (childProps.value) {\n values.push(childProps.value)\n }\n }\n })\n return values\n }, [children])\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement\n if (!target.hasAttribute('data-accordion-trigger')) return\n\n const currentValue = target.getAttribute('data-accordion-value')\n if (!currentValue) return\n\n const currentIndex = itemValues.indexOf(currentValue)\n if (currentIndex === -1) return\n\n let newIndex = currentIndex\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault()\n newIndex = currentIndex < itemValues.length - 1 ? currentIndex + 1 : 0\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault()\n newIndex = currentIndex > 0 ? currentIndex - 1 : itemValues.length - 1\n } else if (e.key === \"Home\") {\n e.preventDefault()\n newIndex = 0\n } else if (e.key === \"End\") {\n e.preventDefault()\n newIndex = itemValues.length - 1\n }\n\n if (newIndex !== currentIndex && itemValues[newIndex]) {\n const triggerElement = target.closest('[data-accordion-item]')?.querySelector(\n `[data-accordion-value=\"${itemValues[newIndex]}\"]`\n ) as HTMLElement\n triggerElement?.focus()\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n openItems,\n onToggle: handleItemToggle\n } as Partial<AccordionItemProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nAccordion.displayName = \"Accordion\"\n\n/**\n * AccordionItem 컴포넌트의 props / AccordionItem component props\n * @typedef {Object} AccordionItemProps\n * @property {string} value - 아이템의 고유 값 / Item unique value\n * @property {React.ReactNode} children - AccordionTrigger와 AccordionContent / AccordionTrigger and AccordionContent\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [disabled=false] - 아이템 비활성화 여부 / Item disabled state\n * @property {string[]} [openItems] - 열린 아이템 목록 (Accordion에서 자동 전달) / Open items list (auto-passed from Accordion)\n * @property {(value: string) => void} [onToggle] - 토글 콜백 (Accordion에서 자동 전달) / Toggle callback (auto-passed from Accordion)\n */\ninterface AccordionItemProps {\n value: string\n children: React.ReactNode\n className?: string\n disabled?: boolean\n openItems?: string[]\n onToggle?: (value: string) => void\n}\n\n/**\n * AccordionItem 컴포넌트 / AccordionItem component\n * 아코디언의 개별 아이템을 감싸는 컨테이너입니다.\n * Container that wraps an individual accordion item.\n * \n * @component\n * @param {AccordionItemProps} props - AccordionItem 컴포넌트의 props / AccordionItem component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} AccordionItem 컴포넌트 / AccordionItem component\n */\nconst AccordionItem = React.forwardRef<HTMLDivElement, AccordionItemProps>(\n ({ \n value, \n children, \n className,\n disabled = false,\n openItems = [],\n onToggle,\n ...props \n }, ref) => {\n const isOpen = openItems.includes(value)\n\n return (\n <div\n ref={ref}\n data-accordion-item\n className={merge(\n \"border border-border/50 rounded-lg overflow-hidden\",\n disabled && \"opacity-50 pointer-events-none\",\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n value,\n isOpen,\n disabled,\n onToggle: () => onToggle?.(value),\n 'data-accordion-value': value\n } as Partial<AccordionTriggerProps | AccordionContentProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nAccordionItem.displayName = \"AccordionItem\"\n\ninterface AccordionTriggerProps {\n children: React.ReactNode\n className?: string\n icon?: React.ReactNode\n iconPosition?: \"left\" | \"right\"\n value?: string // Optional: AccordionItem에서 자동으로 전달됨 / Optional: Auto-passed from AccordionItem\n isOpen?: boolean\n disabled?: boolean\n onToggle?: () => void\n}\n\nconst AccordionTrigger = React.forwardRef<HTMLButtonElement, AccordionTriggerProps>(\n ({ \n children, \n className,\n icon,\n iconPosition = \"right\",\n value,\n isOpen = false,\n disabled = false,\n onToggle,\n ...props \n }, ref) => {\n const defaultIcon = (\n <Icon \n name=\"chevronDown\" \n size={20} \n className={merge(\n \"transition-transform duration-300 ease-out text-muted-foreground\",\n isOpen && \"rotate-180\"\n )} \n />\n )\n\n const contentId = `accordion-content-${value}`\n const triggerId = `accordion-trigger-${value}`\n\n return (\n <button\n ref={ref}\n id={triggerId}\n data-accordion-trigger\n data-accordion-value={value}\n aria-expanded={isOpen}\n aria-controls={contentId}\n onClick={onToggle}\n disabled={disabled}\n className={merge(\n \"flex w-full items-center justify-between px-6 py-4 text-left font-medium transition-all hover:bg-muted/80 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <div className=\"flex items-center gap-3 flex-1\">\n {iconPosition === \"left\" && (icon || defaultIcon)}\n <span className=\"flex-1\">{children}</span>\n </div>\n {iconPosition === \"right\" && (icon || defaultIcon)}\n </button>\n )\n }\n)\nAccordionTrigger.displayName = \"AccordionTrigger\"\n\n/**\n * AccordionTrigger 컴포넌트 / AccordionTrigger component\n * 아코디언 아이템을 열고 닫는 트리거 버튼입니다.\n * Button that opens and closes an accordion item.\n * \n * @component\n * @param {AccordionTriggerProps} props - AccordionTrigger 컴포넌트의 props / AccordionTrigger component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} AccordionTrigger 컴포넌트 / AccordionTrigger component\n */\n\n/**\n * AccordionContent 컴포넌트의 props\n * @typedef {Object} AccordionContentProps\n * @property {React.ReactNode} children - 콘텐츠\n * @property {string} [className] - 추가 CSS 클래스\n * @property {boolean} [isOpen] - 열림 상태 (AccordionItem에서 자동 전달)\n * @property {string} [value] - 아이템 값 (AccordionItem에서 자동 전달)\n * @property {string} ['data-accordion-value'] - 아이템 값 (내부 사용)\n */\ninterface AccordionContentProps {\n children: React.ReactNode\n className?: string\n isOpen?: boolean\n value?: string\n 'data-accordion-value'?: string\n}\n\n/**\n * AccordionContent 컴포넌트 / AccordionContent component\n * 아코디언 아이템의 콘텐츠를 표시합니다.\n * Displays the content of an accordion item.\n * \n * @component\n * @param {AccordionContentProps} props - AccordionContent 컴포넌트의 props / AccordionContent component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} AccordionContent 컴포넌트 / AccordionContent component\n */\nconst AccordionContent = React.forwardRef<HTMLDivElement, AccordionContentProps>(\n ({ children, className, isOpen = false, value, 'data-accordion-value': dataValue, ...props }, ref) => {\n const [height, setHeight] = React.useState(0)\n const contentRef = React.useRef<HTMLDivElement>(null)\n const itemValue = value || dataValue || 'unknown'\n\n React.useEffect(() => {\n if (contentRef.current) {\n if (isOpen) {\n setHeight(contentRef.current.scrollHeight)\n } else {\n setHeight(0)\n }\n }\n }, [isOpen, children])\n\n const triggerId = `accordion-trigger-${itemValue}`\n const contentId = `accordion-content-${itemValue}`\n\n return (\n <div\n ref={ref}\n id={contentId}\n role=\"region\"\n aria-labelledby={triggerId}\n hidden={!isOpen}\n className=\"overflow-hidden transition-all duration-300 ease-out\"\n style={{ height: `${height}px` }}\n {...props}\n >\n <div\n ref={contentRef}\n className={merge(\"px-6 pt-2 pb-4\", className)}\n >\n {children}\n </div>\n </div>\n )\n }\n)\nAccordionContent.displayName = \"AccordionContent\"\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent } ","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../lib/utils'\n\n/**\n * TabsContent 컴포넌트의 props / TabsContent component props\n * @typedef {Object} TabsContentProps\n * @property {string} value - 탭 패널의 고유 값 (TabsTrigger의 value와 일치해야 함) / Unique value for tab panel (must match TabsTrigger value)\n * @property {boolean} [active] - 탭 패널 활성화 상태 (자동 설정됨) / Tab panel active state (auto-set)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n active?: boolean\n}\n\n/**\n * TabsContent 컴포넌트 / TabsContent component\n * 탭의 콘텐츠 패널을 표시합니다. Tabs 컴포넌트 내부에서 사용됩니다.\n * Displays the tab content panel. Used inside Tabs component.\n * \n * @component\n * @param {TabsContentProps} props - TabsContent 컴포넌트의 props / TabsContent component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} TabsContent 컴포넌트 / TabsContent component\n */\nconst TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, value, active, children, ...props }, ref) => {\n // active prop이 명시적으로 false로 설정된 경우에만 숨김\n if (active === false) return null\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n id={`tabpanel-${value}`}\n aria-labelledby={`tab-${value}`}\n hidden={!active}\n className={merge(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nTabsContent.displayName = \"TabsContent\"\n\n/**\n * Tabs 컴포넌트의 props / Tabs component props\n * @typedef {Object} TabsProps\n * @property {string} [value] - 현재 활성화된 탭 값 (제어 컴포넌트) / Currently active tab value (controlled component)\n * @property {string} [defaultValue] - 초기 활성화된 탭 값 (비제어 컴포넌트) / Initial active tab value (uncontrolled component)\n * @property {(value: string) => void} [onValueChange] - 탭 변경 시 호출되는 콜백 / Callback when tab changes\n * @property {\"horizontal\" | \"vertical\"} [orientation=\"horizontal\"] - 탭 방향 / Tab orientation\n * @property {\"default\" | \"pills\" | \"underline\" | \"cards\"} [variant=\"default\"] - 탭 스타일 변형 / Tab style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 탭 크기 / Tab size\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n orientation?: \"horizontal\" | \"vertical\"\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * Tabs 컴포넌트 / Tabs component\n * \n * 탭 네비게이션을 제공하는 컴포넌트입니다.\n * 키보드 네비게이션(Arrow keys, Home/End)을 지원하며, ARIA 속성을 자동으로 설정합니다.\n * \n * Component that provides tab navigation.\n * Supports keyboard navigation (Arrow keys, Home/End) and automatically sets ARIA attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Tabs defaultValue=\"tab1\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">탭 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">탭 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">탭 1 내용</TabsContent>\n * <TabsContent value=\"tab2\">탭 2 내용</TabsContent>\n * </Tabs>\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [activeTab, setActiveTab] = useState(\"tab1\")\n * <Tabs value={activeTab} onValueChange={setActiveTab}>\n * <TabsList>\n * <TabsTrigger value=\"tab1\">탭 1</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">내용</TabsContent>\n * </Tabs>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Tabs variant=\"pills\" size=\"lg\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Pills 스타일</TabsTrigger>\n * </TabsList>\n * </Tabs>\n * \n * @param {TabsProps} props - Tabs 컴포넌트의 props / Tabs component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Tabs 컴포넌트 / Tabs component\n */\nconst Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n ({ \n className, \n value,\n defaultValue,\n onValueChange,\n orientation = \"horizontal\",\n variant = \"default\",\n size = \"md\",\n children,\n ...props \n }, ref) => {\n const [activeTab, setActiveTab] = React.useState(value || defaultValue || \"\")\n const isControlled = value !== undefined\n const currentValue = isControlled ? value : activeTab\n\n const handleTabChange = (newValue: string) => {\n if (!isControlled) {\n setActiveTab(newValue)\n }\n onValueChange?.(newValue)\n }\n\n React.useEffect(() => {\n if (value !== undefined) {\n setActiveTab(value)\n }\n }, [value])\n\n return (\n <div\n ref={ref}\n className={merge(\n \"w-full\",\n orientation === \"vertical\" && \"flex\",\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n // TabsContent인 경우 active prop만 설정 (value는 원래 값 유지)\n if (child.type === TabsContent) {\n const childProps = child.props as TabsContentProps\n return React.cloneElement(child, {\n active: childProps.value === currentValue\n } as Partial<TabsContentProps>)\n }\n // TabsList인 경우에만 onValueChange 전달\n if (child.type === TabsList) {\n return React.cloneElement(child, {\n value: currentValue,\n onValueChange: handleTabChange,\n orientation,\n variant,\n size\n } as Partial<TabsListProps>)\n }\n // 다른 React 컴포넌트들 (다른 custom wrapper 등)\n // HTML 요소가 아닌 경우에만 props 전달\n if (typeof child.type !== 'string') {\n return React.cloneElement(child, {\n value: currentValue,\n onValueChange: handleTabChange,\n orientation,\n variant,\n size\n } as Record<string, unknown>)\n }\n }\n return child\n })}\n </div>\n )\n }\n)\nTabs.displayName = \"Tabs\"\n\n/**\n * TabsList 컴포넌트의 props / TabsList component props\n * @typedef {Object} TabsListProps\n * @property {string} [value] - 현재 활성화된 탭 값 (Tabs에서 자동 전달) / Currently active tab value (auto-passed from Tabs)\n * @property {(value: string) => void} [onValueChange] - 탭 변경 콜백 (Tabs에서 자동 전달) / Tab change callback (auto-passed from Tabs)\n * @property {\"horizontal\" | \"vertical\"} [orientation] - 탭 방향 (Tabs에서 자동 전달) / Tab orientation (auto-passed from Tabs)\n * @property {\"default\" | \"pills\" | \"underline\" | \"cards\"} [variant] - 탭 스타일 (Tabs에서 자동 전달) / Tab style (auto-passed from Tabs)\n * @property {\"sm\" | \"md\" | \"lg\"} [size] - 탭 크기 (Tabs에서 자동 전달) / Tab size (auto-passed from Tabs)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string\n onValueChange?: (value: string) => void\n orientation?: \"horizontal\" | \"vertical\"\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * TabsList 컴포넌트 / TabsList component\n * 탭 트리거 목록을 표시합니다. Tabs 컴포넌트 내부에서 사용됩니다.\n * Displays the list of tab triggers. Used inside Tabs component.\n * \n * @component\n * @param {TabsListProps} props - TabsList 컴포넌트의 props / TabsList component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} TabsList 컴포넌트 / TabsList component\n */\nconst TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(\n ({ \n className, \n value,\n onValueChange,\n orientation = \"horizontal\",\n variant = \"default\",\n size = \"md\",\n children,\n ...props \n }, ref) => {\n const listRef = React.useRef<HTMLDivElement>(null)\n React.useImperativeHandle(ref, () => listRef.current as HTMLDivElement)\n \n // 모든 탭 트리거의 value를 수집\n const tabValues = React.useMemo(() => {\n const values: string[] = []\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n const childProps = child.props as { value?: string }\n if (childProps.value) {\n values.push(childProps.value)\n }\n }\n })\n return values\n }, [children])\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!value || tabValues.length === 0) return\n\n const currentIndex = tabValues.indexOf(value)\n if (currentIndex === -1) return\n\n let newIndex = currentIndex\n\n if (orientation === \"horizontal\") {\n if (e.key === \"ArrowLeft\") {\n e.preventDefault()\n newIndex = currentIndex > 0 ? currentIndex - 1 : tabValues.length - 1\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault()\n newIndex = currentIndex < tabValues.length - 1 ? currentIndex + 1 : 0\n } else if (e.key === \"Home\") {\n e.preventDefault()\n newIndex = 0\n } else if (e.key === \"End\") {\n e.preventDefault()\n newIndex = tabValues.length - 1\n }\n } else {\n if (e.key === \"ArrowUp\") {\n e.preventDefault()\n newIndex = currentIndex > 0 ? currentIndex - 1 : tabValues.length - 1\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault()\n newIndex = currentIndex < tabValues.length - 1 ? currentIndex + 1 : 0\n } else if (e.key === \"Home\") {\n e.preventDefault()\n newIndex = 0\n } else if (e.key === \"End\") {\n e.preventDefault()\n newIndex = tabValues.length - 1\n }\n }\n\n if (newIndex !== currentIndex && tabValues[newIndex]) {\n onValueChange?.(tabValues[newIndex])\n // 포커스 이동\n const triggerElement = listRef.current?.querySelector(\n `[data-tab-value=\"${tabValues[newIndex]}\"]`\n ) as HTMLElement\n triggerElement?.focus()\n }\n }\n const getVariantClasses = () => {\n switch (variant) {\n case \"pills\":\n return \"bg-muted p-3 rounded-xl border border-border/50\"\n case \"underline\":\n return \"border-b border-border\"\n case \"cards\":\n return \"bg-muted/80 p-3 rounded-xl border border-border/50\"\n default:\n return \"bg-muted p-3 rounded-xl border border-border/50\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"h-12\"\n case \"lg\":\n return \"h-16\"\n default:\n return \"h-14\"\n }\n }\n\n return (\n <div\n ref={listRef}\n role=\"tablist\"\n aria-orientation={orientation}\n onKeyDown={handleKeyDown}\n className={merge(\n \"flex items-center justify-center\",\n orientation === \"vertical\" && \"flex-col\",\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n // Only pass tab props to non-HTML elements (React components)\n if (typeof child.type === 'string') {\n return child\n }\n const childProps = child.props as { value?: string }\n return React.cloneElement(child, {\n onValueChange,\n orientation,\n variant,\n size,\n active: childProps.value === value\n } as Partial<TabsTriggerProps>)\n }\n return child\n })}\n </div>\n )\n }\n)\nTabsList.displayName = \"TabsList\"\n\n/**\n * TabsTrigger 컴포넌트의 props\n * @typedef {Object} TabsTriggerProps\n * @property {string} value - 탭 트리거의 고유 값 (TabsContent의 value와 일치해야 함)\n * @property {(value: string) => void} [onValueChange] - 탭 변경 콜백 (TabsList에서 자동 전달)\n * @property {\"horizontal\" | \"vertical\"} [orientation] - 탭 방향 (TabsList에서 자동 전달)\n * @property {\"default\" | \"pills\" | \"underline\" | \"cards\"} [variant] - 탭 스타일 (TabsList에서 자동 전달)\n * @property {\"sm\" | \"md\" | \"lg\"} [size] - 탭 크기 (TabsList에서 자동 전달)\n * @property {boolean} [active] - 탭 활성화 상태 (자동 설정됨)\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n onValueChange?: (value: string) => void\n orientation?: \"horizontal\" | \"vertical\"\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\"\n size?: \"sm\" | \"md\" | \"lg\"\n active?: boolean\n}\n\n/**\n * TabsTrigger 컴포넌트 / TabsTrigger component\n * 탭을 활성화하는 버튼입니다. TabsList 컴포넌트 내부에서 사용됩니다.\n * Button that activates a tab. Used inside TabsList component.\n * \n * @component\n * @param {TabsTriggerProps} props - TabsTrigger 컴포넌트의 props / TabsTrigger component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} TabsTrigger 컴포넌트 / TabsTrigger component\n */\nconst TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n ({ \n className,\n value,\n onValueChange,\n orientation: _orientation = \"horizontal\",\n variant = \"default\",\n size = \"md\",\n active = false,\n children,\n ...props\n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"pills\":\n return merge(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-lg px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active\n ? \"bg-background text-foreground shadow-md\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n )\n case \"underline\":\n return merge(\n \"inline-flex items-center justify-center whitespace-nowrap border-b-2 px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active\n ? \"border-primary text-primary\"\n : \"border-transparent text-muted-foreground hover:text-foreground\"\n )\n case \"cards\":\n return merge(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-lg px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active\n ? \"bg-background text-foreground shadow-md\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n )\n default:\n return merge(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-lg px-4 py-2.5 text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active\n ? \"bg-background text-foreground shadow-md\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n )\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"h-10 px-4 py-2 text-xs\"\n case \"lg\":\n return \"h-14 px-6 py-3 text-base\"\n default:\n return \"h-12 px-5 py-2.5 text-sm\"\n }\n }\n\n const handleClick = () => {\n if (onValueChange) {\n onValueChange(value)\n }\n }\n\n return (\n <button\n ref={ref}\n role=\"tab\"\n aria-selected={active}\n aria-controls={`tabpanel-${value}`}\n id={`tab-${value}`}\n data-tab-value={value}\n tabIndex={active ? 0 : -1}\n className={merge(\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n onClick={handleClick}\n type=\"button\"\n {...props}\n >\n {children}\n </button>\n )\n }\n)\nTabsTrigger.displayName = \"TabsTrigger\"\n\n// 편의 컴포넌트들\nconst TabsPills = React.forwardRef<HTMLDivElement, TabsProps>(\n (props, ref) => <Tabs ref={ref} variant=\"pills\" {...props} />\n)\nTabsPills.displayName = \"TabsPills\"\n\nconst TabsUnderline = React.forwardRef<HTMLDivElement, TabsProps>(\n (props, ref) => <Tabs ref={ref} variant=\"underline\" {...props} />\n)\nTabsUnderline.displayName = \"TabsUnderline\"\n\nconst TabsCards = React.forwardRef<HTMLDivElement, TabsProps>(\n (props, ref) => <Tabs ref={ref} variant=\"cards\" {...props} />\n)\nTabsCards.displayName = \"TabsCards\"\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, TabsPills, TabsUnderline, TabsCards } "]}
@@ -1,13 +0,0 @@
1
- "use client";
2
- import {a}from'./chunk-QEMPERUK.mjs';import {jsxs,jsx,Fragment}from'react/jsx-runtime';function b({className:s,size:n="md",variant:l="default",text:o,color:d="default"}){let u={sm:"w-6 h-6",md:"w-8 h-8",lg:"w-12 h-12",xl:"w-16 h-16"},r={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"},m=()=>{switch(l){case "dots":return jsxs(Fragment,{children:[jsx("style",{children:`
3
- @keyframes dotPulse {
4
- 0%, 80%, 100% { opacity: 0.3; }
5
- 40% { opacity: 1; }
6
- }
7
- `}),jsxs("div",{className:"flex space-x-1 items-center",children:[jsx("div",{className:"w-2 h-2 bg-current rounded-full",style:{animation:"dotPulse 1.4s ease-in-out infinite",animationDelay:"0ms"}}),jsx("div",{className:"w-2 h-2 bg-current rounded-full",style:{animation:"dotPulse 1.4s ease-in-out infinite",animationDelay:"200ms"}}),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 jsxs(Fragment,{children:[jsx("style",{children:`
8
- @keyframes barWave {
9
- 0%, 40%, 100% { transform: scaleY(0.4); }
10
- 20% { transform: scaleY(1); }
11
- }
12
- `}),jsxs("div",{className:"flex space-x-0.5 h-full items-center",children:[jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"0ms"}}),jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"100ms"}}),jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"200ms"}}),jsx("div",{className:"w-1 h-full bg-current rounded-sm origin-bottom",style:{animation:"barWave 1.2s ease-in-out infinite",animationDelay:"300ms"}}),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 jsx("div",{className:a("w-full h-full animate-spin rounded-full",n==="xl"?"border-[3px]":n==="lg"?"border-[2.5px]":"border-2",r[d]||r.default)});case "ripple":return jsxs("div",{className:"relative w-full h-full",children:[jsx("div",{className:a("absolute inset-0 rounded-full border-2 animate-ping",r[d]||r.default)}),jsx("div",{className:a("w-full h-full rounded-full border-2",r[d]||r.default)})]});default:return jsx("div",{className:a("w-full h-full animate-spin rounded-full",n==="xl"?"border-[3px]":n==="lg"?"border-[2.5px]":"border-2",r[d]||r.default)})}};return jsxs("div",{className:a("flex flex-col items-center justify-center",s),children:[jsx("div",{className:a(u[n],"text-muted-foreground"),children:m()}),o&&jsx("p",{className:"mt-3 text-sm text-muted-foreground text-center",children:o})]})}export{b as a};//# sourceMappingURL=chunk-QRRP7TGF.mjs.map
13
- //# sourceMappingURL=chunk-QRRP7TGF.mjs.map