@hua-labs/ui 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -43
  3. package/dist/{ComponentLayout-BhM4VSoq.d.mts → ComponentLayout-Clf6C2jV.d.mts} +37 -3
  4. package/dist/DashboardSidebar-ZulecqKs.d.mts +54 -0
  5. package/dist/DashboardToolbar-BRZayZNz.d.mts +122 -0
  6. package/dist/EmptyState-SQ3Z6Vf2.d.mts +64 -0
  7. package/dist/{Modal-CrXmb3Ll.d.mts → Modal-DKKtBtbh.d.mts} +12 -6
  8. package/dist/{Section-BWzyshgX.d.mts → Section-DKdIG1sg.d.mts} +11 -12
  9. package/dist/SectionHeader-DHwQ_xh8.d.mts +1653 -0
  10. package/dist/{Switch-Dzm5TLR3.d.mts → Switch-D0l7SJrz.d.mts} +31 -15
  11. package/dist/Tooltip-Cv7nYhPW.d.mts +304 -0
  12. package/dist/advanced/Logo.d.ts +8 -4
  13. package/dist/advanced/Logo.d.ts.map +1 -1
  14. package/dist/advanced/dashboard.d.ts +28 -6
  15. package/dist/advanced/dashboard.d.ts.map +1 -1
  16. package/dist/advanced-dashboard.d.mts +9 -2278
  17. package/dist/advanced-dashboard.mjs +1 -33
  18. package/dist/advanced-dashboard.mjs.map +1 -1
  19. package/dist/advanced-emotion.d.mts +13 -5
  20. package/dist/advanced-emotion.mjs +1 -1
  21. package/dist/advanced-motion.d.mts +136 -56
  22. package/dist/advanced-motion.mjs +1 -1
  23. package/dist/advanced.d.mts +69 -36
  24. package/dist/advanced.mjs +14 -3
  25. package/dist/advanced.mjs.map +1 -1
  26. package/dist/chunk-32OZGTPV.mjs +41 -0
  27. package/dist/chunk-32OZGTPV.mjs.map +1 -0
  28. package/dist/chunk-6WBFZ2KV.mjs +3 -0
  29. package/dist/chunk-6WBFZ2KV.mjs.map +1 -0
  30. package/dist/chunk-7CGJQSJO.mjs +3 -0
  31. package/dist/chunk-7CGJQSJO.mjs.map +1 -0
  32. package/dist/chunk-7T3IUG3G.mjs +3 -0
  33. package/dist/chunk-7T3IUG3G.mjs.map +1 -0
  34. package/dist/chunk-AJOGTUWS.mjs +3 -0
  35. package/dist/chunk-AJOGTUWS.mjs.map +1 -0
  36. package/dist/chunk-AQTSQYH2.mjs +3 -0
  37. package/dist/chunk-AQTSQYH2.mjs.map +1 -0
  38. package/dist/chunk-B2MRZJQA.mjs +3 -0
  39. package/dist/chunk-B2MRZJQA.mjs.map +1 -0
  40. package/dist/chunk-BOX4TONF.mjs +3 -0
  41. package/dist/chunk-BOX4TONF.mjs.map +1 -0
  42. package/dist/chunk-C2DOXNBK.mjs +3 -0
  43. package/dist/chunk-C2DOXNBK.mjs.map +1 -0
  44. package/dist/chunk-CQBMR7VU.mjs +3 -0
  45. package/dist/chunk-CQBMR7VU.mjs.map +1 -0
  46. package/dist/chunk-CYAAAEPJ.mjs +3 -0
  47. package/dist/chunk-CYAAAEPJ.mjs.map +1 -0
  48. package/dist/chunk-D7MTTTQY.mjs +8 -0
  49. package/dist/chunk-D7MTTTQY.mjs.map +1 -0
  50. package/dist/chunk-DABVKUJN.mjs +3 -0
  51. package/dist/chunk-DABVKUJN.mjs.map +1 -0
  52. package/dist/chunk-EK6BLFVQ.mjs +3 -0
  53. package/dist/chunk-EK6BLFVQ.mjs.map +1 -0
  54. package/dist/chunk-FVUAVGP5.mjs +3 -0
  55. package/dist/chunk-FVUAVGP5.mjs.map +1 -0
  56. package/dist/chunk-GAIUZVNC.mjs +3 -0
  57. package/dist/chunk-GAIUZVNC.mjs.map +1 -0
  58. package/dist/chunk-HLBIIF4I.mjs +3 -0
  59. package/dist/chunk-HLBIIF4I.mjs.map +1 -0
  60. package/dist/chunk-I6NCGF6E.mjs +3 -0
  61. package/dist/chunk-I6NCGF6E.mjs.map +1 -0
  62. package/dist/chunk-J46VEBVF.mjs +3 -0
  63. package/dist/chunk-J46VEBVF.mjs.map +1 -0
  64. package/dist/chunk-JNW3CLCA.mjs +3 -0
  65. package/dist/chunk-JNW3CLCA.mjs.map +1 -0
  66. package/dist/chunk-JY3QVUGW.mjs +3 -0
  67. package/dist/chunk-JY3QVUGW.mjs.map +1 -0
  68. package/dist/chunk-KHBZOGUU.mjs +3 -0
  69. package/dist/chunk-KHBZOGUU.mjs.map +1 -0
  70. package/dist/chunk-KPNNAQLI.mjs +3 -0
  71. package/dist/chunk-KPNNAQLI.mjs.map +1 -0
  72. package/dist/chunk-L2LGSILS.mjs +13 -0
  73. package/dist/chunk-L2LGSILS.mjs.map +1 -0
  74. package/dist/chunk-LPHUWTQ2.mjs +3 -0
  75. package/dist/chunk-LPHUWTQ2.mjs.map +1 -0
  76. package/dist/chunk-M4JE7TQL.mjs +3 -0
  77. package/dist/chunk-M4JE7TQL.mjs.map +1 -0
  78. package/dist/chunk-MEDKGNLV.mjs +3 -0
  79. package/dist/chunk-MEDKGNLV.mjs.map +1 -0
  80. package/dist/chunk-MR46CSMC.mjs +3 -0
  81. package/dist/chunk-MR46CSMC.mjs.map +1 -0
  82. package/dist/chunk-NSDWT2JM.mjs +3 -0
  83. package/dist/chunk-NSDWT2JM.mjs.map +1 -0
  84. package/dist/chunk-OBMOTQEU.mjs +3 -0
  85. package/dist/chunk-OBMOTQEU.mjs.map +1 -0
  86. package/dist/chunk-RICRFXFP.mjs +3 -0
  87. package/dist/chunk-RICRFXFP.mjs.map +1 -0
  88. package/dist/chunk-SOK7VBSM.mjs +13 -0
  89. package/dist/chunk-SOK7VBSM.mjs.map +1 -0
  90. package/dist/chunk-SPZ7SZH4.mjs +3 -0
  91. package/dist/chunk-SPZ7SZH4.mjs.map +1 -0
  92. package/dist/chunk-TB3DARQO.mjs +3 -0
  93. package/dist/chunk-TB3DARQO.mjs.map +1 -0
  94. package/dist/chunk-TND4HPKW.mjs +51 -0
  95. package/dist/chunk-TND4HPKW.mjs.map +1 -0
  96. package/dist/chunk-TSAXVD2H.mjs +35 -0
  97. package/dist/chunk-TSAXVD2H.mjs.map +1 -0
  98. package/dist/chunk-UR3TIWBS.mjs +3 -0
  99. package/dist/chunk-UR3TIWBS.mjs.map +1 -0
  100. package/dist/chunk-XU2XBAEW.mjs +3 -0
  101. package/dist/chunk-XU2XBAEW.mjs.map +1 -0
  102. package/dist/chunk-XXHDNZTG.mjs +3 -0
  103. package/dist/chunk-XXHDNZTG.mjs.map +1 -0
  104. package/dist/chunk-YW5DA7Q6.mjs +3 -0
  105. package/dist/chunk-YW5DA7Q6.mjs.map +1 -0
  106. package/dist/chunk-ZTHUGQZL.mjs +3 -0
  107. package/dist/chunk-ZTHUGQZL.mjs.map +1 -0
  108. package/dist/chunk-ZVCGC6EV.mjs +3 -0
  109. package/dist/chunk-ZVCGC6EV.mjs.map +1 -0
  110. package/dist/chunk-ZZ67E3M5.mjs +3 -0
  111. package/dist/chunk-ZZ67E3M5.mjs.map +1 -0
  112. package/dist/{common-YLvZxA_K.d.mts → common-Bej8Okcg.d.mts} +1 -1
  113. package/dist/components/Accordion.d.ts +14 -7
  114. package/dist/components/Accordion.d.ts.map +1 -1
  115. package/dist/components/Action.d.ts.map +1 -1
  116. package/dist/components/ActionToolbar.d.ts +10 -6
  117. package/dist/components/ActionToolbar.d.ts.map +1 -1
  118. package/dist/components/Alert.d.ts +16 -2
  119. package/dist/components/Alert.d.ts.map +1 -1
  120. package/dist/components/Autocomplete.d.ts +6 -4
  121. package/dist/components/Autocomplete.d.ts.map +1 -1
  122. package/dist/components/Avatar.d.ts +20 -7
  123. package/dist/components/Avatar.d.ts.map +1 -1
  124. package/dist/components/Badge.d.ts +27 -9
  125. package/dist/components/Badge.d.ts.map +1 -1
  126. package/dist/components/Bookmark.d.ts +4 -2
  127. package/dist/components/Bookmark.d.ts.map +1 -1
  128. package/dist/components/BottomSheet.d.ts +13 -9
  129. package/dist/components/BottomSheet.d.ts.map +1 -1
  130. package/dist/components/Box.d.ts +9 -0
  131. package/dist/components/Box.d.ts.map +1 -0
  132. package/dist/components/Breadcrumb.d.ts +9 -4
  133. package/dist/components/Breadcrumb.d.ts.map +1 -1
  134. package/dist/components/Button.d.ts +3 -29
  135. package/dist/components/Button.d.ts.map +1 -1
  136. package/dist/components/Button.variants.d.ts +54 -10
  137. package/dist/components/Button.variants.d.ts.map +1 -1
  138. package/dist/components/Card.d.ts +49 -14
  139. package/dist/components/Card.d.ts.map +1 -1
  140. package/dist/components/ChatMessage.d.ts +3 -2
  141. package/dist/components/ChatMessage.d.ts.map +1 -1
  142. package/dist/components/Checkbox.d.ts +5 -2
  143. package/dist/components/Checkbox.d.ts.map +1 -1
  144. package/dist/components/CodeBlock.d.ts +8 -5
  145. package/dist/components/CodeBlock.d.ts.map +1 -1
  146. package/dist/components/ColorPicker.d.ts +4 -2
  147. package/dist/components/ColorPicker.d.ts.map +1 -1
  148. package/dist/components/Command.d.ts +28 -14
  149. package/dist/components/Command.d.ts.map +1 -1
  150. package/dist/components/ComponentLayout.d.ts +5 -2
  151. package/dist/components/ComponentLayout.d.ts.map +1 -1
  152. package/dist/components/ConfirmModal.d.ts +4 -0
  153. package/dist/components/ConfirmModal.d.ts.map +1 -1
  154. package/dist/components/Container.d.ts +18 -5
  155. package/dist/components/Container.d.ts.map +1 -1
  156. package/dist/components/ContextMenu.d.ts +36 -36
  157. package/dist/components/ContextMenu.d.ts.map +1 -1
  158. package/dist/components/DatePicker.d.ts +12 -5
  159. package/dist/components/DatePicker.d.ts.map +1 -1
  160. package/dist/components/Divider.d.ts +2 -1
  161. package/dist/components/Divider.d.ts.map +1 -1
  162. package/dist/components/Drawer.d.ts +17 -12
  163. package/dist/components/Drawer.d.ts.map +1 -1
  164. package/dist/components/Dropdown.d.ts +25 -7
  165. package/dist/components/Dropdown.d.ts.map +1 -1
  166. package/dist/components/EmotionAnalysis.d.ts +3 -1
  167. package/dist/components/EmotionAnalysis.d.ts.map +1 -1
  168. package/dist/components/EmotionButton.d.ts +3 -1
  169. package/dist/components/EmotionButton.d.ts.map +1 -1
  170. package/dist/components/EmotionMeter.d.ts +3 -1
  171. package/dist/components/EmotionMeter.d.ts.map +1 -1
  172. package/dist/components/EmotionSelector.d.ts +3 -1
  173. package/dist/components/EmotionSelector.d.ts.map +1 -1
  174. package/dist/components/FeatureCard.d.ts +9 -3
  175. package/dist/components/FeatureCard.d.ts.map +1 -1
  176. package/dist/components/Form.d.ts +20 -54
  177. package/dist/components/Form.d.ts.map +1 -1
  178. package/dist/components/FormControl.d.ts +3 -2
  179. package/dist/components/FormControl.d.ts.map +1 -1
  180. package/dist/components/Grid.d.ts +11 -4
  181. package/dist/components/Grid.d.ts.map +1 -1
  182. package/dist/components/HeroSection.d.ts +4 -2
  183. package/dist/components/HeroSection.d.ts.map +1 -1
  184. package/dist/components/Icon/Icon.d.ts +12 -8
  185. package/dist/components/Icon/Icon.d.ts.map +1 -1
  186. package/dist/components/IconsaxGallery/index.d.ts +8 -5
  187. package/dist/components/IconsaxGallery/index.d.ts.map +1 -1
  188. package/dist/components/InfoCard.d.ts +5 -2
  189. package/dist/components/InfoCard.d.ts.map +1 -1
  190. package/dist/components/Input.d.ts +29 -4
  191. package/dist/components/Input.d.ts.map +1 -1
  192. package/dist/components/Label.d.ts +15 -10
  193. package/dist/components/Label.d.ts.map +1 -1
  194. package/dist/components/LanguageToggle.d.ts +5 -3
  195. package/dist/components/LanguageToggle.d.ts.map +1 -1
  196. package/dist/components/Link.d.ts +17 -6
  197. package/dist/components/Link.d.ts.map +1 -1
  198. package/dist/components/LoadingSpinner.d.ts +7 -3
  199. package/dist/components/LoadingSpinner.d.ts.map +1 -1
  200. package/dist/components/Menu.d.ts +59 -60
  201. package/dist/components/Menu.d.ts.map +1 -1
  202. package/dist/components/Modal.d.ts +12 -6
  203. package/dist/components/Modal.d.ts.map +1 -1
  204. package/dist/components/Navigation.d.ts +26 -11
  205. package/dist/components/Navigation.d.ts.map +1 -1
  206. package/dist/components/NumberInput.d.ts +5 -2
  207. package/dist/components/NumberInput.d.ts.map +1 -1
  208. package/dist/components/PageNavigation.d.ts +6 -3
  209. package/dist/components/PageNavigation.d.ts.map +1 -1
  210. package/dist/components/PageTransition.d.ts +2 -2
  211. package/dist/components/PageTransition.d.ts.map +1 -1
  212. package/dist/components/Pagination.d.ts +5 -2
  213. package/dist/components/Pagination.d.ts.map +1 -1
  214. package/dist/components/Panel.d.ts +1 -7
  215. package/dist/components/Panel.d.ts.map +1 -1
  216. package/dist/components/Popover.d.ts +25 -9
  217. package/dist/components/Popover.d.ts.map +1 -1
  218. package/dist/components/Pressable.d.ts +14 -0
  219. package/dist/components/Pressable.d.ts.map +1 -0
  220. package/dist/components/Progress.d.ts +36 -13
  221. package/dist/components/Progress.d.ts.map +1 -1
  222. package/dist/components/Prose.d.ts +51 -0
  223. package/dist/components/Prose.d.ts.map +1 -0
  224. package/dist/components/Radio.d.ts +29 -33
  225. package/dist/components/Radio.d.ts.map +1 -1
  226. package/dist/components/ScrollArea.d.ts +8 -9
  227. package/dist/components/ScrollArea.d.ts.map +1 -1
  228. package/dist/components/ScrollIndicator.d.ts +9 -8
  229. package/dist/components/ScrollIndicator.d.ts.map +1 -1
  230. package/dist/components/ScrollProgress.d.ts +3 -2
  231. package/dist/components/ScrollProgress.d.ts.map +1 -1
  232. package/dist/components/ScrollToTop.d.ts +5 -5
  233. package/dist/components/ScrollToTop.d.ts.map +1 -1
  234. package/dist/components/Section.d.ts +12 -9
  235. package/dist/components/Section.d.ts.map +1 -1
  236. package/dist/components/SectionHeader.d.ts +3 -2
  237. package/dist/components/SectionHeader.d.ts.map +1 -1
  238. package/dist/components/Select.d.ts +18 -5
  239. package/dist/components/Select.d.ts.map +1 -1
  240. package/dist/components/Skeleton.d.ts +43 -15
  241. package/dist/components/Skeleton.d.ts.map +1 -1
  242. package/dist/components/Slider.d.ts +7 -5
  243. package/dist/components/Slider.d.ts.map +1 -1
  244. package/dist/components/Stack.d.ts +22 -6
  245. package/dist/components/Stack.d.ts.map +1 -1
  246. package/dist/components/StatsPanel.d.ts +4 -2
  247. package/dist/components/StatsPanel.d.ts.map +1 -1
  248. package/dist/components/Switch.d.ts +9 -4
  249. package/dist/components/Switch.d.ts.map +1 -1
  250. package/dist/components/Table.d.ts +43 -18
  251. package/dist/components/Table.d.ts.map +1 -1
  252. package/dist/components/Tabs.d.ts +50 -77
  253. package/dist/components/Tabs.d.ts.map +1 -1
  254. package/dist/components/Text.d.ts +11 -0
  255. package/dist/components/Text.d.ts.map +1 -0
  256. package/dist/components/Textarea.d.ts +24 -6
  257. package/dist/components/Textarea.d.ts.map +1 -1
  258. package/dist/components/ThemeToggle.d.ts +18 -27
  259. package/dist/components/ThemeToggle.d.ts.map +1 -1
  260. package/dist/components/Timeline.d.ts +4 -2
  261. package/dist/components/Timeline.d.ts.map +1 -1
  262. package/dist/components/Toast.d.ts +1 -1
  263. package/dist/components/Toast.d.ts.map +1 -1
  264. package/dist/components/Toggle.d.ts +11 -2
  265. package/dist/components/Toggle.d.ts.map +1 -1
  266. package/dist/components/Tooltip.d.ts +5 -2
  267. package/dist/components/Tooltip.d.ts.map +1 -1
  268. package/dist/components/Upload.d.ts +5 -3
  269. package/dist/components/Upload.d.ts.map +1 -1
  270. package/dist/components/advanced/AdvancedPageTransition.d.ts +7 -5
  271. package/dist/components/advanced/AdvancedPageTransition.d.ts.map +1 -1
  272. package/dist/components/advanced/AnimatedGradient.d.ts +6 -2
  273. package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
  274. package/dist/components/advanced/Carousel.d.ts +3 -1
  275. package/dist/components/advanced/Carousel.d.ts.map +1 -1
  276. package/dist/components/advanced/DotNav.d.ts +12 -5
  277. package/dist/components/advanced/DotNav.d.ts.map +1 -1
  278. package/dist/components/advanced/GlowCard.d.ts +4 -1
  279. package/dist/components/advanced/GlowCard.d.ts.map +1 -1
  280. package/dist/components/advanced/HorizontalScroll.d.ts +4 -1
  281. package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -1
  282. package/dist/components/advanced/ImageReveal.d.ts +23 -1
  283. package/dist/components/advanced/ImageReveal.d.ts.map +1 -1
  284. package/dist/components/advanced/Marquee.d.ts +4 -2
  285. package/dist/components/advanced/Marquee.d.ts.map +1 -1
  286. package/dist/components/advanced/Parallax.d.ts +4 -2
  287. package/dist/components/advanced/Parallax.d.ts.map +1 -1
  288. package/dist/components/advanced/SpotlightCard.d.ts +13 -12
  289. package/dist/components/advanced/SpotlightCard.d.ts.map +1 -1
  290. package/dist/components/advanced/TextReveal.d.ts +5 -1
  291. package/dist/components/advanced/TextReveal.d.ts.map +1 -1
  292. package/dist/components/advanced/TiltCard.d.ts +6 -2
  293. package/dist/components/advanced/TiltCard.d.ts.map +1 -1
  294. package/dist/components/advanced/VideoBackground.d.ts +4 -1
  295. package/dist/components/advanced/VideoBackground.d.ts.map +1 -1
  296. package/dist/components/advanced/blog-editor/BlogEditor.d.ts +4 -2
  297. package/dist/components/advanced/blog-editor/BlogEditor.d.ts.map +1 -1
  298. package/dist/components/advanced/blog-editor/BlogEditorActions.d.ts +4 -2
  299. package/dist/components/advanced/blog-editor/BlogEditorActions.d.ts.map +1 -1
  300. package/dist/components/advanced/blog-editor/BlogEditorContent.d.ts +4 -2
  301. package/dist/components/advanced/blog-editor/BlogEditorContent.d.ts.map +1 -1
  302. package/dist/components/advanced/blog-editor/BlogEditorHeader.d.ts +4 -2
  303. package/dist/components/advanced/blog-editor/BlogEditorHeader.d.ts.map +1 -1
  304. package/dist/components/advanced/blog-editor/BlogEditorLanguageTabs.d.ts +4 -2
  305. package/dist/components/advanced/blog-editor/BlogEditorLanguageTabs.d.ts.map +1 -1
  306. package/dist/components/advanced/blog-editor/BlogEditorMetadata.d.ts +5 -3
  307. package/dist/components/advanced/blog-editor/BlogEditorMetadata.d.ts.map +1 -1
  308. package/dist/components/advanced/blog-editor/BlogEditorPreview.d.ts +5 -3
  309. package/dist/components/advanced/blog-editor/BlogEditorPreview.d.ts.map +1 -1
  310. package/dist/components/advanced/blog-editor/BlogEditorToolbar.d.ts +4 -2
  311. package/dist/components/advanced/blog-editor/BlogEditorToolbar.d.ts.map +1 -1
  312. package/dist/components/advanced/blog-editor/BlogEditorTranslate.d.ts +4 -2
  313. package/dist/components/advanced/blog-editor/BlogEditorTranslate.d.ts.map +1 -1
  314. package/dist/components/advanced/blog-editor/types.d.ts +5 -2
  315. package/dist/components/advanced/blog-editor/types.d.ts.map +1 -1
  316. package/dist/components/advanced/emotion/EmotionAnalysis.d.ts +3 -1
  317. package/dist/components/advanced/emotion/EmotionAnalysis.d.ts.map +1 -1
  318. package/dist/components/advanced/emotion/EmotionButton.d.ts +3 -1
  319. package/dist/components/advanced/emotion/EmotionButton.d.ts.map +1 -1
  320. package/dist/components/advanced/emotion/EmotionMeter.d.ts +4 -2
  321. package/dist/components/advanced/emotion/EmotionMeter.d.ts.map +1 -1
  322. package/dist/components/advanced/emotion/EmotionSelector.d.ts +3 -1
  323. package/dist/components/advanced/emotion/EmotionSelector.d.ts.map +1 -1
  324. package/dist/components/dashboard/ActivityFeed.d.ts +5 -2
  325. package/dist/components/dashboard/ActivityFeed.d.ts.map +1 -1
  326. package/dist/components/dashboard/BarChart.d.ts +3 -2
  327. package/dist/components/dashboard/BarChart.d.ts.map +1 -1
  328. package/dist/components/dashboard/DashboardGrid.d.ts +13 -3
  329. package/dist/components/dashboard/DashboardGrid.d.ts.map +1 -1
  330. package/dist/components/dashboard/DashboardSidebar.d.ts +15 -82
  331. package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -1
  332. package/dist/components/dashboard/DashboardToolbar.d.ts +3 -2
  333. package/dist/components/dashboard/DashboardToolbar.d.ts.map +1 -1
  334. package/dist/components/dashboard/EmptyState.d.ts +3 -2
  335. package/dist/components/dashboard/EmptyState.d.ts.map +1 -1
  336. package/dist/components/dashboard/MembershipBadge.d.ts +3 -2
  337. package/dist/components/dashboard/MembershipBadge.d.ts.map +1 -1
  338. package/dist/components/dashboard/MerchantList.d.ts +3 -2
  339. package/dist/components/dashboard/MerchantList.d.ts.map +1 -1
  340. package/dist/components/dashboard/MetricCard.d.ts +3 -2
  341. package/dist/components/dashboard/MetricCard.d.ts.map +1 -1
  342. package/dist/components/dashboard/MiniBarChart.d.ts +3 -2
  343. package/dist/components/dashboard/MiniBarChart.d.ts.map +1 -1
  344. package/dist/components/dashboard/NotificationCard.d.ts +5 -2
  345. package/dist/components/dashboard/NotificationCard.d.ts.map +1 -1
  346. package/dist/components/dashboard/ProfileCard.d.ts +5 -2
  347. package/dist/components/dashboard/ProfileCard.d.ts.map +1 -1
  348. package/dist/components/dashboard/ProgressCard.d.ts +6 -3
  349. package/dist/components/dashboard/ProgressCard.d.ts.map +1 -1
  350. package/dist/components/dashboard/QuickActionCard.d.ts +22 -27
  351. package/dist/components/dashboard/QuickActionCard.d.ts.map +1 -1
  352. package/dist/components/dashboard/RoutingBreakdownCard.d.ts +3 -2
  353. package/dist/components/dashboard/RoutingBreakdownCard.d.ts.map +1 -1
  354. package/dist/components/dashboard/SettlementTimeline.d.ts +3 -2
  355. package/dist/components/dashboard/SettlementTimeline.d.ts.map +1 -1
  356. package/dist/components/dashboard/StatCard.d.ts +7 -4
  357. package/dist/components/dashboard/StatCard.d.ts.map +1 -1
  358. package/dist/components/dashboard/SummaryCard.d.ts +6 -3
  359. package/dist/components/dashboard/SummaryCard.d.ts.map +1 -1
  360. package/dist/components/dashboard/TransactionDetailDrawer.d.ts +2 -2
  361. package/dist/components/dashboard/TransactionDetailDrawer.d.ts.map +1 -1
  362. package/dist/components/dashboard/TransactionsTable.d.ts +3 -2
  363. package/dist/components/dashboard/TransactionsTable.d.ts.map +1 -1
  364. package/dist/components/dashboard/TrendChart.d.ts +3 -2
  365. package/dist/components/dashboard/TrendChart.d.ts.map +1 -1
  366. package/dist/components/dashboard/YearlyHeatmap.d.ts +4 -2
  367. package/dist/components/dashboard/YearlyHeatmap.d.ts.map +1 -1
  368. package/dist/components/dashboard/kanban/KanbanAddCard.d.ts.map +1 -1
  369. package/dist/components/dashboard/kanban/KanbanAddColumn.d.ts.map +1 -1
  370. package/dist/components/dashboard/kanban/KanbanBoard.d.ts.map +1 -1
  371. package/dist/components/dashboard/kanban/KanbanCard.d.ts.map +1 -1
  372. package/dist/components/dashboard/kanban/KanbanColumn.d.ts.map +1 -1
  373. package/dist/components/dashboard/kanban/KanbanColumnHeader.d.ts.map +1 -1
  374. package/dist/components/dashboard/kanban/KanbanDropIndicator.d.ts.map +1 -1
  375. package/dist/components/dashboard/kanban/index.d.ts +1 -1
  376. package/dist/components/dashboard/kanban/types.d.ts +24 -12
  377. package/dist/components/dashboard/kanban/types.d.ts.map +1 -1
  378. package/dist/components/scrollbar/scrollbar.d.ts +2 -1
  379. package/dist/components/scrollbar/scrollbar.d.ts.map +1 -1
  380. package/dist/context/MotionConfigContext.d.ts +41 -0
  381. package/dist/context/MotionConfigContext.d.ts.map +1 -0
  382. package/dist/data.d.mts +55 -23
  383. package/dist/data.d.ts +45 -3
  384. package/dist/data.d.ts.map +1 -1
  385. package/dist/data.mjs +2 -2
  386. package/dist/data.mjs.map +1 -1
  387. package/dist/feedback.d.mts +6 -293
  388. package/dist/feedback.d.ts +7 -5
  389. package/dist/feedback.d.ts.map +1 -1
  390. package/dist/feedback.mjs +1 -1
  391. package/dist/form.d.mts +99 -114
  392. package/dist/form.mjs +8 -3
  393. package/dist/form.mjs.map +1 -1
  394. package/dist/hooks/index.d.ts +6 -0
  395. package/dist/hooks/index.d.ts.map +1 -1
  396. package/dist/hooks/useAnimatedEntrance.d.ts +24 -0
  397. package/dist/hooks/useAnimatedEntrance.d.ts.map +1 -0
  398. package/dist/hooks/useBreakpoint.d.ts +22 -0
  399. package/dist/hooks/useBreakpoint.d.ts.map +1 -0
  400. package/dist/hooks/useDotEnv.d.ts +12 -0
  401. package/dist/hooks/useDotEnv.d.ts.map +1 -0
  402. package/dist/hooks/useDotMap.d.ts +38 -0
  403. package/dist/hooks/useDotMap.d.ts.map +1 -0
  404. package/dist/iconsax-extended.mjs +2 -2
  405. package/dist/iconsax-extended.mjs.map +1 -1
  406. package/dist/iconsax.mjs +2 -2
  407. package/dist/iconsax.mjs.map +1 -1
  408. package/dist/index.d.mts +358 -127
  409. package/dist/index.d.ts +74 -64
  410. package/dist/index.d.ts.map +1 -1
  411. package/dist/index.mjs +15 -15
  412. package/dist/index.mjs.map +1 -1
  413. package/dist/interactive/kanban.d.ts +12 -0
  414. package/dist/interactive/kanban.d.ts.map +1 -0
  415. package/dist/interactive-kanban.d.mts +378 -0
  416. package/dist/interactive-kanban.mjs +3 -0
  417. package/dist/interactive-kanban.mjs.map +1 -0
  418. package/dist/interactive.d.mts +193 -197
  419. package/dist/interactive.d.ts +7 -5
  420. package/dist/interactive.d.ts.map +1 -1
  421. package/dist/interactive.mjs +1 -1
  422. package/dist/interactive.mjs.map +1 -1
  423. package/dist/landing/LandingAbout.d.ts +2 -2
  424. package/dist/landing/LandingAbout.d.ts.map +1 -1
  425. package/dist/landing/LandingCTA.d.ts +2 -2
  426. package/dist/landing/LandingCTA.d.ts.map +1 -1
  427. package/dist/landing/LandingContact.d.ts +2 -2
  428. package/dist/landing/LandingContact.d.ts.map +1 -1
  429. package/dist/landing/LandingExperience.d.ts +1 -1
  430. package/dist/landing/LandingExperience.d.ts.map +1 -1
  431. package/dist/landing/LandingFeatures.d.ts +1 -1
  432. package/dist/landing/LandingFeatures.d.ts.map +1 -1
  433. package/dist/landing/LandingHero.d.ts +2 -2
  434. package/dist/landing/LandingHero.d.ts.map +1 -1
  435. package/dist/landing/LandingLogoCloud.d.ts +2 -2
  436. package/dist/landing/LandingLogoCloud.d.ts.map +1 -1
  437. package/dist/landing/LandingMetrics.d.ts +1 -1
  438. package/dist/landing/LandingMetrics.d.ts.map +1 -1
  439. package/dist/landing/LandingProjects.d.ts +1 -1
  440. package/dist/landing/LandingProjects.d.ts.map +1 -1
  441. package/dist/landing/LandingShowcase.d.ts +2 -2
  442. package/dist/landing/LandingShowcase.d.ts.map +1 -1
  443. package/dist/landing/LandingSkills.d.ts +1 -1
  444. package/dist/landing/LandingSkills.d.ts.map +1 -1
  445. package/dist/landing/LandingStats.d.ts +1 -1
  446. package/dist/landing/LandingStats.d.ts.map +1 -1
  447. package/dist/landing/LandingTestimonials.d.ts +1 -1
  448. package/dist/landing/LandingTestimonials.d.ts.map +1 -1
  449. package/dist/landing/types.d.ts +42 -30
  450. package/dist/landing/types.d.ts.map +1 -1
  451. package/dist/landing.d.mts +47 -37
  452. package/dist/landing.mjs +4 -20
  453. package/dist/landing.mjs.map +1 -1
  454. package/dist/lib/Slot.d.ts.map +1 -1
  455. package/dist/lib/icon-providers.d.ts +17 -3
  456. package/dist/lib/icon-providers.d.ts.map +1 -1
  457. package/dist/lib/styles/animation.d.ts +35 -0
  458. package/dist/lib/styles/animation.d.ts.map +1 -0
  459. package/dist/lib/styles/disabled.d.ts +15 -0
  460. package/dist/lib/styles/disabled.d.ts.map +1 -0
  461. package/dist/lib/styles/focus.d.ts +34 -0
  462. package/dist/lib/styles/focus.d.ts.map +1 -0
  463. package/dist/lib/styles/glass.d.ts +18 -0
  464. package/dist/lib/styles/glass.d.ts.map +1 -0
  465. package/dist/lib/styles/hover.d.ts +9 -0
  466. package/dist/lib/styles/hover.d.ts.map +1 -0
  467. package/dist/lib/styles/index.d.ts +6 -0
  468. package/dist/lib/styles/index.d.ts.map +1 -1
  469. package/dist/lib/styles/transition.d.ts +42 -0
  470. package/dist/lib/styles/transition.d.ts.map +1 -0
  471. package/dist/lib/types/common.d.ts +3 -3
  472. package/dist/lib/types/common.d.ts.map +1 -1
  473. package/dist/native/Box.d.ts +11 -0
  474. package/dist/native/Box.d.ts.map +1 -0
  475. package/dist/native/Pressable.d.ts +10 -0
  476. package/dist/native/Pressable.d.ts.map +1 -0
  477. package/dist/native/Text.d.ts +11 -0
  478. package/dist/native/Text.d.ts.map +1 -0
  479. package/dist/native/index.d.ts +9 -0
  480. package/dist/native/index.d.ts.map +1 -0
  481. package/dist/native/useDotMap.d.ts +51 -0
  482. package/dist/native/useDotMap.d.ts.map +1 -0
  483. package/dist/native.mjs +2 -0
  484. package/dist/native.mjs.map +1 -0
  485. package/dist/navigation.d.mts +48 -21
  486. package/dist/navigation.d.ts +10 -8
  487. package/dist/navigation.d.ts.map +1 -1
  488. package/dist/navigation.mjs +1 -1
  489. package/dist/navigation.mjs.map +1 -1
  490. package/dist/overlay.d.mts +84 -37
  491. package/dist/overlay.mjs +2 -2
  492. package/dist/overlay.mjs.map +1 -1
  493. package/dist/sdui/SDUIRenderer.d.ts.map +1 -1
  494. package/dist/sdui/core.d.ts +50 -0
  495. package/dist/sdui/core.d.ts.map +1 -0
  496. package/dist/sdui/index.d.ts +3 -1
  497. package/dist/sdui/index.d.ts.map +1 -1
  498. package/dist/sdui/registry.d.ts.map +1 -1
  499. package/dist/sdui/types.d.ts +38 -0
  500. package/dist/sdui/types.d.ts.map +1 -1
  501. package/dist/sdui.d.mts +89 -1
  502. package/dist/sdui.mjs +2 -2
  503. package/dist/sdui.mjs.map +1 -1
  504. package/package.json +39 -15
  505. package/src/styles/component-vars.css +503 -69
  506. package/src/styles/landing.css +12 -12
  507. package/src/styles/prose.css +284 -0
  508. package/src/styles/recommended-theme.css +123 -141
  509. package/src/styles/utilities.css +3 -3
  510. package/dist/chunk-5DPW7SVD.mjs +0 -4
  511. package/dist/chunk-5DPW7SVD.mjs.map +0 -1
  512. package/dist/chunk-5L5HIPKA.mjs +0 -3
  513. package/dist/chunk-5L5HIPKA.mjs.map +0 -1
  514. package/dist/chunk-CNW22G24.mjs +0 -13
  515. package/dist/chunk-CNW22G24.mjs.map +0 -1
  516. package/dist/chunk-CW66UBQG.mjs +0 -3
  517. package/dist/chunk-CW66UBQG.mjs.map +0 -1
  518. package/dist/chunk-EPY3432E.mjs +0 -3
  519. package/dist/chunk-EPY3432E.mjs.map +0 -1
  520. package/dist/chunk-F2M4YDDQ.mjs +0 -3
  521. package/dist/chunk-F2M4YDDQ.mjs.map +0 -1
  522. package/dist/chunk-FHMFDCX2.mjs +0 -3
  523. package/dist/chunk-FHMFDCX2.mjs.map +0 -1
  524. package/dist/chunk-HBIUCLFL.mjs +0 -3
  525. package/dist/chunk-HBIUCLFL.mjs.map +0 -1
  526. package/dist/chunk-HEBXAFRY.mjs +0 -3
  527. package/dist/chunk-HEBXAFRY.mjs.map +0 -1
  528. package/dist/chunk-IG47LMOD.mjs +0 -3
  529. package/dist/chunk-IG47LMOD.mjs.map +0 -1
  530. package/dist/chunk-J47ZEXEL.mjs +0 -3
  531. package/dist/chunk-J47ZEXEL.mjs.map +0 -1
  532. package/dist/chunk-K2FOFIST.mjs +0 -3
  533. package/dist/chunk-K2FOFIST.mjs.map +0 -1
  534. package/dist/chunk-LL6QPRD7.mjs +0 -3
  535. package/dist/chunk-LL6QPRD7.mjs.map +0 -1
  536. package/dist/chunk-NMJLOK6M.mjs +0 -3
  537. package/dist/chunk-NMJLOK6M.mjs.map +0 -1
  538. package/dist/chunk-O24K56OS.mjs +0 -3
  539. package/dist/chunk-O24K56OS.mjs.map +0 -1
  540. package/dist/chunk-OIWG3IJ7.mjs +0 -3
  541. package/dist/chunk-OIWG3IJ7.mjs.map +0 -1
  542. package/dist/chunk-OLLU7ZFH.mjs +0 -3
  543. package/dist/chunk-OLLU7ZFH.mjs.map +0 -1
  544. package/dist/chunk-Q76JW7X5.mjs +0 -73
  545. package/dist/chunk-Q76JW7X5.mjs.map +0 -1
  546. package/dist/chunk-QRM66RQG.mjs +0 -3
  547. package/dist/chunk-QRM66RQG.mjs.map +0 -1
  548. package/dist/chunk-QRRP7TGF.mjs +0 -13
  549. package/dist/chunk-QRRP7TGF.mjs.map +0 -1
  550. package/dist/chunk-SD6XGDAC.mjs +0 -3
  551. package/dist/chunk-SD6XGDAC.mjs.map +0 -1
  552. package/dist/chunk-SDFVGFXT.mjs +0 -3
  553. package/dist/chunk-SDFVGFXT.mjs.map +0 -1
  554. package/dist/chunk-SMLDNOV3.mjs +0 -8
  555. package/dist/chunk-SMLDNOV3.mjs.map +0 -1
  556. package/dist/chunk-TAP6MYDW.mjs +0 -3
  557. package/dist/chunk-TAP6MYDW.mjs.map +0 -1
  558. package/dist/chunk-TBZ645BI.mjs +0 -3
  559. package/dist/chunk-TBZ645BI.mjs.map +0 -1
  560. package/dist/chunk-V2DNYJR6.mjs +0 -3
  561. package/dist/chunk-V2DNYJR6.mjs.map +0 -1
  562. package/dist/chunk-VBABZXL7.mjs +0 -3
  563. package/dist/chunk-VBABZXL7.mjs.map +0 -1
  564. package/dist/chunk-WYBSHTGY.mjs +0 -3
  565. package/dist/chunk-WYBSHTGY.mjs.map +0 -1
  566. package/dist/chunk-ZQUMJQYV.mjs +0 -3
  567. package/dist/chunk-ZQUMJQYV.mjs.map +0 -1
  568. package/dist/chunk-ZY23NOT4.mjs +0 -3
  569. package/dist/chunk-ZY23NOT4.mjs.map +0 -1
  570. package/dist/components/EmptyState.d.ts +0 -62
  571. package/dist/components/EmptyState.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/advanced/AdvancedPageTransition.tsx","../src/components/advanced/usePageTransition.ts","../src/components/advanced/usePageTransitionManager.ts","../src/components/advanced/Parallax.tsx","../src/components/advanced/TextReveal.tsx","../src/components/advanced/TiltCard.tsx","../src/components/advanced/VideoBackground.tsx","../src/components/advanced/ImageReveal.tsx","../src/components/advanced/DotNav.tsx","../src/components/advanced/HorizontalScroll.tsx","../src/components/advanced/blog-editor/utils/slug.ts","../src/components/advanced/blog-editor/BlogEditorContext.tsx","../src/components/advanced/blog-editor/BlogEditorHeader.tsx","../src/components/advanced/blog-editor/BlogEditorMetadata.tsx","../src/components/advanced/blog-editor/BlogEditorLanguageTabs.tsx","../src/components/advanced/blog-editor/BlogEditorContent.tsx","../src/components/advanced/blog-editor/utils/markdown.ts","../src/components/advanced/blog-editor/BlogEditorToolbar.tsx","../src/components/advanced/blog-editor/BlogEditorPreview.tsx","../src/components/advanced/blog-editor/BlogEditorActions.tsx","../src/components/advanced/blog-editor/BlogEditorTranslate.tsx","../src/components/advanced/blog-editor/BlogEditor.tsx"],"names":["AdvancedPageTransition","React","children","className","type","duration","easing","delay","autoStart","onStart","onComplete","showProgress","progressClassName","ref","isVisible","setIsVisible","useState","progress","setProgress","_isTransitioning","setIsTransitioning","animationRef","useRef","startTimeRef","getEasingFunction","easingType","t","animate","useCallback","timestamp","elapsed","easingFunction","currentProgress","startTransition","useEffect","timer","transitionStyles","jsxs","merge","jsx","FadePageTransition","props","SlidePageTransition","ScalePageTransition","FlipPageTransition","MorphPageTransition","CubePageTransition","ZoomPageTransition","usePageTransition","initialConfig","state","setState","configRef","_a","config","prev","start","resolve","finalConfig","reverse","pause","resume","reset","usePageTransitionManager","defaultType","defaultDuration","defaultEasing","enableHistory","_enableProgress","enableDebug","activeTransitionsRef","transitionCounterRef","logDebug","message","data","updateStats","newTransition","newHistory","total","average","sum","transitionId","fullConfig","transitionEvent","completedEvent","cancelTransition","id","transition","pauseAll","resumeAll","_id","clearHistory","getTransitionStats","transitionHistory","byType","acc","byStatus","activeTransitions","subscribers","listening","rafId","tick","cb","onScroll","subscribe","Parallax","speed","direction","offset","disabled","scale","opacityEffect","rotate","rotateDirection","disableOnMobile","style","innerRef","isVisibleRef","isMobileRef","prefersReducedMotion","useReducedMotion","mq","handleChange","e","updateTransform","element","rect","windowHeight","elementCenter","movement","x","y","scaleValue","opacityValue","rotateValue","observer","entry","combinedStyle","mergeRefs","refs","value","TextReveal","text","revealColor","hiddenColor","threshold","byWord","byChar","containerRef","updateProgress","end","newProgress","handleScroll","renderText","chars","char","index","charProgress","isRevealed","words","word","wordProgress","TiltCard","maxTilt","perspective","glare","maxGlare","cardRef","transform","setTransform","glarePosition","setGlarePosition","isHovered","setIsHovered","handleMouseMove","centerX","centerY","mouseX","mouseY","rotateY","rotateX","glareX","glareY","handleMouseEnter","handleMouseLeave","cardStyle","innerStyle","glareStyle","VideoBackground","src","poster","autoPlay","loop","muted","controls","objectFit","overlay","overlayColor","gradient","gradientDirection","playbackRate","fadeIn","videoRef","isLoaded","setIsLoaded","isPlaying","setIsPlaying","handleLoadedData","handlePlaying","getYouTubeUrl","videoId","params","getVimeoUrl","renderVideo","objectFitClass","renderGradientOverlay","gradients","Fragment","hasPositionClass","ImageReveal","alt","height","vh","p","clipPath","getClipPath","r","DotNav","items","position","activeColor","inactiveColor","activeIndex","setActiveIndex","updateActive","closest","closestDist","item","i","el","dist","handleClick","positionClass","useMemo","HorizontalScroll","heightMultiplier","snap","onProgress","outerRef","scrollWidth","setScrollWidth","measure","ro","outerHeight","scrolled","totalHeight","child","generateSlug","title","isValidSlug","slug","normalizeSlug","input","DEFAULT_LABELS","DEFAULT_FEATURES","DEFAULT_LANGUAGES","createEmptyMultilingualField","languages","field","lang","createInitialData","initialData","_b","_c","_d","_e","_f","_g","_h","BlogEditorContext","createContext","useBlogEditor","context","useContext","BlogEditorProvider","isEditMode","defaultLanguage","userLabels","callbacks","userFeatures","variant","autoSaveKey","autoSaveInterval","primaryLanguage","l","initialLanguage","labels","features","formData","setFormData","activeLanguage","setActiveLanguage","showPreview","setShowPreview","submitting","setSubmitting","translating","setTranslating","uploading","setUploading","error","setError","translateSuccess","setTranslateSuccess","slugManuallyEdited","setSlugManuallyEdited","autoSaveStatus","setAutoSaveStatus","autoSaveTimerRef","isInitialMount","storageKey","saved","parsed","clearAutoSave","updateField","updateMultilingualField","language","handleSave","publish","primaryTitle","primaryContent","handleTranslate","primaryExcerpt","translations","newTitle","newContent","newExcerpt","langKey","translation","trans","handleUploadImage","file","handleCancel","BlogEditorHeader","onBack","backLink","Icon","BlogEditorMetadata","tagInput","setTagInput","fileInputRef","containerClasses","inputClasses","labelClasses","addTag","tag","trimmed","removeTag","tagToRemove","handleTagInputChange","parts","part","idx","handleTagKeyDown","url","BlogEditorLanguageTabs","isActive","isPrimary","BlogEditorContent","textareaRef","isPrimaryLanguage","currentLang","handleTitleChange","getLangLabel","baseLabel","escapeHtml","parseMarkdown","html","_","code","match","stripMarkdown","getMarkdownPreview","maxLength","stripped","insertMarkdown","selectionStart","selectionEnd","before","after","selectedText","beforeText","afterText","newText","cursorPosition","TOOLBAR_ITEMS","BlogEditorToolbar","handleInsert","textarea","currentContent","BlogEditorPreview","renderMarkdown","content","renderedContent","BlogEditorActions","cancelLink","BlogEditorTranslate","hint","canTranslate","BlogEditorRoot","translateHint","maxWidth","contentContainerClasses","BlogEditor","BlogEditorCompound"],"mappings":"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","file":"chunk-CNW22G24.mjs","sourcesContent":["'use client'\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react'\nimport { merge } from '../../lib/utils'\n\nexport type TransitionType = \n | 'fade' \n | 'slide' \n | 'scale' \n | 'flip' \n | 'morph' \n | 'cube' \n | 'zoom' \n | 'slide-up' \n | 'slide-down' \n | 'slide-left' \n | 'slide-right'\n\nexport type TransitionEasing = \n | 'linear' \n | 'ease-in' \n | 'ease-out' \n | 'ease-in-out' \n | 'bounce' \n | 'elastic' \n | 'smooth'\n\nexport interface AdvancedPageTransitionProps {\n children: React.ReactNode\n className?: string\n type?: TransitionType\n duration?: number\n easing?: TransitionEasing\n delay?: number\n autoStart?: boolean\n onStart?: () => void\n onComplete?: () => void\n showProgress?: boolean\n progressClassName?: string\n}\n\nexport const AdvancedPageTransition = React.forwardRef<HTMLDivElement, AdvancedPageTransitionProps>(({\n children,\n className,\n type = 'fade',\n duration = 500,\n easing = 'smooth',\n delay = 0,\n autoStart = true,\n onStart,\n onComplete,\n showProgress = false,\n progressClassName\n}, ref) => {\n const [isVisible, setIsVisible] = useState(false)\n const [progress, setProgress] = useState(0)\n const [_isTransitioning, setIsTransitioning] = useState(false)\n const animationRef = useRef<number | null>(null)\n const startTimeRef = useRef<number | null>(null)\n\n const getEasingFunction = (easingType: TransitionEasing) => {\n const easingFunctions = {\n linear: (t: number) => t,\n 'ease-in': (t: number) => t * t,\n 'ease-out': (t: number) => 1 - Math.pow(1 - t, 2),\n 'ease-in-out': (t: number) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t: number) => {\n if (t < 1 / 2.75) return 7.5625 * t * t\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375\n },\n elastic: (t: number) => {\n return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1\n },\n smooth: (t: number) => {\n return t * t * (3 - 2 * t)\n }\n }\n return easingFunctions[easingType]\n }\n\n const animate = useCallback((timestamp: number) => {\n if (!startTimeRef.current) {\n startTimeRef.current = timestamp\n }\n\n const elapsed = timestamp - startTimeRef.current\n const easingFunction = getEasingFunction(easing)\n\n let currentProgress = Math.min(elapsed / duration, 1)\n currentProgress = easingFunction(currentProgress)\n\n setProgress(currentProgress)\n setIsVisible(currentProgress > 0.1)\n\n if (currentProgress < 1) {\n animationRef.current = requestAnimationFrame((t) => animate(t))\n } else {\n setIsTransitioning(false)\n setProgress(1)\n onComplete?.()\n }\n }, [duration, easing, onComplete])\n\n const startTransition = useCallback(() => {\n setIsTransitioning(true)\n setProgress(0)\n onStart?.()\n\n startTimeRef.current = null\n animationRef.current = requestAnimationFrame(animate)\n }, [animate, onStart])\n\n useEffect(() => {\n if (autoStart) {\n const timer = setTimeout(() => {\n startTransition()\n }, delay)\n\n return () => clearTimeout(timer)\n }\n }, [autoStart, delay, startTransition])\n\n useEffect(() => {\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }\n }, [])\n\n const getTransitionStyles = () => {\n switch (type) {\n case 'fade':\n return {\n opacity: isVisible ? 1 : 0,\n transform: 'none'\n }\n \n case 'slide':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(${(1 - progress) * 100}%)`\n }\n \n case 'slide-up':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateY(${(1 - progress) * 100}%)`\n }\n \n case 'slide-down':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateY(-${(1 - progress) * 100}%)`\n }\n \n case 'slide-left':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(-${(1 - progress) * 100}%)`\n }\n \n case 'slide-right':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(${(1 - progress) * 100}%)`\n }\n \n case 'scale':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.8 + progress * 0.2})`\n }\n \n case 'flip':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `perspective(1000px) rotateY(${(1 - progress) * 90}deg)`\n }\n \n case 'morph':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.9 + progress * 0.1}) rotate(${(1 - progress) * 5}deg)`\n }\n \n case 'cube':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `perspective(1000px) rotateX(${(1 - progress) * 90}deg) rotateY(${(1 - progress) * 45}deg)`\n }\n \n case 'zoom':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.5 + progress * 0.5})`\n }\n \n default:\n return {\n opacity: isVisible ? 1 : 0,\n transform: 'none'\n }\n }\n }\n\n const transitionStyles = getTransitionStyles()\n\n return (\n <div className=\"relative\">\n {showProgress && (\n <div className={merge(\n 'fixed top-4 right-4 z-50 bg-background rounded-lg px-3 py-2 shadow-lg border',\n progressClassName\n )}>\n <div className=\"text-sm font-medium text-foreground\">\n Progress: {Math.round(progress * 100)}%\n </div>\n <div className=\"w-24 h-2 bg-muted rounded-full mt-2\">\n <div \n className=\"h-full bg-primary rounded-full transition-all duration-100\"\n style={{ width: `${progress * 100}%` }}\n />\n </div>\n </div>\n )}\n \n <div\n ref={ref}\n className={merge(\n 'transition-all duration-500 ease-out',\n className\n )}\n style={{\n ...transitionStyles,\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: easing === 'smooth' \n ? 'cubic-bezier(0.4, 0, 0.2, 1)'\n : easing === 'bounce'\n ? 'cubic-bezier(0.68, -0.55, 0.265, 1.55)'\n : easing === 'elastic'\n ? 'cubic-bezier(0.175, 0.885, 0.32, 1.275)'\n : easing\n }}\n >\n {children}\n </div>\n </div>\n )\n})\n\nAdvancedPageTransition.displayName = 'AdvancedPageTransition'\n\n// 편의 컴포넌트들\nexport const FadePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"fade\" {...props} />\n))\n\nexport const SlidePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"slide\" {...props} />\n))\n\nexport const ScalePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"scale\" {...props} />\n))\n\nexport const FlipPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"flip\" {...props} />\n))\n\nexport const MorphPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"morph\" {...props} />\n))\n\nexport const CubePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"cube\" {...props} />\n))\n\nexport const ZoomPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"zoom\" {...props} />\n))\n\n// displayName 설정\nFadePageTransition.displayName = 'FadePageTransition'\nSlidePageTransition.displayName = 'SlidePageTransition'\nScalePageTransition.displayName = 'ScalePageTransition'\nFlipPageTransition.displayName = 'FlipPageTransition'\nMorphPageTransition.displayName = 'MorphPageTransition'\nCubePageTransition.displayName = 'CubePageTransition'\nZoomPageTransition.displayName = 'ZoomPageTransition'\n","'use client'\n\nimport { useState, useEffect, useCallback, useRef } from 'react'\n\nexport type TransitionType = \n | 'fade' \n | 'slide' \n | 'scale' \n | 'flip' \n | 'morph' \n | 'cube' \n | 'zoom' \n | 'slide-up' \n | 'slide-down' \n | 'slide-left' \n | 'slide-right'\n\nexport type TransitionEasing = \n | 'linear' \n | 'ease-in' \n | 'ease-out' \n | 'ease-in-out' \n | 'bounce' \n | 'elastic' \n | 'smooth'\n\nexport interface TransitionConfig {\n type: TransitionType\n duration: number\n easing: TransitionEasing\n delay?: number\n stagger?: number\n direction?: 'forward' | 'backward'\n onStart?: () => void\n onComplete?: () => void\n onReverse?: () => void\n}\n\nexport interface PageTransitionState {\n isTransitioning: boolean\n isVisible: boolean\n currentStep: number\n progress: number\n}\n\nexport interface PageTransitionControls {\n start: (config?: Partial<TransitionConfig>) => Promise<void>\n reverse: () => Promise<void>\n pause: () => void\n resume: () => void\n reset: () => void\n}\n\nexport const usePageTransition = (\n initialConfig: Partial<TransitionConfig> = {}\n): [PageTransitionState, PageTransitionControls] => {\n const [state, setState] = useState<PageTransitionState>({\n isTransitioning: false,\n isVisible: false,\n currentStep: 0,\n progress: 0\n })\n\n const animationRef = useRef<number | null>(null)\n const startTimeRef = useRef<number | null>(null)\n const configRef = useRef<TransitionConfig>({\n type: 'fade',\n duration: 500,\n easing: 'smooth',\n delay: 0,\n stagger: 0,\n direction: 'forward',\n ...initialConfig\n })\n\n const getEasingFunction = useCallback((easing: TransitionEasing) => {\n const easingFunctions = {\n linear: (t: number) => t,\n 'ease-in': (t: number) => t * t,\n 'ease-out': (t: number) => 1 - Math.pow(1 - t, 2),\n 'ease-in-out': (t: number) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t: number) => {\n if (t < 1 / 2.75) return 7.5625 * t * t\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375\n },\n elastic: (t: number) => {\n return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1\n },\n smooth: (t: number) => {\n return t * t * (3 - 2 * t)\n }\n }\n return easingFunctions[easing]\n }, [])\n\n const animate = useCallback((timestamp: number) => {\n if (!startTimeRef.current) {\n startTimeRef.current = timestamp\n }\n\n const elapsed = timestamp - startTimeRef.current\n const config = configRef.current\n const easing = getEasingFunction(config.easing)\n \n let progress = Math.min(elapsed / config.duration, 1)\n progress = easing(progress)\n\n setState(prev => ({\n ...prev,\n progress,\n isVisible: config.direction === 'forward' ? progress > 0.1 : progress < 0.9,\n currentStep: Math.floor(progress * 10)\n }))\n\n if (progress < 1) {\n animationRef.current = requestAnimationFrame(animate)\n } else {\n setState(prev => ({\n ...prev,\n isTransitioning: false,\n progress: config.direction === 'forward' ? 1 : 0\n }))\n config.onComplete?.()\n }\n }, [getEasingFunction])\n\n const start = useCallback(async (config?: Partial<TransitionConfig>) => {\n return new Promise<void>((resolve) => {\n if (config) {\n configRef.current = { ...configRef.current, ...config }\n }\n\n const finalConfig = configRef.current\n finalConfig.onComplete = () => resolve()\n\n setState(prev => ({\n ...prev,\n isTransitioning: true,\n progress: finalConfig.direction === 'forward' ? 0 : 1\n }))\n\n startTimeRef.current = null\n finalConfig.onStart?.()\n \n if (finalConfig.delay) {\n setTimeout(() => {\n animationRef.current = requestAnimationFrame(animate)\n }, finalConfig.delay)\n } else {\n animationRef.current = requestAnimationFrame(animate)\n }\n })\n }, [animate])\n\n const reverse = useCallback(async () => {\n return new Promise<void>((resolve) => {\n const config = configRef.current\n config.direction = 'backward'\n config.onComplete = () => resolve()\n \n start()\n })\n }, [start])\n\n const pause = useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }, [])\n\n const resume = useCallback(() => {\n if (state.isTransitioning) {\n animationRef.current = requestAnimationFrame(animate)\n }\n }, [state.isTransitioning, animate])\n\n const reset = useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n setState({\n isTransitioning: false,\n isVisible: false,\n currentStep: 0,\n progress: 0\n })\n }, [])\n\n useEffect(() => {\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }\n }, [])\n\n return [state, { start, reverse, pause, resume, reset }]\n}\n\n// 특정 전환 타입을 위한 편의 훅들\nexport const useFadeTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'fade', duration: 400, ...config })\n}\n\nexport const useSlideTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'slide', duration: 600, ...config })\n}\n\nexport const useScaleTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'scale', duration: 500, ...config })\n}\n\nexport const useMorphTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'morph', duration: 800, ...config })\n}\n\nexport const useCubeTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'cube', duration: 1000, ...config })\n}\n","'use client'\n\nimport { useState, useCallback, useRef, useEffect } from 'react'\nimport { TransitionType, TransitionEasing, TransitionConfig } from './usePageTransition'\n\nexport interface PageTransitionManagerConfig {\n defaultType?: TransitionType\n defaultDuration?: number\n defaultEasing?: TransitionEasing\n enableHistory?: boolean\n enableProgress?: boolean\n enableDebug?: boolean\n}\n\nexport interface PageTransitionEvent {\n id: string\n type: TransitionType\n duration: number\n easing: TransitionEasing\n timestamp: number\n status: 'pending' | 'active' | 'completed' | 'failed'\n}\n\nexport interface PageTransitionManagerState {\n isTransitioning: boolean\n currentTransition: PageTransitionEvent | null\n transitionHistory: PageTransitionEvent[]\n totalTransitions: number\n averageDuration: number\n}\n\nexport interface PageTransitionManagerControls {\n startTransition: (config: Partial<TransitionConfig>) => Promise<string>\n cancelTransition: (id: string) => void\n pauseAll: () => void\n resumeAll: () => void\n clearHistory: () => void\n getTransitionStats: () => {\n total: number\n average: number\n byType: Record<TransitionType, number>\n byStatus: Record<string, number>\n }\n}\n\nexport const usePageTransitionManager = (\n config: PageTransitionManagerConfig = {}\n): [PageTransitionManagerState, PageTransitionManagerControls] => {\n const {\n defaultType = 'fade',\n defaultDuration = 500,\n defaultEasing = 'smooth',\n enableHistory = true,\n enableProgress: _enableProgress = true,\n enableDebug = false\n } = config\n\n const [state, setState] = useState<PageTransitionManagerState>({\n isTransitioning: false,\n currentTransition: null,\n transitionHistory: [],\n totalTransitions: 0,\n averageDuration: 0\n })\n\n const activeTransitionsRef = useRef<Map<string, { timer: NodeJS.Timeout; config: TransitionConfig }>>(new Map())\n const transitionCounterRef = useRef(0)\n\n const logDebug = useCallback((message: string, data?: unknown) => {\n if (enableDebug) {\n // eslint-disable-next-line no-console\n console.log(`[PageTransitionManager] ${message}`, data)\n }\n }, [enableDebug])\n\n const updateStats = useCallback((newTransition: PageTransitionEvent) => {\n setState(prev => {\n const newHistory = enableHistory ? [...prev.transitionHistory, newTransition] : prev.transitionHistory\n const total = newHistory.length\n const average = newHistory.reduce((sum, t) => sum + t.duration, 0) / total\n\n return {\n ...prev,\n totalTransitions: total,\n averageDuration: average,\n transitionHistory: newHistory\n }\n })\n }, [enableHistory])\n\n const startTransition = useCallback(async (config: Partial<TransitionConfig>): Promise<string> => {\n const transitionId = `transition_${++transitionCounterRef.current}`\n const fullConfig: TransitionConfig = {\n type: defaultType,\n duration: defaultDuration,\n easing: defaultEasing,\n ...config\n }\n\n const transitionEvent: PageTransitionEvent = {\n id: transitionId,\n type: fullConfig.type,\n duration: fullConfig.duration,\n easing: fullConfig.easing,\n timestamp: Date.now(),\n status: 'pending'\n }\n\n logDebug('Starting transition', { id: transitionId, config: fullConfig })\n\n setState(prev => ({\n ...prev,\n isTransitioning: true,\n currentTransition: transitionEvent\n }))\n\n // 실제 전환 로직을 시뮬레이션 (실제로는 usePageTransition과 연동)\n const timer = setTimeout(() => {\n const completedEvent: PageTransitionEvent = {\n ...transitionEvent,\n status: 'completed'\n }\n\n setState(prev => ({\n ...prev,\n isTransitioning: false,\n currentTransition: null\n }))\n\n updateStats(completedEvent)\n activeTransitionsRef.current.delete(transitionId)\n logDebug('Transition completed', { id: transitionId })\n\n fullConfig.onComplete?.()\n }, fullConfig.duration)\n\n activeTransitionsRef.current.set(transitionId, { timer, config: fullConfig })\n\n // 진행 상태 업데이트\n setTimeout(() => {\n setState(prev => ({\n ...prev,\n currentTransition: {\n ...prev.currentTransition!,\n status: 'active'\n }\n }))\n }, 50)\n\n return transitionId\n }, [defaultType, defaultDuration, defaultEasing, logDebug, updateStats])\n\n const cancelTransition = useCallback((id: string) => {\n const transition = activeTransitionsRef.current.get(id)\n if (transition) {\n clearTimeout(transition.timer)\n activeTransitionsRef.current.delete(id)\n\n setState(prev => ({\n ...prev,\n isTransitioning: activeTransitionsRef.current.size > 0,\n currentTransition: prev.currentTransition?.id === id ? null : prev.currentTransition\n }))\n\n logDebug('Transition cancelled', { id })\n }\n }, [logDebug])\n\n const pauseAll = useCallback(() => {\n activeTransitionsRef.current.forEach(({ timer }, id) => {\n clearTimeout(timer)\n logDebug('Transition paused', { id })\n })\n }, [logDebug])\n\n const resumeAll = useCallback(() => {\n activeTransitionsRef.current.forEach(({ config }, _id) => {\n startTransition(config)\n })\n }, [startTransition])\n\n const clearHistory = useCallback(() => {\n setState(prev => ({\n ...prev,\n transitionHistory: [],\n totalTransitions: 0,\n averageDuration: 0\n }))\n logDebug('History cleared')\n }, [logDebug])\n\n const getTransitionStats = useCallback(() => {\n const { transitionHistory } = state\n const byType = transitionHistory.reduce((acc, t) => {\n acc[t.type] = (acc[t.type] || 0) + 1\n return acc\n }, {} as Record<TransitionType, number>)\n\n const byStatus = transitionHistory.reduce((acc, t) => {\n acc[t.status] = (acc[t.status] || 0) + 1\n return acc\n }, {} as Record<string, number>)\n\n return {\n total: transitionHistory.length,\n average: state.averageDuration,\n byType,\n byStatus\n }\n }, [state])\n\n useEffect(() => {\n const activeTransitions = activeTransitionsRef.current\n return () => {\n // 컴포넌트 언마운트 시 모든 타이머 정리\n activeTransitions.forEach(({ timer }) => {\n clearTimeout(timer)\n })\n activeTransitions.clear()\n }\n }, [])\n\n return [state, {\n startTransition,\n cancelTransition,\n pauseAll,\n resumeAll,\n clearHistory,\n getTransitionStats\n }]\n}\n\n// 특정 전환 타입을 위한 편의 훅들\nexport const useFadeTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'fade' })\n}\n\nexport const useSlideTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'slide' })\n}\n\nexport const useScaleTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'scale' })\n}\n\nexport const useMorphTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'morph' })\n}\n\nexport const useCubeTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'cube' })\n}\n","\"use client\";\n\nimport React, { useRef, useEffect, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\n\n/**\n * Parallax 컴포넌트의 props / Parallax component props\n * @property {number} [speed=0.5] - 패럴렉스 속도 (0-1, 1이 가장 빠름) / Parallax speed (0-1, 1 is fastest)\n * @property {\"up\" | \"down\" | \"left\" | \"right\"} [direction=\"up\"] - 이동 방향 / Movement direction\n * @property {number} [offset=0] - 시작 오프셋 (px) / Starting offset in pixels\n * @property {boolean} [disabled=false] - 패럴렉스 비활성화 / Disable parallax\n * @property {boolean} [scale=false] - 스케일 효과 추가 / Add scale effect\n * @property {boolean} [opacity=false] - 투명도 효과 추가 / Add opacity effect\n * @property {boolean} [rotate=false] - 회전 효과 추가 / Add rotation effect\n * @property {boolean} [disableOnMobile=false] - 모바일(768px 미만)에서 자동 비활성화\n */\nexport interface ParallaxProps extends React.HTMLAttributes<HTMLDivElement> {\n speed?: number;\n direction?: \"up\" | \"down\" | \"left\" | \"right\";\n offset?: number;\n disabled?: boolean;\n scale?: boolean;\n opacity?: boolean;\n rotate?: boolean;\n rotateDirection?: \"cw\" | \"ccw\";\n disableOnMobile?: boolean;\n}\n\n/* ────────────────────────────────────────\n Shared scroll listener — 모든 Parallax가\n 하나의 scroll/resize 리스너를 공유\n ──────────────────────────────────────── */\ntype ScrollCallback = () => void;\nconst subscribers = new Set<ScrollCallback>();\nlet listening = false;\nlet rafId = 0;\n\nfunction tick() {\n subscribers.forEach((cb) => cb());\n}\n\nfunction onScroll() {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(tick);\n}\n\nfunction subscribe(cb: ScrollCallback) {\n subscribers.add(cb);\n if (!listening && subscribers.size > 0) {\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n window.addEventListener(\"resize\", onScroll, { passive: true });\n listening = true;\n }\n return () => {\n subscribers.delete(cb);\n if (listening && subscribers.size === 0) {\n window.removeEventListener(\"scroll\", onScroll);\n window.removeEventListener(\"resize\", onScroll);\n cancelAnimationFrame(rafId);\n listening = false;\n }\n };\n}\n\n/**\n * Parallax 컴포넌트 / Parallax component\n *\n * 스크롤에 반응하여 패럴렉스 효과를 제공하는 컴포넌트입니다.\n * 다양한 방향과 속도, 추가 효과(스케일, 투명도, 회전)를 지원합니다.\n *\n * 성능 최적화:\n * - 모든 인스턴스가 하나의 scroll/resize 리스너 공유\n * - IntersectionObserver로 뷰포트 밖 요소 업데이트 건너뛰기\n * - ref 기반 직접 DOM 조작 (React 리렌더 없음)\n *\n * @component\n * @example\n * <Parallax speed={0.3}>\n * <img src=\"/background.jpg\" alt=\"background\" />\n * </Parallax>\n *\n * @example\n * // 모바일에서 비활성화\n * <Parallax speed={0.5} disableOnMobile>\n * <div className=\"decorative-blob\" />\n * </Parallax>\n */\nconst Parallax = React.forwardRef<HTMLDivElement, ParallaxProps>(\n (\n {\n children,\n className,\n speed = 0.5,\n direction = \"up\",\n offset = 0,\n disabled = false,\n scale = false,\n opacity: opacityEffect = false,\n rotate = false,\n rotateDirection = \"cw\",\n disableOnMobile = false,\n style,\n ...props\n },\n ref\n ) => {\n const innerRef = useRef<HTMLDivElement>(null);\n const isVisibleRef = useRef(true);\n const isMobileRef = useRef(false);\n\n // Check for reduced motion preference\n const prefersReducedMotion = useReducedMotion();\n\n // Mobile detection\n useEffect(() => {\n if (!disableOnMobile) return;\n const mq = window.matchMedia(\"(max-width: 767px)\");\n isMobileRef.current = mq.matches;\n\n const handleChange = (e: MediaQueryListEvent) => {\n isMobileRef.current = e.matches;\n // 모바일 전환 시 transform 초기화\n if (e.matches && innerRef.current) {\n innerRef.current.style.transform = \"\";\n innerRef.current.style.opacity = \"\";\n }\n };\n\n mq.addEventListener(\"change\", handleChange);\n return () => mq.removeEventListener(\"change\", handleChange);\n }, [disableOnMobile]);\n\n const updateTransform = useCallback(() => {\n if (disabled || prefersReducedMotion) return;\n if (disableOnMobile && isMobileRef.current) return;\n if (!isVisibleRef.current) return;\n\n const element = innerRef.current;\n if (!element) return;\n\n const rect = element.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n\n const elementCenter = rect.top + rect.height / 2;\n const viewportCenter = windowHeight / 2;\n const progress = (viewportCenter - elementCenter) / windowHeight;\n\n const movement = progress * speed * 100 + offset;\n\n let x = 0;\n let y = 0;\n\n switch (direction) {\n case \"up\":\n y = -movement;\n break;\n case \"down\":\n y = movement;\n break;\n case \"left\":\n x = -movement;\n break;\n case \"right\":\n x = movement;\n break;\n }\n\n const scaleValue = scale ? 1 + Math.abs(progress) * 0.1 : 1;\n const opacityValue = opacityEffect ? Math.max(0.3, 1 - Math.abs(progress) * 0.5) : 1;\n const rotateValue = rotate\n ? progress * 10 * (rotateDirection === \"cw\" ? 1 : -1)\n : 0;\n\n // 직접 DOM 조작 — React 리렌더 없음\n element.style.transform = `translate3d(${x}px, ${y}px, 0) scale(${scaleValue}) rotate(${rotateValue}deg)`;\n if (opacityEffect) {\n element.style.opacity = String(opacityValue);\n }\n }, [disabled, prefersReducedMotion, speed, direction, offset, scale, opacityEffect, rotate, rotateDirection, disableOnMobile]);\n\n // IntersectionObserver — 뷰포트 밖이면 업데이트 건너뛰기\n useEffect(() => {\n if (disabled || prefersReducedMotion) return;\n const element = innerRef.current;\n if (!element) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n isVisibleRef.current = entry.isIntersecting;\n },\n { rootMargin: \"100px\" }\n );\n\n observer.observe(element);\n return () => observer.disconnect();\n }, [disabled, prefersReducedMotion]);\n\n // 공유 scroll 리스너 구독\n useEffect(() => {\n if (disabled || prefersReducedMotion) return;\n\n // Initial calculation\n updateTransform();\n\n return subscribe(updateTransform);\n }, [updateTransform, disabled, prefersReducedMotion]);\n\n const isActive = !disabled && !prefersReducedMotion;\n\n const combinedStyle: React.CSSProperties = {\n ...style,\n willChange: isActive ? \"transform, opacity\" : undefined,\n };\n\n return (\n <div\n ref={mergeRefs(ref, innerRef)}\n className={merge(\"transition-none\", className)}\n style={combinedStyle}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nParallax.displayName = \"Parallax\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { Parallax };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\n\n/**\n * TextReveal 컴포넌트의 props / TextReveal component props\n * @property {string} text - 표시할 텍스트 / Text to display\n * @property {string} [revealColor=\"currentColor\"] - 공개된 텍스트 색상 / Revealed text color\n * @property {string} [hiddenColor=\"rgba(128, 128, 128, 0.3)\"] - 숨겨진 텍스트 색상 / Hidden text color\n * @property {number} [threshold=0.5] - 공개 시작 임계값 (0-1) / Reveal threshold (0-1)\n * @property {boolean} [byWord=false] - 단어별 공개 / Reveal by word\n * @property {boolean} [byChar=false] - 글자별 공개 / Reveal by character\n */\nexport interface TextRevealProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n text: string;\n revealColor?: string;\n hiddenColor?: string;\n threshold?: number;\n byWord?: boolean;\n byChar?: boolean;\n}\n\n/**\n * TextReveal 컴포넌트 / TextReveal component\n *\n * 스크롤에 따라 텍스트가 점진적으로 공개되는 효과를 제공합니다.\n * 히어로 섹션, 스토리텔링 페이지에 적합합니다.\n *\n * Provides a text reveal effect based on scroll position.\n * Perfect for hero sections and storytelling pages.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <TextReveal text=\"Welcome to the future of design\" />\n *\n * @example\n * // 단어별 공개 / Word by word reveal\n * <TextReveal\n * text=\"Build amazing products with our platform\"\n * byWord\n * revealColor=\"#3b82f6\"\n * />\n */\nconst TextReveal = React.forwardRef<HTMLDivElement, TextRevealProps>(\n (\n {\n text,\n className,\n revealColor = \"currentColor\",\n hiddenColor = \"rgba(128, 128, 128, 0.3)\",\n threshold = 0.5,\n byWord = false,\n byChar = false,\n style,\n ...props\n },\n ref\n ) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [progress, setProgress] = useState(0);\n\n // Check for reduced motion preference\n const prefersReducedMotion = useReducedMotion();\n\n const updateProgress = useCallback(() => {\n if (!containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n\n // Calculate progress based on element position\n const start = windowHeight * (1 - threshold);\n const end = windowHeight * threshold;\n const elementCenter = rect.top + rect.height / 2;\n\n let newProgress = 0;\n if (elementCenter <= start && elementCenter >= end) {\n newProgress = (start - elementCenter) / (start - end);\n } else if (elementCenter < end) {\n newProgress = 1;\n }\n\n setProgress(Math.max(0, Math.min(1, newProgress)));\n }, [threshold]);\n\n useEffect(() => {\n if (prefersReducedMotion) {\n setProgress(1);\n return;\n }\n\n updateProgress();\n\n const handleScroll = () => {\n requestAnimationFrame(updateProgress);\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n window.addEventListener(\"resize\", handleScroll, { passive: true });\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", handleScroll);\n };\n }, [updateProgress, prefersReducedMotion]);\n\n // Split text based on mode\n const renderText = () => {\n if (byChar) {\n const chars = text.split(\"\");\n return chars.map((char, index) => {\n const charProgress = progress * chars.length;\n const isRevealed = index < charProgress;\n return (\n <span\n key={index}\n style={{\n color: isRevealed ? revealColor : hiddenColor,\n transition: \"color 0.1s ease-out\",\n }}\n >\n {char}\n </span>\n );\n });\n }\n\n if (byWord) {\n const words = text.split(\" \");\n return words.map((word, index) => {\n const wordProgress = progress * words.length;\n const isRevealed = index < wordProgress;\n return (\n <span key={index}>\n <span\n style={{\n color: isRevealed ? revealColor : hiddenColor,\n transition: \"color 0.15s ease-out\",\n }}\n >\n {word}\n </span>\n {index < words.length - 1 && \" \"}\n </span>\n );\n });\n }\n\n // Default: gradient mask reveal\n return (\n <span\n style={{\n background: `linear-gradient(90deg, ${revealColor} ${progress * 100}%, ${hiddenColor} ${progress * 100}%)`,\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\",\n transition: \"background 0.1s ease-out\",\n }}\n >\n {text}\n </span>\n );\n };\n\n return (\n <div\n ref={mergeRefs(ref, containerRef)}\n className={merge(\"font-medium\", className)}\n style={style}\n {...props}\n >\n {renderText()}\n </div>\n );\n }\n);\n\nTextReveal.displayName = \"TextReveal\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { TextReveal };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * TiltCard 컴포넌트의 props / TiltCard component props\n * @property {number} [maxTilt=15] - 최대 기울기 각도 / Maximum tilt angle in degrees\n * @property {number} [perspective=1000] - 원근감 / Perspective value\n * @property {number} [scale=1.02] - 호버시 스케일 / Scale on hover\n * @property {number} [speed=400] - 전환 속도 (ms) / Transition speed in milliseconds\n * @property {boolean} [glare=true] - 글레어 효과 / Glare effect\n * @property {number} [maxGlare=0.3] - 최대 글레어 투명도 / Maximum glare opacity\n * @property {boolean} [reset=true] - 마우스 떠나면 리셋 / Reset on mouse leave\n */\nexport interface TiltCardProps extends React.HTMLAttributes<HTMLDivElement> {\n maxTilt?: number;\n perspective?: number;\n scale?: number;\n speed?: number;\n glare?: boolean;\n maxGlare?: number;\n reset?: boolean;\n}\n\n/**\n * TiltCard 컴포넌트 / TiltCard component\n *\n * 마우스 움직임에 따라 3D 틸트 효과를 제공하는 카드 컴포넌트입니다.\n * 제품 카드, 프로필 카드, 갤러리에 적합합니다.\n *\n * Card component that provides 3D tilt effect based on mouse movement.\n * Perfect for product cards, profile cards, and galleries.\n *\n * @component\n * @example\n * <TiltCard className=\"bg-white shadow-lg rounded-xl p-6\">\n * <img src=\"/product.jpg\" alt=\"Product\" />\n * <h3>Premium Product</h3>\n * </TiltCard>\n */\nconst TiltCard = React.forwardRef<HTMLDivElement, TiltCardProps>(\n (\n {\n children,\n className,\n maxTilt = 15,\n perspective = 1000,\n scale = 1.02,\n speed = 400,\n glare = true,\n maxGlare = 0.3,\n reset = true,\n style,\n ...props\n },\n ref\n ) => {\n const cardRef = useRef<HTMLDivElement>(null);\n const [transform, setTransform] = useState({\n rotateX: 0,\n rotateY: 0,\n scale: 1,\n });\n const [glarePosition, setGlarePosition] = useState({ x: 50, y: 50 });\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!cardRef.current) return;\n\n const rect = cardRef.current.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n\n // Calculate rotation based on mouse position\n const mouseX = e.clientX - centerX;\n const mouseY = e.clientY - centerY;\n\n const rotateY = (mouseX / (rect.width / 2)) * maxTilt;\n const rotateX = -(mouseY / (rect.height / 2)) * maxTilt;\n\n setTransform({\n rotateX,\n rotateY,\n scale,\n });\n\n // Calculate glare position (0-100%)\n const glareX = ((e.clientX - rect.left) / rect.width) * 100;\n const glareY = ((e.clientY - rect.top) / rect.height) * 100;\n setGlarePosition({ x: glareX, y: glareY });\n },\n [maxTilt, scale]\n );\n\n const handleMouseEnter = () => {\n setIsHovered(true);\n };\n\n const handleMouseLeave = () => {\n setIsHovered(false);\n if (reset) {\n setTransform({\n rotateX: 0,\n rotateY: 0,\n scale: 1,\n });\n }\n };\n\n const cardStyle: React.CSSProperties = {\n ...style,\n perspective: `${perspective}px`,\n };\n\n const innerStyle: React.CSSProperties = {\n transform: `rotateX(${transform.rotateX}deg) rotateY(${transform.rotateY}deg) scale(${transform.scale})`,\n transition: isHovered ? \"none\" : `transform ${speed}ms ease-out`,\n transformStyle: \"preserve-3d\",\n };\n\n const glareStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n background: `linear-gradient(\n ${Math.atan2(glarePosition.y - 50, glarePosition.x - 50) * (180 / Math.PI) + 90}deg,\n rgba(255, 255, 255, ${isHovered ? maxGlare : 0}) 0%,\n transparent 80%\n )`,\n transition: isHovered ? \"opacity 0.1s ease-out\" : `opacity ${speed}ms ease-out`,\n pointerEvents: \"none\",\n opacity: isHovered ? 1 : 0,\n };\n\n return (\n <div\n ref={mergeRefs(ref, cardRef)}\n className={merge(\"relative\", className)}\n style={cardStyle}\n onMouseMove={handleMouseMove}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n <div style={innerStyle} className=\"relative\">\n {children}\n\n {/* Glare effect */}\n {glare && <div style={glareStyle} aria-hidden=\"true\" />}\n </div>\n </div>\n );\n }\n);\n\nTiltCard.displayName = \"TiltCard\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { TiltCard };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * VideoBackground 컴포넌트의 props / VideoBackground component props\n * @property {string} src - 비디오 소스 (URL, YouTube ID, Vimeo ID) / Video source\n * @property {\"native\" | \"youtube\" | \"vimeo\"} [type=\"native\"] - 비디오 타입 / Video type\n * @property {string} [poster] - 포스터 이미지 URL / Poster image URL\n * @property {boolean} [autoPlay=true] - 자동 재생 / Auto play\n * @property {boolean} [loop=true] - 반복 재생 / Loop playback\n * @property {boolean} [muted=true] - 음소거 / Mute audio\n * @property {boolean} [controls=false] - 컨트롤 표시 / Show controls\n * @property {\"cover\" | \"contain\" | \"fill\"} [objectFit=\"cover\"] - 비디오 맞춤 / Video fit\n * @property {boolean} [overlay=true] - 오버레이 표시 / Show overlay\n * @property {string} [overlayColor=\"rgba(0, 0, 0, 0.4)\"] - 오버레이 색상 / Overlay color\n * @property {boolean} [gradient=false] - 그라디언트 오버레이 / Gradient overlay\n * @property {\"top\" | \"bottom\" | \"both\"} [gradientDirection=\"bottom\"] - 그라디언트 방향 / Gradient direction\n * @property {number} [playbackRate=1] - 재생 속도 / Playback rate\n * @property {boolean} [fadeIn=true] - 페이드 인 효과 / Fade in effect\n */\nexport interface VideoBackgroundProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n src: string;\n type?: \"native\" | \"youtube\" | \"vimeo\";\n poster?: string;\n autoPlay?: boolean;\n loop?: boolean;\n muted?: boolean;\n controls?: boolean;\n objectFit?: \"cover\" | \"contain\" | \"fill\";\n overlay?: boolean;\n overlayColor?: string;\n gradient?: boolean;\n gradientDirection?: \"top\" | \"bottom\" | \"both\";\n playbackRate?: number;\n fadeIn?: boolean;\n children?: React.ReactNode;\n}\n\n/**\n * VideoBackground 컴포넌트 / VideoBackground component\n *\n * 페이지 배경으로 사용할 수 있는 비디오 컴포넌트입니다.\n * YouTube, Vimeo, 일반 비디오 소스를 지원합니다.\n *\n * Video component that can be used as page background.\n * Supports YouTube, Vimeo, and native video sources.\n *\n * @component\n * @example\n * // Native video\n * <VideoBackground src=\"/hero-video.mp4\" overlay gradient>\n * <h1>Welcome</h1>\n * </VideoBackground>\n *\n * @example\n * // YouTube video\n * <VideoBackground\n * type=\"youtube\"\n * src=\"dQw4w9WgXcQ\"\n * overlay\n * overlayColor=\"rgba(0, 0, 50, 0.5)\"\n * />\n *\n * @example\n * // Vimeo video\n * <VideoBackground type=\"vimeo\" src=\"123456789\" />\n */\nconst VideoBackground = React.forwardRef<HTMLDivElement, VideoBackgroundProps>(\n (\n {\n src,\n type = \"native\",\n poster,\n autoPlay = true,\n loop = true,\n muted = true,\n controls = false,\n objectFit = \"cover\",\n overlay = true,\n overlayColor = \"rgba(0, 0, 0, 0.4)\",\n gradient = false,\n gradientDirection = \"bottom\",\n playbackRate = 1,\n fadeIn = true,\n children,\n className,\n style,\n ...props\n },\n ref\n ) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isLoaded, setIsLoaded] = useState(false);\n const [isPlaying, setIsPlaying] = useState(false);\n\n // Handle native video playback rate\n useEffect(() => {\n if (type === \"native\" && videoRef.current) {\n videoRef.current.playbackRate = playbackRate;\n }\n }, [playbackRate, type]);\n\n // Handle video loaded\n const handleLoadedData = () => {\n setIsLoaded(true);\n };\n\n const handlePlaying = () => {\n setIsPlaying(true);\n };\n\n // Generate YouTube embed URL\n const getYouTubeUrl = (videoId: string) => {\n const params = new URLSearchParams({\n autoplay: autoPlay ? \"1\" : \"0\",\n mute: muted ? \"1\" : \"0\",\n loop: loop ? \"1\" : \"0\",\n controls: controls ? \"1\" : \"0\",\n playlist: videoId, // Required for loop to work\n modestbranding: \"1\",\n rel: \"0\",\n showinfo: \"0\",\n iv_load_policy: \"3\",\n disablekb: \"1\",\n enablejsapi: \"1\",\n playsinline: \"1\",\n });\n return `https://www.youtube.com/embed/${videoId}?${params.toString()}`;\n };\n\n // Generate Vimeo embed URL\n const getVimeoUrl = (videoId: string) => {\n const params = new URLSearchParams({\n autoplay: autoPlay ? \"1\" : \"0\",\n muted: muted ? \"1\" : \"0\",\n loop: loop ? \"1\" : \"0\",\n controls: controls ? \"1\" : \"0\",\n background: \"1\",\n quality: \"auto\",\n dnt: \"1\",\n });\n return `https://player.vimeo.com/video/${videoId}?${params.toString()}`;\n };\n\n // Render video element based on type\n const renderVideo = () => {\n const objectFitClass = {\n cover: \"object-cover\",\n contain: \"object-contain\",\n fill: \"object-fill\",\n }[objectFit];\n\n switch (type) {\n case \"youtube\":\n return (\n <iframe\n src={getYouTubeUrl(src)}\n className={merge(\n \"absolute inset-0 w-full h-full pointer-events-none\",\n \"scale-[1.2]\" // Scale up to hide YouTube branding\n )}\n style={{\n opacity: isLoaded || !fadeIn ? 1 : 0,\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\n }}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n onLoad={() => setIsLoaded(true)}\n title=\"YouTube video background\"\n />\n );\n\n case \"vimeo\":\n return (\n <iframe\n src={getVimeoUrl(src)}\n className=\"absolute inset-0 w-full h-full pointer-events-none\"\n style={{\n opacity: isLoaded || !fadeIn ? 1 : 0,\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\n }}\n allow=\"autoplay; fullscreen; picture-in-picture\"\n allowFullScreen\n onLoad={() => setIsLoaded(true)}\n title=\"Vimeo video background\"\n />\n );\n\n case \"native\":\n default:\n return (\n <video\n ref={videoRef}\n src={src}\n poster={poster}\n autoPlay={autoPlay}\n loop={loop}\n muted={muted}\n controls={controls}\n playsInline\n className={merge(\n \"absolute inset-0 w-full h-full\",\n objectFitClass\n )}\n style={{\n opacity: isPlaying || !fadeIn ? 1 : 0,\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\n }}\n onLoadedData={handleLoadedData}\n onPlaying={handlePlaying}\n />\n );\n }\n };\n\n // Generate gradient overlay\n const renderGradientOverlay = () => {\n if (!gradient) return null;\n\n const gradients = [];\n\n if (gradientDirection === \"top\" || gradientDirection === \"both\") {\n gradients.push(\n <div\n key=\"top\"\n className=\"absolute top-0 left-0 right-0 h-1/3\"\n style={{\n background: `linear-gradient(to bottom, ${overlayColor}, transparent)`,\n }}\n aria-hidden=\"true\"\n />\n );\n }\n\n if (gradientDirection === \"bottom\" || gradientDirection === \"both\") {\n gradients.push(\n <div\n key=\"bottom\"\n className=\"absolute bottom-0 left-0 right-0 h-1/3\"\n style={{\n background: `linear-gradient(to top, ${overlayColor}, transparent)`,\n }}\n aria-hidden=\"true\"\n />\n );\n }\n\n return <>{gradients}</>;\n };\n\n // Check if className contains position class (fixed, absolute, sticky)\n const hasPositionClass = className && /\\b(fixed|absolute|sticky)\\b/.test(className);\n\n return (\n <div\n ref={ref}\n className={merge(\n \"overflow-hidden\",\n !hasPositionClass && \"relative\",\n className\n )}\n style={style}\n {...props}\n >\n {/* Poster image (shows until video loads) */}\n {poster && fadeIn && !isLoaded && !isPlaying && (\n <div\n className=\"absolute inset-0 bg-cover bg-center\"\n style={{ backgroundImage: `url(${poster})` }}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Video layer */}\n {renderVideo()}\n\n {/* Solid overlay */}\n {overlay && !gradient && (\n <div\n className=\"absolute inset-0\"\n style={{ backgroundColor: overlayColor }}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Gradient overlay */}\n {renderGradientOverlay()}\n\n {/* Content */}\n {children && (\n <div className=\"relative z-10 h-full\">\n {children}\n </div>\n )}\n </div>\n );\n }\n);\n\nVideoBackground.displayName = \"VideoBackground\";\n\nexport { VideoBackground };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\n\nexport interface ImageRevealProps\n extends React.HTMLAttributes<HTMLDivElement> {\n /** 이미지 src */\n src: string;\n /** 이미지 alt */\n alt: string;\n /** 공개 방향 @default 'left' */\n direction?: \"left\" | \"right\" | \"up\" | \"down\";\n /** 공개 시작 임계값 (0-1) @default 0.3 */\n threshold?: number;\n /** 이미지 높이 @default '400px' */\n height?: string;\n /** 오버레이 색상 */\n overlayColor?: string;\n}\n\n/**\n * ImageReveal - 스크롤 기반 이미지 공개 컴포넌트\n *\n * TextReveal에서 영감 받은 이미지 공개 효과.\n * clip-path를 사용하여 스크롤에 따라 이미지가 점진적으로 드러남.\n */\nconst ImageReveal = React.forwardRef<HTMLDivElement, ImageRevealProps>(\n (\n {\n src,\n alt,\n direction = \"left\",\n threshold = 0.3,\n height = \"400px\",\n overlayColor,\n className,\n style,\n ...props\n },\n ref\n ) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [progress, setProgress] = useState(0);\n\n const prefersReducedMotion = useReducedMotion();\n\n const updateProgress = useCallback(() => {\n if (!containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n const vh = window.innerHeight;\n\n const start = vh * (1 - threshold);\n const end = vh * threshold;\n const elementCenter = rect.top + rect.height / 2;\n\n let p = 0;\n if (elementCenter <= start && elementCenter >= end) {\n p = (start - elementCenter) / (start - end);\n } else if (elementCenter < end) {\n p = 1;\n }\n\n setProgress(Math.max(0, Math.min(1, p)));\n }, [threshold]);\n\n useEffect(() => {\n if (prefersReducedMotion) {\n setProgress(1);\n return;\n }\n\n updateProgress();\n const handleScroll = () => requestAnimationFrame(updateProgress);\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n window.addEventListener(\"resize\", handleScroll, { passive: true });\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", handleScroll);\n };\n }, [updateProgress, prefersReducedMotion]);\n\n const clipPath = getClipPath(direction, progress);\n\n return (\n <div\n ref={mergeRefs(ref, containerRef)}\n className={merge(\"relative overflow-hidden\", className)}\n style={{ height, ...style }}\n {...props}\n >\n <img\n src={src}\n alt={alt}\n className=\"absolute inset-0 w-full h-full object-cover\"\n style={{\n clipPath,\n transition: \"clip-path 0.1s ease-out\",\n }}\n />\n {overlayColor && (\n <div\n className=\"absolute inset-0 pointer-events-none\"\n style={{\n background: overlayColor,\n opacity: 1 - progress,\n transition: \"opacity 0.3s ease-out\",\n }}\n aria-hidden=\"true\"\n />\n )}\n </div>\n );\n }\n);\n\nImageReveal.displayName = \"ImageReveal\";\n\nfunction getClipPath(direction: string, progress: number): string {\n switch (direction) {\n case \"left\":\n return `inset(0 ${100 - progress * 100}% 0 0)`;\n case \"right\":\n return `inset(0 0 0 ${100 - progress * 100}%)`;\n case \"up\":\n return `inset(0 0 ${100 - progress * 100}% 0)`;\n case \"down\":\n return `inset(${100 - progress * 100}% 0 0 0)`;\n default:\n return `inset(0 ${100 - progress * 100}% 0 0)`;\n }\n}\n\nfunction mergeRefs<T>(\n ...refs: (React.Ref<T> | undefined)[]\n): React.RefCallback<T> {\n return (value) => {\n refs.forEach((r) => {\n if (typeof r === \"function\") r(value);\n else if (r && typeof r === \"object\")\n (r as React.MutableRefObject<T | null>).current = value;\n });\n };\n}\n\nexport { ImageReveal };\n","\"use client\";\n\nimport React, { useState, useEffect, useCallback, useMemo } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\nexport interface DotNavItem {\n /** 섹션 ID (scroll target) */\n id: string;\n /** 라벨 (호버 시 표시) */\n label?: string;\n}\n\nexport interface DotNavProps extends React.HTMLAttributes<HTMLElement> {\n /** 섹션 목록 */\n items: DotNavItem[];\n /** 위치 @default 'right' */\n position?: \"left\" | \"right\";\n /** 활성 색상 @default 'bg-primary' */\n activeColor?: string;\n /** 비활성 색상 @default 'bg-muted-foreground/30' */\n inactiveColor?: string;\n}\n\n/**\n * DotNav - 섹션 도트 네비게이터\n *\n * 포트폴리오/immersive 테마용 고정 위치 네비게이션.\n * 스크롤 위치에 따라 활성 섹션 자동 추적.\n */\nconst DotNav = React.forwardRef<HTMLElement, DotNavProps>(\n (\n {\n items,\n position = \"right\",\n activeColor = \"bg-primary\",\n inactiveColor = \"bg-muted-foreground/30\",\n className,\n ...props\n },\n ref\n ) => {\n const [activeIndex, setActiveIndex] = useState(0);\n\n const updateActive = useCallback(() => {\n const vh = window.innerHeight;\n let closest = 0;\n let closestDist = Infinity;\n\n items.forEach((item, i) => {\n const el = document.getElementById(item.id);\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const dist = Math.abs(rect.top - vh * 0.3);\n if (dist < closestDist) {\n closestDist = dist;\n closest = i;\n }\n });\n\n setActiveIndex(closest);\n }, [items]);\n\n useEffect(() => {\n updateActive();\n window.addEventListener(\"scroll\", updateActive, { passive: true });\n return () => window.removeEventListener(\"scroll\", updateActive);\n }, [updateActive]);\n\n const handleClick = useCallback(\n (id: string) => {\n const el = document.getElementById(id);\n if (el) {\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n },\n []\n );\n\n const positionClass = useMemo(\n () => (position === \"left\" ? \"left-4\" : \"right-4\"),\n [position]\n );\n\n return (\n <nav\n ref={ref}\n className={merge(\n \"fixed top-1/2 -translate-y-1/2 z-40 flex flex-col gap-3\",\n positionClass,\n className\n )}\n aria-label=\"Section navigation\"\n {...props}\n >\n {items.map((item, i) => (\n <button\n key={item.id}\n onClick={() => handleClick(item.id)}\n className={merge(\n \"group relative w-3 h-3 rounded-full transition-all duration-300\",\n i === activeIndex\n ? `${activeColor} scale-125`\n : `${inactiveColor} hover:scale-110`\n )}\n aria-label={item.label || item.id}\n aria-current={i === activeIndex ? \"true\" : undefined}\n >\n {item.label && (\n <span\n className={merge(\n \"absolute top-1/2 -translate-y-1/2 whitespace-nowrap px-2 py-1 text-xs rounded bg-popover text-popover-foreground shadow-md opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none\",\n position === \"right\" ? \"right-full mr-2\" : \"left-full ml-2\"\n )}\n >\n {item.label}\n </span>\n )}\n </button>\n ))}\n </nav>\n );\n }\n);\n\nDotNav.displayName = \"DotNav\";\n\nexport { DotNav };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\nexport interface HorizontalScrollProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onProgress'> {\n /** 가로 스크롤 컨텐츠 */\n children: React.ReactNode;\n /** 스크롤 높이 배율 (패널 수 × 이 값 = 총 스크롤 높이) @default 1 */\n heightMultiplier?: number;\n /** 스냅 여부 @default false */\n snap?: boolean;\n /** 진행률 콜백 */\n onProgress?: (progress: number) => void;\n}\n\n/**\n * HorizontalScroll - 세로 스크롤을 가로 스크롤로 변환\n *\n * sticky positioning + translateX로 구현.\n * 세로 스크롤 입력을 가로 이동으로 매핑합니다.\n */\nconst HorizontalScroll = React.forwardRef<HTMLDivElement, HorizontalScrollProps>(\n (\n {\n children,\n heightMultiplier = 1,\n snap = false,\n onProgress,\n className,\n style,\n ...props\n },\n ref\n ) => {\n const outerRef = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLDivElement>(null);\n const [scrollWidth, setScrollWidth] = useState(0);\n const [progress, setProgress] = useState(0);\n\n // Measure content width\n useEffect(() => {\n if (!innerRef.current) return;\n const measure = () => {\n if (innerRef.current) {\n setScrollWidth(innerRef.current.scrollWidth - window.innerWidth);\n }\n };\n measure();\n\n const ro = new ResizeObserver(measure);\n ro.observe(innerRef.current);\n return () => ro.disconnect();\n }, [children]);\n\n // Track scroll and convert to horizontal\n const handleScroll = useCallback(() => {\n if (!outerRef.current || scrollWidth <= 0) return;\n\n const rect = outerRef.current.getBoundingClientRect();\n const outerHeight = outerRef.current.offsetHeight - window.innerHeight;\n const scrolled = -rect.top;\n\n const p = Math.max(0, Math.min(1, scrolled / outerHeight));\n setProgress(p);\n onProgress?.(p);\n }, [scrollWidth, onProgress]);\n\n useEffect(() => {\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [handleScroll]);\n\n const panelCount = React.Children.count(children);\n const totalHeight = `${panelCount * heightMultiplier * 100}vh`;\n\n return (\n <div\n ref={mergeRefs(ref, outerRef)}\n className={merge(\"relative\", className)}\n style={{ height: totalHeight, ...style }}\n {...props}\n >\n <div className=\"sticky top-0 h-screen overflow-hidden\">\n <div\n ref={innerRef}\n className={merge(\n \"flex h-full will-change-transform\",\n snap && \"scroll-snap-x\"\n )}\n style={{\n transform: `translateX(${-progress * scrollWidth}px)`,\n }}\n >\n {React.Children.map(children, (child, i) => (\n <div\n key={i}\n className={merge(\n \"flex-shrink-0 w-screen h-full\",\n snap && \"snap-start\"\n )}\n >\n {child}\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n }\n);\n\nHorizontalScroll.displayName = \"HorizontalScroll\";\n\nfunction mergeRefs<T>(\n ...refs: (React.Ref<T> | undefined)[]\n): React.RefCallback<T> {\n return (value) => {\n refs.forEach((r) => {\n if (typeof r === \"function\") r(value);\n else if (r && typeof r === \"object\")\n (r as React.MutableRefObject<T | null>).current = value;\n });\n };\n}\n\nexport { HorizontalScroll };\n","/**\n * 슬러그 생성 유틸리티\n * Slug generation utilities\n */\n\n/**\n * 제목에서 URL 슬러그 생성\n * Generate URL slug from title\n *\n * @param title - 제목 / Title\n * @returns 슬러그 / Slug\n *\n * @example\n * ```ts\n * generateSlug('Hello World') // 'hello-world'\n * generateSlug('안녕하세요') // '안녕하세요'\n * generateSlug('Hello 안녕') // 'hello-안녕'\n * ```\n */\nexport function generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9가-힣ぁ-んァ-ン一-龯_.~\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n .trim()\n}\n\n/**\n * 슬러그 유효성 검사\n * Validate slug\n *\n * @param slug - 슬러그 / Slug\n * @returns 유효 여부 / Whether valid\n */\nexport function isValidSlug(slug: string): boolean {\n if (!slug || slug.length === 0) return false\n if (slug.length > 200) return false\n\n // 슬러그 형식 검사: 영문, 숫자, 한글, 일본어, 하이픈만 허용\n const slugPattern = /^[a-z0-9가-힣ぁ-んァ-ン一-龯_.~-]+$/\n return slugPattern.test(slug)\n}\n\n/**\n * 슬러그 정규화 (입력된 슬러그를 유효한 형식으로 변환)\n * Normalize slug (convert input to valid format)\n *\n * @param input - 입력값 / Input value\n * @returns 정규화된 슬러그 / Normalized slug\n */\nexport function normalizeSlug(input: string): string {\n return input\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9가-힣ぁ-んァ-ン一-龯_.~-]/g, '')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n","\"use client\"\n\nimport React, { createContext, useContext, useState, useCallback, useMemo, useEffect, useRef } from 'react'\nimport type {\n BlogEditorContextValue,\n BlogEditorData,\n BlogEditorProps,\n BlogEditorLabels,\n BlogEditorFeatures,\n LanguageConfig,\n MultilingualField,\n} from './types'\nimport { generateSlug as generateSlugUtil } from './utils/slug'\n\n/**\n * 기본 레이블 / Default labels\n */\nconst DEFAULT_LABELS: BlogEditorLabels = {\n // Header\n pageTitle: '새 글 작성',\n editTitle: '글 수정',\n preview: '미리보기',\n editMode: '편집',\n\n // Metadata\n basicInfo: '기본 정보',\n slug: '슬러그',\n slugPrefix: '/blog/',\n tags: '태그',\n tagsPlaceholder: '개발, 일상, 업데이트',\n coverImage: '커버 이미지 URL',\n coverImagePlaceholder: 'https://example.com/image.jpg',\n publishDate: '발행 예약일시',\n publishDateHint: '비워두면 즉시 발행됨',\n expiresAt: '만료 일시',\n expiresAtHint: '비워두면 만료되지 않음',\n\n // Content\n titleLabel: '제목',\n titlePlaceholder: '제목을 입력하세요',\n excerpt: '요약',\n excerptPlaceholder: '카드에 표시될 짧은 요약',\n contentLabel: '본문',\n contentPlaceholder: '마크다운으로 작성하세요...',\n\n // Actions\n cancel: '취소',\n saveDraft: '임시저장',\n publish: '발행',\n update: '수정 완료',\n saving: '저장 중...',\n\n // Translation\n translateHint: 'AI 번역 기능',\n translateButton: 'AI 번역',\n translating: '번역 중...',\n translateSuccess: '번역 완료!',\n\n // Errors\n requiredFields: '필수 필드를 입력해주세요',\n saveError: '저장 중 오류 발생',\n translateError: '번역 중 오류 발생',\n noTitle: '제목 없음',\n\n // Toolbar\n bold: '굵게',\n italic: '기울임',\n strikethrough: '취소선',\n heading: '제목',\n link: '링크',\n image: '이미지',\n code: '코드',\n codeBlock: '코드블록',\n quote: '인용문',\n list: '목록',\n orderedList: '순서 목록',\n horizontalRule: '수평선',\n}\n\n/**\n * 기본 기능 / Default features\n */\nconst DEFAULT_FEATURES: Required<BlogEditorFeatures> = {\n enableSlug: true,\n enableTags: true,\n enableCoverImage: true,\n enablePublishDate: true,\n enableExcerpt: true,\n enableTranslation: true,\n enablePreview: true,\n enableMarkdownToolbar: true,\n enableAutoSave: true,\n enableExpiresAt: false,\n}\n\n/**\n * 기본 언어 / Default languages\n */\nconst DEFAULT_LANGUAGES: LanguageConfig[] = [\n { key: 'ko', label: '한국어', isPrimary: true, flag: '🇰🇷' },\n { key: 'en', label: 'English', flag: '🇺🇸' },\n { key: 'ja', label: '日本語', flag: '🇯🇵' },\n]\n\n/**\n * 빈 다국어 필드 생성 / Create empty multilingual field\n */\nfunction createEmptyMultilingualField(languages: LanguageConfig[]): MultilingualField {\n const field: MultilingualField = {}\n languages.forEach((lang) => {\n field[lang.key] = ''\n })\n return field\n}\n\n/**\n * 초기 데이터 생성 / Create initial data\n */\nfunction createInitialData(\n languages: LanguageConfig[],\n initialData?: Partial<BlogEditorData>\n): BlogEditorData {\n return {\n slug: initialData?.slug ?? '',\n title: initialData?.title ?? createEmptyMultilingualField(languages),\n excerpt: initialData?.excerpt ?? createEmptyMultilingualField(languages),\n content: initialData?.content ?? createEmptyMultilingualField(languages),\n tags: initialData?.tags ?? [],\n coverImage: initialData?.coverImage ?? '',\n publishedAt: initialData?.publishedAt ?? null,\n expiresAt: initialData?.expiresAt ?? null,\n }\n}\n\n/**\n * BlogEditor 컨텍스트 / BlogEditor context\n */\nconst BlogEditorContext = createContext<BlogEditorContextValue | null>(null)\n\n/**\n * BlogEditor 컨텍스트 훅 / BlogEditor context hook\n */\nexport function useBlogEditor(): BlogEditorContextValue {\n const context = useContext(BlogEditorContext)\n if (!context) {\n throw new Error('useBlogEditor must be used within a BlogEditorProvider')\n }\n return context\n}\n\n/**\n * BlogEditor 프로바이더 Props / BlogEditor provider props\n */\ninterface BlogEditorProviderProps extends BlogEditorProps {\n children: React.ReactNode\n}\n\n/**\n * BlogEditor 프로바이더 / BlogEditor provider\n */\nexport function BlogEditorProvider({\n children,\n initialData,\n isEditMode = false,\n languages = DEFAULT_LANGUAGES,\n defaultLanguage,\n labels: userLabels,\n callbacks,\n features: userFeatures,\n variant = 'default',\n autoSaveKey,\n autoSaveInterval = 3000,\n}: BlogEditorProviderProps) {\n // 언어 설정\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key ?? languages[0]?.key ?? 'ko'\n const initialLanguage = defaultLanguage ?? primaryLanguage\n\n // 병합된 설정\n const labels = useMemo<BlogEditorLabels>(\n () => ({ ...DEFAULT_LABELS, ...userLabels }),\n [userLabels]\n )\n const features = useMemo<Required<BlogEditorFeatures>>(\n () => ({ ...DEFAULT_FEATURES, ...userFeatures }),\n [userFeatures]\n )\n\n // 상태\n const [formData, setFormData] = useState<BlogEditorData>(() =>\n createInitialData(languages, initialData)\n )\n const [activeLanguage, setActiveLanguage] = useState(initialLanguage)\n const [showPreview, setShowPreview] = useState(false)\n const [submitting, setSubmitting] = useState(false)\n const [translating, setTranslating] = useState(false)\n const [uploading, setUploading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [translateSuccess, setTranslateSuccess] = useState(false)\n // 슬러그가 사용자에 의해 수동 편집되었는지 추적\n const [slugManuallyEdited, setSlugManuallyEdited] = useState(isEditMode || !!initialData?.slug)\n const [autoSaveStatus, setAutoSaveStatus] = useState<'idle' | 'saving' | 'saved'>('idle')\n const autoSaveTimerRef = useRef<NodeJS.Timeout | null>(null)\n const isInitialMount = useRef(true)\n\n // 자동저장 키 생성 / Generate auto-save key\n const storageKey = autoSaveKey || (isEditMode ? null : 'blog-editor-draft')\n\n // localStorage에서 복원 (새 글 작성 모드만) / Restore from localStorage (create mode only)\n useEffect(() => {\n if (!features.enableAutoSave || !storageKey || isEditMode) return\n\n try {\n const saved = localStorage.getItem(storageKey)\n if (saved) {\n const parsed = JSON.parse(saved) as BlogEditorData\n setFormData(parsed)\n }\n } catch {\n // 파싱 실패 시 무시\n }\n }, []) // 마운트 시 한 번만 실행\n\n // 자동저장 / Auto-save to localStorage\n useEffect(() => {\n if (!features.enableAutoSave || !storageKey) return\n\n // 초기 마운트 시에는 저장하지 않음\n if (isInitialMount.current) {\n isInitialMount.current = false\n return\n }\n\n // 기존 타이머 취소\n if (autoSaveTimerRef.current) {\n clearTimeout(autoSaveTimerRef.current)\n }\n\n setAutoSaveStatus('saving')\n\n // debounce 저장\n autoSaveTimerRef.current = setTimeout(() => {\n try {\n localStorage.setItem(storageKey, JSON.stringify(formData))\n setAutoSaveStatus('saved')\n // 3초 후 idle로\n setTimeout(() => setAutoSaveStatus('idle'), 2000)\n } catch {\n setAutoSaveStatus('idle')\n }\n }, autoSaveInterval)\n\n return () => {\n if (autoSaveTimerRef.current) {\n clearTimeout(autoSaveTimerRef.current)\n }\n }\n }, [formData, features.enableAutoSave, storageKey, autoSaveInterval])\n\n // 저장 성공 시 localStorage 초기화 / Clear localStorage on successful save\n const clearAutoSave = useCallback(() => {\n if (storageKey) {\n try {\n localStorage.removeItem(storageKey)\n } catch {\n // 무시\n }\n }\n }, [storageKey])\n\n // 필드 업데이트 / Update field\n const updateField = useCallback(\n <K extends keyof BlogEditorData>(field: K, value: BlogEditorData[K]) => {\n setFormData((prev) => ({ ...prev, [field]: value }))\n },\n []\n )\n\n // 다국어 필드 업데이트 / Update multilingual field\n const updateMultilingualField = useCallback(\n (field: 'title' | 'excerpt' | 'content', language: string, value: string) => {\n setFormData((prev) => ({\n ...prev,\n [field]: {\n ...prev[field],\n [language]: value,\n },\n }))\n },\n []\n )\n\n // 슬러그 생성 / Generate slug\n const generateSlug = useCallback((title: string) => {\n return generateSlugUtil(title)\n }, [])\n\n // 저장 핸들러 / Save handler\n const handleSave = useCallback(\n async (publish: boolean) => {\n // 유효성 검사\n const primaryTitle = formData.title[primaryLanguage]\n const primaryContent = formData.content[primaryLanguage]\n\n if (!primaryTitle || !primaryContent) {\n setError(labels.requiredFields)\n return\n }\n\n if (features.enableSlug && !formData.slug) {\n setError(labels.requiredFields)\n return\n }\n\n setSubmitting(true)\n setError(null)\n\n try {\n await callbacks.onSave(formData, publish)\n // 저장 성공 시 자동저장 데이터 삭제\n clearAutoSave()\n } catch (err) {\n setError(labels.saveError)\n } finally {\n setSubmitting(false)\n }\n },\n [formData, primaryLanguage, labels, features, callbacks, clearAutoSave]\n )\n\n // 번역 핸들러 / Translate handler\n const handleTranslate = useCallback(async () => {\n if (!callbacks.onTranslate) return\n\n const primaryTitle = formData.title[primaryLanguage]\n const primaryContent = formData.content[primaryLanguage]\n const primaryExcerpt = formData.excerpt[primaryLanguage]\n\n if (!primaryTitle || !primaryContent) {\n setError(labels.requiredFields)\n return\n }\n\n setTranslating(true)\n setError(null)\n setTranslateSuccess(false)\n\n try {\n const translations = await callbacks.onTranslate({\n sourceLanguage: primaryLanguage,\n title: primaryTitle,\n content: primaryContent,\n excerpt: primaryExcerpt || undefined,\n })\n\n // 번역 결과 적용\n setFormData((prev) => {\n const newTitle = { ...prev.title }\n const newContent = { ...prev.content }\n const newExcerpt = { ...prev.excerpt }\n\n // translations는 { title: MultilingualField, content: MultilingualField, excerpt: MultilingualField } 형태일 수 있음\n // 또는 단순히 { ko: { title, content, excerpt }, en: { ... }, ja: { ... } } 형태일 수 있음\n // 여기서는 콜백이 언어별 번역을 반환한다고 가정\n Object.keys(translations).forEach((langKey) => {\n if (langKey !== primaryLanguage) {\n const translation = translations[langKey]\n if (typeof translation === 'object' && translation !== null) {\n const trans = translation as { title?: string; content?: string; excerpt?: string }\n if (trans.title) newTitle[langKey] = trans.title\n if (trans.content) newContent[langKey] = trans.content\n if (trans.excerpt) newExcerpt[langKey] = trans.excerpt\n }\n }\n })\n\n return {\n ...prev,\n title: newTitle,\n content: newContent,\n excerpt: newExcerpt,\n }\n })\n\n setTranslateSuccess(true)\n setTimeout(() => setTranslateSuccess(false), 3000)\n } catch (err) {\n setError(labels.translateError)\n } finally {\n setTranslating(false)\n }\n }, [formData, primaryLanguage, labels, callbacks])\n\n // 이미지 업로드 핸들러 / Image upload handler\n const handleUploadImage = useCallback(async (file: File): Promise<string | null> => {\n if (!callbacks.onUploadImage) return null\n\n setUploading(true)\n setError(null)\n\n try {\n const url = await callbacks.onUploadImage(file)\n return url\n } catch (err) {\n setError('이미지 업로드 실패')\n return null\n } finally {\n setUploading(false)\n }\n }, [callbacks])\n\n // 취소 핸들러 / Cancel handler\n const handleCancel = useCallback(() => {\n callbacks.onCancel?.()\n }, [callbacks])\n\n // 컨텍스트 값\n const value = useMemo<BlogEditorContextValue>(\n () => ({\n // State\n formData,\n activeLanguage,\n showPreview,\n submitting,\n translating,\n uploading,\n error,\n translateSuccess,\n autoSaveStatus,\n\n // Config\n languages,\n features,\n labels,\n variant,\n isEditMode,\n\n // Actions\n setActiveLanguage,\n setShowPreview,\n updateField,\n updateMultilingualField,\n handleSave,\n handleTranslate,\n handleUploadImage,\n handleCancel,\n setError,\n generateSlug,\n slugManuallyEdited,\n setSlugManuallyEdited,\n }),\n [\n formData,\n activeLanguage,\n showPreview,\n submitting,\n translating,\n uploading,\n error,\n translateSuccess,\n autoSaveStatus,\n languages,\n features,\n labels,\n variant,\n isEditMode,\n updateField,\n updateMultilingualField,\n handleSave,\n handleTranslate,\n handleUploadImage,\n handleCancel,\n generateSlug,\n slugManuallyEdited,\n setSlugManuallyEdited,\n ]\n )\n\n return <BlogEditorContext.Provider value={value}>{children}</BlogEditorContext.Provider>\n}\n\nexport { BlogEditorContext }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorHeader Props\n */\nexport interface BlogEditorHeaderProps {\n /** 뒤로가기 콜백 / Back navigation callback */\n onBack?: () => void\n /** 뒤로가기 링크 컴포넌트 / Back link component */\n backLink?: React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorHeader 컴포넌트\n * 에디터 헤더 (제목 + 미리보기 토글)\n */\nconst BlogEditorHeader = React.forwardRef<HTMLElement, BlogEditorHeaderProps>(\n ({ onBack, backLink, className }, ref) => {\n const { labels, isEditMode, formData } = useBlogEditor()\n\n return (\n <header\n ref={ref}\n className={merge('flex items-center justify-between mb-8', className)}\n >\n <div className=\"flex items-center gap-4\">\n {backLink || (\n onBack && (\n <button\n type=\"button\"\n onClick={onBack}\n className=\"p-2 text-muted-foreground hover:text-foreground transition-colors\"\n aria-label=\"뒤로가기\"\n >\n <Icon name=\"chevronLeft\" size={24} />\n </button>\n )\n )}\n <div>\n <h1 className=\"text-2xl font-bold text-foreground\">\n {isEditMode ? labels.editTitle : labels.pageTitle}\n </h1>\n {isEditMode && formData.slug && (\n <p className=\"text-sm text-muted-foreground\">\n {labels.slugPrefix}{formData.slug}\n </p>\n )}\n </div>\n </div>\n </header>\n )\n }\n)\n\nBlogEditorHeader.displayName = 'BlogEditorHeader'\n\nexport { BlogEditorHeader }\n","\"use client\"\n\nimport React, { useState, useCallback, useRef, KeyboardEvent, ChangeEvent } from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\nimport { normalizeSlug } from './utils/slug'\n\n/**\n * BlogEditorMetadata Props\n */\nexport interface BlogEditorMetadataProps {\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorMetadata 컴포넌트\n * 메타데이터 필드 (슬러그, 태그, 커버 이미지, 발행일)\n */\nconst BlogEditorMetadata = React.forwardRef<HTMLDivElement, BlogEditorMetadataProps>(\n ({ className }, ref) => {\n const { formData, updateField, features, labels, variant, handleUploadImage, uploading, setSlugManuallyEdited } = useBlogEditor()\n const [tagInput, setTagInput] = useState('')\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const containerClasses = merge(\n 'rounded-xl p-6 space-y-4',\n variant === 'glass'\n ? 'bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-background/20 dark:border-border/50'\n : variant === 'minimal'\n ? 'bg-transparent'\n : 'bg-background',\n className\n )\n\n const inputClasses =\n 'w-full px-3 py-2 border border-border rounded-lg bg-background text-foreground focus:ring-1 focus:ring-ring focus:border-transparent transition-colors'\n\n const labelClasses = 'block text-sm font-medium text-foreground mb-1'\n\n // 태그 추가\n const addTag = useCallback((tag: string) => {\n const trimmed = tag.trim()\n if (trimmed && !formData.tags.includes(trimmed)) {\n updateField('tags', [...formData.tags, trimmed])\n }\n setTagInput('')\n }, [formData.tags, updateField])\n\n // 태그 삭제\n const removeTag = useCallback((tagToRemove: string) => {\n updateField('tags', formData.tags.filter((t) => t !== tagToRemove))\n }, [formData.tags, updateField])\n\n // 태그 입력 핸들러\n const handleTagInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n // 쉼표 입력 시 태그 추가\n if (value.includes(',')) {\n const parts = value.split(',')\n parts.forEach((part, idx) => {\n if (idx < parts.length - 1) {\n // 마지막이 아닌 부분들은 태그로 추가\n addTag(part)\n } else {\n // 마지막 부분은 입력창에 유지\n setTagInput(part)\n }\n })\n } else {\n setTagInput(value)\n }\n }, [addTag])\n\n // 키보드 이벤트 핸들러\n const handleTagKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n addTag(tagInput)\n } else if (e.key === 'Backspace' && !tagInput && formData.tags.length > 0) {\n // 입력창이 비어있을 때 Backspace 누르면 마지막 태그 삭제\n removeTag(formData.tags[formData.tags.length - 1])\n }\n }, [tagInput, formData.tags, addTag, removeTag])\n\n return (\n <div ref={ref} className={containerClasses}>\n <h2 className=\"font-semibold text-foreground\">{labels.basicInfo}</h2>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {/* 슬러그 */}\n {features.enableSlug && (\n <div>\n <label className={labelClasses}>\n {labels.slug} *\n </label>\n <div className=\"flex items-center\">\n <span className=\"text-muted-foreground mr-1 text-sm\">\n {labels.slugPrefix}\n </span>\n <input\n type=\"text\"\n value={formData.slug}\n onChange={(e) => {\n updateField('slug', normalizeSlug(e.target.value))\n setSlugManuallyEdited(true)\n }}\n className={merge(inputClasses, 'flex-1')}\n placeholder=\"my-post-slug\"\n />\n </div>\n </div>\n )}\n\n {/* 태그 */}\n {features.enableTags && (\n <div>\n <label className={labelClasses}>{labels.tags}</label>\n <div className={merge(\n 'flex flex-wrap items-center gap-2 min-h-[42px] px-3 py-2 border border-border rounded-lg bg-background focus-within:ring-1 focus-within:ring-ring focus-within:border-transparent transition-colors'\n )}>\n {/* 태그 칩들 */}\n {formData.tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-primary/10 text-primary text-sm rounded-md\"\n >\n {tag}\n <button\n type=\"button\"\n onClick={() => removeTag(tag)}\n className=\"hover:text-primary transition-colors\"\n aria-label={`${tag} 태그 삭제`}\n >\n <Icon name=\"x\" size={14} />\n </button>\n </span>\n ))}\n {/* 입력창 */}\n <input\n type=\"text\"\n value={tagInput}\n onChange={handleTagInputChange}\n onKeyDown={handleTagKeyDown}\n className=\"flex-1 min-w-[100px] bg-transparent outline-none text-foreground text-sm\"\n placeholder={formData.tags.length === 0 ? labels.tagsPlaceholder : '태그 추가...'}\n />\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n 쉼표(,) 또는 Enter로 태그 추가\n </p>\n </div>\n )}\n </div>\n\n {/* 커버 이미지 */}\n {features.enableCoverImage && (\n <div>\n <label className={labelClasses}>{labels.coverImage}</label>\n <div className=\"space-y-3\">\n {/* 이미지 미리보기 */}\n {formData.coverImage && (\n <div className=\"relative w-full h-40 rounded-lg overflow-hidden bg-muted\">\n <img\n src={formData.coverImage}\n alt=\"커버 이미지 미리보기\"\n className=\"w-full h-full object-cover\"\n />\n <button\n type=\"button\"\n onClick={() => updateField('coverImage', '')}\n className=\"absolute top-2 right-2 p-1.5 bg-red-500 text-white rounded-full hover:bg-red-600 transition-colors\"\n aria-label=\"이미지 삭제\"\n >\n <Icon name=\"x\" size={14} />\n </button>\n </div>\n )}\n\n {/* URL 입력 + 파일 업로드 */}\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={formData.coverImage}\n onChange={(e) => updateField('coverImage', e.target.value)}\n className={merge(inputClasses, 'flex-1')}\n placeholder={labels.coverImagePlaceholder}\n />\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={async (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n const url = await handleUploadImage(file)\n if (url) {\n updateField('coverImage', url)\n }\n }\n // 같은 파일 다시 선택할 수 있도록 초기화\n e.target.value = ''\n }}\n />\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={uploading}\n className=\"px-3 py-2 border border-border rounded-lg hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n title=\"이미지 업로드\"\n >\n {uploading ? (\n <Icon name=\"loader\" size={20} spin />\n ) : (\n <Icon name=\"upload\" size={20} />\n )}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* 발행일 & 만료일 */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {features.enablePublishDate && (\n <div>\n <label className={labelClasses}>{labels.publishDate}</label>\n <input\n type=\"datetime-local\"\n value={formData.publishedAt ?? ''}\n onChange={(e) => updateField('publishedAt', e.target.value || null)}\n className={inputClasses}\n />\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {labels.publishDateHint}\n </p>\n </div>\n )}\n\n {features.enableExpiresAt && (\n <div>\n <label className={labelClasses}>{labels.expiresAt}</label>\n <input\n type=\"datetime-local\"\n value={formData.expiresAt ?? ''}\n onChange={(e) => updateField('expiresAt', e.target.value || null)}\n className={inputClasses}\n />\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {labels.expiresAtHint}\n </p>\n </div>\n )}\n </div>\n </div>\n )\n }\n)\n\nBlogEditorMetadata.displayName = 'BlogEditorMetadata'\n\nexport { BlogEditorMetadata }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorLanguageTabs Props\n */\nexport interface BlogEditorLanguageTabsProps {\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorLanguageTabs 컴포넌트\n * 언어 탭 네비게이션 + 미리보기 토글 (sticky)\n */\nconst BlogEditorLanguageTabs = React.forwardRef<HTMLDivElement, BlogEditorLanguageTabsProps>(\n ({ className }, ref) => {\n const { languages, activeLanguage, setActiveLanguage, showPreview, setShowPreview, features, labels } = useBlogEditor()\n\n return (\n <div\n ref={ref}\n className={merge(\n 'flex items-center border-b border-border sticky top-0 z-10 bg-background',\n className\n )}\n role=\"tablist\"\n aria-label=\"언어 선택\"\n >\n <div className=\"flex flex-1\">\n {languages.map((lang) => {\n const isActive = activeLanguage === lang.key\n const isPrimary = lang.isPrimary\n\n return (\n <button\n key={lang.key}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`tabpanel-${lang.key}`}\n id={`tab-${lang.key}`}\n onClick={() => setActiveLanguage(lang.key)}\n className={merge(\n 'flex-1 px-4 py-3 text-sm font-medium transition-colors',\n isActive\n ? 'bg-primary/10 text-primary border-b-2 border-primary'\n : 'text-muted-foreground hover:bg-muted'\n )}\n >\n {lang.flag && <span className=\"mr-1.5\">{lang.flag}</span>}\n {lang.label}\n {isPrimary && ' *'}\n </button>\n )\n })}\n </div>\n\n {features.enablePreview && (\n <button\n type=\"button\"\n onClick={() => setShowPreview(!showPreview)}\n className=\"inline-flex items-center gap-1.5 px-3 py-2 mx-2 text-sm border border-border rounded-lg hover:bg-muted transition-colors shrink-0\"\n >\n <Icon name={showPreview ? 'pencil' : 'eye'} size={14} />\n {showPreview ? labels.editMode : labels.preview}\n </button>\n )}\n </div>\n )\n }\n)\n\nBlogEditorLanguageTabs.displayName = 'BlogEditorLanguageTabs'\n\nexport { BlogEditorLanguageTabs }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorContent Props\n */\nexport interface BlogEditorContentProps {\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** textarea ref 콜백 / textarea ref callback */\n textareaRef?: React.RefObject<HTMLTextAreaElement | null>\n}\n\n/**\n * BlogEditorContent 컴포넌트\n * 제목, 요약, 본문 입력 필드\n */\nconst BlogEditorContent = React.forwardRef<HTMLDivElement, BlogEditorContentProps>(\n ({ className, textareaRef }, ref) => {\n const {\n formData,\n activeLanguage,\n updateMultilingualField,\n updateField,\n features,\n labels,\n languages,\n generateSlug,\n isEditMode,\n slugManuallyEdited,\n } = useBlogEditor()\n\n const isPrimaryLanguage = languages.find((l) => l.isPrimary)?.key === activeLanguage\n const currentLang = languages.find((l) => l.key === activeLanguage)\n\n const inputClasses =\n 'w-full px-3 py-2 border border-border rounded-lg bg-background text-foreground focus:ring-1 focus:ring-ring focus:border-transparent transition-colors'\n\n const labelClasses = 'block text-sm font-medium text-foreground mb-1'\n\n const handleTitleChange = (value: string) => {\n updateMultilingualField('title', activeLanguage, value)\n\n // 영어 탭에서 타이틀 입력 시 슬러그 자동 생성\n // (한국어/일본어보다 영어 슬러그가 URL에 적합)\n if (activeLanguage === 'en' && !isEditMode && !slugManuallyEdited) {\n updateField('slug', generateSlug(value))\n }\n }\n\n // 언어별 레이블 생성\n const getLangLabel = (baseLabel: string) => {\n if (isPrimaryLanguage) {\n return `${baseLabel} *`\n }\n return `${baseLabel} (${currentLang?.label || activeLanguage})`\n }\n\n return (\n <div ref={ref} className={merge('p-6 space-y-4', className)}>\n {/* 제목 */}\n <div>\n <label className={labelClasses}>{getLangLabel(labels.titleLabel)}</label>\n <input\n type=\"text\"\n value={formData.title[activeLanguage] || ''}\n onChange={(e) => handleTitleChange(e.target.value)}\n className={inputClasses}\n placeholder={labels.titlePlaceholder}\n />\n </div>\n\n {/* 요약 */}\n {features.enableExcerpt && (\n <div>\n <label className={labelClasses}>{getLangLabel(labels.excerpt)}</label>\n <textarea\n value={formData.excerpt[activeLanguage] || ''}\n onChange={(e) => updateMultilingualField('excerpt', activeLanguage, e.target.value)}\n rows={2}\n className={merge(inputClasses, 'resize-none')}\n placeholder={labels.excerptPlaceholder}\n />\n </div>\n )}\n\n {/* 본문 */}\n <div>\n <label className={labelClasses}>\n {getLangLabel(labels.contentLabel)} (마크다운)\n </label>\n <textarea\n ref={textareaRef}\n value={formData.content[activeLanguage] || ''}\n onChange={(e) => updateMultilingualField('content', activeLanguage, e.target.value)}\n rows={15}\n className={merge(inputClasses, 'font-mono text-sm resize-y min-h-[300px]')}\n placeholder={labels.contentPlaceholder}\n />\n </div>\n </div>\n )\n }\n)\n\nBlogEditorContent.displayName = 'BlogEditorContent'\n\nexport { BlogEditorContent }\n","/**\n * 마크다운 파서 유틸리티\n * Markdown parser utilities\n *\n * 지원 문법 / Supported syntax:\n * - **볼드**, *이탤릭*, ~~취소선~~\n * - [링크](url)\n * - # 헤딩 (h1-h6)\n * - - 또는 * 리스트\n * - `인라인 코드`\n * - ```코드블록```\n * - > 인용문\n * - --- 수평선\n */\n\n/**\n * HTML 특수문자 이스케이프\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n}\n\n/**\n * 마크다운 텍스트를 HTML로 변환\n * Convert markdown text to HTML\n */\nexport function parseMarkdown(text: string): string {\n if (!text) return ''\n\n let html = text\n\n // 코드블록 먼저 처리 (다른 파싱 방지)\n html = html.replace(/```(\\w*)\\n?([\\s\\S]*?)```/g, (_, lang, code) => {\n const escaped = escapeHtml(code.trim())\n return `<pre class=\"bg-gray-100 dark:bg-gray-800 rounded-lg p-4 overflow-x-auto my-4\"><code class=\"text-sm\">${escaped}</code></pre>`\n })\n\n // 인라인 코드\n html = html.replace(\n /`([^`]+)`/g,\n '<code class=\"bg-gray-100 dark:bg-gray-700 px-1.5 py-0.5 rounded text-sm\">$1</code>'\n )\n\n // 헤딩 (줄 시작에서만)\n html = html.replace(/^######\\s+(.+)$/gm, '<h6 class=\"text-base font-semibold mt-4 mb-2\">$1</h6>')\n html = html.replace(/^#####\\s+(.+)$/gm, '<h5 class=\"text-lg font-semibold mt-4 mb-2\">$1</h5>')\n html = html.replace(/^####\\s+(.+)$/gm, '<h4 class=\"text-xl font-semibold mt-5 mb-2\">$1</h4>')\n html = html.replace(/^###\\s+(.+)$/gm, '<h3 class=\"text-2xl font-semibold mt-5 mb-3\">$1</h3>')\n html = html.replace(/^##\\s+(.+)$/gm, '<h2 class=\"text-2xl font-bold mt-6 mb-3\">$1</h2>')\n html = html.replace(/^#\\s+(.+)$/gm, '<h1 class=\"text-3xl font-bold mt-6 mb-4\">$1</h1>')\n\n // 수평선\n html = html.replace(/^---+$/gm, '<hr class=\"my-6 border-gray-300 dark:border-gray-600\" />')\n\n // 인용문\n html = html.replace(\n /^>\\s+(.+)$/gm,\n '<blockquote class=\"border-l-4 border-gray-300 dark:border-gray-600 pl-4 my-4 italic text-gray-600 dark:text-gray-400\">$1</blockquote>'\n )\n\n // 볼드, 이탤릭, 취소선\n html = html.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n html = html.replace(/\\*(.+?)\\*/g, '<em>$1</em>')\n html = html.replace(/~~(.+?)~~/g, '<del class=\"text-gray-500\">$1</del>')\n\n // 링크\n html = html.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" class=\"text-cyan-600 hover:text-cyan-700 dark:text-cyan-400 dark:hover:text-cyan-300 underline\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>'\n )\n\n // 리스트 (연속된 리스트 아이템을 ul로 감싸기)\n html = html.replace(/^[-*]\\s+(.+)$/gm, '<li class=\"ml-4\">$1</li>')\n html = html.replace(/(<li[^>]*>.*<\\/li>\\n?)+/g, (match) => {\n return `<ul class=\"list-disc list-inside my-4 space-y-1\">${match}</ul>`\n })\n\n // 줄바꿈을 <br>로 변환 (단, 블록 요소 직후는 제외)\n html = html.replace(/\\n(?!<)/g, '<br />\\n')\n\n // 연속된 <br /> 정리\n html = html.replace(/(<br \\/>[\\n\\s]*){3,}/g, '<br /><br />\\n')\n\n return html\n}\n\n/**\n * 마크다운에서 순수 텍스트만 추출 (미리보기용)\n * Extract plain text from markdown (for preview)\n */\nexport function stripMarkdown(text: string): string {\n if (!text) return ''\n\n return text\n // 코드블록 제거\n .replace(/```[\\s\\S]*?```/g, '')\n // 인라인 코드 제거\n .replace(/`[^`]+`/g, '')\n // 헤딩 마크 제거\n .replace(/^#{1,6}\\s+/gm, '')\n // 볼드/이탤릭 마크 제거\n .replace(/\\*\\*(.+?)\\*\\*/g, '$1')\n .replace(/\\*(.+?)\\*/g, '$1')\n .replace(/~~(.+?)~~/g, '$1')\n // 링크에서 텍스트만 추출\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1')\n // 리스트 마크 제거\n .replace(/^[-*]\\s+/gm, '')\n // 인용문 마크 제거\n .replace(/^>\\s+/gm, '')\n // 수평선 제거\n .replace(/^---+$/gm, '')\n // 연속 공백/줄바꿈 정리\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n}\n\n/**\n * 마크다운 텍스트 미리보기 (글자수 제한)\n * Markdown text preview (with character limit)\n */\nexport function getMarkdownPreview(text: string, maxLength: number = 150): string {\n const stripped = stripMarkdown(text)\n if (stripped.length <= maxLength) return stripped\n return stripped.slice(0, maxLength).trim() + '...'\n}\n\n/**\n * 마크다운 삽입 헬퍼\n * Markdown insertion helper\n */\nexport function insertMarkdown(\n text: string,\n selectionStart: number,\n selectionEnd: number,\n before: string,\n after: string\n): { text: string; cursorPosition: number } {\n const selectedText = text.slice(selectionStart, selectionEnd)\n const beforeText = text.slice(0, selectionStart)\n const afterText = text.slice(selectionEnd)\n\n const newText = beforeText + before + selectedText + after + afterText\n const cursorPosition = selectionStart + before.length + selectedText.length + after.length\n\n return { text: newText, cursorPosition }\n}\n","\"use client\"\n\nimport React, { useCallback } from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\nimport { insertMarkdown } from './utils/markdown'\nimport type { ToolbarItem } from './types'\n\n/**\n * BlogEditorToolbar Props\n */\nexport interface BlogEditorToolbarProps {\n /** textarea ref / textarea reference */\n textareaRef: React.RefObject<HTMLTextAreaElement | null>\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * 툴바 아이템 정의 / Toolbar item definitions\n */\nconst TOOLBAR_ITEMS: ToolbarItem[] = [\n {\n icon: 'bold',\n label: 'bold',\n markdown: { before: '**', after: '**' },\n shortcut: 'Ctrl+B',\n },\n {\n icon: 'italic',\n label: 'italic',\n markdown: { before: '*', after: '*' },\n shortcut: 'Ctrl+I',\n },\n {\n icon: 'strikethrough',\n label: 'strikethrough',\n markdown: { before: '~~', after: '~~' },\n },\n {\n icon: 'heading',\n label: 'heading',\n markdown: { before: '## ', after: '' },\n },\n {\n icon: 'link',\n label: 'link',\n markdown: { before: '[', after: '](url)' },\n shortcut: 'Ctrl+K',\n },\n {\n icon: 'image',\n label: 'image',\n markdown: { before: '![alt](', after: ')' },\n },\n {\n icon: 'code',\n label: 'code',\n markdown: { before: '`', after: '`' },\n },\n {\n icon: 'fileCode',\n label: 'codeBlock',\n markdown: { before: '```\\n', after: '\\n```' },\n },\n {\n icon: 'quote',\n label: 'quote',\n markdown: { before: '> ', after: '' },\n },\n {\n icon: 'list',\n label: 'list',\n markdown: { before: '- ', after: '' },\n },\n {\n icon: 'listOrdered',\n label: 'orderedList',\n markdown: { before: '1. ', after: '' },\n },\n {\n icon: 'minus',\n label: 'horizontalRule',\n markdown: { before: '\\n---\\n', after: '' },\n },\n]\n\n/**\n * BlogEditorToolbar 컴포넌트\n * 마크다운 포맷팅 툴바\n */\nconst BlogEditorToolbar = React.forwardRef<HTMLDivElement, BlogEditorToolbarProps>(\n ({ textareaRef, className }, ref) => {\n const { labels, activeLanguage, updateMultilingualField, formData, features } = useBlogEditor()\n\n const handleInsert = useCallback(\n (item: ToolbarItem) => {\n const textarea = textareaRef.current\n if (!textarea) return\n\n const { selectionStart, selectionEnd } = textarea\n const currentContent = formData.content[activeLanguage] || ''\n\n const { text: newText, cursorPosition } = insertMarkdown(\n currentContent,\n selectionStart,\n selectionEnd,\n item.markdown.before,\n item.markdown.after\n )\n\n updateMultilingualField('content', activeLanguage, newText)\n\n // 커서 위치 복원\n requestAnimationFrame(() => {\n textarea.focus()\n textarea.setSelectionRange(cursorPosition, cursorPosition)\n })\n },\n [textareaRef, formData, activeLanguage, updateMultilingualField]\n )\n\n if (!features.enableMarkdownToolbar) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n 'flex flex-wrap gap-1 px-4 py-2 border-b border-border bg-muted',\n className\n )}\n role=\"toolbar\"\n aria-label=\"마크다운 서식\"\n >\n {TOOLBAR_ITEMS.map((item) => (\n <button\n key={item.icon}\n type=\"button\"\n onClick={() => handleInsert(item)}\n className=\"p-2 text-muted-foreground hover:text-foreground hover:bg-muted rounded transition-colors\"\n title={`${labels[item.label as keyof typeof labels] || item.label}${item.shortcut ? ` (${item.shortcut})` : ''}`}\n aria-label={labels[item.label as keyof typeof labels] || item.label}\n >\n <Icon name={item.icon as Parameters<typeof Icon>[0]['name']} size={16} />\n </button>\n ))}\n </div>\n )\n }\n)\n\nBlogEditorToolbar.displayName = 'BlogEditorToolbar'\n\nexport { BlogEditorToolbar }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { useBlogEditor } from './BlogEditorContext'\nimport { parseMarkdown } from './utils/markdown'\n\n/**\n * BlogEditorPreview Props\n */\nexport interface BlogEditorPreviewProps {\n /** 커스텀 마크다운 렌더러 / Custom markdown renderer */\n renderMarkdown?: (content: string) => React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorPreview 컴포넌트\n * 마크다운 미리보기\n */\nconst BlogEditorPreview = React.forwardRef<HTMLDivElement, BlogEditorPreviewProps>(\n ({ renderMarkdown, className }, ref) => {\n const { formData, activeLanguage, languages, labels } = useBlogEditor()\n\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key || languages[0]?.key\n\n // 현재 언어의 콘텐츠, 없으면 기본 언어 콘텐츠\n const title = formData.title[activeLanguage] || formData.title[primaryLanguage] || labels.noTitle\n const content = formData.content[activeLanguage] || formData.content[primaryLanguage] || ''\n\n // 마크다운 렌더링\n const renderedContent = React.useMemo(() => {\n if (renderMarkdown) {\n return renderMarkdown(content)\n }\n // 기본 마크다운 파서 사용\n return (\n <div\n dangerouslySetInnerHTML={{ __html: parseMarkdown(content) }}\n />\n )\n }, [content, renderMarkdown])\n\n return (\n <div ref={ref} className={merge('p-6', className)}>\n <h3 className=\"text-xl font-bold text-foreground mb-4\">\n {title}\n </h3>\n <div className=\"prose dark:prose-invert max-w-none\">\n {renderedContent}\n </div>\n </div>\n )\n }\n)\n\nBlogEditorPreview.displayName = 'BlogEditorPreview'\n\nexport { BlogEditorPreview }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorActions Props\n */\nexport interface BlogEditorActionsProps {\n /** 취소 링크 컴포넌트 / Cancel link component */\n cancelLink?: React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorActions 컴포넌트\n * 저장/발행/취소 버튼\n */\nconst BlogEditorActions = React.forwardRef<HTMLDivElement, BlogEditorActionsProps>(\n ({ cancelLink, className }, ref) => {\n const { labels, submitting, handleSave, handleCancel, isEditMode, autoSaveStatus, features } = useBlogEditor()\n\n return (\n <div\n ref={ref}\n className={merge('flex items-center justify-end gap-3', className)}\n >\n {/* 자동저장 상태 */}\n {features.enableAutoSave && autoSaveStatus !== 'idle' && (\n <span className=\"text-sm text-muted-foreground flex items-center gap-1\">\n {autoSaveStatus === 'saving' && (\n <>\n <Icon name=\"loader\" size={14} spin />\n 저장 중...\n </>\n )}\n {autoSaveStatus === 'saved' && (\n <>\n <Icon name=\"check\" size={14} />\n 자동저장됨\n </>\n )}\n </span>\n )}\n\n {/* 취소 */}\n {cancelLink || (\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"px-4 py-2 text-foreground hover:text-foreground transition-colors\"\n >\n {labels.cancel}\n </button>\n )}\n\n {/* 임시저장 */}\n <button\n type=\"button\"\n onClick={() => handleSave(false)}\n disabled={submitting}\n className=\"px-4 py-2 border border-border rounded-lg hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {labels.saveDraft}\n </button>\n\n {/* 발행/수정 */}\n <button\n type=\"button\"\n onClick={() => handleSave(true)}\n disabled={submitting}\n className=\"px-6 py-2 bg-primary text-white rounded-lg hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center gap-2 transition-colors\"\n >\n {submitting ? (\n <>\n <Icon name=\"loader\" size={16} spin />\n {labels.saving}\n </>\n ) : (\n <>\n <Icon name=\"check\" size={16} />\n {isEditMode ? labels.update : labels.publish}\n </>\n )}\n </button>\n </div>\n )\n }\n)\n\nBlogEditorActions.displayName = 'BlogEditorActions'\n\nexport { BlogEditorActions }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorTranslate Props\n */\nexport interface BlogEditorTranslateProps {\n /** 힌트 메시지 오버라이드 / Hint message override */\n hint?: string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorTranslate 컴포넌트\n * AI 번역 버튼\n */\nconst BlogEditorTranslate = React.forwardRef<HTMLDivElement, BlogEditorTranslateProps>(\n ({ hint, className }, ref) => {\n const {\n labels,\n translating,\n translateSuccess,\n handleTranslate,\n formData,\n languages,\n features,\n } = useBlogEditor()\n\n if (!features.enableTranslation) {\n return null\n }\n\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key || languages[0]?.key\n const primaryTitle = formData.title[primaryLanguage] || ''\n const primaryContent = formData.content[primaryLanguage] || ''\n const canTranslate = primaryTitle && primaryContent\n\n return (\n <div\n ref={ref}\n className={merge(\n 'px-6 py-3 bg-muted border-b border-border flex items-center justify-between',\n className\n )}\n >\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Icon name=\"sparkles\" size={16} />\n <span>{hint || labels.translateHint}</span>\n </div>\n <button\n type=\"button\"\n onClick={handleTranslate}\n disabled={translating || !canTranslate}\n className={merge(\n 'inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',\n translateSuccess\n ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\n : 'bg-primary text-white hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n >\n {translating ? (\n <>\n <Icon name=\"loader\" size={16} spin />\n {labels.translating}\n </>\n ) : translateSuccess ? (\n <>\n <Icon name=\"check\" size={16} />\n {labels.translateSuccess}\n </>\n ) : (\n <>\n <Icon name=\"sparkles\" size={16} />\n {labels.translateButton}\n </>\n )}\n </button>\n </div>\n )\n }\n)\n\nBlogEditorTranslate.displayName = 'BlogEditorTranslate'\n\nexport { BlogEditorTranslate }\n","\"use client\"\n\nimport React, { useRef } from 'react'\nimport { merge } from '../../../lib/utils'\nimport { BlogEditorProvider, useBlogEditor } from './BlogEditorContext'\nimport { BlogEditorHeader, type BlogEditorHeaderProps } from './BlogEditorHeader'\nimport { BlogEditorMetadata, type BlogEditorMetadataProps } from './BlogEditorMetadata'\nimport { BlogEditorLanguageTabs, type BlogEditorLanguageTabsProps } from './BlogEditorLanguageTabs'\nimport { BlogEditorContent, type BlogEditorContentProps } from './BlogEditorContent'\nimport { BlogEditorToolbar, type BlogEditorToolbarProps } from './BlogEditorToolbar'\nimport { BlogEditorPreview, type BlogEditorPreviewProps } from './BlogEditorPreview'\nimport { BlogEditorActions, type BlogEditorActionsProps } from './BlogEditorActions'\nimport { BlogEditorTranslate, type BlogEditorTranslateProps } from './BlogEditorTranslate'\nimport type { BlogEditorProps } from './types'\n\n/**\n * BlogEditorRoot Props (내부 컴포넌트)\n */\ninterface BlogEditorRootProps {\n /** 뒤로가기 콜백 / Back navigation callback */\n onBack?: () => void\n /** 뒤로가기 링크 컴포넌트 / Back link component */\n backLink?: React.ReactNode\n /** 취소 링크 컴포넌트 / Cancel link component */\n cancelLink?: React.ReactNode\n /** 커스텀 마크다운 렌더러 / Custom markdown renderer */\n renderMarkdown?: (content: string) => React.ReactNode\n /** AI 번역 힌트 / AI translation hint */\n translateHint?: string\n /** 최대 너비 / Max width */\n maxWidth?: string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** 자식 요소 / Children */\n children?: React.ReactNode\n}\n\n/**\n * BlogEditorRoot 내부 컴포넌트\n * 기본 레이아웃 제공\n */\nfunction BlogEditorRoot({\n onBack,\n backLink,\n cancelLink,\n renderMarkdown,\n translateHint,\n maxWidth = 'max-w-4xl',\n className,\n children,\n}: BlogEditorRootProps) {\n const { showPreview, error, variant, features } = useBlogEditor()\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n const containerClasses = merge(\n variant === 'glass'\n ? 'bg-gradient-to-br from-gray-100 to-gray-200 dark:from-gray-900 dark:to-gray-800'\n : variant === 'minimal'\n ? ''\n : 'bg-muted'\n )\n\n const contentContainerClasses = merge(\n 'rounded-xl overflow-hidden',\n variant === 'glass'\n ? 'bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/20 dark:border-slate-700/50'\n : variant === 'minimal'\n ? 'bg-transparent border border-border'\n : 'bg-background'\n )\n\n // 커스텀 자식 요소가 있으면 그걸 렌더링\n if (children) {\n return (\n <div className={merge(containerClasses, className)}>\n <div className={merge(maxWidth, 'mx-auto px-4 py-8')}>\n {children}\n </div>\n </div>\n )\n }\n\n // 기본 레이아웃\n return (\n <div className={merge(containerClasses, className)}>\n <div className={merge(maxWidth, 'mx-auto px-4 py-8')}>\n {/* 헤더 */}\n <BlogEditorHeader onBack={onBack} backLink={backLink} />\n\n {/* 에러 메시지 */}\n {error && (\n <div className=\"mb-6 p-4 bg-red-50 dark:bg-red-900/30 border border-red-200 dark:border-red-800 rounded-lg text-red-600 dark:text-red-400\">\n {error}\n </div>\n )}\n\n <div className=\"space-y-6\">\n {/* 메타데이터 */}\n <BlogEditorMetadata />\n\n {/* 콘텐츠 영역 */}\n <div className={contentContainerClasses}>\n {/* AI 번역 */}\n {features.enableTranslation && (\n <BlogEditorTranslate hint={translateHint} />\n )}\n\n {/* 언어 탭 */}\n <BlogEditorLanguageTabs />\n\n {/* 툴바 & 콘텐츠 */}\n {showPreview ? (\n <BlogEditorPreview renderMarkdown={renderMarkdown} />\n ) : (\n <>\n {features.enableMarkdownToolbar && (\n <BlogEditorToolbar textareaRef={textareaRef} />\n )}\n <BlogEditorContent textareaRef={textareaRef} />\n </>\n )}\n </div>\n\n {/* 액션 버튼 */}\n <BlogEditorActions cancelLink={cancelLink} />\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * BlogEditor 컴포넌트\n *\n * 다국어 블로그 에디터 컴포넌트\n * Compound component 패턴으로 유연한 커스터마이징 지원\n *\n * @example\n * ```tsx\n * // 기본 사용\n * <BlogEditor\n * callbacks={{\n * onSave: async (data, publish) => { ... },\n * onCancel: () => router.back(),\n * }}\n * />\n *\n * // 커스텀 레이아웃\n * <BlogEditor callbacks={...}>\n * <BlogEditor.Header backLink={<Link href=\"/admin\">Back</Link>} />\n * <BlogEditor.Metadata />\n * <BlogEditor.LanguageTabs />\n * <BlogEditor.Content />\n * <BlogEditor.Actions />\n * </BlogEditor>\n * ```\n */\nconst BlogEditor = React.forwardRef<\n HTMLDivElement,\n BlogEditorProps & BlogEditorRootProps\n>(\n (\n {\n // BlogEditorProps\n initialData,\n isEditMode,\n languages,\n defaultLanguage,\n labels,\n callbacks,\n features,\n variant,\n\n // BlogEditorRootProps\n onBack,\n backLink,\n cancelLink,\n renderMarkdown,\n translateHint,\n maxWidth,\n className,\n children,\n\n // Auto-save\n autoSaveKey,\n autoSaveInterval,\n },\n ref\n ) => {\n return (\n <BlogEditorProvider\n initialData={initialData}\n isEditMode={isEditMode}\n languages={languages}\n defaultLanguage={defaultLanguage}\n labels={labels}\n callbacks={callbacks}\n features={features}\n variant={variant}\n autoSaveKey={autoSaveKey}\n autoSaveInterval={autoSaveInterval}\n >\n <div ref={ref}>\n <BlogEditorRoot\n onBack={onBack}\n backLink={backLink}\n cancelLink={cancelLink}\n renderMarkdown={renderMarkdown}\n translateHint={translateHint}\n maxWidth={maxWidth}\n className={className}\n >\n {children}\n </BlogEditorRoot>\n </div>\n </BlogEditorProvider>\n )\n }\n)\n\nBlogEditor.displayName = 'BlogEditor'\n\n// Compound component exports\nconst BlogEditorCompound = BlogEditor as typeof BlogEditor & {\n Header: typeof BlogEditorHeader\n Metadata: typeof BlogEditorMetadata\n LanguageTabs: typeof BlogEditorLanguageTabs\n Content: typeof BlogEditorContent\n Toolbar: typeof BlogEditorToolbar\n Preview: typeof BlogEditorPreview\n Actions: typeof BlogEditorActions\n Translate: typeof BlogEditorTranslate\n}\n\nBlogEditorCompound.Header = BlogEditorHeader\nBlogEditorCompound.Metadata = BlogEditorMetadata\nBlogEditorCompound.LanguageTabs = BlogEditorLanguageTabs\nBlogEditorCompound.Content = BlogEditorContent\nBlogEditorCompound.Toolbar = BlogEditorToolbar\nBlogEditorCompound.Preview = BlogEditorPreview\nBlogEditorCompound.Actions = BlogEditorActions\nBlogEditorCompound.Translate = BlogEditorTranslate\n\nexport { BlogEditorCompound as BlogEditor }\n\n// 개별 컴포넌트도 export\nexport {\n BlogEditorHeader,\n BlogEditorMetadata,\n BlogEditorLanguageTabs,\n BlogEditorContent,\n BlogEditorToolbar,\n BlogEditorPreview,\n BlogEditorActions,\n BlogEditorTranslate,\n}\n\n// 타입 export\nexport type {\n BlogEditorHeaderProps,\n BlogEditorMetadataProps,\n BlogEditorLanguageTabsProps,\n BlogEditorContentProps,\n BlogEditorToolbarProps,\n BlogEditorPreviewProps,\n BlogEditorActionsProps,\n BlogEditorTranslateProps,\n}\n"]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {a}from'./chunk-QEMPERUK.mjs';import d from'react';import {cva}from'class-variance-authority';import {jsx}from'react/jsx-runtime';var m=cva("rounded-lg",{variants:{variant:{default:"bg-card text-card-foreground border border-border",outline:"bg-transparent border-2 border-border",elevated:"bg-card text-card-foreground shadow-lg border border-border"},shadow:{none:"shadow-none",sm:"shadow-sm",md:"shadow-md",lg:"shadow-lg"},padding:{none:"",sm:"p-3",md:"p-4",lg:"p-6"}},defaultVariants:{variant:"default",padding:"none"}}),c=d.forwardRef(({className:e,variant:r="default",shadow:t,padding:n="none",hoverable:s,...i},l)=>jsx("div",{ref:l,className:a(m({variant:r,shadow:t,padding:n}),s&&"transition-shadow hover:shadow-lg cursor-pointer",e),...i}));c.displayName="Card";var f=d.forwardRef(({className:e,...r},t)=>jsx("div",{ref:t,className:a("flex flex-col space-y-1 p-3",e),...r}));f.displayName="CardHeader";var C=d.forwardRef(({className:e,...r},t)=>jsx("h3",{ref:t,className:a("text-base md:text-lg font-semibold leading-tight tracking-tight",e),...r}));C.displayName="CardTitle";var g=d.forwardRef(({className:e,...r},t)=>jsx("p",{ref:t,className:a("text-sm text-muted-foreground",e),...r}));g.displayName="CardDescription";var b=d.forwardRef(({className:e,...r},t)=>jsx("div",{ref:t,className:a("px-3 pb-3",e),...r}));b.displayName="CardContent";var x=d.forwardRef(({className:e,...r},t)=>jsx("div",{ref:t,className:a("flex items-center px-3 pb-3",e),...r}));x.displayName="CardFooter";export{c as a,f as b,C as c,g as d,b as e,x as f};//# sourceMappingURL=chunk-CW66UBQG.mjs.map
3
- //# sourceMappingURL=chunk-CW66UBQG.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Card.tsx"],"names":["cardVariants","cva","Card","React","className","variant","shadow","padding","hoverable","props","ref","jsx","merge","CardHeader","CardTitle","CardDescription","CardContent","CardFooter"],"mappings":"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","file":"chunk-CW66UBQG.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const cardVariants = cva(\n \"rounded-lg\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground border border-border\",\n outline: \"bg-transparent border-2 border-border\",\n elevated: \"bg-card text-card-foreground shadow-lg border border-border\",\n },\n shadow: {\n none: \"shadow-none\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n },\n padding: {\n none: \"\",\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n padding: \"none\",\n },\n }\n)\n\n/**\n * Card 컴포넌트의 props / Card component props\n */\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"outline\" | \"elevated\"\n shadow?: \"none\" | \"sm\" | \"md\" | \"lg\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\"\n hoverable?: boolean\n}\n\n/**\n * Card 컴포넌트 / Card component\n *\n * 콘텐츠를 카드 형태로 표시하는 컴포넌트입니다.\n *\n * @example\n * <Card>\n * <CardHeader><CardTitle>제목</CardTitle></CardHeader>\n * <CardContent><p>내용</p></CardContent>\n * </Card>\n */\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant = \"default\", shadow, padding = \"none\", hoverable, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n cardVariants({ variant, shadow, padding }),\n hoverable && \"transition-shadow hover:shadow-lg cursor-pointer\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nCard.displayName = \"Card\"\n\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex flex-col space-y-1 p-3\", className)}\n {...props}\n />\n )\n)\n\nCardHeader.displayName = \"CardHeader\"\n\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, CardTitleProps>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={merge(\n \"text-base md:text-lg font-semibold leading-tight tracking-tight\",\n className\n )}\n {...props}\n />\n )\n)\n\nCardTitle.displayName = \"CardTitle\"\n\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={merge(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\n\nCardDescription.displayName = \"CardDescription\"\n\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={merge(\"px-3 pb-3\", className)} {...props} />\n )\n)\n\nCardContent.displayName = \"CardContent\"\n\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center px-3 pb-3\", className)}\n {...props}\n />\n )\n)\n\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n"]}
@@ -1,3 +0,0 @@
1
- "use client";
2
- import {a}from'./chunk-QEMPERUK.mjs';var K={50:"50",100:"100",200:"200",300:"300",400:"400",500:"500",600:"600",700:"700",800:"800",900:"900"};function o(t,r,e=""){return `${e}${t}-${K[r]}`}function d(t,r){return `${t} dark:${r}`}var n={default:{border:{light:200,dark:700},background:{light:50,dark:900,opacity:"50"}},outline:{border:{light:300,dark:600},background:"transparent",text:{light:600,dark:400}},elevated:{border:{light:200,dark:700},background:{light:"white",dark:"gray-800"},shadow:"lg"},icon:{background:{light:100,dark:900,opacity:"30"},text:{light:600,dark:400}},badge:{background:{light:50,dark:900,opacity:"30"},text:{light:700,dark:300}}},U={from:500,to:600,border:{light:400,dark:500}};function j(t,r){var g,s,u,c,b,h,k,p,x,S,y,C,f,$,m;let e={default:(r==null?void 0:r.default)||n.default,gradient:(r==null?void 0:r.gradient)||U,outline:(r==null?void 0:r.outline)||n.outline,elevated:(r==null?void 0:r.elevated)||n.elevated,icon:(r==null?void 0:r.icon)||n.icon,badge:(r==null?void 0:r.badge)||n.badge},l=(g=e.default)!=null&&g.border?d(`border-${o(t,e.default.border.light)}`,`border-${o(t,e.default.border.dark||e.default.border.light)}`):"",v=(s=e.default)!=null&&s.background?d(`bg-${o(t,e.default.background.light)}${e.default.background.opacity?`/${e.default.background.opacity}`:""}`,`bg-${o(t,e.default.background.dark||e.default.background.light)}${e.default.background.opacity?`/${e.default.background.opacity}`:""}`):"",w=a(l,v),z=(u=e.gradient)!=null&&u.from?`from-${o(t,e.gradient.from)}`:"",B=(c=e.gradient)!=null&&c.to?`to-${o(t,e.gradient.to)}`:"",M=(b=e.gradient)!=null&&b.border?d(`border-${o(t,e.gradient.border.light)}`,`border-${o(t,e.gradient.border.dark||e.gradient.border.light)}`):"",R=a("bg-gradient-to-br",z,B,M),E=(h=e.outline)!=null&&h.border?`border-2 ${d(`border-${o(t,e.outline.border.light)}`,`border-${o(t,e.outline.border.dark||e.outline.border.light)}`)}`:"",_=((k=e.outline)==null?void 0:k.background)||"bg-transparent",H=(p=e.outline)!=null&&p.text?d(`text-${o(t,e.outline.text.light)}`,`text-${o(t,e.outline.text.dark||e.outline.text.light)}`):"",T=a(E,_,H),N=(x=e.elevated)!=null&&x.border?d(`border-${o(t,e.elevated.border.light)}`,`border-${o(t,e.elevated.border.dark||e.elevated.border.light)}`):"",P=(S=e.elevated)!=null&&S.background?d(`bg-${e.elevated.background.light}`,`bg-${e.elevated.background.dark}`):"",V=(y=e.elevated)!=null&&y.shadow?`shadow-${e.elevated.shadow}`:"",A=a(N,P,V),G=(C=e.icon)!=null&&C.background?d(`bg-${o(t,e.icon.background.light)}${e.icon.background.opacity?`/${e.icon.background.opacity}`:""}`,`bg-${o(t,e.icon.background.dark||e.icon.background.light)}${e.icon.background.opacity?`/${e.icon.background.opacity}`:""}`):"",I=(f=e.icon)!=null&&f.text?d(`text-${o(t,e.icon.text.light)}`,`text-${o(t,e.icon.text.dark||e.icon.text.light)}`):"",O=a(G,I),D=($=e.badge)!=null&&$.background?d(`bg-${o(t,e.badge.background.light)}${e.badge.background.opacity?`/${e.badge.background.opacity}`:""}`,`bg-${o(t,e.badge.background.dark||e.badge.background.light)}${e.badge.background.opacity?`/${e.badge.background.opacity}`:""}`):"",F=(m=e.badge)!=null&&m.text?d(`text-${o(t,e.badge.text.light)}`,`text-${o(t,e.badge.text.dark||e.badge.text.light)}`):"",J=a(D,F);return {default:w,gradient:R,outline:T,elevated:A,icon:O,badge:J}}var i=new Map;function L(t,r){let e=`${t}-${JSON.stringify(r||{})}`;return i.has(e)||i.set(e,j(t,r)),i.get(e)}function X(t,r){let e="rounded-2xl border transition-all duration-200";switch(t){case "default":return a(e,r.default);case "gradient":return a(e,"text-white",r.gradient);case "outline":return a(e,r.outline);case "elevated":return a(e,r.elevated);default:return e}}function Y(t="md"){return {sm:{container:"p-4",icon:"h-4 w-4",iconContainer:"w-8 h-8",text:"text-xs",title:"text-xs",description:"text-xs"},md:{container:"p-6",icon:"h-6 w-6",iconContainer:"w-12 h-12",text:"text-base",title:"text-sm",description:"text-sm"},lg:{container:"p-8",icon:"h-8 w-8",iconContainer:"w-16 h-16",text:"text-lg",title:"text-base",description:"text-base"},xl:{container:"p-10",icon:"h-10 w-10",iconContainer:"w-20 h-20",text:"text-xl",title:"text-lg",description:"text-lg"}}[t]}function Z(t="md"){return {sm:"rounded",md:"rounded-md",lg:"rounded-lg",xl:"rounded-xl",full:"rounded-full",none:"rounded-none"}[t]}function ee(t="md"){return t==="none"?"":`shadow-${t}`}var te="cubic-bezier(0.34, 1.56, 0.64, 1)";function re(t="springy",r=false){if(r||t==="none")return "";let e="[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]";return {springy:`hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${e} transform-gpu`,scale:"hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu",glow:"hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200",slide:`hover:-translate-y-0.5 hover:shadow-md ${e} transform-gpu`,none:""}[t]}export{j as a,L as b,X as c,Y as d,Z as e,ee as f,te as g,re as h};//# sourceMappingURL=chunk-EPY3432E.mjs.map
3
- //# sourceMappingURL=chunk-EPY3432E.mjs.map