@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
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import {m}from'./chunk-NSDWT2JM.mjs';import {d,e}from'./chunk-OBMOTQEU.mjs';import n from'react';import {jsxs,jsx}from'react/jsx-runtime';var T=n.forwardRef(({isOpen:o,onClose:a,children:i,dot:s,style:m,side:e$1="right",size:g="md",showBackdrop:v=true,backdropDot:R,closeOnBackdropClick:D=true,closeOnEscape:u=true,closable:M=true,...S},P)=>{let r=o!=null?o:false,b=()=>{a==null||a();},[k,p]=n.useState(false),[C,f]=n.useState(false);if(n.useEffect(()=>{if(r){p(true),f(true);let d=setTimeout(()=>f(false),50);return ()=>clearTimeout(d)}else {f(true);let d=setTimeout(()=>{p(false),f(false);},300);return ()=>clearTimeout(d)}},[r]),n.useEffect(()=>{if(!u)return;let d=N=>{N.key==="Escape"&&r&&b();};return r&&(document.addEventListener("keydown",d),document.body.style.overflow="hidden"),()=>{document.removeEventListener("keydown",d),document.body.style.overflow="";}},[r,u]),!k)return null;let E={sm:e$1==="left"||e$1==="right"?{width:"20rem"}:{height:"16rem"},md:e$1==="left"||e$1==="right"?{width:"24rem"}:{height:"24rem"},lg:e$1==="left"||e$1==="right"?{width:"28rem"}:{height:"32rem"},xl:e$1==="left"||e$1==="right"?{width:"32rem"}:{height:"40rem"},full:e$1==="left"||e$1==="right"?{width:"100%"}:{height:"100%"}},x={left:{left:0,top:0,height:"100%"},right:{right:0,top:0,height:"100%"},top:{top:0,left:0,width:"100%"},bottom:{bottom:0,left:0,width:"100%"}},H={left:{transform:r?"translateX(0)":"translateX(-100%)"},right:{transform:r?"translateX(0)":"translateX(100%)"},top:{transform:r?"translateY(0)":"translateY(-100%)"},bottom:{transform:r?"translateY(0)":"translateY(100%)"}},h=C?r?1:0:void 0;return jsxs("div",{style:e("fixed inset-0 z-50"),children:[v&&jsx("div",{style:d(e("absolute inset-0 bg-black/85 backdrop-blur-md transition-opacity duration-300"),e(R),h!==void 0?{opacity:h}:void 0),onClick:D?b:void 0}),jsx("div",{ref:P,style:d(e("absolute bg-background/95 backdrop-blur-xl border border-border/50 shadow-2xl transition-transform duration-300 ease-out"),E[g],x[e$1],H[e$1],e(s),m),...S,children:i})]})});T.displayName="Drawer";var L=n.forwardRef(({children:o,style:a,showCloseButton:i=true,onClose:s,...m$1},e$1)=>jsxs("div",{ref:e$1,style:d(e("flex items-center justify-between p-6 border-b border-border/50"),a),...m$1,children:[jsx("div",{style:e("flex-1"),children:o}),i&&jsx("button",{onClick:s,style:e("p-2 rounded-lg hover:bg-muted transition-colors"),children:jsx(m,{name:"close",size:20})})]}));L.displayName="DrawerHeader";var z=n.forwardRef(({children:o,style:a,...i},s)=>jsx("div",{ref:s,style:d(e("flex-1 p-6 overflow-y-auto"),a),...i,children:o}));z.displayName="DrawerContent";var F=n.forwardRef(({children:o,style:a,...i},s)=>jsx("div",{ref:s,style:d(e("flex items-center justify-end gap-3 p-6 border-t border-border/50"),a),...i,children:o}));F.displayName="DrawerFooter";export{T as a,L as b,z as c,F as d};//# sourceMappingURL=chunk-SPZ7SZH4.mjs.map
3
+ //# sourceMappingURL=chunk-SPZ7SZH4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Drawer.tsx"],"names":["Drawer","React","isOpen","onClose","children","dotProp","style","side","size","showBackdrop","backdropDot","closeOnBackdropClick","closeOnEscape","closable","props","ref","_isOpen","handleClose","isVisible","setIsVisible","isAnimating","setIsAnimating","timer","handleEscapeKey","e","sizeStyles","sideStyles","transformStyles","backdropOpacity","jsxs","resolveDot","jsx","mergeStyles","DrawerHeader","showCloseButton","Icon","DrawerContent","DrawerFooter"],"mappings":"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","file":"chunk-SPZ7SZH4.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { Icon } from \"./Icon\"\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\"\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 {React.CSSProperties} [style] - 인라인 스타일 / Inline style\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} [backdropDot] - 배경 오버레이 추가 dot 스트링 / Backdrop overlay additional dot string\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 /** dot 유틸리티 스트링 (인라인 스타일로 변환) / dot utility string (converted to inline style) */\n dot?: string\n /** 인라인 스타일 / Inline style */\n style?: React.CSSProperties\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 /** 배경 오버레이 추가 dot 스트링 / Backdrop overlay additional dot string */\n backdropDot?: 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 dot: dotProp,\n style,\n side = \"right\",\n size = \"md\",\n showBackdrop = true,\n backdropDot,\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 sizeStyles: Record<string, React.CSSProperties> = {\n sm: side === \"left\" || side === \"right\" ? { width: '20rem' } : { height: '16rem' },\n md: side === \"left\" || side === \"right\" ? { width: '24rem' } : { height: '24rem' },\n lg: side === \"left\" || side === \"right\" ? { width: '28rem' } : { height: '32rem' },\n xl: side === \"left\" || side === \"right\" ? { width: '32rem' } : { height: '40rem' },\n full: side === \"left\" || side === \"right\" ? { width: '100%' } : { height: '100%' }\n }\n\n const sideStyles: Record<string, React.CSSProperties> = {\n left: { left: 0, top: 0, height: '100%' },\n right: { right: 0, top: 0, height: '100%' },\n top: { top: 0, left: 0, width: '100%' },\n bottom: { bottom: 0, left: 0, width: '100%' }\n }\n\n // Transform: _isOpen=true -> visible position, _isOpen=false -> hidden position\n const transformStyles: Record<string, React.CSSProperties> = {\n left: { transform: _isOpen ? 'translateX(0)' : 'translateX(-100%)' },\n right: { transform: _isOpen ? 'translateX(0)' : 'translateX(100%)' },\n top: { transform: _isOpen ? 'translateY(0)' : 'translateY(-100%)' },\n bottom: { transform: _isOpen ? 'translateY(0)' : 'translateY(100%)' }\n }\n\n // Backdrop opacity animation\n const backdropOpacity = isAnimating\n ? (_isOpen ? 1 : 0)\n : undefined\n\n return (\n <div style={resolveDot('fixed inset-0 z-50')}>\n {/* Backdrop */}\n {showBackdrop && (\n <div\n style={mergeStyles(\n resolveDot('absolute inset-0 bg-black/85 backdrop-blur-md transition-opacity duration-300'),\n resolveDot(backdropDot),\n backdropOpacity !== undefined ? { opacity: backdropOpacity } : undefined\n )}\n onClick={closeOnBackdropClick ? handleClose : undefined}\n />\n )}\n\n {/* Drawer Content */}\n <div\n ref={ref}\n style={mergeStyles(\n resolveDot('absolute bg-background/95 backdrop-blur-xl border border-border/50 shadow-2xl transition-transform duration-300 ease-out'),\n sizeStyles[size],\n sideStyles[side],\n transformStyles[side],\n resolveDot(dotProp),\n style\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 {React.CSSProperties} [style] - 인라인 스타일 / Inline style\n * @property {boolean} [showCloseButton=true] - 닫기 버튼 표시 여부 / Show close button\n * @property {() => void} [onClose] - 닫기 버튼 클릭 콜백 / Close button click callback\n */\ninterface DrawerHeaderProps {\n children: React.ReactNode\n /** 인라인 스타일 / Inline style */\n style?: React.CSSProperties\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, style, showCloseButton = true, onClose, ...props }, ref) => {\n return (\n <div\n ref={ref}\n style={mergeStyles(resolveDot('flex items-center justify-between p-6 border-b border-border/50'), style)}\n {...props}\n >\n <div style={resolveDot('flex-1')}>{children}</div>\n {showCloseButton && (\n <button\n onClick={onClose}\n style={resolveDot('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 {React.CSSProperties} [style] - 인라인 스타일 / Inline style\n */\ninterface DrawerContentProps {\n children: React.ReactNode\n /** 인라인 스타일 / Inline style */\n style?: React.CSSProperties\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, style, ...props }, ref) => {\n return (\n <div\n ref={ref}\n style={mergeStyles(resolveDot('flex-1 p-6 overflow-y-auto'), style)}\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 {React.CSSProperties} [style] - 인라인 스타일 / Inline style\n */\ninterface DrawerFooterProps {\n children: React.ReactNode\n /** 인라인 스타일 / Inline style */\n style?: React.CSSProperties\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, style, ...props }, ref) => {\n return (\n <div\n ref={ref}\n style={mergeStyles(resolveDot('flex items-center justify-end gap-3 p-6 border-t border-border/50'), style)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nDrawerFooter.displayName = \"DrawerFooter\"\n\nexport { Drawer, DrawerHeader, DrawerContent, DrawerFooter }\n"]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import {a,b}from'./chunk-LPHUWTQ2.mjs';import {e,d}from'./chunk-OBMOTQEU.mjs';import L,{createContext,useContext,useState,useCallback,useMemo}from'react';import {jsxs,jsx}from'react/jsx-runtime';var T=createContext(void 0);function G(){let t=useContext(T);if(!t)throw new Error("useToast must be used within a ToastProvider");return t}var I=()=>{},M=()=>{},E=()=>{};function q(){let t=useContext(T);return t||{toasts:[],addToast:I,removeToast:M,clearToasts:E}}function F({children:t,maxToasts:c=5,position:r="top-right"}){let[i,e]=useState([]),a=useCallback(s=>{e(l=>l.filter(d=>d.id!==s));},[]),p=useCallback(s=>{let l=Math.random().toString(36).substr(2,9),d={...s,id:l};e(m=>[...m,d].slice(-c)),s.duration!==0&&setTimeout(()=>{a(l);},s.duration||5e3);},[c,a]),u=useCallback(()=>{e([]);},[]);return jsxs(T.Provider,{value:{toasts:i,addToast:p,removeToast:a,clearToasts:u},children:[t,jsx(O,{toasts:i,removeToast:a,position:r})]})}var C={"top-right":{top:"1rem",right:"1rem"},"top-left":{top:"1rem",left:"1rem"},"bottom-right":{bottom:"1rem",right:"1rem"},"bottom-left":{bottom:"1rem",left:"1rem"},"top-center":{top:"1rem",left:"50%",transform:"translateX(-50%)"},"bottom-center":{bottom:"1rem",left:"50%",transform:"translateX(-50%)"}},W={position:"fixed",zIndex:50,display:"flex",flexDirection:"column",...e("gap-3"),maxWidth:"24rem"};function O({toasts:t,removeToast:c,position:r}){let i=useMemo(()=>{var e;return d(W,(e=C[r])!=null?e:C["top-right"])},[r]);return t.length===0?null:jsx("div",{"data-toast-container":true,"data-position":r,style:i,children:t.map(e=>jsx(A,{toast:e,onRemove:c},e.id))})}var B={display:"flex",alignItems:"flex-start",...e("p-4 rounded-xl"),border:"1px solid",...b("light"),transition:a.smooth},z={success:{backgroundColor:"var(--toast-success-bg)",borderColor:"var(--toast-success-border, rgba(134, 239, 172, 0.6))",color:"var(--toast-success-text, #166534)",boxShadow:"0 10px 15px -3px rgba(187, 247, 208, 0.5)"},error:{backgroundColor:"var(--toast-error-bg)",borderColor:"var(--toast-error-border, rgba(252, 165, 165, 0.6))",color:"var(--toast-error-text, #991b1b)",boxShadow:"0 10px 15px -3px rgba(254, 202, 202, 0.5)"},warning:{backgroundColor:"var(--toast-warning-bg)",borderColor:"var(--toast-warning-border, rgba(253, 224, 71, 0.6))",color:"var(--toast-warning-text, #854d0e)",boxShadow:"0 10px 15px -3px rgba(254, 240, 138, 0.5)"},info:{backgroundColor:"var(--toast-info-bg)",borderColor:"var(--toast-info-border, rgba(165, 180, 252, 0.6))",color:"var(--toast-info-text, #1e3a5f)",boxShadow:"0 10px 15px -3px rgba(199, 210, 254, 0.5)"}},N={success:"var(--toast-success-icon, #22c55e)",error:"var(--toast-error-icon, #ef4444)",warning:"var(--toast-warning-icon, #eab308)",info:"var(--toast-info-icon, #06b6d4)"};function A({toast:t,onRemove:c}){let[r,i]=useState(false),[e$1,a]=useState(false);L.useEffect(()=>{i(true);},[]);let p=()=>{i(false),setTimeout(()=>c(t.id),300);},u=useMemo(()=>d(B,z[t.type],r?{transform:"translateX(0)",opacity:1,scale:"1"}:{transform:"translateX(100%)",opacity:0,scale:"0.95"},r?{animation:"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)"}:void 0),[t.type,r]),s=N[t.type],l={flexShrink:0,...e("mr-3"),color:s},d$1={flex:1,minWidth:0},m={fontSize:"0.875rem",fontWeight:600,...e("mb-1")},h={fontSize:"0.875rem",lineHeight:1.625},w={...e("mt-3"),fontSize:"0.875rem",fontWeight:500,textDecoration:"underline",background:"none",border:"none",padding:0,cursor:"pointer",color:"inherit"},R={flexShrink:0,...e("ml-4")},P={display:"inline-flex",...e("rounded-md p-1.5"),transition:"background-color 200ms ease-in-out",background:e$1?"rgba(0, 0, 0, 0.05)":"transparent",border:"none",cursor:"pointer",color:s,outline:"none"};return jsxs("div",{style:u,children:[jsx("div",{style:l,children:j(t.type)}),jsxs("div",{style:d$1,children:[t.title&&jsx("h4",{style:m,children:t.title}),jsx("p",{style:h,children:t.message}),t.action&&jsx("button",{onClick:t.action.onClick,style:w,children:t.action.label})]}),jsx("div",{style:R,children:jsx("button",{onClick:p,onMouseEnter:()=>a(true),onMouseLeave:()=>a(false),style:P,"aria-label":"\uB2EB\uAE30",children:jsx("svg",{style:{width:"1rem",height:"1rem"},fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})})]})}function j(t){switch(t){case "success":return jsx("svg",{style:{width:"1.25rem",height:"1.25rem"},fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})});case "error":return jsx("svg",{style:{width:"1.25rem",height:"1.25rem"},fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})});case "warning":return jsx("svg",{style:{width:"1.25rem",height:"1.25rem"},fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})});case "info":return jsx("svg",{style:{width:"1.25rem",height:"1.25rem"},fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})}}export{G as a,q as b,F as c};//# sourceMappingURL=chunk-TB3DARQO.mjs.map
3
+ //# sourceMappingURL=chunk-TB3DARQO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Toast.tsx"],"names":["ToastContext","createContext","useToast","context","useContext","noopAddToast","noopRemoveToast","noopClearToasts","useToastSafe","ToastProvider","children","maxToasts","position","toasts","setToasts","useState","removeToast","useCallback","id","prev","toast","addToast","newToast","clearToasts","jsxs","jsx","ToastContainer","POSITION_STYLES","CONTAINER_BASE","resolveDot","containerStyle","useMemo","_a","mergeStyles","ToastItem","ITEM_BASE","createGlassStyle","TRANSITIONS","TYPE_STYLES","ICON_COLOR","onRemove","isVisible","setIsVisible","isCloseHovered","setIsCloseHovered","React","handleRemove","itemStyle","iconColor","iconStyle","contentStyle","titleStyle","messageStyle","actionStyle","closeWrapperStyle","closeButtonStyle","getToastIcon","type"],"mappings":"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","file":"chunk-TB3DARQO.mjs","sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n} from \"react\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\nimport { createGlassStyle } from \"../lib/styles/glass\";\nimport { TRANSITIONS } from \"../lib/styles/transition\";\n\n/**\n * Toast 메시지 타입 / Toast message type\n * @typedef {Object} Toast\n * @property {string} id - Toast 고유 ID / Toast unique ID\n * @property {\"success\" | \"error\" | \"warning\" | \"info\"} type - Toast 타입 / Toast type\n * @property {string} [title] - Toast 제목 / Toast title\n * @property {string} message - Toast 메시지 / Toast message\n * @property {number} [duration] - 표시 시간(ms), 0이면 자동 제거 안 함 / Display duration (ms), 0 means no auto-remove\n * @property {Object} [action] - 액션 버튼 / Action button\n * @property {string} action.label - 액션 버튼 레이블 / Action button label\n * @property {() => void} action.onClick - 액션 버튼 클릭 핸들러 / Action button click handler\n */\nexport interface Toast {\n id: string;\n type: \"success\" | \"error\" | \"warning\" | \"info\";\n title?: string;\n message: string;\n duration?: number;\n action?: {\n label: string;\n onClick: () => void;\n };\n}\n\n// Toast Context 타입\ninterface ToastContextType {\n toasts: Toast[];\n addToast: (toast: Omit<Toast, \"id\">) => void;\n removeToast: (id: string) => void;\n clearToasts: () => void;\n}\n\n// Toast Context 생성\nconst ToastContext = createContext<ToastContextType | undefined>(undefined);\n\n/**\n * useToast Hook\n *\n * Toast를 추가, 제거, 초기화하는 훅입니다.\n * ToastProvider 내부에서만 사용 가능합니다.\n *\n * Hook for adding, removing, and clearing toasts.\n * Can only be used within ToastProvider.\n *\n * @example\n * const { addToast, removeToast, clearToasts } = useToast()\n *\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * duration: 3000\n * })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 / Toast context value\n * @throws {Error} ToastProvider 외부에서 사용 시 에러 발생 / Error when used outside ToastProvider\n */\nexport function useToast(): ToastContextType {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\");\n }\n return context;\n}\n\n// No-op functions for safe toast hook\nconst noopAddToast = () => {};\nconst noopRemoveToast = () => {};\nconst noopClearToasts = () => {};\n\n/**\n * useToastSafe Hook\n *\n * ToastProvider 없이도 안전하게 사용할 수 있는 useToast 훅입니다.\n * Provider가 없으면 no-op 함수를 반환합니다.\n *\n * Safe version of useToast that works without ToastProvider.\n * Returns no-op functions when used outside ToastProvider.\n *\n * @example\n * const { addToast } = useToastSafe()\n *\n * // 안전하게 호출 가능 - Provider 없으면 아무 일도 안 함\n * addToast({ type: \"success\", message: \"저장됨\" })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 또는 no-op 함수들\n */\nexport function useToastSafe(): ToastContextType {\n const context = useContext(ToastContext);\n if (!context) {\n return {\n toasts: [],\n addToast: noopAddToast,\n removeToast: noopRemoveToast,\n clearToasts: noopClearToasts,\n };\n }\n return context;\n}\n\n/**\n * ToastProvider 컴포넌트의 props / ToastProvider component props\n * @typedef {Object} ToastProviderProps\n * @property {React.ReactNode} children - 자식 컴포넌트 / Child components\n * @property {number} [maxToasts=5] - 최대 Toast 개수 / Maximum number of toasts\n * @property {\"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"} [position=\"top-right\"] - Toast 표시 위치 / Toast display position\n */\ninterface ToastProviderProps {\n children: React.ReactNode;\n maxToasts?: number;\n position?:\n | \"top-right\"\n | \"top-left\"\n | \"bottom-right\"\n | \"bottom-left\"\n | \"top-center\"\n | \"bottom-center\";\n}\n\n/**\n * ToastProvider 컴포넌트 / ToastProvider component\n *\n * Toast 시스템의 컨텍스트를 제공하는 Provider 컴포넌트입니다.\n * 앱의 루트 레벨에서 사용하여 전역 Toast 기능을 활성화합니다.\n *\n * Provider component that provides context for the Toast system.\n * Use at the root level of your app to enable global Toast functionality.\n *\n * @component\n * @example\n * // App.tsx\n * <ToastProvider position=\"top-center\" maxToasts={3}>\n * <App />\n * </ToastProvider>\n *\n * @example\n * // 컴포넌트에서 사용 / Usage in component\n * const { addToast } = useToast()\n *\n * const handleSave = () => {\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * title: \"성공\"\n * })\n * }\n *\n * @param {ToastProviderProps} props - ToastProvider 컴포넌트의 props / ToastProvider component props\n * @returns {JSX.Element} ToastProvider 컴포넌트 / ToastProvider component\n *\n * @todo 접근성 개선: ToastItem에 role=\"alert\" 또는 role=\"status\" 추가 필요 / Accessibility: Add role=\"alert\" or role=\"status\" to ToastItem\n * @todo 접근성 개선: aria-live=\"polite\" 또는 aria-live=\"assertive\" 추가 필요 / Accessibility: Add aria-live=\"polite\" or aria-live=\"assertive\"\n */\nexport function ToastProvider({\n children,\n maxToasts = 5,\n position = \"top-right\",\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const addToast = useCallback(\n (toast: Omit<Toast, \"id\">) => {\n const id = Math.random().toString(36).substr(2, 9);\n const newToast: Toast = { ...toast, id };\n\n setToasts((prev) => {\n const updatedToasts = [...prev, newToast];\n return updatedToasts.slice(-maxToasts); // 최대 개수 제한\n });\n\n // 자동 제거\n if (toast.duration !== 0) {\n setTimeout(() => {\n removeToast(id);\n }, toast.duration || 5000);\n }\n },\n [maxToasts, removeToast],\n );\n\n const clearToasts = useCallback(() => {\n setToasts([]);\n }, []);\n\n return (\n <ToastContext.Provider\n value={{ toasts, addToast, removeToast, clearToasts }}\n >\n {children}\n <ToastContainer\n toasts={toasts}\n removeToast={removeToast}\n position={position}\n />\n </ToastContext.Provider>\n );\n}\n\n// Toast Container Props\ninterface ToastContainerProps {\n toasts: Toast[];\n removeToast: (id: string) => void;\n position: string;\n}\n\n/** Inline CSSProperties for each position key */\nconst POSITION_STYLES: Record<string, React.CSSProperties> = {\n \"top-right\": { top: \"1rem\", right: \"1rem\" },\n \"top-left\": { top: \"1rem\", left: \"1rem\" },\n \"bottom-right\": { bottom: \"1rem\", right: \"1rem\" },\n \"bottom-left\": { bottom: \"1rem\", left: \"1rem\" },\n \"top-center\": { top: \"1rem\", left: \"50%\", transform: \"translateX(-50%)\" },\n \"bottom-center\": {\n bottom: \"1rem\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n },\n};\n\nconst CONTAINER_BASE: React.CSSProperties = {\n position: \"fixed\",\n zIndex: 50,\n display: \"flex\",\n flexDirection: \"column\",\n ...resolveDot(\"gap-3\"),\n maxWidth: \"24rem\",\n};\n\n// Toast Container\nfunction ToastContainer({\n toasts,\n removeToast,\n position,\n}: ToastContainerProps) {\n const containerStyle = useMemo(\n (): React.CSSProperties =>\n mergeStyles(\n CONTAINER_BASE,\n POSITION_STYLES[position] ?? POSITION_STYLES[\"top-right\"],\n ),\n [position],\n );\n\n if (toasts.length === 0) return null;\n\n return (\n <div data-toast-container data-position={position} style={containerStyle}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n );\n}\n\n// Toast Item Props\ninterface ToastItemProps {\n toast: Toast;\n onRemove: (id: string) => void;\n}\n\n/** Static base style for a toast item */\nconst ITEM_BASE: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"flex-start\",\n ...resolveDot(\"p-4 rounded-xl\"),\n border: \"1px solid\",\n ...createGlassStyle(\"light\"),\n transition: TRANSITIONS.smooth,\n};\n\n/** Type-specific styles: background, border color, text color */\nconst TYPE_STYLES: Record<Toast[\"type\"], React.CSSProperties> = {\n success: {\n backgroundColor: \"var(--toast-success-bg)\",\n borderColor: \"var(--toast-success-border, rgba(134, 239, 172, 0.6))\",\n color: \"var(--toast-success-text, #166534)\",\n boxShadow: \"0 10px 15px -3px rgba(187, 247, 208, 0.5)\",\n },\n error: {\n backgroundColor: \"var(--toast-error-bg)\",\n borderColor: \"var(--toast-error-border, rgba(252, 165, 165, 0.6))\",\n color: \"var(--toast-error-text, #991b1b)\",\n boxShadow: \"0 10px 15px -3px rgba(254, 202, 202, 0.5)\",\n },\n warning: {\n backgroundColor: \"var(--toast-warning-bg)\",\n borderColor: \"var(--toast-warning-border, rgba(253, 224, 71, 0.6))\",\n color: \"var(--toast-warning-text, #854d0e)\",\n boxShadow: \"0 10px 15px -3px rgba(254, 240, 138, 0.5)\",\n },\n info: {\n backgroundColor: \"var(--toast-info-bg)\",\n borderColor: \"var(--toast-info-border, rgba(165, 180, 252, 0.6))\",\n color: \"var(--toast-info-text, #1e3a5f)\",\n boxShadow: \"0 10px 15px -3px rgba(199, 210, 254, 0.5)\",\n },\n};\n\n/** Type-specific icon colors */\nconst ICON_COLOR: Record<Toast[\"type\"], string> = {\n success: \"var(--toast-success-icon, #22c55e)\",\n error: \"var(--toast-error-icon, #ef4444)\",\n warning: \"var(--toast-warning-icon, #eab308)\",\n info: \"var(--toast-info-icon, #06b6d4)\",\n};\n\n// Toast Item\nfunction ToastItem({ toast, onRemove }: ToastItemProps) {\n const [isVisible, setIsVisible] = useState(false);\n const [isCloseHovered, setIsCloseHovered] = useState(false);\n\n React.useEffect(() => {\n setIsVisible(true);\n }, []);\n\n const handleRemove = () => {\n setIsVisible(false);\n setTimeout(() => onRemove(toast.id), 300);\n };\n\n const itemStyle = useMemo(\n (): React.CSSProperties =>\n mergeStyles(\n ITEM_BASE,\n TYPE_STYLES[toast.type],\n isVisible\n ? { transform: \"translateX(0)\", opacity: 1, scale: \"1\" }\n : { transform: \"translateX(100%)\", opacity: 0, scale: \"0.95\" },\n isVisible\n ? { animation: \"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)\" }\n : undefined,\n ),\n [toast.type, isVisible],\n );\n\n const iconColor = ICON_COLOR[toast.type];\n\n const iconStyle: React.CSSProperties = {\n flexShrink: 0,\n ...resolveDot(\"mr-3\"),\n color: iconColor,\n };\n\n const contentStyle: React.CSSProperties = {\n flex: 1,\n minWidth: 0,\n };\n\n const titleStyle: React.CSSProperties = {\n fontSize: \"0.875rem\",\n fontWeight: 600,\n ...resolveDot(\"mb-1\"),\n };\n\n const messageStyle: React.CSSProperties = {\n fontSize: \"0.875rem\",\n lineHeight: 1.625,\n };\n\n const actionStyle: React.CSSProperties = {\n ...resolveDot(\"mt-3\"),\n fontSize: \"0.875rem\",\n fontWeight: 500,\n textDecoration: \"underline\",\n background: \"none\",\n border: \"none\",\n padding: 0,\n cursor: \"pointer\",\n color: \"inherit\",\n };\n\n const closeWrapperStyle: React.CSSProperties = {\n flexShrink: 0,\n ...resolveDot(\"ml-4\"),\n };\n\n const closeButtonStyle: React.CSSProperties = {\n display: \"inline-flex\",\n ...resolveDot(\"rounded-md p-1.5\"),\n transition: \"background-color 200ms ease-in-out\",\n background: isCloseHovered ? \"rgba(0, 0, 0, 0.05)\" : \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n color: iconColor,\n outline: \"none\",\n };\n\n return (\n <div style={itemStyle}>\n {/* 아이콘 */}\n <div style={iconStyle}>{getToastIcon(toast.type)}</div>\n\n {/* 내용 */}\n <div style={contentStyle}>\n {toast.title && <h4 style={titleStyle}>{toast.title}</h4>}\n <p style={messageStyle}>{toast.message}</p>\n\n {/* 액션 버튼 */}\n {toast.action && (\n <button onClick={toast.action.onClick} style={actionStyle}>\n {toast.action.label}\n </button>\n )}\n </div>\n\n {/* 닫기 버튼 */}\n <div style={closeWrapperStyle}>\n <button\n onClick={handleRemove}\n onMouseEnter={() => setIsCloseHovered(true)}\n onMouseLeave={() => setIsCloseHovered(false)}\n style={closeButtonStyle}\n aria-label=\"닫기\"\n >\n <svg\n style={{ width: \"1rem\", height: \"1rem\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n </div>\n );\n}\n\nfunction getToastIcon(type: Toast[\"type\"]): React.ReactElement {\n switch (type) {\n case \"success\":\n return (\n <svg\n style={{ width: \"1.25rem\", height: \"1.25rem\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n );\n case \"error\":\n return (\n <svg\n style={{ width: \"1.25rem\", height: \"1.25rem\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n );\n case \"warning\":\n return (\n <svg\n style={{ width: \"1.25rem\", height: \"1.25rem\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\"\n />\n </svg>\n );\n case \"info\":\n return (\n <svg\n style={{ width: \"1.25rem\", height: \"1.25rem\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n );\n }\n}\n\n// 편의 함수들 (ToastProvider 내부에서만 사용 가능 - 스텁 함수)\nexport const showToast = (_toast: Omit<Toast, \"id\">) => {\n // ToastProvider 컨텍스트 필요\n};\n\nexport const showSuccessToast = (\n _message: string,\n _title?: string,\n _duration?: number,\n) => {\n // ToastProvider 컨텍스트 필요\n};\n\nexport const showErrorToast = (\n _message: string,\n _title?: string,\n _duration?: number,\n) => {\n // ToastProvider 컨텍스트 필요\n};\n\nexport const showWarningToast = (\n _message: string,\n _title?: string,\n _duration?: number,\n) => {\n // ToastProvider 컨텍스트 필요\n};\n\nexport const showInfoToast = (\n _message: string,\n _title?: string,\n _duration?: number,\n) => {\n // ToastProvider 컨텍스트 필요\n};\n"]}
@@ -0,0 +1,51 @@
1
+ "use client";
2
+ import {c}from'./chunk-UR3TIWBS.mjs';import {d as d$1}from'./chunk-7T3IUG3G.mjs';import {d,e}from'./chunk-OBMOTQEU.mjs';import Q,{useRef,useState,useEffect,useMemo,useCallback}from'react';import {jsxs,jsx,Fragment}from'react/jsx-runtime';var Ee=Q.forwardRef(({children:o,dot:i,direction:r="left",speed:s=50,pauseOnHover:v=true,pauseOnClick:C=false,gap:a=16,gradient:x=true,gradientColor:b="var(--color-background)",gradientWidth:d$1=100,style:u,onMouseEnter:g,onMouseLeave:M,onClick:h,...f},H)=>{let S=useRef(null),[E,P]=useState(0),[l,T]=useState(0),[$,I]=useState(false),m=r==="left"||r==="right",B=r==="right"||r==="down";useEffect(()=>{let k=S.current;if(!k)return;let G=k.firstElementChild;if(!G)return;let F=()=>{m?P(G.offsetWidth):T(G.offsetHeight);};F();let y=new ResizeObserver(F);return y.observe(G),()=>y.disconnect()},[m,o]);let D=m?E/s:l/s,O=m?B?"marquee-right":"marquee-left":B?"marquee-down":"marquee-up",w=useMemo(()=>d({position:"relative",overflow:"hidden"},e(i),u),[i,u]),z=useMemo(()=>({display:"flex",flexDirection:m?"row":"column","--marquee-duration":`${D}s`,"--marquee-gap":`${a}px`,animation:$?void 0:`${O} ${D}s linear infinite`,animationPlayState:$?"paused":"running"}),[m,D,a,O,$]),j=useMemo(()=>({display:"flex",flexShrink:0,flexDirection:m?"row":"column",gap:a}),[m,a]),Z=useMemo(()=>({...j,...m?{marginLeft:a}:{marginTop:a}}),[j,m,a]);return jsxs("div",{ref:H,style:w,onMouseEnter:k=>{v&&I(true),g==null||g(k);},onMouseLeave:k=>{v&&I(false),M==null||M(k);},onClick:k=>{C&&I(!$),h==null||h(k);},...f,children:[jsxs("div",{ref:S,style:z,children:[jsx("div",{style:j,children:o}),jsx("div",{style:Z,"aria-hidden":"true",children:o})]}),x&&jsxs(Fragment,{children:[jsx("div",{"aria-hidden":"true",style:{position:"absolute",top:0,bottom:0,left:0,width:d$1,zIndex:10,pointerEvents:"none",background:`linear-gradient(to right, ${b}, transparent)`}}),jsx("div",{"aria-hidden":"true",style:{position:"absolute",top:0,bottom:0,right:0,width:d$1,zIndex:10,pointerEvents:"none",background:`linear-gradient(to left, ${b}, transparent)`}})]}),jsx("style",{dangerouslySetInnerHTML:{__html:`
3
+ @keyframes marquee-left {
4
+ from { transform: translateX(0); }
5
+ to { transform: translateX(calc(-50% - ${a/2}px)); }
6
+ }
7
+ @keyframes marquee-right {
8
+ from { transform: translateX(calc(-50% - ${a/2}px)); }
9
+ to { transform: translateX(0); }
10
+ }
11
+ @keyframes marquee-up {
12
+ from { transform: translateY(0); }
13
+ to { transform: translateY(calc(-50% - ${a/2}px)); }
14
+ }
15
+ @keyframes marquee-down {
16
+ from { transform: translateY(calc(-50% - ${a/2}px)); }
17
+ to { transform: translateY(0); }
18
+ }
19
+ `}})]})});Ee.displayName="Marquee";var De={position:"relative",overflow:"hidden",...e("rounded-xl"),backgroundColor:"var(--color-card, var(--card))",border:"1px solid var(--color-border, var(--border))",...e("p-6"),transition:"all 300ms ease"},Ae={borderColor:"transparent"},ze={position:"relative",zIndex:10},Ne=Q.forwardRef(({children:o,dot:i,glowColor:r="rgba(120, 119, 198, 0.3)",glowSize:s=400,glowOpacity:v=.6,border:C=true,borderColor:a,style:x,...b},d$2)=>{let u=useRef(null),[g,M]=useState({x:0,y:0}),[h,f]=useState(false),H=d$1(),{enableAnimations:S}=c(),E=H||!S,P=useCallback(I=>{if(E||!u.current)return;let m=u.current.getBoundingClientRect();M({x:I.clientX-m.left,y:I.clientY-m.top});},[E]),l=useMemo(()=>d(De,h?Ae:void 0,e(i),x),[h,i,x]),T={position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:"inherit",opacity:h?v:0,background:`radial-gradient(${s}px circle at ${g.x}px ${g.y}px, ${r}, transparent 40%)`,transition:"opacity 0.3s ease",pointerEvents:"none"},$=C?{position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:"inherit",opacity:h?1:0,background:`radial-gradient(${s/2}px circle at ${g.x}px ${g.y}px, ${a||r}, 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:Oe(d$2,u),style:l,onMouseMove:P,onMouseEnter:()=>f(true),onMouseLeave:()=>f(false),...b,children:[jsx("div",{style:T,"aria-hidden":"true"}),C&&jsx("div",{style:$,"aria-hidden":"true"}),jsx("div",{style:ze,children:o})]})});Ne.displayName="GlowCard";function Oe(...o){return i=>{o.forEach(r=>{typeof r=="function"?r(i):r&&typeof r=="object"&&(r.current=i);});}}var Xe={position:"relative",overflow:"hidden",borderRadius:"0.75rem",backgroundColor:"rgb(17 24 39)",borderWidth:"1px",borderStyle:"solid",borderColor:"rgb(31 41 55)",transition:"border-color 300ms ease, box-shadow 300ms ease"},_e={borderColor:"rgb(55 65 81)",boxShadow:"0 25px 50px -12px rgba(0,0,0,0.2)"},Be=Q.forwardRef(({children:o,dot:i,spotlightColor:r="rgba(255, 255, 255, 0.1)",spotlightSize:s=300,gradient:v=true,gradientFrom:C="rgba(255, 255, 255, 0.05)",gradientTo:a="transparent",style:x,onMouseMove:b,onMouseEnter:d$2,onMouseLeave:u,...g},M)=>{let h=useRef(null),[f,H]=useState({x:0,y:0}),[S,E]=useState(false),P=d$1(),{enableAnimations:l}=c(),T=P||!l,$=useCallback(w=>{if(b==null||b(w),T||!h.current)return;let z=h.current.getBoundingClientRect();H({x:w.clientX-z.left,y:w.clientY-z.top});},[T,b]),I=useCallback(w=>{d$2==null||d$2(w),E(true);},[d$2]),m=useCallback(w=>{u==null||u(w),E(false);},[u]),B=useMemo(()=>d(Xe,S?_e:void 0,e(i),x),[S,i,x]),D=useMemo(()=>({position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:"inherit",opacity:S?1:0,background:`radial-gradient(${s}px circle at ${f.x}px ${f.y}px, ${r}, transparent 60%)`,transition:"opacity 0.4s ease",pointerEvents:"none"}),[S,s,f.x,f.y,r]),O=useMemo(()=>v?{position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:"inherit",background:`linear-gradient(135deg, ${C} 0%, ${a} 100%)`,pointerEvents:"none"}:void 0,[v,C,a]);return jsxs("div",{ref:je(M,h),style:B,onMouseMove:$,onMouseEnter:I,onMouseLeave:m,...g,children:[v&&O&&jsx("div",{style:O,"aria-hidden":"true"}),jsx("div",{style:D,"aria-hidden":"true"}),jsx("div",{style:{position:"relative",zIndex:10},children:o})]})});Be.displayName="SpotlightCard";function je(...o){return i=>{o.forEach(r=>{typeof r=="function"?r(i):r&&typeof r=="object"&&(r.current=i);});}}var Qe=["#ff0080","#7928ca","#0070f3","#00dfd8"],ne={position:"absolute",top:0,right:0,bottom:0,left:0},Ue=Q.forwardRef(({children:o,colors:i=Qe,speed:r=3,blur:s=true,blurAmount:v=100,type:C="mesh",animate:a=true,dot:x,style:b,...d$2},u)=>{let[g,M]=useState(false),h=d$1(),f=a&&!h;useEffect(()=>{M(true);},[]);let H=useMemo(()=>d({position:"relative",overflow:"hidden"},e(x),b),[x,b]),S=()=>{switch(C){case "linear":return jsx("div",{style:{...ne,background:`linear-gradient(
20
+ ${f?"var(--gradient-angle, 0deg)":"135deg"},
21
+ ${i.join(", ")}
22
+ )`,animation:f?`gradient-rotate ${r}s linear infinite`:void 0}});case "radial":return jsx("div",{style:{...ne,background:`radial-gradient(
23
+ circle at ${f?"var(--gradient-x, 50%) var(--gradient-y, 50%)":"50% 50%"},
24
+ ${i.join(", ")}
25
+ )`,animation:f?`gradient-move ${r}s ease-in-out infinite`:void 0}});case "conic":return jsx("div",{style:{...ne,background:`conic-gradient(
26
+ from ${f?"var(--gradient-angle, 0deg)":"0deg"} at 50% 50%,
27
+ ${i.join(", ")},
28
+ ${i[0]}
29
+ )`,animation:f?`gradient-spin ${r}s linear infinite`:void 0}});default:return g?jsx(Fragment,{children:i.map((E,P)=>{let l=360/i.length*P,T=r/i.length*P;return jsx("div",{style:{position:"absolute",borderRadius:"9999px",mixBlendMode:"screen",width:"60%",height:"60%",background:`radial-gradient(circle at center, ${E} 0%, transparent 70%)`,top:`${30+Math.sin(l*Math.PI/180)*20}%`,left:`${30+Math.cos(l*Math.PI/180)*20}%`,animation:f?`gradient-blob ${r}s ease-in-out infinite`:void 0,animationDelay:f?`${-T}s`:void 0}},P)})}):null}};return jsxs("div",{ref:u,style:H,...d$2,children:[jsx("div",{style:{...ne,filter:s?`blur(${v}px)`:void 0},children:S()}),o&&jsx("div",{style:{position:"relative",zIndex:10},children:o}),jsx("style",{dangerouslySetInnerHTML:{__html:`
30
+ @keyframes gradient-rotate {
31
+ 0% { --gradient-angle: 0deg; }
32
+ 100% { --gradient-angle: 360deg; }
33
+ }
34
+ @keyframes gradient-spin {
35
+ 0% { transform: rotate(0deg); }
36
+ 100% { transform: rotate(360deg); }
37
+ }
38
+ @keyframes gradient-move {
39
+ 0%, 100% { --gradient-x: 0%; --gradient-y: 0%; }
40
+ 25% { --gradient-x: 100%; --gradient-y: 0%; }
41
+ 50% { --gradient-x: 100%; --gradient-y: 100%; }
42
+ 75% { --gradient-x: 0%; --gradient-y: 100%; }
43
+ }
44
+ @keyframes gradient-blob {
45
+ 0%, 100% { transform: translate(0, 0) scale(1); }
46
+ 25% { transform: translate(20%, -20%) scale(1.1); }
47
+ 50% { transform: translate(0, 20%) scale(0.9); }
48
+ 75% { transform: translate(-20%, -10%) scale(1.05); }
49
+ }
50
+ `}})]})});Ue.displayName="AnimatedGradient";var rt=Q.forwardRef(({children:o,autoPlay:i=false,interval:r=5e3,loop:s=true,pauseOnHover:v=true,indicators:C="dots",indicatorPosition:a="bottom",showArrows:x=true,arrowPosition:b="inside",transition:d$2="slide",transitionDuration:u=500,onSlideChange:g,showPlayPause:M=false,playPausePosition:h="right",style:f,dot:H,...S},E)=>{let P=()=>d$2==="slide"&&s?1:0,[l,T]=useState(P),[$,I]=useState(!i),[m,B]=useState(false),[D,O]=useState(false),[w,z]=useState(false),[j,Z]=useState(null),[k,G]=useState(null),F=useRef(null),y=Q.Children.count(o),oe=d$1(),me=useCallback(e=>d$2!=="slide"||!s?e:e===0?y-1:e===y+1?0:e-1,[s,y,d$2]),W=useCallback(e=>{if(D)return;let t=e;if(s?d$2!=="slide"&&(e<0?t=y-1:e>=y&&(t=0)):t=Math.max(0,Math.min(e,y-1)),t!==l){O(true),T(t);let p=s&&d$2==="slide"?t===0?y-1:t===y+1?0:t-1:t;g==null||g(p),setTimeout(()=>O(false),u);}},[l,y,s,D,u,d$2,g]);useEffect(()=>{!s||D||d$2!=="slide"||(l===0?setTimeout(()=>{z(true),T(y),setTimeout(()=>z(false),50);},u):l===y+1&&setTimeout(()=>{z(true),T(1),setTimeout(()=>z(false),50);},u));},[l,y,s,D,u,d$2]);let V=useCallback(()=>{W(l+1);},[l,W]),ee=useCallback(()=>{W(l-1);},[l,W]),ye=useCallback(()=>{B(e=>!e);},[]);useEffect(()=>{if(!i||$||m||oe)return;let e=setInterval(V,r);return ()=>clearInterval(e)},[i,r,$,m,V,oe]);let he=e=>{Z(e.targetTouches[0].clientX);},ve=e=>{G(e.targetTouches[0].clientX);},Se=()=>{if(!j||!k)return;let e=j-k;Math.abs(e)>=50&&(e>0?V():ee()),Z(null),G(null);};useEffect(()=>{let e=p=>{p.key==="ArrowLeft"?ee():p.key==="ArrowRight"&&V();},t=F.current;return t==null||t.addEventListener("keydown",e),()=>t==null?void 0:t.removeEventListener("keydown",e)},[V,ee]);let Re=()=>{let e=oe||w?0:u,t=me(l);switch(d$2){case "fade":return Q.Children.map(o,(p,R)=>jsx("div",{style:{position:"absolute",inset:0,width:"100%",height:"100%",zIndex:R===t?10:0,opacity:R===t?1:0,transition:`opacity ${e}ms ease-in-out`},children:p},R));case "scale":return Q.Children.map(o,(p,R)=>jsx("div",{style:{position:"absolute",inset:0,width:"100%",height:"100%",zIndex:R===t?10:0,opacity:R===t?1:0,transform:`scale(${R===t?1:.9})`,transition:`opacity ${e}ms ease-in-out, transform ${e}ms ease-in-out`},children:p},R));default:{let p=Q.Children.toArray(o);return (s?[p[p.length-1],...p,p[0]]:p).map((X,K)=>jsx("div",{style:{position:"absolute",inset:0,width:"100%",height:"100%",transform:`translateX(${(K-l)*100}%)`,transition:w?"none":`transform ${e}ms ease-in-out`},children:X},K))}}},pe=()=>{if(C==="none")return null;let e$1=a.includes("inside"),t=a.includes("top"),p=me(l),R=e$1?{display:"flex",alignItems:"center",justifyContent:"center",...e("gap-2"),position:"absolute",left:"50%",transform:"translateX(-50%)",zIndex:20,...t?{...e("top-4")}:{...e("bottom-4")}}:{display:"flex",alignItems:"center",justifyContent:"center",...e("gap-2"),...e("mt-4"),...t?{order:-1,...e("mb-4"),marginTop:0}:{}},X=K=>{W(s&&d$2==="slide"?K+1:K);};return jsx("div",{style:R,role:"tablist",children:Array.from({length:y},(K,L)=>{let N=L===p;switch(C){case "bars":return jsx("button",{onClick:()=>X(L),style:{...e("h-1"),borderRadius:"9999px",transition:"all 300ms",border:"none",cursor:"pointer",width:N?"2rem":"1rem",backgroundColor:N?"white":"rgba(255,255,255,0.5)"},role:"tab","aria-selected":N,"aria-label":`\uC2AC\uB77C\uC774\uB4DC ${L+1}`},L);case "numbers":return jsx("button",{onClick:()=>X(L),style:{...e("w-8 h-8"),borderRadius:"9999px",fontSize:"0.875rem",fontWeight:500,transition:"all 300ms",border:"none",cursor:"pointer",backgroundColor:N?"white":"rgba(255,255,255,0.3)",color:N?"#111827":"white"},role:"tab","aria-selected":N,"aria-label":`\uC2AC\uB77C\uC774\uB4DC ${L+1}`,children:L+1},L);default:return jsx("button",{onClick:()=>X(L),style:{width:"0.625rem",height:"0.625rem",borderRadius:"9999px",transition:"all 300ms",border:"none",cursor:"pointer",backgroundColor:N?"white":"rgba(255,255,255,0.5)",transform:N?"scale(1.25)":"scale(1)"},role:"tab","aria-selected":N,"aria-label":`\uC2AC\uB77C\uC774\uB4DC ${L+1}`},L)}})})},Ce=()=>{if(!M||!i)return null;let e$1=!m,t={left:{...e("left-4")},center:{left:"50%",transform:"translateX(-50%)"},right:{...e("right-4")}};return jsx("button",{onClick:ye,style:{position:"absolute",...e("bottom-4"),zIndex:20,...e("w-8 h-8"),borderRadius:"9999px",display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"rgba(255,255,255,0.8)",color:"#1f2937",border:"none",cursor:"pointer",transition:"all 200ms",...t[h]},"aria-label":e$1?"\uC77C\uC2DC\uC815\uC9C0":"\uC7AC\uC0DD",children:e$1?jsx(st,{style:{...e("w-4 h-4")}}):jsx(it,{style:{...e("w-4 h-4")}})})},xe=()=>{if(!x||b==="hidden")return null;let e$1=s||l>0,t=s||l<y-1,p={position:"absolute",top:"50%",transform:"translateY(-50%)",zIndex:20,...e("w-10 h-10"),borderRadius:"9999px",display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"rgba(255,255,255,0.8)",color:"#1f2937",border:"none",cursor:"pointer",transition:"all 200ms"},R=b==="outside"?"-3.5rem":"1rem",X=b==="outside"?"-3.5rem":"1rem";return jsxs(Fragment,{children:[jsx("button",{onClick:ee,disabled:!e$1,style:{...p,left:R,opacity:e$1?1:.3,cursor:e$1?"pointer":"not-allowed"},"aria-label":"\uC774\uC804 \uC2AC\uB77C\uC774\uB4DC",children:jsx(nt,{style:{...e("w-5 h-5")}})}),jsx("button",{onClick:V,disabled:!t,style:{...p,right:X,opacity:t?1:.3,cursor:t?"pointer":"not-allowed"},"aria-label":"\uB2E4\uC74C \uC2AC\uB77C\uC774\uB4DC",children:jsx(ot,{style:{...e("w-5 h-5")}})})]})},Te=H?e(H):void 0;return jsxs("div",{ref:E,style:d({display:"flex",flexDirection:"column",width:"100%",height:"100%",...b==="outside"?{padding:"0 4rem"}:{}},Te,f),...S,children:[jsxs("div",{ref:F,style:{position:"relative",overflow:"hidden",width:"100%",flex:1},onMouseEnter:()=>v&&I(true),onMouseLeave:()=>v&&I(false),onTouchStart:he,onTouchMove:ve,onTouchEnd:Se,tabIndex:0,role:"region","aria-roledescription":"carousel","aria-label":"\uC774\uBBF8\uC9C0 \uC2AC\uB77C\uC774\uB354",children:[Re(),xe(),Ce(),a.includes("inside")&&pe()]}),!a.includes("inside")&&pe()]})});rt.displayName="Carousel";function nt({style:o}){return jsx("svg",{style:o,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 ot({style:o}){return jsx("svg",{style:o,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 it({style:o}){return jsx("svg",{style:o,fill:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{d:"M8 5v14l11-7z"})})}function st({style:o}){return jsx("svg",{style:o,fill:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{d:"M6 4h4v16H6V4zm8 0h4v16h-4V4z"})})}export{Ee as a,Ne as b,Be as c,Ue as d,rt as e};//# sourceMappingURL=chunk-TND4HPKW.mjs.map
51
+ //# sourceMappingURL=chunk-TND4HPKW.mjs.map
@@ -0,0 +1 @@
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","dotProp","direction","speed","pauseOnHover","pauseOnClick","gap","gradient","gradientColor","gradientWidth","style","onMouseEnter","onMouseLeave","onClick","props","ref","containerRef","useRef","contentWidth","setContentWidth","useState","contentHeight","setContentHeight","isPaused","setIsPaused","isHorizontal","isReverse","useEffect","container","firstChild","updateSize","resizeObserver","duration","animationName","outerStyle","useMemo","mergeStyles","resolveDot","trackStyle","stripStyle","stripStyle2","jsxs","e","jsx","Fragment","BASE_STYLE","HOVERED_STYLE","CONTENT_STYLE","GlowCard","glowColor","glowSize","glowOpacity","border","borderColor","cardRef","mousePosition","setMousePosition","isHovered","setIsHovered","prefersReducedMotion","useReducedMotion","enableAnimations","useMotionConfig","motionDisabled","handleMouseMove","useCallback","rect","cardStyle","glowStyle","borderStyle","mergeRefs","refs","value","SpotlightCard","spotlightColor","spotlightSize","gradientFrom","gradientTo","onMouseMove","handleMouseEnter","handleMouseLeave","computedStyle","spotlightStyle","gradientOverlayStyle","defaultColors","INSET_STYLE","AnimatedGradient","colors","blur","blurAmount","type","animate","mounted","setMounted","shouldAnimate","rootStyle","renderGradient","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","child","childArray","renderIndicators","isInside","isTop","indicatorContainerStyle","handleIndicatorClick","_","isActive","renderPlayPause","isPlaying","positionMap","PauseIcon","PlayIcon","renderArrows","canGoPrev","canGoNext","arrowBaseStyle","prevLeft","nextRight","ChevronLeft","ChevronRight","dotStyle"],"mappings":"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","file":"chunk-TND4HPKW.mjs","sourcesContent":["\"use client\";\n\nimport React, { useRef, useEffect, useState, useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../../hooks/useDotMap\";\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=\"var(--color-background)\"] - 그라디언트 색상 / Gradient color\n * @property {number} [gradientWidth=100] - 그라디언트 너비 (px) / Gradient width in pixels\n */\nexport interface MarqueeProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"className\"\n> {\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 dot?: string;\n style?: React.CSSProperties;\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 dot: dotProp,\n direction = \"left\",\n speed = 50,\n pauseOnHover = true,\n pauseOnClick = false,\n gap = 16,\n gradient = true,\n gradientColor = \"var(--color-background)\",\n gradientWidth = 100,\n style,\n onMouseEnter,\n onMouseLeave,\n onClick,\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 // Pick animation name based on direction/pause state\n const animationName = isHorizontal\n ? isReverse\n ? \"marquee-right\"\n : \"marquee-left\"\n : isReverse\n ? \"marquee-down\"\n : \"marquee-up\";\n\n // Container outer style\n const outerStyle = useMemo<React.CSSProperties>(() => {\n const base: React.CSSProperties = {\n position: \"relative\",\n overflow: \"hidden\",\n };\n return mergeStyles(base, resolveDot(dotProp), style);\n }, [dotProp, style]);\n\n // Inner track style (flex row or col + animation inline)\n const trackStyle = useMemo<React.CSSProperties>(() => {\n return {\n display: \"flex\",\n flexDirection: isHorizontal ? \"row\" : \"column\",\n [\"--marquee-duration\" as string]: `${duration}s`,\n [\"--marquee-gap\" as string]: `${gap}px`,\n animation: isPaused\n ? undefined\n : `${animationName} ${duration}s linear infinite`,\n animationPlayState: isPaused ? \"paused\" : \"running\",\n } as React.CSSProperties;\n }, [isHorizontal, duration, gap, animationName, isPaused]);\n\n // Shared item strip style\n const stripStyle = useMemo<React.CSSProperties>(\n () => ({\n display: \"flex\",\n flexShrink: 0,\n flexDirection: isHorizontal ? \"row\" : \"column\",\n gap,\n }),\n [isHorizontal, gap],\n );\n\n // Second strip style (offset margin for seamless loop)\n const stripStyle2 = useMemo<React.CSSProperties>(\n () => ({\n ...stripStyle,\n ...(isHorizontal ? { marginLeft: gap } : { marginTop: gap }),\n }),\n [stripStyle, isHorizontal, gap],\n );\n\n return (\n <div\n ref={ref}\n style={outerStyle}\n onMouseEnter={(e) => {\n if (pauseOnHover) setIsPaused(true);\n onMouseEnter?.(e);\n }}\n onMouseLeave={(e) => {\n if (pauseOnHover) setIsPaused(false);\n onMouseLeave?.(e);\n }}\n onClick={(e) => {\n if (pauseOnClick) setIsPaused(!isPaused);\n onClick?.(e);\n }}\n {...props}\n >\n <div ref={containerRef} style={trackStyle}>\n {/* Original content */}\n <div style={stripStyle}>{children}</div>\n {/* Duplicated content for seamless loop */}\n <div style={stripStyle2} aria-hidden=\"true\">\n {children}\n </div>\n </div>\n\n {/* Gradient overlays as DOM elements (replaces ::before/::after) */}\n {gradient && (\n <>\n <div\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n top: 0,\n bottom: 0,\n left: 0,\n width: gradientWidth,\n zIndex: 10,\n pointerEvents: \"none\",\n background: `linear-gradient(to right, ${gradientColor}, transparent)`,\n }}\n />\n <div\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n top: 0,\n bottom: 0,\n right: 0,\n width: gradientWidth,\n zIndex: 10,\n pointerEvents: \"none\",\n background: `linear-gradient(to left, ${gradientColor}, transparent)`,\n }}\n />\n </>\n )}\n\n {/* CSS keyframe definitions for marquee animations */}\n <style\n dangerouslySetInnerHTML={{\n __html: `\n @keyframes marquee-left {\n from { transform: translateX(0); }\n to { transform: translateX(calc(-50% - ${gap / 2}px)); }\n }\n @keyframes marquee-right {\n from { transform: translateX(calc(-50% - ${gap / 2}px)); }\n to { transform: translateX(0); }\n }\n @keyframes marquee-up {\n from { transform: translateY(0); }\n to { transform: translateY(calc(-50% - ${gap / 2}px)); }\n }\n @keyframes marquee-down {\n from { transform: translateY(calc(-50% - ${gap / 2}px)); }\n to { transform: translateY(0); }\n }\n `,\n }}\n />\n </div>\n );\n },\n);\n\nMarquee.displayName = \"Marquee\";\n\nexport { Marquee };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback, useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../../hooks/useDotMap\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useMotionConfig } from \"../../context/MotionConfigContext\";\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 * @property {string} [dot] - dot utility string for additional styles\n */\nexport interface GlowCardProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"className\"\n> {\n glowColor?: string;\n glowSize?: number;\n glowOpacity?: number;\n border?: boolean;\n borderColor?: string;\n dot?: string;\n style?: React.CSSProperties;\n}\n\n/** Base card styles (replaces Tailwind: relative overflow-hidden rounded-xl bg-card border border-border p-6) */\nconst BASE_STYLE: React.CSSProperties = {\n position: \"relative\",\n overflow: \"hidden\",\n ...resolveDot(\"rounded-xl\"),\n backgroundColor: \"var(--color-card, var(--card))\",\n border: \"1px solid var(--color-border, var(--border))\",\n ...resolveDot(\"p-6\"),\n transition: \"all 300ms ease\",\n};\n\n/** Hovered state overrides */\nconst HOVERED_STYLE: React.CSSProperties = {\n borderColor: \"transparent\",\n};\n\n/** Inner content wrapper (replaces Tailwind: relative z-10) */\nconst CONTENT_STYLE: React.CSSProperties = {\n position: \"relative\",\n zIndex: 10,\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 dot: dotProp,\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 const prefersReducedMotion = useReducedMotion();\n const { enableAnimations } = useMotionConfig();\n const motionDisabled = prefersReducedMotion || !enableAnimations;\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (motionDisabled) return;\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 [motionDisabled],\n );\n\n const cardStyle = useMemo(\n () =>\n mergeStyles(\n BASE_STYLE,\n isHovered ? HOVERED_STYLE : undefined,\n resolveDot(dotProp),\n style,\n ),\n [isHovered, dotProp, style],\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 style={cardStyle}\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 && (\n <div style={borderStyle as React.CSSProperties} aria-hidden=\"true\" />\n )}\n\n {/* Content */}\n <div style={CONTENT_STYLE}>{children}</div>\n </div>\n );\n },\n);\n\nGlowCard.displayName = \"GlowCard\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(\n ...refs: (React.Ref<T> | undefined)[]\n): 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, useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../../hooks/useDotMap\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useMotionConfig } from \"../../context/MotionConfigContext\";\n\n/** Base card styles applied to every SpotlightCard */\nconst BASE_STYLE: React.CSSProperties = {\n position: \"relative\",\n overflow: \"hidden\",\n borderRadius: \"0.75rem\",\n backgroundColor: \"rgb(17 24 39)\",\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n borderColor: \"rgb(31 41 55)\",\n transition: \"border-color 300ms ease, box-shadow 300ms ease\",\n};\n\nconst HOVERED_STYLE: React.CSSProperties = {\n borderColor: \"rgb(55 65 81)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.2)\",\n};\n\n/**\n * SpotlightCard component props\n * @property {string} [spotlightColor=\"rgba(255, 255, 255, 0.1)\"] - Spotlight color\n * @property {number} [spotlightSize=300] - 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 * @property {string} [dot] - dot utility string for additional styles\n * @property {React.CSSProperties} [style] - Additional inline styles (merged last)\n */\nexport interface SpotlightCardProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"className\"> {\n spotlightColor?: string;\n spotlightSize?: number;\n gradient?: boolean;\n gradientFrom?: string;\n gradientTo?: string;\n dot?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * SpotlightCard component\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 dot=\"p-8\" style={{ background: 'rgb(17 24 39)' }}>\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 dot: dotProp,\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 onMouseMove,\n onMouseEnter,\n onMouseLeave,\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 const prefersReducedMotion = useReducedMotion();\n const { enableAnimations } = useMotionConfig();\n const motionDisabled = prefersReducedMotion || !enableAnimations;\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n onMouseMove?.(e);\n if (motionDisabled) return;\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 [motionDisabled, onMouseMove]\n );\n\n const handleMouseEnter = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n onMouseEnter?.(e);\n setIsHovered(true);\n },\n [onMouseEnter]\n );\n\n const handleMouseLeave = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n onMouseLeave?.(e);\n setIsHovered(false);\n },\n [onMouseLeave]\n );\n\n const computedStyle = useMemo(\n () =>\n mergeStyles(\n BASE_STYLE,\n isHovered ? HOVERED_STYLE : undefined,\n resolveDot(dotProp),\n style\n ),\n [isHovered, dotProp, style]\n );\n\n const spotlightStyle = useMemo(\n (): 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 [isHovered, spotlightSize, mousePosition.x, mousePosition.y, spotlightColor]\n );\n\n const gradientOverlayStyle = useMemo(\n (): React.CSSProperties | undefined =>\n 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 : undefined,\n [gradient, gradientFrom, gradientTo]\n );\n\n return (\n <div\n ref={mergeRefs(ref, cardRef)}\n style={computedStyle}\n onMouseMove={handleMouseMove}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n {/* Gradient overlay */}\n {gradient && gradientOverlayStyle && (\n <div style={gradientOverlayStyle} aria-hidden=\"true\" />\n )}\n\n {/* Spotlight effect */}\n <div style={spotlightStyle} aria-hidden=\"true\" />\n\n {/* Content */}\n <div style={{ position: \"relative\", zIndex: 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, useMemo, useState } from \"react\";\nimport { mergeStyles, resolveDot } from \"../../hooks/useDotMap\";\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 * @property {string} [dot] - dot utility string for additional styles\n * @property {React.CSSProperties} [style] - inline style overrides\n */\nexport interface AnimatedGradientProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'className'> {\n colors?: string[];\n speed?: number;\n blur?: boolean;\n blurAmount?: number;\n type?: \"linear\" | \"radial\" | \"conic\" | \"mesh\";\n animate?: boolean;\n dot?: string;\n style?: React.CSSProperties;\n}\n\nconst defaultColors = [\n \"#ff0080\",\n \"#7928ca\",\n \"#0070f3\",\n \"#00dfd8\",\n];\n\n/** Base style for full-coverage absolute overlay divs */\nconst INSET_STYLE: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\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\" dot=\"absolute inset-0\" style={{ zIndex: -1 }} />\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 colors = defaultColors,\n speed = 3,\n blur = true,\n blurAmount = 100,\n type = \"mesh\",\n animate = true,\n dot: dotProp,\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 rootStyle = useMemo<React.CSSProperties>(() => mergeStyles(\n { position: 'relative', overflow: 'hidden' },\n resolveDot(dotProp),\n style,\n ), [dotProp, style]);\n\n const renderGradient = () => {\n switch (type) {\n case \"linear\":\n return (\n <div\n style={{\n ...INSET_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 style={{\n ...INSET_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 style={{\n ...INSET_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 style={{\n position: 'absolute',\n borderRadius: '9999px',\n mixBlendMode: 'screen',\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 style={rootStyle}\n {...props}\n >\n {/* Gradient layer */}\n <div\n style={{\n ...INSET_STYLE,\n filter: blur ? `blur(${blurAmount}px)` : undefined,\n }}\n >\n {renderGradient()}\n </div>\n\n {/* Content */}\n {children && (\n <div style={{ position: 'relative', zIndex: 10 }}>\n {children}\n </div>\n )}\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 { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { mergeStyles, resolveDot } from \"../../hooks/useDotMap\";\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<\n React.HTMLAttributes<HTMLDivElement>,\n \"children\" | \"className\"\n> {\n children: React.ReactNode[];\n dot?: string;\n style?: React.CSSProperties;\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 style,\n dot: dotProp,\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(\n (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 },\n [loop, slideCount, transition],\n );\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 =\n loop && transition === \"slide\"\n ? newIndex === 0\n ? slideCount - 1\n : newIndex === slideCount + 1\n ? 0\n : newIndex - 1\n : newIndex;\n onSlideChange?.(actualIndex);\n setTimeout(() => setIsTransitioning(false), transitionDuration);\n }\n },\n [\n currentIndex,\n slideCount,\n loop,\n isTransitioning,\n transitionDuration,\n transition,\n onSlideChange,\n ],\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 }, [\n currentIndex,\n slideCount,\n loop,\n isTransitioning,\n transitionDuration,\n transition,\n ]);\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 // Auto play\n useEffect(() => {\n if (!autoPlay || isPaused || isManuallyPaused || prefersReducedMotion)\n return;\n\n const timer = setInterval(nextSlide, interval);\n return () => clearInterval(timer);\n }, [\n autoPlay,\n interval,\n isPaused,\n isManuallyPaused,\n nextSlide,\n prefersReducedMotion,\n ]);\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 =\n 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 style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n zIndex: index === actualIndex ? 10 : 0,\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 style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n zIndex: index === actualIndex ? 10 : 0,\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 return slides.map((child, index) => (\n <div\n key={index}\n style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n transform: `translateX(${(index - currentIndex) * 100}%)`,\n transition: noTransition\n ? \"none\"\n : `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 indicatorContainerStyle: React.CSSProperties = isInside\n ? {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ...resolveDot(\"gap-2\"),\n position: \"absolute\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 20,\n ...(isTop\n ? { ...resolveDot(\"top-4\") }\n : { ...resolveDot(\"bottom-4\") }),\n }\n : {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ...resolveDot(\"gap-2\"),\n ...resolveDot(\"mt-4\"),\n ...(isTop\n ? { order: -1, ...resolveDot(\"mb-4\"), marginTop: 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 style={indicatorContainerStyle} 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 style={{\n ...resolveDot(\"h-1\"),\n borderRadius: \"9999px\",\n transition: \"all 300ms\",\n border: \"none\",\n cursor: \"pointer\",\n width: isActive ? \"2rem\" : \"1rem\",\n backgroundColor: isActive\n ? \"white\"\n : \"rgba(255,255,255,0.5)\",\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 style={{\n ...resolveDot(\"w-8 h-8\"),\n borderRadius: \"9999px\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n transition: \"all 300ms\",\n border: \"none\",\n cursor: \"pointer\",\n backgroundColor: isActive\n ? \"white\"\n : \"rgba(255,255,255,0.3)\",\n color: isActive ? \"#111827\" : \"white\",\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 style={{\n width: \"0.625rem\",\n height: \"0.625rem\",\n borderRadius: \"9999px\",\n transition: \"all 300ms\",\n border: \"none\",\n cursor: \"pointer\",\n backgroundColor: isActive\n ? \"white\"\n : \"rgba(255,255,255,0.5)\",\n transform: isActive ? \"scale(1.25)\" : \"scale(1)\",\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 positionMap: Record<string, React.CSSProperties> = {\n left: { ...resolveDot(\"left-4\") },\n center: { left: \"50%\", transform: \"translateX(-50%)\" },\n right: { ...resolveDot(\"right-4\") },\n };\n\n return (\n <button\n onClick={togglePlayPause}\n style={{\n position: \"absolute\",\n ...resolveDot(\"bottom-4\"),\n zIndex: 20,\n ...resolveDot(\"w-8 h-8\"),\n borderRadius: \"9999px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"rgba(255,255,255,0.8)\",\n color: \"#1f2937\",\n border: \"none\",\n cursor: \"pointer\",\n transition: \"all 200ms\",\n ...positionMap[playPausePosition],\n }}\n aria-label={isPlaying ? \"일시정지\" : \"재생\"}\n >\n {isPlaying ? (\n <PauseIcon style={{ ...resolveDot(\"w-4 h-4\") }} />\n ) : (\n <PlayIcon style={{ ...resolveDot(\"w-4 h-4\") }} />\n )}\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 arrowBaseStyle: React.CSSProperties = {\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n zIndex: 20,\n ...resolveDot(\"w-10 h-10\"),\n borderRadius: \"9999px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"rgba(255,255,255,0.8)\",\n color: \"#1f2937\",\n border: \"none\",\n cursor: \"pointer\",\n transition: \"all 200ms\",\n };\n\n const prevLeft = arrowPosition === \"outside\" ? \"-3.5rem\" : \"1rem\";\n const nextRight = arrowPosition === \"outside\" ? \"-3.5rem\" : \"1rem\";\n\n return (\n <>\n <button\n onClick={prevSlide}\n disabled={!canGoPrev}\n style={{\n ...arrowBaseStyle,\n left: prevLeft,\n opacity: !canGoPrev ? 0.3 : 1,\n cursor: !canGoPrev ? \"not-allowed\" : \"pointer\",\n }}\n aria-label=\"이전 슬라이드\"\n >\n <ChevronLeft style={{ ...resolveDot(\"w-5 h-5\") }} />\n </button>\n <button\n onClick={nextSlide}\n disabled={!canGoNext}\n style={{\n ...arrowBaseStyle,\n right: nextRight,\n opacity: !canGoNext ? 0.3 : 1,\n cursor: !canGoNext ? \"not-allowed\" : \"pointer\",\n }}\n aria-label=\"다음 슬라이드\"\n >\n <ChevronRight style={{ ...resolveDot(\"w-5 h-5\") }} />\n </button>\n </>\n );\n };\n\n const dotStyle = dotProp ? resolveDot(dotProp) : undefined;\n\n return (\n <div\n ref={ref}\n style={mergeStyles(\n {\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n height: \"100%\",\n ...(arrowPosition === \"outside\" ? { padding: \"0 4rem\" } : {}),\n },\n dotStyle,\n style,\n )}\n {...props}\n >\n <div\n ref={containerRef}\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n width: \"100%\",\n flex: 1,\n }}\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({ style }: { style?: React.CSSProperties }) {\n return (\n <svg style={style} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n );\n}\n\nfunction ChevronRight({ style }: { style?: React.CSSProperties }) {\n return (\n <svg style={style} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n );\n}\n\nfunction PlayIcon({ style }: { style?: React.CSSProperties }) {\n return (\n <svg style={style} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction PauseIcon({ style }: { style?: React.CSSProperties }) {\n return (\n <svg style={style} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M6 4h4v16H6V4zm8 0h4v16h-4V4z\" />\n </svg>\n );\n}\n\nexport { Carousel };\n"]}
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import {a}from'./chunk-D7MTTTQY.mjs';import {m}from'./chunk-NSDWT2JM.mjs';import {e,d}from'./chunk-OBMOTQEU.mjs';import Xe,{createContext,useState,useRef,useEffect,useCallback,useMemo,useContext}from'react';import {jsx,jsxs}from'react/jsx-runtime';import {useSortable,SortableContext,verticalListSortingStrategy,arrayMove,horizontalListSortingStrategy}from'@dnd-kit/sortable';import {CSS}from'@dnd-kit/utilities';import {useSensors,useSensor,PointerSensor,KeyboardSensor,DndContext,closestCenter,DragOverlay}from'@dnd-kit/core';var je=createContext(null);function ae(){let e=useContext(je);if(!e)throw new Error("useKanban must be used within a KanbanProvider");return e}function qe({children:e,columns:i,cards:s,onColumnsChange:u,onCardsChange:o,onCardMove:y,onColumnMove:m,onCardAdd:x,onCardDelete:L,onCardUpdate:D,onColumnAdd:S,onColumnDelete:b,onColumnUpdate:f,onCardClick:I,variant:M="elevated",color:k="blue",allowCardDrag:T=true,allowColumnDrag:z=true,allowAddCard:g=true,allowAddColumn:K=false,readOnly:d=false}){let[H,n]=Xe.useState(null),[P,ee]=Xe.useState(null),[_,ie]=Xe.useState(null),le=useCallback(a=>{n(a);},[]),te=useCallback((a,r)=>{ee(a),ie(r);},[]),V=useCallback(()=>{n(null),ee(null),ie(null);},[]),G=useCallback(a=>s.filter(r=>r.columnId===a).sort((r,v)=>{var c,C;return ((c=r.order)!=null?c:0)-((C=v.order)!=null?C:0)}),[s]),p=useCallback(a=>{let r=i.find(c=>c.id===a);if(!r||r.limit===void 0)return true;let v=G(a).length;return (H==null?void 0:H.type)==="card"&&H.columnId===a?true:v<r.limit},[i,G,H]),fe=useCallback((a,r,v)=>{if(d)return;let c=s.find(B=>B.id===a);if(!c)return;let C=c.columnId;if(C!==r&&!p(r))return;let w=new Map;i.forEach(B=>{w.set(B.id,[]);}),s.forEach(B=>{if(B.id!==a){let W=w.get(B.columnId);W&&W.push(B);}}),w.forEach(B=>{B.sort((W,re)=>{var Y,Le;return ((Y=W.order)!=null?Y:0)-((Le=re.order)!=null?Le:0)});});let ge=w.get(r)||[],Re=Math.min(v,ge.length),$e={...c,columnId:r};ge.splice(Re,0,$e),w.set(r,ge);let ye=[];w.forEach(B=>{B.forEach((W,re)=>{ye.push({...W,order:re});});}),o==null||o(ye),y==null||y({cardId:a,fromColumnId:C,toColumnId:r,toIndex:Re});},[s,i,d,p,o,y]),pe=useCallback((a,r)=>{if(d||!p(a))return;let v={id:r.id||`card-${Date.now()}`,columnId:a,title:r.title||"\uC0C8 \uCE74\uB4DC",description:r.description,priority:r.priority,tags:r.tags,assignee:r.assignee,dueDate:r.dueDate,metadata:r.metadata},c=[...s,v];o==null||o(c),x==null||x(a,v);},[s,d,p,o,x]),be=useCallback((a,r)=>{if(d)return;let v=s.map(c=>c.id===a?{...c,...r}:c);o==null||o(v),D==null||D(a,r);},[s,d,o,D]),ne=useCallback(a=>{if(d)return;let r=s.filter(v=>v.id!==a);o==null||o(r),L==null||L(a);},[s,d,o,L]),Ee=useCallback((a,r)=>{if(d)return;let v=i.findIndex(w=>w.id===a);if(v===-1)return;let c=[...i],[C]=c.splice(v,1);c.splice(r,0,C),u==null||u(c),m==null||m({columnId:a,toIndex:r});},[i,d,u,m]),he=useCallback(a=>{if(d)return;let r={id:a.id||`column-${Date.now()}`,title:a.title||"\uC0C8 \uCEEC\uB7FC",color:a.color,limit:a.limit,collapsed:a.collapsed},v=[...i,r];u==null||u(v),S==null||S(r);},[i,d,u,S]),Te=useCallback((a,r)=>{if(d)return;let v=i.map(c=>c.id===a?{...c,...r}:c);u==null||u(v),f==null||f(a,r);},[i,d,u,f]),Pe=useCallback(a=>{if(d)return;let r=i.filter(c=>c.id!==a),v=s.filter(c=>c.columnId!==a);u==null||u(r),o==null||o(v),b==null||b(a);},[i,s,d,u,o,b]),O=useMemo(()=>({columns:i,cards:s,dragData:H,dropTargetId:P,dropIndex:_,startDrag:le,updateDropTarget:te,endDrag:V,moveCard:fe,addCard:pe,updateCard:be,deleteCard:ne,moveColumn:Ee,addColumn:he,updateColumn:Te,deleteColumn:Pe,getCardsByColumn:G,canDropCard:p,variant:M,color:k,allowCardDrag:T,allowColumnDrag:z,allowAddCard:g,allowAddColumn:K,readOnly:d,onCardClick:I}),[i,s,H,P,_,le,te,V,fe,pe,be,ne,Ee,he,Te,Pe,G,p,M,k,T,z,g,K,d,I]);return jsx(je.Provider,{value:O,children:e})}var St={blue:{backgroundColor:"#6366f1"},purple:{backgroundColor:"#a855f7"},green:{backgroundColor:"#22c55e"},orange:{backgroundColor:"#f97316"},red:{backgroundColor:"#ef4444"},indigo:{backgroundColor:"#6366f1"},pink:{backgroundColor:"#ec4899"},gray:{backgroundColor:"#6b7280"},cyan:{backgroundColor:"#06b6d4"},primary:{backgroundColor:"var(--color-primary, #06b6d4)"}},kt={blue:{backgroundColor:"rgba(239,246,255,0.3)",color:"#1d4ed8"},purple:{backgroundColor:"rgba(250,245,255,0.3)",color:"#7e22ce"},green:{backgroundColor:"rgba(240,253,244,0.3)",color:"#15803d"},orange:{backgroundColor:"rgba(255,247,237,0.3)",color:"#c2410c"},red:{backgroundColor:"rgba(254,242,242,0.3)",color:"#b91c1c"},indigo:{backgroundColor:"rgba(238,242,255,0.3)",color:"#4338ca"},pink:{backgroundColor:"rgba(253,242,248,0.3)",color:"#be185d"},gray:{backgroundColor:"rgba(249,250,251,0.3)",color:"#374151"},cyan:{backgroundColor:"rgba(236,254,255,0.3)",color:"#0e7490"},primary:{backgroundColor:"rgba(var(--color-primary-rgb, 6,182,212),0.1)",color:"var(--color-primary, #0e7490)"}},ze=Xe.forwardRef(({column:e$1,cardCount:i,onTitleChange:s,onDelete:u,onToggleCollapse:o,dragHandleProps:y,dot:m$1,style:x,...L},D)=>{let[S,b]=useState(false),[f,I]=useState(e$1.title),M=useRef(null),k=e$1.color||"gray",T=St[k],z=kt[k],g={backgroundColor:"#fef3c7",color:"#b45309"};useEffect(()=>{S&&M.current&&(M.current.focus(),M.current.select());},[S]);let K=()=>{s&&(b(true),I(e$1.title));},d$1=()=>{f.trim()&&f!==e$1.title?s==null||s(f.trim()):I(e$1.title),b(false);},H=n=>{n.key==="Enter"?d$1():n.key==="Escape"&&(I(e$1.title),b(false));};return e$1.collapsed?jsx("div",{ref:D,style:d({display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100%",minHeight:"300px",...e("py-4 px-2 rounded-xl")},e(m$1),x),...L,children:jsxs("button",{type:"button",onClick:n=>{n.stopPropagation(),o==null||o();},onPointerDown:n=>n.stopPropagation(),style:{display:"flex",flexDirection:"column",alignItems:"center",...e("gap-3 rounded-lg p-2"),width:"100%",height:"100%",justifyContent:"center",cursor:"pointer",background:"none",border:"none",transition:"background-color 150ms"},onMouseEnter:n=>{n.currentTarget.style.backgroundColor="rgba(229,231,235,0.5)";},onMouseLeave:n=>{n.currentTarget.style.backgroundColor="transparent";},children:[jsx(m,{name:"chevronRight",size:16,style:{color:"#9ca3af"}}),jsx("span",{style:{fontSize:"0.875rem",fontWeight:600,color:"#374151",letterSpacing:"0.05em",writingMode:"vertical-rl",textOrientation:"mixed"},children:e$1.title}),jsx("span",{style:{fontSize:"0.75rem",...e("px-2 py-1 rounded-full"),fontWeight:500,...z},children:i})]})}):jsxs("div",{ref:D,style:d({display:"flex",alignItems:"center",justifyContent:"space-between",...e("gap-2 p-3"),borderBottom:"1px solid #e5e7eb"},e(m$1),x),...L,children:[jsxs("div",{style:{display:"flex",alignItems:"center",...e("gap-2"),flex:1,minWidth:0},children:[y&&jsx("div",{...y,style:{flexShrink:0,...e("p-0.5 rounded"),marginLeft:"-0.25rem",cursor:"grab",transition:"background-color 150ms"},title:"\uB4DC\uB798\uADF8\uD558\uC5EC \uCEEC\uB7FC \uC774\uB3D9",onMouseEnter:n=>{n.currentTarget.style.backgroundColor="#e5e7eb";},onMouseLeave:n=>{n.currentTarget.style.backgroundColor="transparent";},children:jsx(m,{name:"moreVertical",size:16,style:{color:"#9ca3af"}})}),jsx("div",{style:{...e("w-3 h-3 rounded-full"),flexShrink:0,...T}}),S?jsx("input",{ref:M,type:"text",value:f,onChange:n=>I(n.target.value),onBlur:d$1,onKeyDown:H,style:{flex:1,minWidth:0,...e("px-2 py-1 rounded"),fontSize:"0.875rem",fontWeight:600,backgroundColor:"transparent",border:"1px solid #6366f1",outline:"none",color:"#1f2937"}}):jsx("h3",{style:{flex:1,minWidth:0,fontSize:"0.875rem",fontWeight:600,color:"#1f2937",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:s?"pointer":"default",transition:"color 150ms"},onClick:K,onMouseEnter:n=>{s&&(n.currentTarget.style.color="#4f46e5");},onMouseLeave:n=>{n.currentTarget.style.color="#1f2937";},children:e$1.title}),jsxs("span",{style:{fontSize:"0.75rem",...e("px-2 py-0.5 rounded-full"),flexShrink:0,...e$1.limit&&i>=e$1.limit?g:z},children:[i,e$1.limit&&`/${e$1.limit}`]})]}),jsxs("div",{style:{display:"flex",alignItems:"center",...e("gap-1"),flexShrink:0},children:[o&&jsx("button",{type:"button",onClick:n=>{n.stopPropagation(),n.preventDefault(),o();},onPointerDown:n=>n.stopPropagation(),style:{...e("p-1 rounded"),background:"none",border:"none",cursor:"pointer",transition:"background-color 150ms"},"aria-label":"\uCEEC\uB7FC \uC811\uAE30",onMouseEnter:n=>{n.currentTarget.style.backgroundColor="#e5e7eb";},onMouseLeave:n=>{n.currentTarget.style.backgroundColor="transparent";},children:jsx(m,{name:"chevronLeft",size:14,style:{color:"#9ca3af"}})}),u&&jsx("button",{type:"button",onClick:n=>{n.stopPropagation(),n.preventDefault(),u();},onPointerDown:n=>n.stopPropagation(),style:{...e("p-1 rounded"),background:"none",border:"none",cursor:"pointer",transition:"background-color 150ms"},"aria-label":"\uCEEC\uB7FC \uC0AD\uC81C",onMouseEnter:n=>{n.currentTarget.style.backgroundColor="#fee2e2";let P=n.currentTarget.querySelector("[data-icon]");P&&(P.style.color="#ef4444");},onMouseLeave:n=>{n.currentTarget.style.backgroundColor="transparent";let P=n.currentTarget.querySelector("[data-icon]");P&&(P.style.color="#9ca3af");},children:jsx(m,{name:"delete",size:14,style:{color:"#9ca3af",transition:"color 150ms"}})})]})]})});ze.displayName="KanbanColumnHeader";var Ue="kanban-card-keyframes";function Et(){useEffect(()=>{if(document.getElementById(Ue))return;let e=document.createElement("style");e.id=Ue,e.textContent=`
3
+ @keyframes kanban-card-enter {
4
+ from {
5
+ opacity: 0;
6
+ transform: translateY(8px);
7
+ }
8
+ to {
9
+ opacity: 1;
10
+ transform: translateY(0);
11
+ }
12
+ }
13
+ @keyframes kanban-card-exit {
14
+ from {
15
+ opacity: 1;
16
+ transform: translateX(0) scale(1);
17
+ }
18
+ to {
19
+ opacity: 0;
20
+ transform: translateX(20px) scale(0.95);
21
+ }
22
+ }
23
+ `,document.head.appendChild(e);},[]);}var ht={low:"\uB0AE\uC74C",medium:"\uC911\uAC04",high:"\uB192\uC74C",urgent:"\uAE34\uAE09"},Tt={urgent:{backgroundColor:"#fee2e2",color:"#b91c1c"},high:{backgroundColor:"#ffedd5",color:"#c2410c"},medium:{backgroundColor:"#e0e7ff",color:"#0e7490"},low:{backgroundColor:"#f3f4f6",color:"#374151"}},et={default:{backgroundColor:"#ffffff"},gradient:{background:"linear-gradient(135deg, #ffffff, #f9fafb)"},outline:{backgroundColor:"transparent",border:"1px solid #e5e7eb"},elevated:{backgroundColor:"#ffffff",boxShadow:"0 1px 2px 0 rgba(0,0,0,0.05)"}},xe=Xe.forwardRef(({card:e$1,index:i,isDragging:s=false,isOver:u=false,dot:o,style:y,...m$1},x)=>{var G;Et();let{deleteCard:L,variant:D,allowCardDrag:S,readOnly:b,onCardClick:f}=ae(),{attributes:I,listeners:M,setNodeRef:k,transform:T,transition:z,isDragging:g}=useSortable({id:e$1.id,disabled:!S||b,data:{type:"card",card:e$1,columnId:e$1.columnId}}),K={transform:CSS.Transform.toString(T),transition:z},d$1=useCallback(()=>{g||f==null||f(e$1);},[e$1,f,g]),[H,n]=useState(false),P=useCallback(p=>{p.stopPropagation(),n(true),setTimeout(()=>{L(e$1.id);},200);},[e$1.id,L]),_=(p=>{if(!p)return null;let fe=typeof p=="string"?new Date(p):p,pe=new Date,be=fe.getTime()-pe.getTime(),ne=Math.ceil(be/(1e3*60*60*24));return ne<0?`${Math.abs(ne)}\uC77C \uC9C0\uB0A8`:ne===0?"\uC624\uB298":ne===1?"\uB0B4\uC77C":`${ne}\uC77C \uB0A8\uC74C`})(e$1.dueDate),ie=e$1.dueDate&&new Date(e$1.dueDate)<new Date,le=(G=et[D])!=null?G:et.elevated,te={animation:H?"kanban-card-exit 0.2s ease-out forwards":"kanban-card-enter 0.2s ease-out both",animationDelay:H?"0ms":`${Math.min(i*30,150)}ms`},V=d({position:"relative",...e("rounded-lg p-3 mb-2"),cursor:S?"grab":"default",transition:"all 200ms",touchAction:"none",outline:u?"1px solid #6366f1":void 0},le,g?{opacity:.5,transform:"scale(0.95)",boxShadow:"0 25px 50px -12px rgba(0,0,0,0.25)",zIndex:50}:void 0,H?{pointerEvents:"none"}:void 0,K,te,e(o),y);return jsxs("div",{...I,...M,ref:k,"data-card-id":e$1.id,role:"listitem","aria-label":e$1.title,tabIndex:0,style:V,onClick:d$1,onKeyDown:p=>{(p.key==="Enter"||p.key===" ")&&(p.preventDefault(),d$1());},...m$1,children:[!b&&jsx("button",{type:"button",onClick:P,style:{position:"absolute",...e("top-2 right-2 p-1 rounded"),opacity:0,border:"none",background:"none",cursor:"pointer",transition:"opacity 150ms, background-color 150ms"},"aria-label":"\uCE74\uB4DC \uC0AD\uC81C",onMouseEnter:p=>{p.currentTarget.style.opacity="1",p.currentTarget.style.backgroundColor="#fee2e2";},onMouseLeave:p=>{p.currentTarget.style.opacity="0",p.currentTarget.style.backgroundColor="transparent";},children:jsx(m,{name:"close",size:12,style:{color:"#9ca3af"}})}),jsx("h4",{style:{fontSize:"0.875rem",fontWeight:500,color:"#1f2937",...e("pr-6 mb-1")},children:e$1.title}),e$1.description&&jsx("p",{style:{fontSize:"0.75rem",color:"#6b7280",...e("mb-2"),overflow:"hidden",display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical"},children:e$1.description}),e$1.tags&&e$1.tags.length>0&&jsxs("div",{style:{display:"flex",flexWrap:"wrap",...e("gap-1 mb-2")},children:[e$1.tags.slice(0,3).map(p=>jsx("span",{style:{fontSize:"0.75rem",...e("px-1.5 py-0.5 rounded"),backgroundColor:"#f3f4f6",color:"#4b5563"},children:p},p)),e$1.tags.length>3&&jsxs("span",{style:{fontSize:"0.75rem",color:"#9ca3af"},children:["+",e$1.tags.length-3]})]}),jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",...e("mt-2")},children:[jsx("div",{style:{display:"flex",alignItems:"center",...e("gap-1")},children:e$1.assignee&&jsxs("div",{style:{display:"flex",alignItems:"center",...e("gap-1.5")},children:[e$1.assignee.avatar?jsx("img",{src:e$1.assignee.avatar,alt:e$1.assignee.name,style:{...e("w-5 h-5 rounded-full")}}):jsx("div",{style:{...e("w-5 h-5 rounded-full"),backgroundColor:"#d1d5db",display:"flex",alignItems:"center",justifyContent:"center"},children:jsx("span",{style:{fontSize:"0.625rem",fontWeight:500,color:"#4b5563"},children:e$1.assignee.name.charAt(0).toUpperCase()})}),jsx("span",{style:{fontSize:"0.75rem",color:"#6b7280"},children:e$1.assignee.name})]})}),jsxs("div",{style:{display:"flex",alignItems:"center",...e("gap-2")},children:[_&&jsxs("span",{style:{fontSize:"0.75rem",display:"flex",alignItems:"center",...e("gap-0.5"),color:ie?"#ef4444":"#9ca3af"},children:[jsx(m,{name:"clock",size:12}),_]}),e$1.priority&&jsx("span",{style:{fontSize:"0.625rem",...e("px-1.5 py-0.5 rounded"),...Tt[e$1.priority]},children:ht[e$1.priority]})]})]})]})});xe.displayName="KanbanCard";var Be=Xe.forwardRef(({columnId:e$1,onAdd:i,onCancel:s,placeholder:u="\uCE74\uB4DC \uC81C\uBAA9 \uC785\uB825...",dot:o,style:y,...m$1},x)=>{let{addCard:L}=ae(),[D,S]=useState(false),[b,f]=useState(""),I=useRef(null);useEffect(()=>{D&&I.current&&I.current.focus();},[D]);let M=()=>{S(true),f("");},k=()=>{S(false),f(""),s==null||s();},T=()=>{var d;let g=b.trim();if(!g){k();return}let K={title:g};i?i(K):L(e$1,K),f(""),(d=I.current)==null||d.focus();},z=g=>{g.key==="Enter"?(g.preventDefault(),T()):g.key==="Escape"&&k();};return D?jsxs("div",{ref:x,style:d({...e("rounded-lg p-2"),backgroundColor:"#ffffff",boxShadow:"0 1px 2px 0 rgba(0,0,0,0.05)",border:"1px solid #e5e7eb"},e(o),y),...m$1,children:[jsx("input",{ref:I,type:"text",value:b,onChange:g=>f(g.target.value),onKeyDown:z,onBlur:()=>{setTimeout(()=>{b.trim()||k();},150);},placeholder:u,style:{width:"100%",...e("px-2 py-1.5"),fontSize:"0.875rem",backgroundColor:"transparent",border:"none",outline:"none",color:"#1f2937"}}),jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"flex-end",...e("gap-1 mt-2")},children:[jsx("button",{type:"button",onClick:k,style:{...e("px-2 py-1"),fontSize:"0.75rem",color:"#6b7280",background:"none",border:"none",cursor:"pointer"},children:"\uCDE8\uC18C"}),jsx("button",{type:"button",onClick:T,disabled:!b.trim(),style:b.trim()?{...e("px-3 py-1 rounded"),fontSize:"0.75rem",fontWeight:500,backgroundColor:"#6366f1",color:"#ffffff",border:"none",cursor:"pointer",transition:"background-color 150ms"}:{...e("px-3 py-1 rounded"),fontSize:"0.75rem",fontWeight:500,backgroundColor:"#e5e7eb",color:"#9ca3af",border:"none",cursor:"not-allowed"},children:"\uCD94\uAC00"})]})]}):jsxs("button",{ref:x,type:"button",onClick:M,style:d({width:"100%",display:"flex",alignItems:"center",...e("gap-2 px-3 py-2 rounded-lg"),fontSize:"0.875rem",color:"#6b7280",background:"none",border:"none",cursor:"pointer",transition:"background-color 150ms, color 150ms"},e(o),y),...m$1,children:[jsx(m,{name:"add",size:16}),jsx("span",{children:"\uCE74\uB4DC \uCD94\uAC00"})]})});Be.displayName="KanbanAddCard";var nt="kanban-column-keyframes";function Nt(){useEffect(()=>{if(document.getElementById(nt))return;let e=document.createElement("style");e.id=nt,e.textContent=`
24
+ @keyframes kanban-column-enter {
25
+ from {
26
+ opacity: 0;
27
+ transform: translateY(12px) scale(0.98);
28
+ }
29
+ to {
30
+ opacity: 1;
31
+ transform: translateY(0) scale(1);
32
+ }
33
+ }
34
+ `,document.head.appendChild(e);},[]);}var rt={default:{backgroundColor:"rgba(243,244,246,0.5)"},gradient:{background:"linear-gradient(to bottom, #f3f4f6, #ffffff)"},outline:{backgroundColor:"transparent",border:"2px solid #e5e7eb"},elevated:{backgroundColor:"#ffffff",boxShadow:"0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1)"}},Ie=Xe.forwardRef(({column:e$1,cards:i,index:s,style:u,dot:o,...y},m)=>{var te;Nt();let{updateColumn:x,deleteColumn:L,variant:D,allowColumnDrag:S,allowAddCard:b,readOnly:f}=ae(),{attributes:I,listeners:M,setNodeRef:k,transform:T,transition:z,isDragging:g}=useSortable({id:e$1.id,disabled:!S||f}),K=o?e(o):void 0,d$1=d({transform:CSS.Transform.toString(T),transition:z,animation:g?"none":"kanban-column-enter 0.25s ease-out both",animationDelay:g?"0ms":`${s*50}ms`},u,K),H=e$1.limit!==void 0&&i.length>=e$1.limit,n=useMemo(()=>i.map(V=>V.id),[i]),P=V=>{x(e$1.id,{title:V});},ee=()=>{L(e$1.id);},_=()=>{x(e$1.id,{collapsed:!e$1.collapsed});},ie=(te=rt[D])!=null?te:rt.elevated,le=d({display:"flex",flexDirection:"column",...e("rounded-xl"),transition:"all 300ms ease-out",opacity:g?.4:1,...e$1.collapsed?{width:"4rem",minWidth:"4rem",maxWidth:"4rem"}:{flexShrink:0}},ie,d$1);return jsxs("div",{ref:k,role:"group","aria-label":`${e$1.title} \uCEEC\uB7FC`,style:le,...y,children:[jsx(ze,{column:e$1,cardCount:i.length,onTitleChange:f?void 0:P,onDelete:f?void 0:ee,onToggleCollapse:_,dragHandleProps:{...I,...M,style:{cursor:S?"grab":"default"}}}),!e$1.collapsed&&jsxs("div",{style:{flex:1,...e("px-2 pb-2"),overflowY:"auto",overflowX:"hidden",minHeight:"100px"},role:"list","aria-label":`${e$1.title} \uCE74\uB4DC \uBAA9\uB85D`,children:[jsx(SortableContext,{items:n,strategy:verticalListSortingStrategy,children:i.map((V,G)=>jsx(xe,{card:V,index:G},V.id))}),i.length===0&&jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"5rem",fontSize:"0.875rem",color:"#9ca3af"},children:"\uCE74\uB4DC\uB97C \uB4DC\uB798\uADF8\uD558\uC138\uC694"})]}),!e$1.collapsed&&b&&!f&&!H&&jsx("div",{style:{...e("px-2 pb-2")},children:jsx(Be,{columnId:e$1.id})}),!e$1.collapsed&&H&&jsxs("div",{style:{...e("px-2 pb-2"),fontSize:"0.75rem",textAlign:"center",color:"#d97706"},children:["WIP \uC81C\uD55C \uB3C4\uB2EC (",e$1.limit,"\uAC1C)"]})]})});Ie.displayName="KanbanColumn";var Ae=Xe.forwardRef(({onAdd:e$1,onCancel:i,placeholder:s="\uCEEC\uB7FC \uC81C\uBAA9 \uC785\uB825...",dot:u,style:o,...y},m$1)=>{let{addColumn:x,variant:L}=ae(),[D,S]=useState(false),[b,f]=useState(""),I=useRef(null);useEffect(()=>{D&&I.current&&I.current.focus();},[D]);let M=()=>{S(true),f("");},k=()=>{S(false),f(""),i==null||i();},T=()=>{let K=b.trim();if(!K){k();return}let d={title:K};e$1?e$1(d):x(d),S(false),f("");},z=K=>{K.key==="Enter"?(K.preventDefault(),T()):K.key==="Escape"&&k();},g=(()=>{switch(L){case "gradient":return {background:"linear-gradient(to bottom, rgba(243,244,246,0.5), rgba(255,255,255,0.5))"};case "outline":return {border:"2px dashed #d1d5db",background:"transparent"};default:return {backgroundColor:"rgba(243,244,246,0.5)"}}})();return D?jsxs("div",{ref:m$1,style:d({flexShrink:0,...e("rounded-xl p-3")},g,e(u),o),...y,children:[jsx("input",{ref:I,type:"text",value:b,onChange:K=>f(K.target.value),onKeyDown:z,placeholder:s,style:{width:"100%",...e("px-3 py-2 rounded-lg"),fontSize:"0.875rem",backgroundColor:"#ffffff",border:"1px solid #e5e7eb",outline:"none",color:"#1f2937",boxSizing:"border-box"}}),jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"flex-end",...e("gap-2 mt-3")},children:[jsx("button",{type:"button",onClick:k,style:{...e("px-3 py-1.5"),fontSize:"0.875rem",color:"#6b7280",background:"none",border:"none",cursor:"pointer"},children:"\uCDE8\uC18C"}),jsx("button",{type:"button",onClick:T,disabled:!b.trim(),style:b.trim()?{...e("px-4 py-1.5 rounded-lg"),fontSize:"0.875rem",fontWeight:500,backgroundColor:"#6366f1",color:"#ffffff",border:"none",cursor:"pointer",transition:"background-color 150ms"}:{...e("px-4 py-1.5 rounded-lg"),fontSize:"0.875rem",fontWeight:500,backgroundColor:"#e5e7eb",color:"#9ca3af",border:"none",cursor:"not-allowed"},children:"\uCD94\uAC00"})]})]}):jsxs("button",{ref:m$1,type:"button",onClick:M,style:d({flexShrink:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",...e("gap-3 rounded-xl"),border:"2px dashed #d1d5db",color:"#9ca3af",background:"none",cursor:"pointer",transition:"all 200ms",minHeight:300},e(u),o),...y,children:[jsx("div",{style:{...e("w-12 h-12 rounded-full"),border:"2px dashed currentColor",display:"flex",alignItems:"center",justifyContent:"center",transition:"all 200ms"},children:jsx(m,{name:"add",size:24})}),jsx("span",{style:{fontSize:"0.875rem",fontWeight:500},children:"\uC0C8 \uCEEC\uB7FC \uCD94\uAC00"})]})});Ae.displayName="KanbanAddColumn";var lt=Xe.forwardRef(({columns:e$1,cards:i,defaultColumns:s=[],defaultCards:u=[],onColumnsChange:o,onCardsChange:y,onCardMove:m,onColumnMove:x,onCardAdd:L,onCardDelete:D,onCardUpdate:S,onColumnAdd:b,onColumnDelete:f,onColumnUpdate:I,onCardClick:M,onKanbanDragStart:k,onKanbanDragEnd:T,variant:z="elevated",color:g="blue",allowAddColumn:K=false,allowAddCard:d$1=true,allowColumnDrag:H=true,allowCardDrag:n=true,readOnly:P=false,columnMinWidth:ee=280,columnMaxWidth:_=320,showDragOverlay:ie=true,dragOverlayStyle:le,dragRotation:te=3,dragScale:V=1.05,dot:G,style:p,...fe},pe)=>{let[be,ne]=useState(false);useEffect(()=>{ne(true);},[]);let[Ee,he]=useState(s),[Te,Pe]=useState(u),[O,a$1]=useState(null),[r,v]=useState(null),c=e$1!==void 0,C=c?e$1:Ee,w=c?i!=null?i:[]:Te,ge=O!==null,Re=r==="column",$e=useSensors(useSensor(PointerSensor,{activationConstraint:{distance:8}}),useSensor(KeyboardSensor)),ye=useCallback(l=>{c||he(l),o==null||o(l);},[c,o]),B=useCallback(l=>{c||Pe(l),y==null||y(l);},[c,y]),W=useCallback(l=>w.filter(R=>R.columnId===l).sort((R,X)=>{var A,U;return ((A=R.order)!=null?A:0)-((U=X.order)!=null?U:0)}),[w]),re=useCallback(l=>{var X;let R=w.find(A=>A.id===l);return (X=R==null?void 0:R.columnId)!=null?X:null},[w]),Y=useCallback(l=>C.some(R=>R.id===l),[C]),Le=useCallback(l=>{let{active:R}=l,X=R.id,A=Y(X)?"column":"card";a$1(X),v(A),k==null||k(A,X);},[Y,k]),dt=useCallback(l=>{let{active:R,over:X}=l;if(!X)return;let A=R.id,U=X.id;if(Y(A))return;let J=re(A),$=Y(U)?U:re(U);if(!(!J||!$)&&J!==$){let se=W(J),de=W($);se.findIndex(E=>E.id===A);let oe=Y(U)?de.length:de.findIndex(E=>E.id===U),N=C.find(E=>E.id===$);if(N!=null&&N.limit&&de.length>=N.limit)return;let Ve=w.map(E=>E.id===A?{...E,columnId:$,order:oe}:E).map(E=>{var He;if(E.columnId===$&&E.id!==A){let Me=(He=E.order)!=null?He:0;if(Me>=oe)return {...E,order:Me+1}}return E});B(Ve);}},[w,C,re,W,B,Y]),ct=useCallback(l=>{let{active:R,over:X}=l,A=O,U=r;if(a$1(null),v(null),A&&U&&(T==null||T(U,A)),!X)return;let J=R.id,$=X.id;if(J===$)return;if(Y(J)&&Y($)){let ce=C.findIndex(N=>N.id===J),oe=C.findIndex(N=>N.id===$);if(ce!==oe){let N=arrayMove(C,ce,oe);ye(N),x==null||x({columnId:J,toIndex:oe});}return}let se=re(J),de=Y($)?$:re($);if(!(!se||!de))if(se===de){let ce=W(se),oe=ce.findIndex(ve=>ve.id===J),N=Y($)?ce.length-1:ce.findIndex(ve=>ve.id===$);if(oe!==N&&oe!==-1&&N!==-1){let ve=arrayMove(ce,oe,N),Ve=w.map(E=>{if(E.columnId===se){let He=ve.findIndex(Me=>Me.id===E.id);return {...E,order:He}}return E});B(Ve),m==null||m({cardId:J,fromColumnId:se,toColumnId:de,toIndex:N});}}else m==null||m({cardId:J,fromColumnId:se,toColumnId:de,toIndex:0});},[O,r,C,w,re,W,ye,B,Y,m,x,T]),Je=useMemo(()=>!O||r!=="card"?null:w.find(l=>l.id===O),[O,r,w]),Ne=useMemo(()=>!O||r!=="column"?null:C.find(l=>l.id===O),[O,r,C]),Qe=useMemo(()=>{let l={display:"flex",...e("gap-4 pb-4"),overflowX:"auto",minHeight:"400px"};switch(z){case "gradient":return {...l,...e("p-4 rounded-xl"),background:"linear-gradient(135deg, #f3f4f6, #e5e7eb)"};case "outline":return {...l,...e("p-4 rounded-xl"),border:"2px dashed #d1d5db"};case "elevated":return {...l,...e("p-4 rounded-xl"),backgroundColor:"rgba(249,250,251,0.5)"};default:return l}},[z]),ut=useMemo(()=>C.map(l=>l.id),[C]),ft=useMemo(()=>({transform:`rotate(${te}deg) scale(${V})`}),[te,V]);return be?jsx(qe,{columns:C,cards:w,onColumnsChange:ye,onCardsChange:B,onCardMove:m,onColumnMove:x,onCardAdd:L,onCardDelete:D,onCardUpdate:S,onColumnAdd:b,onColumnDelete:f,onColumnUpdate:I,onCardClick:M,variant:z,color:g,allowCardDrag:n&&!P,allowColumnDrag:H&&!P,allowAddCard:d$1&&!P,allowAddColumn:K&&!P,readOnly:P,children:jsxs(DndContext,{sensors:$e,collisionDetection:closestCenter,onDragStart:Le,onDragOver:dt,onDragEnd:ct,children:[ie&&ge&&Re&&jsx("div",{style:d({position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.2)",zIndex:40,transition:"opacity 200ms"},le),"aria-hidden":"true"}),jsxs("div",{ref:pe,role:"region","aria-label":"\uCE78\uBC18 \uBCF4\uB4DC",style:d(Qe,ge?{position:"relative",zIndex:50}:void 0,e(G),p),...fe,children:[jsx(SortableContext,{items:ut,strategy:horizontalListSortingStrategy,children:C.map((l,R)=>jsx(Ie,{column:l,cards:W(l.id),index:R,style:l.collapsed?void 0:{minWidth:ee,maxWidth:_}},l.id))}),K&&!P&&jsx(Ae,{style:{minWidth:ee,maxWidth:_}})]}),jsxs(DragOverlay,{dropAnimation:{duration:200,easing:"cubic-bezier(0.18, 0.67, 0.6, 1.22)"},children:[Je&&jsx("div",{style:{...ft,boxShadow:"0 25px 50px -12px rgba(0,0,0,0.25)"},children:jsx(xe,{card:Je,index:0,isDragging:true})}),Ne&&jsx("div",{style:{opacity:.9,boxShadow:"0 25px 50px -12px rgba(0,0,0,0.25)",transform:"rotate(1deg)",minWidth:ee,maxWidth:_},children:jsx(Ie,{column:Ne,cards:W(Ne.id),index:0})})]})]})}):jsx("div",{ref:pe,role:"region","aria-label":"\uCE78\uBC18 \uBCF4\uB4DC",style:d(Qe,e(G),p),...fe,children:C.map(l=>jsxs("div",{style:{flexShrink:0,backgroundColor:"#f3f4f6",...e("rounded-xl p-3"),minWidth:ee,maxWidth:_},children:[jsx(a,{variant:"text",dot:"h-8 mb-3"}),jsx("div",{style:{display:"flex",flexDirection:"column",...e("gap-2")},children:W(l.id).slice(0,3).map(R=>jsx(a,{variant:"rounded",dot:"h-20"},R.id))})]},l.id))})});lt.displayName="KanbanBoard";var st=Xe.forwardRef(({visible:e$1,orientation:i="horizontal",dot:s,style:u,...o},y)=>e$1?jsx("div",{ref:y,style:d({transition:"all 150ms",borderRadius:"9999px",backgroundColor:"#6366f1"},i==="horizontal"?{height:"4px",marginTop:"4px",marginBottom:"4px"}:{width:"4px",marginLeft:"4px",marginRight:"4px",alignSelf:"stretch"},e(s),u),...o}):null);st.displayName="KanbanDropIndicator";export{je as a,ae as b,qe as c,ze as d,xe as e,Be as f,Ie as g,Ae as h,lt as i,st as j};//# sourceMappingURL=chunk-TSAXVD2H.mjs.map
35
+ //# sourceMappingURL=chunk-TSAXVD2H.mjs.map