@hua-labs/ui 2.1.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +91 -43
- package/dist/{ComponentLayout-DrZpz0yv.d.mts → ComponentLayout-Clf6C2jV.d.mts} +38 -4
- package/dist/DashboardSidebar-ZulecqKs.d.mts +54 -0
- package/dist/DashboardToolbar-BRZayZNz.d.mts +122 -0
- package/dist/EmptyState-SQ3Z6Vf2.d.mts +64 -0
- package/dist/{Modal-CrXmb3Ll.d.mts → Modal-DKKtBtbh.d.mts} +12 -6
- package/dist/{Section-BWzyshgX.d.mts → Section-DKdIG1sg.d.mts} +11 -12
- package/dist/SectionHeader-DHwQ_xh8.d.mts +1653 -0
- package/dist/{Switch-Dzm5TLR3.d.mts → Switch-D0l7SJrz.d.mts} +31 -15
- package/dist/Tooltip-Cv7nYhPW.d.mts +304 -0
- package/dist/advanced/Logo.d.ts +8 -4
- package/dist/advanced/Logo.d.ts.map +1 -1
- package/dist/advanced/dashboard.d.ts +28 -6
- package/dist/advanced/dashboard.d.ts.map +1 -1
- package/dist/advanced-dashboard.d.mts +9 -2278
- package/dist/advanced-dashboard.mjs +1 -33
- package/dist/advanced-dashboard.mjs.map +1 -1
- package/dist/advanced-emotion.d.mts +13 -5
- package/dist/advanced-emotion.mjs +1 -1
- package/dist/advanced-motion.d.mts +144 -61
- package/dist/advanced-motion.mjs +1 -1
- package/dist/advanced.d.mts +70 -37
- package/dist/advanced.mjs +14 -3
- package/dist/advanced.mjs.map +1 -1
- package/dist/chunk-32OZGTPV.mjs +41 -0
- package/dist/chunk-32OZGTPV.mjs.map +1 -0
- package/dist/chunk-6WBFZ2KV.mjs +3 -0
- package/dist/chunk-6WBFZ2KV.mjs.map +1 -0
- package/dist/chunk-7CGJQSJO.mjs +3 -0
- package/dist/chunk-7CGJQSJO.mjs.map +1 -0
- package/dist/chunk-7T3IUG3G.mjs +3 -0
- package/dist/chunk-7T3IUG3G.mjs.map +1 -0
- package/dist/chunk-A5YOVVM5.mjs +3 -0
- package/dist/chunk-A5YOVVM5.mjs.map +1 -0
- package/dist/chunk-AJOGTUWS.mjs +3 -0
- package/dist/chunk-AJOGTUWS.mjs.map +1 -0
- package/dist/chunk-AQTSQYH2.mjs +3 -0
- package/dist/chunk-AQTSQYH2.mjs.map +1 -0
- package/dist/chunk-B2MRZJQA.mjs +3 -0
- package/dist/chunk-B2MRZJQA.mjs.map +1 -0
- package/dist/chunk-BOX4TONF.mjs +3 -0
- package/dist/chunk-BOX4TONF.mjs.map +1 -0
- package/dist/chunk-C2DOXNBK.mjs +3 -0
- package/dist/chunk-C2DOXNBK.mjs.map +1 -0
- package/dist/chunk-CQBMR7VU.mjs +3 -0
- package/dist/chunk-CQBMR7VU.mjs.map +1 -0
- package/dist/chunk-CYAAAEPJ.mjs +3 -0
- package/dist/chunk-CYAAAEPJ.mjs.map +1 -0
- package/dist/chunk-D7MTTTQY.mjs +8 -0
- package/dist/chunk-D7MTTTQY.mjs.map +1 -0
- package/dist/chunk-DABVKUJN.mjs +3 -0
- package/dist/chunk-DABVKUJN.mjs.map +1 -0
- package/dist/chunk-EAZEI74V.mjs +3 -0
- package/dist/chunk-EAZEI74V.mjs.map +1 -0
- package/dist/chunk-EK6BLFVQ.mjs +3 -0
- package/dist/chunk-EK6BLFVQ.mjs.map +1 -0
- package/dist/chunk-FVUAVGP5.mjs +3 -0
- package/dist/chunk-FVUAVGP5.mjs.map +1 -0
- package/dist/chunk-GAIUZVNC.mjs +3 -0
- package/dist/chunk-GAIUZVNC.mjs.map +1 -0
- package/dist/chunk-HLBIIF4I.mjs +3 -0
- package/dist/chunk-HLBIIF4I.mjs.map +1 -0
- package/dist/chunk-I6NCGF6E.mjs +3 -0
- package/dist/chunk-I6NCGF6E.mjs.map +1 -0
- package/dist/chunk-J46VEBVF.mjs +3 -0
- package/dist/chunk-J46VEBVF.mjs.map +1 -0
- package/dist/chunk-JNW3CLCA.mjs +3 -0
- package/dist/chunk-JNW3CLCA.mjs.map +1 -0
- package/dist/chunk-JY3QVUGW.mjs +3 -0
- package/dist/chunk-JY3QVUGW.mjs.map +1 -0
- package/dist/chunk-KHBZOGUU.mjs +3 -0
- package/dist/chunk-KHBZOGUU.mjs.map +1 -0
- package/dist/chunk-KPNNAQLI.mjs +3 -0
- package/dist/chunk-KPNNAQLI.mjs.map +1 -0
- package/dist/chunk-L2LGSILS.mjs +13 -0
- package/dist/chunk-L2LGSILS.mjs.map +1 -0
- package/dist/chunk-LPHUWTQ2.mjs +3 -0
- package/dist/chunk-LPHUWTQ2.mjs.map +1 -0
- package/dist/chunk-M4JE7TQL.mjs +3 -0
- package/dist/chunk-M4JE7TQL.mjs.map +1 -0
- package/dist/chunk-MEDKGNLV.mjs +3 -0
- package/dist/chunk-MEDKGNLV.mjs.map +1 -0
- package/dist/chunk-MR46CSMC.mjs +3 -0
- package/dist/chunk-MR46CSMC.mjs.map +1 -0
- package/dist/chunk-NSDWT2JM.mjs +3 -0
- package/dist/chunk-NSDWT2JM.mjs.map +1 -0
- package/dist/chunk-OBMOTQEU.mjs +3 -0
- package/dist/chunk-OBMOTQEU.mjs.map +1 -0
- package/dist/chunk-QEMPERUK.mjs +3 -0
- package/dist/chunk-QEMPERUK.mjs.map +1 -0
- package/dist/chunk-RICRFXFP.mjs +3 -0
- package/dist/chunk-RICRFXFP.mjs.map +1 -0
- package/dist/chunk-SOK7VBSM.mjs +13 -0
- package/dist/chunk-SOK7VBSM.mjs.map +1 -0
- package/dist/chunk-SPZ7SZH4.mjs +3 -0
- package/dist/chunk-SPZ7SZH4.mjs.map +1 -0
- package/dist/chunk-TB3DARQO.mjs +3 -0
- package/dist/chunk-TB3DARQO.mjs.map +1 -0
- package/dist/chunk-TND4HPKW.mjs +51 -0
- package/dist/chunk-TND4HPKW.mjs.map +1 -0
- package/dist/chunk-TSAXVD2H.mjs +35 -0
- package/dist/chunk-TSAXVD2H.mjs.map +1 -0
- package/dist/chunk-UR3TIWBS.mjs +3 -0
- package/dist/chunk-UR3TIWBS.mjs.map +1 -0
- package/dist/chunk-XU2XBAEW.mjs +3 -0
- package/dist/chunk-XU2XBAEW.mjs.map +1 -0
- package/dist/chunk-XXHDNZTG.mjs +3 -0
- package/dist/chunk-XXHDNZTG.mjs.map +1 -0
- package/dist/chunk-YW5DA7Q6.mjs +3 -0
- package/dist/chunk-YW5DA7Q6.mjs.map +1 -0
- package/dist/chunk-ZTHUGQZL.mjs +3 -0
- package/dist/chunk-ZTHUGQZL.mjs.map +1 -0
- package/dist/chunk-ZVCGC6EV.mjs +3 -0
- package/dist/chunk-ZVCGC6EV.mjs.map +1 -0
- package/dist/chunk-ZZ67E3M5.mjs +3 -0
- package/dist/chunk-ZZ67E3M5.mjs.map +1 -0
- package/dist/{common-YLvZxA_K.d.mts → common-Bej8Okcg.d.mts} +1 -1
- package/dist/components/Accordion.d.ts +14 -7
- package/dist/components/Accordion.d.ts.map +1 -1
- package/dist/components/Action.d.ts.map +1 -1
- package/dist/components/ActionToolbar.d.ts +10 -6
- package/dist/components/ActionToolbar.d.ts.map +1 -1
- package/dist/components/Alert.d.ts +16 -2
- package/dist/components/Alert.d.ts.map +1 -1
- package/dist/components/Autocomplete.d.ts +6 -4
- package/dist/components/Autocomplete.d.ts.map +1 -1
- package/dist/components/Avatar.d.ts +20 -7
- package/dist/components/Avatar.d.ts.map +1 -1
- package/dist/components/Badge.d.ts +27 -9
- package/dist/components/Badge.d.ts.map +1 -1
- package/dist/components/Bookmark.d.ts +4 -2
- package/dist/components/Bookmark.d.ts.map +1 -1
- package/dist/components/BottomSheet.d.ts +13 -9
- package/dist/components/BottomSheet.d.ts.map +1 -1
- package/dist/components/Box.d.ts +9 -0
- package/dist/components/Box.d.ts.map +1 -0
- package/dist/components/Breadcrumb.d.ts +9 -4
- package/dist/components/Breadcrumb.d.ts.map +1 -1
- package/dist/components/Button.d.ts +3 -29
- package/dist/components/Button.d.ts.map +1 -1
- package/dist/components/Button.variants.d.ts +54 -10
- package/dist/components/Button.variants.d.ts.map +1 -1
- package/dist/components/Card.d.ts +49 -14
- package/dist/components/Card.d.ts.map +1 -1
- package/dist/components/ChatMessage.d.ts +3 -2
- package/dist/components/ChatMessage.d.ts.map +1 -1
- package/dist/components/Checkbox.d.ts +5 -2
- package/dist/components/Checkbox.d.ts.map +1 -1
- package/dist/components/CodeBlock.d.ts +8 -5
- package/dist/components/CodeBlock.d.ts.map +1 -1
- package/dist/components/ColorPicker.d.ts +4 -2
- package/dist/components/ColorPicker.d.ts.map +1 -1
- package/dist/components/Command.d.ts +28 -14
- package/dist/components/Command.d.ts.map +1 -1
- package/dist/components/ComponentLayout.d.ts +5 -2
- package/dist/components/ComponentLayout.d.ts.map +1 -1
- package/dist/components/ConfirmModal.d.ts +4 -0
- package/dist/components/ConfirmModal.d.ts.map +1 -1
- package/dist/components/Container.d.ts +18 -5
- package/dist/components/Container.d.ts.map +1 -1
- package/dist/components/ContextMenu.d.ts +36 -36
- package/dist/components/ContextMenu.d.ts.map +1 -1
- package/dist/components/DatePicker.d.ts +12 -5
- package/dist/components/DatePicker.d.ts.map +1 -1
- package/dist/components/Divider.d.ts +2 -1
- package/dist/components/Divider.d.ts.map +1 -1
- package/dist/components/Drawer.d.ts +17 -12
- package/dist/components/Drawer.d.ts.map +1 -1
- package/dist/components/Dropdown.d.ts +25 -57
- package/dist/components/Dropdown.d.ts.map +1 -1
- package/dist/components/EmotionAnalysis.d.ts +3 -1
- package/dist/components/EmotionAnalysis.d.ts.map +1 -1
- package/dist/components/EmotionButton.d.ts +3 -1
- package/dist/components/EmotionButton.d.ts.map +1 -1
- package/dist/components/EmotionMeter.d.ts +3 -1
- package/dist/components/EmotionMeter.d.ts.map +1 -1
- package/dist/components/EmotionSelector.d.ts +3 -1
- package/dist/components/EmotionSelector.d.ts.map +1 -1
- package/dist/components/FeatureCard.d.ts +9 -3
- package/dist/components/FeatureCard.d.ts.map +1 -1
- package/dist/components/Form.d.ts +20 -54
- package/dist/components/Form.d.ts.map +1 -1
- package/dist/components/FormControl.d.ts +3 -2
- package/dist/components/FormControl.d.ts.map +1 -1
- package/dist/components/Grid.d.ts +11 -4
- package/dist/components/Grid.d.ts.map +1 -1
- package/dist/components/HeroSection.d.ts +4 -2
- package/dist/components/HeroSection.d.ts.map +1 -1
- package/dist/components/Icon/Icon.d.ts +12 -8
- package/dist/components/Icon/Icon.d.ts.map +1 -1
- package/dist/components/IconsaxGallery/index.d.ts +8 -5
- package/dist/components/IconsaxGallery/index.d.ts.map +1 -1
- package/dist/components/InfoCard.d.ts +5 -2
- package/dist/components/InfoCard.d.ts.map +1 -1
- package/dist/components/Input.d.ts +29 -4
- package/dist/components/Input.d.ts.map +1 -1
- package/dist/components/Label.d.ts +15 -10
- package/dist/components/Label.d.ts.map +1 -1
- package/dist/components/LanguageToggle.d.ts +5 -3
- package/dist/components/LanguageToggle.d.ts.map +1 -1
- package/dist/components/Link.d.ts +17 -6
- package/dist/components/Link.d.ts.map +1 -1
- package/dist/components/LoadingSpinner.d.ts +7 -3
- package/dist/components/LoadingSpinner.d.ts.map +1 -1
- package/dist/components/Menu.d.ts +59 -60
- package/dist/components/Menu.d.ts.map +1 -1
- package/dist/components/Modal.d.ts +12 -6
- package/dist/components/Modal.d.ts.map +1 -1
- package/dist/components/Navigation.d.ts +26 -11
- package/dist/components/Navigation.d.ts.map +1 -1
- package/dist/components/NumberInput.d.ts +5 -2
- package/dist/components/NumberInput.d.ts.map +1 -1
- package/dist/components/PageNavigation.d.ts +6 -3
- package/dist/components/PageNavigation.d.ts.map +1 -1
- package/dist/components/PageTransition.d.ts +2 -2
- package/dist/components/PageTransition.d.ts.map +1 -1
- package/dist/components/Pagination.d.ts +5 -2
- package/dist/components/Pagination.d.ts.map +1 -1
- package/dist/components/Panel.d.ts +1 -7
- package/dist/components/Panel.d.ts.map +1 -1
- package/dist/components/Popover.d.ts +25 -9
- package/dist/components/Popover.d.ts.map +1 -1
- package/dist/components/Pressable.d.ts +14 -0
- package/dist/components/Pressable.d.ts.map +1 -0
- package/dist/components/Progress.d.ts +36 -13
- package/dist/components/Progress.d.ts.map +1 -1
- package/dist/components/Prose.d.ts +51 -0
- package/dist/components/Prose.d.ts.map +1 -0
- package/dist/components/Radio.d.ts +29 -33
- package/dist/components/Radio.d.ts.map +1 -1
- package/dist/components/ScrollArea.d.ts +8 -9
- package/dist/components/ScrollArea.d.ts.map +1 -1
- package/dist/components/ScrollIndicator.d.ts +9 -8
- package/dist/components/ScrollIndicator.d.ts.map +1 -1
- package/dist/components/ScrollProgress.d.ts +3 -2
- package/dist/components/ScrollProgress.d.ts.map +1 -1
- package/dist/components/ScrollToTop.d.ts +5 -5
- package/dist/components/ScrollToTop.d.ts.map +1 -1
- package/dist/components/Section.d.ts +12 -9
- package/dist/components/Section.d.ts.map +1 -1
- package/dist/components/SectionHeader.d.ts +3 -2
- package/dist/components/SectionHeader.d.ts.map +1 -1
- package/dist/components/Select.d.ts +18 -5
- package/dist/components/Select.d.ts.map +1 -1
- package/dist/components/Skeleton.d.ts +43 -15
- package/dist/components/Skeleton.d.ts.map +1 -1
- package/dist/components/Slider.d.ts +7 -5
- package/dist/components/Slider.d.ts.map +1 -1
- package/dist/components/Stack.d.ts +22 -6
- package/dist/components/Stack.d.ts.map +1 -1
- package/dist/components/StatsPanel.d.ts +4 -2
- package/dist/components/StatsPanel.d.ts.map +1 -1
- package/dist/components/Switch.d.ts +9 -4
- package/dist/components/Switch.d.ts.map +1 -1
- package/dist/components/Table.d.ts +43 -18
- package/dist/components/Table.d.ts.map +1 -1
- package/dist/components/Tabs.d.ts +50 -77
- package/dist/components/Tabs.d.ts.map +1 -1
- package/dist/components/Text.d.ts +11 -0
- package/dist/components/Text.d.ts.map +1 -0
- package/dist/components/Textarea.d.ts +24 -6
- package/dist/components/Textarea.d.ts.map +1 -1
- package/dist/components/ThemeToggle.d.ts +18 -27
- package/dist/components/ThemeToggle.d.ts.map +1 -1
- package/dist/components/Timeline.d.ts +4 -2
- package/dist/components/Timeline.d.ts.map +1 -1
- package/dist/components/Toast.d.ts +1 -1
- package/dist/components/Toast.d.ts.map +1 -1
- package/dist/components/Toggle.d.ts +11 -2
- package/dist/components/Toggle.d.ts.map +1 -1
- package/dist/components/Tooltip.d.ts +5 -2
- package/dist/components/Tooltip.d.ts.map +1 -1
- package/dist/components/Upload.d.ts +5 -3
- package/dist/components/Upload.d.ts.map +1 -1
- package/dist/components/advanced/AdvancedPageTransition.d.ts +7 -5
- package/dist/components/advanced/AdvancedPageTransition.d.ts.map +1 -1
- package/dist/components/advanced/AnimatedGradient.d.ts +6 -2
- package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
- package/dist/components/advanced/Carousel.d.ts +3 -1
- package/dist/components/advanced/Carousel.d.ts.map +1 -1
- package/dist/components/advanced/DotNav.d.ts +12 -5
- package/dist/components/advanced/DotNav.d.ts.map +1 -1
- package/dist/components/advanced/GlowCard.d.ts +4 -1
- package/dist/components/advanced/GlowCard.d.ts.map +1 -1
- package/dist/components/advanced/HorizontalScroll.d.ts +4 -1
- package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -1
- package/dist/components/advanced/ImageReveal.d.ts +23 -1
- package/dist/components/advanced/ImageReveal.d.ts.map +1 -1
- package/dist/components/advanced/Marquee.d.ts +4 -2
- package/dist/components/advanced/Marquee.d.ts.map +1 -1
- package/dist/components/advanced/Parallax.d.ts +12 -7
- package/dist/components/advanced/Parallax.d.ts.map +1 -1
- package/dist/components/advanced/SpotlightCard.d.ts +13 -12
- package/dist/components/advanced/SpotlightCard.d.ts.map +1 -1
- package/dist/components/advanced/TextReveal.d.ts +5 -1
- package/dist/components/advanced/TextReveal.d.ts.map +1 -1
- package/dist/components/advanced/TiltCard.d.ts +6 -2
- package/dist/components/advanced/TiltCard.d.ts.map +1 -1
- package/dist/components/advanced/VideoBackground.d.ts +4 -1
- package/dist/components/advanced/VideoBackground.d.ts.map +1 -1
- package/dist/components/advanced/blog-editor/BlogEditor.d.ts +4 -2
- package/dist/components/advanced/blog-editor/BlogEditor.d.ts.map +1 -1
- package/dist/components/advanced/blog-editor/BlogEditorActions.d.ts +4 -2
- package/dist/components/advanced/blog-editor/BlogEditorActions.d.ts.map +1 -1
- package/dist/components/advanced/blog-editor/BlogEditorContent.d.ts +4 -2
- package/dist/components/advanced/blog-editor/BlogEditorContent.d.ts.map +1 -1
- package/dist/components/advanced/blog-editor/BlogEditorHeader.d.ts +4 -2
- package/dist/components/advanced/blog-editor/BlogEditorHeader.d.ts.map +1 -1
- package/dist/components/advanced/blog-editor/BlogEditorLanguageTabs.d.ts +4 -2
- package/dist/components/advanced/blog-editor/BlogEditorLanguageTabs.d.ts.map +1 -1
- package/dist/components/advanced/blog-editor/BlogEditorMetadata.d.ts +5 -3
- package/dist/components/advanced/blog-editor/BlogEditorMetadata.d.ts.map +1 -1
- package/dist/components/advanced/blog-editor/BlogEditorPreview.d.ts +5 -3
- package/dist/components/advanced/blog-editor/BlogEditorPreview.d.ts.map +1 -1
- package/dist/components/advanced/blog-editor/BlogEditorToolbar.d.ts +4 -2
- package/dist/components/advanced/blog-editor/BlogEditorToolbar.d.ts.map +1 -1
- package/dist/components/advanced/blog-editor/BlogEditorTranslate.d.ts +4 -2
- package/dist/components/advanced/blog-editor/BlogEditorTranslate.d.ts.map +1 -1
- package/dist/components/advanced/blog-editor/types.d.ts +5 -2
- package/dist/components/advanced/blog-editor/types.d.ts.map +1 -1
- package/dist/components/advanced/emotion/EmotionAnalysis.d.ts +3 -1
- package/dist/components/advanced/emotion/EmotionAnalysis.d.ts.map +1 -1
- package/dist/components/advanced/emotion/EmotionButton.d.ts +3 -1
- package/dist/components/advanced/emotion/EmotionButton.d.ts.map +1 -1
- package/dist/components/advanced/emotion/EmotionMeter.d.ts +4 -2
- package/dist/components/advanced/emotion/EmotionMeter.d.ts.map +1 -1
- package/dist/components/advanced/emotion/EmotionSelector.d.ts +3 -1
- package/dist/components/advanced/emotion/EmotionSelector.d.ts.map +1 -1
- package/dist/components/dashboard/ActivityFeed.d.ts +5 -2
- package/dist/components/dashboard/ActivityFeed.d.ts.map +1 -1
- package/dist/components/dashboard/BarChart.d.ts +3 -2
- package/dist/components/dashboard/BarChart.d.ts.map +1 -1
- package/dist/components/dashboard/DashboardGrid.d.ts +13 -3
- package/dist/components/dashboard/DashboardGrid.d.ts.map +1 -1
- package/dist/components/dashboard/DashboardSidebar.d.ts +15 -82
- package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -1
- package/dist/components/dashboard/DashboardToolbar.d.ts +3 -2
- package/dist/components/dashboard/DashboardToolbar.d.ts.map +1 -1
- package/dist/components/dashboard/EmptyState.d.ts +3 -2
- package/dist/components/dashboard/EmptyState.d.ts.map +1 -1
- package/dist/components/dashboard/MembershipBadge.d.ts +3 -2
- package/dist/components/dashboard/MembershipBadge.d.ts.map +1 -1
- package/dist/components/dashboard/MerchantList.d.ts +3 -2
- package/dist/components/dashboard/MerchantList.d.ts.map +1 -1
- package/dist/components/dashboard/MetricCard.d.ts +3 -2
- package/dist/components/dashboard/MetricCard.d.ts.map +1 -1
- package/dist/components/dashboard/MiniBarChart.d.ts +3 -2
- package/dist/components/dashboard/MiniBarChart.d.ts.map +1 -1
- package/dist/components/dashboard/NotificationCard.d.ts +5 -2
- package/dist/components/dashboard/NotificationCard.d.ts.map +1 -1
- package/dist/components/dashboard/ProfileCard.d.ts +5 -2
- package/dist/components/dashboard/ProfileCard.d.ts.map +1 -1
- package/dist/components/dashboard/ProgressCard.d.ts +6 -3
- package/dist/components/dashboard/ProgressCard.d.ts.map +1 -1
- package/dist/components/dashboard/QuickActionCard.d.ts +22 -27
- package/dist/components/dashboard/QuickActionCard.d.ts.map +1 -1
- package/dist/components/dashboard/RoutingBreakdownCard.d.ts +3 -2
- package/dist/components/dashboard/RoutingBreakdownCard.d.ts.map +1 -1
- package/dist/components/dashboard/SettlementTimeline.d.ts +3 -2
- package/dist/components/dashboard/SettlementTimeline.d.ts.map +1 -1
- package/dist/components/dashboard/StatCard.d.ts +7 -4
- package/dist/components/dashboard/StatCard.d.ts.map +1 -1
- package/dist/components/dashboard/SummaryCard.d.ts +6 -3
- package/dist/components/dashboard/SummaryCard.d.ts.map +1 -1
- package/dist/components/dashboard/TransactionDetailDrawer.d.ts +2 -2
- package/dist/components/dashboard/TransactionDetailDrawer.d.ts.map +1 -1
- package/dist/components/dashboard/TransactionsTable.d.ts +3 -2
- package/dist/components/dashboard/TransactionsTable.d.ts.map +1 -1
- package/dist/components/dashboard/TrendChart.d.ts +3 -2
- package/dist/components/dashboard/TrendChart.d.ts.map +1 -1
- package/dist/components/dashboard/YearlyHeatmap.d.ts +4 -2
- package/dist/components/dashboard/YearlyHeatmap.d.ts.map +1 -1
- package/dist/components/dashboard/kanban/KanbanAddCard.d.ts.map +1 -1
- package/dist/components/dashboard/kanban/KanbanAddColumn.d.ts.map +1 -1
- package/dist/components/dashboard/kanban/KanbanBoard.d.ts.map +1 -1
- package/dist/components/dashboard/kanban/KanbanCard.d.ts.map +1 -1
- package/dist/components/dashboard/kanban/KanbanColumn.d.ts.map +1 -1
- package/dist/components/dashboard/kanban/KanbanColumnHeader.d.ts.map +1 -1
- package/dist/components/dashboard/kanban/KanbanDropIndicator.d.ts.map +1 -1
- package/dist/components/dashboard/kanban/index.d.ts +1 -1
- package/dist/components/dashboard/kanban/types.d.ts +24 -12
- package/dist/components/dashboard/kanban/types.d.ts.map +1 -1
- package/dist/components/scrollbar/scrollbar.d.ts +2 -1
- package/dist/components/scrollbar/scrollbar.d.ts.map +1 -1
- package/dist/context/MotionConfigContext.d.ts +41 -0
- package/dist/context/MotionConfigContext.d.ts.map +1 -0
- package/dist/data.d.mts +55 -23
- package/dist/data.d.ts +45 -3
- package/dist/data.d.ts.map +1 -1
- package/dist/data.mjs +2 -2
- package/dist/data.mjs.map +1 -1
- package/dist/feedback.d.mts +6 -293
- package/dist/feedback.d.ts +7 -5
- package/dist/feedback.d.ts.map +1 -1
- package/dist/feedback.mjs +1 -1
- package/dist/form.d.mts +99 -114
- package/dist/form.mjs +9 -4
- package/dist/form.mjs.map +1 -1
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/useAnimatedEntrance.d.ts +24 -0
- package/dist/hooks/useAnimatedEntrance.d.ts.map +1 -0
- package/dist/hooks/useBreakpoint.d.ts +22 -0
- package/dist/hooks/useBreakpoint.d.ts.map +1 -0
- package/dist/hooks/useDotEnv.d.ts +12 -0
- package/dist/hooks/useDotEnv.d.ts.map +1 -0
- package/dist/hooks/useDotMap.d.ts +38 -0
- package/dist/hooks/useDotMap.d.ts.map +1 -0
- package/dist/{icons-DmhQEH_E.d.mts → icons-DcOBy9Hf.d.mts} +4 -0
- package/dist/iconsax-extended.mjs +2 -2
- package/dist/iconsax-extended.mjs.map +1 -1
- package/dist/iconsax.mjs +2 -2
- package/dist/iconsax.mjs.map +1 -1
- package/dist/index.d.mts +360 -210
- package/dist/index.d.ts +74 -64
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +15 -15
- package/dist/index.mjs.map +1 -1
- package/dist/interactive/kanban.d.ts +12 -0
- package/dist/interactive/kanban.d.ts.map +1 -0
- package/dist/interactive-kanban.d.mts +378 -0
- package/dist/interactive-kanban.mjs +3 -0
- package/dist/interactive-kanban.mjs.map +1 -0
- package/dist/interactive.d.mts +193 -197
- package/dist/interactive.d.ts +7 -5
- package/dist/interactive.d.ts.map +1 -1
- package/dist/interactive.mjs +1 -1
- package/dist/interactive.mjs.map +1 -1
- package/dist/landing/LandingAbout.d.ts +2 -2
- package/dist/landing/LandingAbout.d.ts.map +1 -1
- package/dist/landing/LandingCTA.d.ts +2 -2
- package/dist/landing/LandingCTA.d.ts.map +1 -1
- package/dist/landing/LandingContact.d.ts +2 -2
- package/dist/landing/LandingContact.d.ts.map +1 -1
- package/dist/landing/LandingExperience.d.ts +1 -1
- package/dist/landing/LandingExperience.d.ts.map +1 -1
- package/dist/landing/LandingFeatures.d.ts +1 -1
- package/dist/landing/LandingFeatures.d.ts.map +1 -1
- package/dist/landing/LandingHero.d.ts +2 -2
- package/dist/landing/LandingHero.d.ts.map +1 -1
- package/dist/landing/LandingLogoCloud.d.ts +2 -2
- package/dist/landing/LandingLogoCloud.d.ts.map +1 -1
- package/dist/landing/LandingMetrics.d.ts +1 -1
- package/dist/landing/LandingMetrics.d.ts.map +1 -1
- package/dist/landing/LandingProjects.d.ts +1 -1
- package/dist/landing/LandingProjects.d.ts.map +1 -1
- package/dist/landing/LandingShowcase.d.ts +2 -2
- package/dist/landing/LandingShowcase.d.ts.map +1 -1
- package/dist/landing/LandingSkills.d.ts +1 -1
- package/dist/landing/LandingSkills.d.ts.map +1 -1
- package/dist/landing/LandingStats.d.ts +1 -1
- package/dist/landing/LandingStats.d.ts.map +1 -1
- package/dist/landing/LandingTestimonials.d.ts +1 -1
- package/dist/landing/LandingTestimonials.d.ts.map +1 -1
- package/dist/landing/types.d.ts +42 -30
- package/dist/landing/types.d.ts.map +1 -1
- package/dist/landing.d.mts +47 -37
- package/dist/landing.mjs +4 -20
- package/dist/landing.mjs.map +1 -1
- package/dist/lib/Slot.d.ts.map +1 -1
- package/dist/lib/icon-providers.d.ts +25 -27
- package/dist/lib/icon-providers.d.ts.map +1 -1
- package/dist/lib/icons.d.ts +4 -0
- package/dist/lib/icons.d.ts.map +1 -1
- package/dist/lib/styles/animation.d.ts +35 -0
- package/dist/lib/styles/animation.d.ts.map +1 -0
- package/dist/lib/styles/disabled.d.ts +15 -0
- package/dist/lib/styles/disabled.d.ts.map +1 -0
- package/dist/lib/styles/focus.d.ts +34 -0
- package/dist/lib/styles/focus.d.ts.map +1 -0
- package/dist/lib/styles/glass.d.ts +18 -0
- package/dist/lib/styles/glass.d.ts.map +1 -0
- package/dist/lib/styles/hover.d.ts +9 -0
- package/dist/lib/styles/hover.d.ts.map +1 -0
- package/dist/lib/styles/index.d.ts +6 -0
- package/dist/lib/styles/index.d.ts.map +1 -1
- package/dist/lib/styles/transition.d.ts +42 -0
- package/dist/lib/styles/transition.d.ts.map +1 -0
- package/dist/lib/types/common.d.ts +3 -3
- package/dist/lib/types/common.d.ts.map +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/native/Box.d.ts +11 -0
- package/dist/native/Box.d.ts.map +1 -0
- package/dist/native/Pressable.d.ts +10 -0
- package/dist/native/Pressable.d.ts.map +1 -0
- package/dist/native/Text.d.ts +11 -0
- package/dist/native/Text.d.ts.map +1 -0
- package/dist/native/index.d.ts +9 -0
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/useDotMap.d.ts +51 -0
- package/dist/native/useDotMap.d.ts.map +1 -0
- package/dist/native.mjs +2 -0
- package/dist/native.mjs.map +1 -0
- package/dist/navigation.d.mts +49 -22
- package/dist/navigation.d.ts +10 -8
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.mjs +1 -1
- package/dist/navigation.mjs.map +1 -1
- package/dist/overlay.d.mts +84 -87
- package/dist/overlay.mjs +2 -2
- package/dist/overlay.mjs.map +1 -1
- package/dist/sdui/SDUIRenderer.d.ts.map +1 -1
- package/dist/sdui/core.d.ts +50 -0
- package/dist/sdui/core.d.ts.map +1 -0
- package/dist/sdui/index.d.ts +3 -1
- package/dist/sdui/index.d.ts.map +1 -1
- package/dist/sdui/registry.d.ts.map +1 -1
- package/dist/sdui/types.d.ts +38 -0
- package/dist/sdui/types.d.ts.map +1 -1
- package/dist/sdui.d.mts +89 -1
- package/dist/sdui.mjs +2 -2
- package/dist/sdui.mjs.map +1 -1
- package/dist/theme.d.mts +85 -0
- package/dist/theme.d.ts +14 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.mjs +3 -0
- package/dist/theme.mjs.map +1 -0
- package/package.json +50 -22
- package/src/styles/component-vars.css +503 -69
- package/src/styles/landing.css +12 -12
- package/src/styles/prose.css +284 -0
- package/src/styles/recommended-theme.css +123 -141
- package/src/styles/utilities.css +3 -3
- package/dist/advanced-dashboard.js +0 -39
- package/dist/advanced-dashboard.js.map +0 -1
- package/dist/advanced-emotion.js +0 -2
- package/dist/advanced-emotion.js.map +0 -1
- package/dist/advanced-motion.js +0 -82
- package/dist/advanced-motion.js.map +0 -1
- package/dist/advanced.js +0 -112
- package/dist/advanced.js.map +0 -1
- package/dist/chunk-3CCF7U3P.mjs +0 -3
- package/dist/chunk-3CCF7U3P.mjs.map +0 -1
- package/dist/chunk-3GAUTZXQ.mjs +0 -3
- package/dist/chunk-3GAUTZXQ.mjs.map +0 -1
- package/dist/chunk-42RGFEL2.mjs +0 -3
- package/dist/chunk-42RGFEL2.mjs.map +0 -1
- package/dist/chunk-4NJE7D6X.mjs +0 -3
- package/dist/chunk-4NJE7D6X.mjs.map +0 -1
- package/dist/chunk-6HVJFEDA.mjs +0 -3
- package/dist/chunk-6HVJFEDA.mjs.map +0 -1
- package/dist/chunk-7OYT3QSY.mjs +0 -3
- package/dist/chunk-7OYT3QSY.mjs.map +0 -1
- package/dist/chunk-ANYZ56VB.mjs +0 -3
- package/dist/chunk-ANYZ56VB.mjs.map +0 -1
- package/dist/chunk-AOSXB5JJ.mjs +0 -4
- package/dist/chunk-AOSXB5JJ.mjs.map +0 -1
- package/dist/chunk-B544MRF7.mjs +0 -3
- package/dist/chunk-B544MRF7.mjs.map +0 -1
- package/dist/chunk-CVWWS25A.mjs +0 -3
- package/dist/chunk-CVWWS25A.mjs.map +0 -1
- package/dist/chunk-DYNBM24D.mjs +0 -3
- package/dist/chunk-DYNBM24D.mjs.map +0 -1
- package/dist/chunk-FX57OSYG.mjs +0 -3
- package/dist/chunk-FX57OSYG.mjs.map +0 -1
- package/dist/chunk-IJSYSNM5.mjs +0 -3
- package/dist/chunk-IJSYSNM5.mjs.map +0 -1
- package/dist/chunk-KJZGOL2Z.mjs +0 -3
- package/dist/chunk-KJZGOL2Z.mjs.map +0 -1
- package/dist/chunk-KYRIUUQP.mjs +0 -3
- package/dist/chunk-KYRIUUQP.mjs.map +0 -1
- package/dist/chunk-LSA7DU3N.mjs +0 -73
- package/dist/chunk-LSA7DU3N.mjs.map +0 -1
- package/dist/chunk-MDLCJASB.mjs +0 -3
- package/dist/chunk-MDLCJASB.mjs.map +0 -1
- package/dist/chunk-N56BUOCD.mjs +0 -3
- package/dist/chunk-N56BUOCD.mjs.map +0 -1
- package/dist/chunk-OFYITQXI.mjs +0 -13
- package/dist/chunk-OFYITQXI.mjs.map +0 -1
- package/dist/chunk-OZNST3EZ.mjs +0 -3
- package/dist/chunk-OZNST3EZ.mjs.map +0 -1
- package/dist/chunk-RS6RKW5U.mjs +0 -13
- package/dist/chunk-RS6RKW5U.mjs.map +0 -1
- package/dist/chunk-TXBZZJNR.mjs +0 -3
- package/dist/chunk-TXBZZJNR.mjs.map +0 -1
- package/dist/chunk-TZ4YSHMC.mjs +0 -3
- package/dist/chunk-TZ4YSHMC.mjs.map +0 -1
- package/dist/chunk-U6CTBZ2U.mjs +0 -3
- package/dist/chunk-U6CTBZ2U.mjs.map +0 -1
- package/dist/chunk-WP7VFE77.mjs +0 -3
- package/dist/chunk-WP7VFE77.mjs.map +0 -1
- package/dist/chunk-XCZMLKPK.mjs +0 -3
- package/dist/chunk-XCZMLKPK.mjs.map +0 -1
- package/dist/chunk-XGHT7WMO.mjs +0 -3
- package/dist/chunk-XGHT7WMO.mjs.map +0 -1
- package/dist/chunk-XL4KTJ4L.mjs +0 -3
- package/dist/chunk-XL4KTJ4L.mjs.map +0 -1
- package/dist/chunk-Z74YUUVT.mjs +0 -3
- package/dist/chunk-Z74YUUVT.mjs.map +0 -1
- package/dist/chunk-ZXZIHU7J.mjs +0 -8
- package/dist/chunk-ZXZIHU7J.mjs.map +0 -1
- package/dist/components/EmptyState.d.ts +0 -62
- package/dist/components/EmptyState.d.ts.map +0 -1
- package/dist/data.js +0 -3
- package/dist/data.js.map +0 -1
- package/dist/feedback.js +0 -12
- package/dist/feedback.js.map +0 -1
- package/dist/form.js +0 -8
- package/dist/form.js.map +0 -1
- package/dist/iconsax-extended.js +0 -3
- package/dist/iconsax-extended.js.map +0 -1
- package/dist/iconsax.js +0 -3
- package/dist/iconsax.js.map +0 -1
- package/dist/index.js +0 -51
- package/dist/index.js.map +0 -1
- package/dist/interactive.js +0 -2
- package/dist/interactive.js.map +0 -1
- package/dist/landing.js +0 -100
- package/dist/landing.js.map +0 -1
- package/dist/lib/phosphor-icons.d.ts +0 -6
- package/dist/lib/phosphor-icons.d.ts.map +0 -1
- package/dist/navigation.js +0 -12
- package/dist/navigation.js.map +0 -1
- package/dist/overlay.js +0 -3
- package/dist/overlay.js.map +0 -1
- package/dist/sdui.js +0 -9
- package/dist/sdui.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
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/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","dotProp","style","type","duration","easing","delay","autoStart","onStart","onComplete","showProgress","progressDot","progressStyle","ref","dotStyle","resolveDot","isVisible","setIsVisible","useState","progress","setProgress","_isTransitioning","setIsTransitioning","animationRef","useRef","startTimeRef","getEasingFunction","easingType","t","animate","useCallback","timestamp","elapsed","easingFunction","currentProgress","startTransition","useEffect","timer","transitionStyles","jsxs","mergeStyles","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","innerRef","isVisibleRef","isMobileRef","prefersReducedMotion","useReducedMotion","mq","handleChange","e","updateTransform","element","rect","windowHeight","elementCenter","movement","x","y","scaleValue","opacityValue","rotateValue","observer","entry","computedStyle","mergeRefs","refs","value","TextReveal","text","revealColor","hiddenColor","threshold","byWord","byChar","containerRef","updateProgress","end","newProgress","handleScroll","containerStyle","useMemo","renderText","chars","char","index","charProgress","isRevealed","words","word","wordProgress","TiltCard","maxTilt","perspective","glare","maxGlare","cardRef","transform","setTransform","glarePosition","setGlarePosition","isHovered","setIsHovered","enableAnimations","useMotionConfig","motionDisabled","handleMouseMove","centerX","centerY","mouseX","mouseY","rotateY","rotateX","glareX","glareY","handleMouseEnter","handleMouseLeave","cardStyle","innerStyle","glareStyle","OBJECT_FIT_MAP","LAYER_BASE","YOUTUBE_SCALE","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","fadeStyle","renderGradientOverlay","gradients","Fragment","ImageReveal","alt","height","vh","p","clipPath","getClipPath","imgStyle","overlayStyle","r","HorizontalScroll","heightMultiplier","snap","onProgress","outerRef","scrollWidth","setScrollWidth","measure","ro","outerHeight","scrolled","totalHeight","outerStyle","stickyStyle","trackStyle","panelStyle","child","i","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","dot","Icon","BlogEditorMetadata","tagInput","setTagInput","fileInputRef","containerVariantStyle","inputStyle","labelStyle","addTag","tag","trimmed","removeTag","tagToRemove","handleTagInputChange","parts","part","idx","handleTagKeyDown","url","BlogEditorLanguageTabs","isActive","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","item","textarea","currentContent","BlogEditorPreview","renderMarkdown","content","renderedContent","Prose","BlogEditorActions","cancelLink","BlogEditorTranslate","hint","canTranslate","BlogEditorRoot","translateHint","maxWidth","contentContainerStyle","BlogEditor","BlogEditorCompound"],"mappings":"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","file":"chunk-L2LGSILS.mjs","sourcesContent":["\"use client\";\n\nimport React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport { mergeStyles, resolveDot } from \"../../hooks/useDotMap\";\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 dot?: string;\n style?: React.CSSProperties;\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 progressDot?: string;\n progressStyle?: React.CSSProperties;\n}\n\nexport const AdvancedPageTransition = React.forwardRef<\n HTMLDivElement,\n AdvancedPageTransitionProps\n>(\n (\n {\n children,\n dot: dotProp,\n style,\n type = \"fade\",\n duration = 500,\n easing = \"smooth\",\n delay = 0,\n autoStart = true,\n onStart,\n onComplete,\n showProgress = false,\n progressDot,\n progressStyle,\n },\n ref,\n ) => {\n const dotStyle = dotProp ? resolveDot(dotProp) : undefined;\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) =>\n 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 (\n Math.pow(2, -10 * t) *\n Math.sin(((t - 0.075) * (2 * Math.PI)) / 0.3) +\n 1\n );\n },\n smooth: (t: number) => {\n return t * t * (3 - 2 * t);\n },\n };\n return easingFunctions[easingType];\n };\n\n const animate = useCallback(\n (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 },\n [duration, easing, onComplete],\n );\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 style={{ position: \"relative\" }}>\n {showProgress && (\n <div\n style={mergeStyles(\n {\n position: \"fixed\",\n ...resolveDot(\"top-4\"),\n ...resolveDot(\"right-4\"),\n zIndex: 50,\n backgroundColor: \"var(--color-background)\",\n ...resolveDot(\"rounded-lg\"),\n ...resolveDot(\"px-3 py-2\"),\n boxShadow: \"0 10px 15px -3px rgba(0,0,0,0.1)\",\n border: \"1px solid var(--color-border)\",\n },\n resolveDot(progressDot),\n progressStyle,\n )}\n >\n <div\n style={{\n fontSize: \"0.875rem\",\n fontWeight: 500,\n color: \"var(--color-foreground)\",\n }}\n >\n Progress: {Math.round(progress * 100)}%\n </div>\n <div\n style={{\n width: \"6rem\",\n height: \"0.5rem\",\n backgroundColor: \"var(--color-muted)\",\n borderRadius: \"9999px\",\n ...resolveDot(\"mt-2\"),\n }}\n >\n <div\n style={{\n height: \"100%\",\n backgroundColor: \"var(--color-primary)\",\n borderRadius: \"9999px\",\n transition: \"width 100ms\",\n width: `${progress * 100}%`,\n }}\n />\n </div>\n </div>\n )}\n\n <div\n ref={ref}\n style={mergeStyles(\n {\n ...transitionStyles,\n transition: \"all 500ms ease-out\",\n transitionDuration: `${duration}ms`,\n transitionTimingFunction:\n 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 dotStyle,\n style,\n )}\n >\n {children}\n </div>\n </div>\n );\n },\n);\n\nAdvancedPageTransition.displayName = \"AdvancedPageTransition\";\n\n// 편의 컴포넌트들\nexport const FadePageTransition = React.forwardRef<\n HTMLDivElement,\n Omit<AdvancedPageTransitionProps, \"type\">\n>((props, ref) => <AdvancedPageTransition ref={ref} type=\"fade\" {...props} />);\n\nexport const SlidePageTransition = React.forwardRef<\n HTMLDivElement,\n Omit<AdvancedPageTransitionProps, \"type\">\n>((props, ref) => <AdvancedPageTransition ref={ref} type=\"slide\" {...props} />);\n\nexport const ScalePageTransition = React.forwardRef<\n HTMLDivElement,\n Omit<AdvancedPageTransitionProps, \"type\">\n>((props, ref) => <AdvancedPageTransition ref={ref} type=\"scale\" {...props} />);\n\nexport const FlipPageTransition = React.forwardRef<\n HTMLDivElement,\n Omit<AdvancedPageTransitionProps, \"type\">\n>((props, ref) => <AdvancedPageTransition ref={ref} type=\"flip\" {...props} />);\n\nexport const MorphPageTransition = React.forwardRef<\n HTMLDivElement,\n Omit<AdvancedPageTransitionProps, \"type\">\n>((props, ref) => <AdvancedPageTransition ref={ref} type=\"morph\" {...props} />);\n\nexport const CubePageTransition = React.forwardRef<\n HTMLDivElement,\n Omit<AdvancedPageTransitionProps, \"type\">\n>((props, ref) => <AdvancedPageTransition ref={ref} type=\"cube\" {...props} />);\n\nexport const ZoomPageTransition = React.forwardRef<\n HTMLDivElement,\n Omit<AdvancedPageTransitionProps, \"type\">\n>((props, ref) => <AdvancedPageTransition ref={ref} type=\"zoom\" {...props} />);\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 { mergeStyles, resolveDot } from \"../../hooks/useDotMap\";\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 Omit<React.HTMLAttributes<HTMLDivElement>, 'className'> {\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 dot?: string;\n style?: React.CSSProperties;\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 style={{ position: 'absolute', inset: 0 }} />\n * </Parallax>\n */\nconst Parallax = React.forwardRef<HTMLDivElement, ParallaxProps>(\n (\n {\n children,\n dot: dotProp,\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 computedStyle = mergeStyles(\n { transition: 'none' },\n isActive ? { willChange: 'transform, opacity' } : undefined,\n resolveDot(dotProp),\n style,\n );\n\n return (\n <div\n ref={mergeRefs(ref, innerRef)}\n style={computedStyle}\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, useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../../hooks/useDotMap\";\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 * @property {string} [dot] - dot utility string for additional styles\n * @property {React.CSSProperties} [style] - inline style overrides\n */\nexport interface TextRevealProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'className'> {\n text: string;\n revealColor?: string;\n hiddenColor?: string;\n threshold?: number;\n byWord?: boolean;\n byChar?: boolean;\n dot?: string;\n style?: React.CSSProperties;\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 dot: dotProp,\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 const containerStyle = useMemo(() => mergeStyles(\n { fontWeight: 500 },\n resolveDot(dotProp),\n style,\n ), [dotProp, style]);\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 style={containerStyle}\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, useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../../hooks/useDotMap\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useMotionConfig } from \"../../context/MotionConfigContext\";\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 * @property {string} [dot] - dot utility string for additional styles\n * @property {React.CSSProperties} [style] - inline styles\n */\nexport interface TiltCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'className'> {\n maxTilt?: number;\n perspective?: number;\n scale?: number;\n speed?: number;\n glare?: boolean;\n maxGlare?: number;\n reset?: boolean;\n dot?: string;\n style?: React.CSSProperties;\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 dot=\"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 dot: dotProp,\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 const prefersReducedMotion = useReducedMotion();\n const { enableAnimations } = useMotionConfig();\n const motionDisabled = prefersReducedMotion || !enableAnimations;\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (motionDisabled) return;\n if (!cardRef.current) return;\n\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, motionDisabled]\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 = useMemo((): React.CSSProperties => mergeStyles(\n { position: \"relative\", perspective: `${perspective}px` },\n resolveDot(dotProp),\n style,\n ), [perspective, dotProp, style]);\n\n const innerStyle: React.CSSProperties = {\n position: \"relative\",\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 style={cardStyle}\n onMouseMove={handleMouseMove}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n <div style={innerStyle}>\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, useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../../hooks/useDotMap\";\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 * @property {string} [dot] - dot 스타일 유틸리티 문자열 / dot utility string\n */\nexport interface VideoBackgroundProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'className'> {\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 dot?: string;\n style?: React.CSSProperties;\n}\n\n/** objectFit → CSSProperties mapping */\nconst OBJECT_FIT_MAP: Record<\"cover\" | \"contain\" | \"fill\", React.CSSProperties> = {\n cover: { objectFit: \"cover\" },\n contain: { objectFit: \"contain\" },\n fill: { objectFit: \"fill\" },\n};\n\n/** Base styles for absolutely-positioned full-size video/iframe layers */\nconst LAYER_BASE: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n width: \"100%\",\n height: \"100%\",\n pointerEvents: \"none\",\n};\n\n/** YouTube scale-up to hide branding */\nconst YOUTUBE_SCALE: React.CSSProperties = {\n transform: \"scale(1.2)\",\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 dot: dotProp,\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 fadeStyle: React.CSSProperties = {\n opacity: isLoaded || !fadeIn ? 1 : 0,\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\n };\n\n switch (type) {\n case \"youtube\":\n return (\n <iframe\n src={getYouTubeUrl(src)}\n style={mergeStyles(LAYER_BASE, YOUTUBE_SCALE, fadeStyle)}\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 style={mergeStyles(LAYER_BASE, fadeStyle)}\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 style={mergeStyles(\n LAYER_BASE,\n OBJECT_FIT_MAP[objectFit],\n {\n opacity: isPlaying || !fadeIn ? 1 : 0,\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\n }\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: React.ReactElement[] = [];\n\n if (gradientDirection === \"top\" || gradientDirection === \"both\") {\n gradients.push(\n <div\n key=\"top\"\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n height: \"33.333%\",\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 style={{\n position: \"absolute\",\n bottom: 0,\n left: 0,\n right: 0,\n height: \"33.333%\",\n background: `linear-gradient(to top, ${overlayColor}, transparent)`,\n }}\n aria-hidden=\"true\"\n />\n );\n }\n\n return <>{gradients}</>;\n };\n\n const containerStyle = useMemo(\n () =>\n mergeStyles(\n { overflow: \"hidden\", position: \"relative\" },\n resolveDot(dotProp),\n style,\n ),\n [dotProp, style]\n );\n\n return (\n <div\n ref={ref}\n style={containerStyle}\n {...props}\n >\n {/* Poster image (shows until video loads) */}\n {poster && fadeIn && !isLoaded && !isPlaying && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n backgroundImage: `url(${poster})`,\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n }}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Video layer */}\n {renderVideo()}\n\n {/* Solid overlay */}\n {overlay && !gradient && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n backgroundColor: overlayColor,\n }}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Gradient overlay */}\n {renderGradientOverlay()}\n\n {/* Content */}\n {children && (\n <div style={{ position: \"relative\", zIndex: 10, height: \"100%\" }}>\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, useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../../hooks/useDotMap\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\n\n/**\n * ImageReveal 컴포넌트의 props / ImageReveal component props\n * @property {string} src - 이미지 src / Image src\n * @property {string} alt - 이미지 alt / Image alt\n * @property {\"left\"|\"right\"|\"up\"|\"down\"} [direction=\"left\"] - 공개 방향 / Reveal direction\n * @property {number} [threshold=0.3] - 공개 시작 임계값 (0-1) / Reveal threshold (0-1)\n * @property {string} [height=\"400px\"] - 이미지 높이 / Image height\n * @property {string} [overlayColor] - 오버레이 색상 / Overlay color\n * @property {string} [dot] - dot utility string for additional styles\n * @property {React.CSSProperties} [style] - inline style overrides\n */\nexport interface ImageRevealProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'className'> {\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 /** dot utility string for additional styles */\n dot?: string;\n /** inline style overrides */\n style?: React.CSSProperties;\n}\n\n/**\n * ImageReveal - 스크롤 기반 이미지 공개 컴포넌트\n *\n * TextReveal에서 영감 받은 이미지 공개 효과.\n * clip-path를 사용하여 스크롤에 따라 이미지가 점진적으로 드러남.\n *\n * @component\n * @example\n * <ImageReveal src=\"/photo.jpg\" alt=\"Scenic view\" direction=\"left\" />\n *\n * @example\n * <ImageReveal src=\"/hero.jpg\" alt=\"Hero image\" direction=\"up\" height=\"600px\" overlayColor=\"rgba(0,0,0,0.4)\" />\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 dot: dotProp,\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 const containerStyle = useMemo(() => mergeStyles(\n {\n position: \"relative\",\n overflow: \"hidden\",\n height,\n },\n resolveDot(dotProp),\n style,\n ), [height, dotProp, style]);\n\n const imgStyle = useMemo<React.CSSProperties>(() => ({\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n clipPath,\n transition: \"clip-path 0.1s ease-out\",\n }), [clipPath]);\n\n const overlayStyle = useMemo<React.CSSProperties>(() => ({\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n background: overlayColor,\n opacity: 1 - progress,\n transition: \"opacity 0.3s ease-out\",\n }), [overlayColor, progress]);\n\n return (\n <div\n ref={mergeRefs(ref, containerRef)}\n style={containerStyle}\n {...props}\n >\n <img\n src={src}\n alt={alt}\n style={imgStyle}\n />\n {overlayColor && (\n <div\n style={overlayStyle}\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, { useRef, useEffect, useState, useCallback, useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../../hooks/useDotMap\";\n\nexport interface HorizontalScrollProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'className' | '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 /** dot 유틸리티 클래스 (outer wrapper에 적용) */\n dot?: string;\n style?: React.CSSProperties;\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 dot: dotProp,\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 const outerStyle = useMemo(\n () =>\n mergeStyles(\n { position: \"relative\", height: totalHeight } as React.CSSProperties,\n resolveDot(dotProp),\n style,\n ),\n [totalHeight, dotProp, style]\n );\n\n const stickyStyle: React.CSSProperties = {\n position: \"sticky\",\n top: 0,\n height: \"100vh\",\n overflow: \"hidden\",\n };\n\n const trackStyle: React.CSSProperties = {\n display: \"flex\",\n height: \"100%\",\n willChange: \"transform\",\n transform: `translateX(${-progress * scrollWidth}px)`,\n ...(snap\n ? { scrollSnapType: \"x mandatory\" }\n : {}),\n };\n\n const panelStyle: React.CSSProperties = {\n flexShrink: 0,\n width: \"100vw\",\n height: \"100%\",\n ...(snap ? { scrollSnapAlign: \"start\" } : {}),\n };\n\n return (\n <div\n ref={mergeRefs(ref, outerRef)}\n style={outerStyle}\n {...props}\n >\n <div style={stickyStyle}>\n <div ref={innerRef} style={trackStyle}>\n {React.Children.map(children, (child, i) => (\n <div key={i} style={panelStyle}>\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 { mergeStyles, resolveDot } from '../../../hooks/useDotMap'\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 /** dot 유틸리티 스타일 */\n dot?: string\n /** 인라인 스타일 */\n style?: React.CSSProperties\n}\n\n/**\n * BlogEditorHeader 컴포넌트\n * 에디터 헤더 (제목 + 미리보기 토글)\n */\nconst BlogEditorHeader = React.forwardRef<HTMLElement, BlogEditorHeaderProps>(\n ({ onBack, backLink, dot, style }, ref) => {\n const { labels, isEditMode, formData } = useBlogEditor()\n\n return (\n <header\n ref={ref}\n style={mergeStyles(resolveDot('flex items-center justify-between mb-8'), resolveDot(dot), style)}\n >\n <div style={resolveDot('flex items-center gap-4')}>\n {backLink || (\n onBack && (\n <button\n type=\"button\"\n onClick={onBack}\n style={resolveDot('p-2 text-muted-foreground transition-colors')}\n aria-label=\"뒤로가기\"\n >\n <Icon name=\"chevronLeft\" size={24} />\n </button>\n )\n )}\n <div>\n <h1 style={resolveDot('text-2xl font-bold text-foreground')}>\n {isEditMode ? labels.editTitle : labels.pageTitle}\n </h1>\n {isEditMode && formData.slug && (\n <p style={resolveDot('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, {\n useState,\n useCallback,\n useRef,\n KeyboardEvent,\n ChangeEvent,\n} from \"react\";\nimport { mergeStyles, resolveDot } from \"../../../hooks/useDotMap\";\nimport { Icon } from \"../../Icon\";\nimport { useBlogEditor } from \"./BlogEditorContext\";\nimport { normalizeSlug } from \"./utils/slug\";\n\n/**\n * BlogEditorMetadata Props\n */\nexport interface BlogEditorMetadataProps {\n /** dot 유틸리티 스타일 */\n dot?: string;\n /** 인라인 스타일 */\n style?: React.CSSProperties;\n}\n\n/**\n * BlogEditorMetadata 컴포넌트\n * 메타데이터 필드 (슬러그, 태그, 커버 이미지, 발행일)\n */\nconst BlogEditorMetadata = React.forwardRef<\n HTMLDivElement,\n BlogEditorMetadataProps\n>(({ dot, style }, ref) => {\n const {\n formData,\n updateField,\n features,\n labels,\n variant,\n handleUploadImage,\n uploading,\n setSlugManuallyEdited,\n } = useBlogEditor();\n const [tagInput, setTagInput] = useState(\"\");\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // variant별 컨테이너 스타일\n const containerVariantStyle: React.CSSProperties =\n variant === \"glass\"\n ? {\n background: \"rgba(255,255,255,0.1)\",\n backdropFilter: \"blur(4px)\",\n border: \"1px solid rgba(255,255,255,0.2)\",\n }\n : variant === \"minimal\"\n ? { background: \"transparent\" }\n : {};\n\n const containerStyle = mergeStyles(\n resolveDot(\"rounded-xl p-6 space-y-4\"),\n variant !== \"glass\" && variant !== \"minimal\"\n ? resolveDot(\"bg-background\")\n : undefined,\n containerVariantStyle,\n resolveDot(dot),\n style,\n );\n\n const inputStyle = resolveDot(\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\n const labelStyle = resolveDot(\n \"block text-sm font-medium text-foreground mb-1\",\n );\n\n // 태그 추가\n const addTag = useCallback(\n (tag: string) => {\n const trimmed = tag.trim();\n if (trimmed && !formData.tags.includes(trimmed)) {\n updateField(\"tags\", [...formData.tags, trimmed]);\n }\n setTagInput(\"\");\n },\n [formData.tags, updateField],\n );\n\n // 태그 삭제\n const removeTag = useCallback(\n (tagToRemove: string) => {\n updateField(\n \"tags\",\n formData.tags.filter((t) => t !== tagToRemove),\n );\n },\n [formData.tags, updateField],\n );\n\n // 태그 입력 핸들러\n const handleTagInputChange = useCallback(\n (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 },\n [addTag],\n );\n\n // 키보드 이벤트 핸들러\n const handleTagKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n addTag(tagInput);\n } else if (\n e.key === \"Backspace\" &&\n !tagInput &&\n formData.tags.length > 0\n ) {\n // 입력창이 비어있을 때 Backspace 누르면 마지막 태그 삭제\n removeTag(formData.tags[formData.tags.length - 1]);\n }\n },\n [tagInput, formData.tags, addTag, removeTag],\n );\n\n return (\n <div ref={ref} style={containerStyle}>\n <h2 style={resolveDot(\"font-semibold text-foreground\")}>\n {labels.basicInfo}\n </h2>\n\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(1, minmax(0, 1fr))\",\n ...resolveDot(\"gap-4\"),\n }}\n >\n {/* 슬러그 */}\n {features.enableSlug && (\n <div>\n <label style={labelStyle}>{labels.slug} *</label>\n <div style={resolveDot(\"flex items-center\")}>\n <span style={resolveDot(\"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 style={mergeStyles(inputStyle, { flex: 1 })}\n placeholder=\"my-post-slug\"\n />\n </div>\n </div>\n )}\n\n {/* 태그 */}\n {features.enableTags && (\n <div>\n <label style={labelStyle}>{labels.tags}</label>\n <div\n style={mergeStyles(\n resolveDot(\n \"flex flex-wrap items-center gap-2 min-h-[42px] px-3 py-2 border border-border rounded-lg bg-background transition-colors\",\n ),\n )}\n >\n {/* 태그 칩들 */}\n {formData.tags.map((tag) => (\n <span\n key={tag}\n style={resolveDot(\n \"inline-flex items-center gap-1 px-2 py-0.5 bg-primary/10 text-primary text-sm rounded-md\",\n )}\n >\n {tag}\n <button\n type=\"button\"\n onClick={() => removeTag(tag)}\n style={resolveDot(\"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 style={mergeStyles(\n resolveDot(\"bg-transparent text-foreground text-sm\"),\n { flex: 1, minWidth: \"100px\", outline: \"none\" },\n )}\n placeholder={\n formData.tags.length === 0\n ? labels.tagsPlaceholder\n : \"태그 추가...\"\n }\n />\n </div>\n <p style={resolveDot(\"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 style={labelStyle}>{labels.coverImage}</label>\n <div style={resolveDot(\"space-y-3\")}>\n {/* 이미지 미리보기 */}\n {formData.coverImage && (\n <div\n style={{\n position: \"relative\",\n width: \"100%\",\n ...resolveDot(\"h-40\"),\n ...resolveDot(\"rounded-lg\"),\n overflow: \"hidden\",\n background: \"var(--muted)\",\n }}\n >\n <img\n src={formData.coverImage}\n alt=\"커버 이미지 미리보기\"\n style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\" }}\n />\n <button\n type=\"button\"\n onClick={() => updateField(\"coverImage\", \"\")}\n style={mergeStyles(\n resolveDot(\n \"p-1.5 text-white rounded-full transition-colors\",\n ),\n {\n position: \"absolute\",\n ...resolveDot(\"top-2 right-2\"),\n background: \"rgb(239,68,68)\",\n },\n )}\n aria-label=\"이미지 삭제\"\n >\n <Icon name=\"x\" size={14} />\n </button>\n </div>\n )}\n\n {/* URL 입력 + 파일 업로드 */}\n <div style={resolveDot(\"flex gap-2\")}>\n <input\n type=\"text\"\n value={formData.coverImage}\n onChange={(e) => updateField(\"coverImage\", e.target.value)}\n style={mergeStyles(inputStyle, { flex: 1 })}\n placeholder={labels.coverImagePlaceholder}\n />\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: \"none\" }}\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 style={resolveDot(\n \"px-3 py-2 border border-border rounded-lg hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed transition-colors\",\n )}\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\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(1, minmax(0, 1fr))\",\n ...resolveDot(\"gap-4\"),\n }}\n >\n {features.enablePublishDate && (\n <div>\n <label style={labelStyle}>{labels.publishDate}</label>\n <input\n type=\"datetime-local\"\n value={formData.publishedAt ?? \"\"}\n onChange={(e) =>\n updateField(\"publishedAt\", e.target.value || null)\n }\n style={inputStyle}\n />\n <p style={resolveDot(\"mt-1 text-sm text-muted-foreground\")}>\n {labels.publishDateHint}\n </p>\n </div>\n )}\n\n {features.enableExpiresAt && (\n <div>\n <label style={labelStyle}>{labels.expiresAt}</label>\n <input\n type=\"datetime-local\"\n value={formData.expiresAt ?? \"\"}\n onChange={(e) => updateField(\"expiresAt\", e.target.value || null)}\n style={inputStyle}\n />\n <p style={resolveDot(\"mt-1 text-sm text-muted-foreground\")}>\n {labels.expiresAtHint}\n </p>\n </div>\n )}\n </div>\n </div>\n );\n});\n\nBlogEditorMetadata.displayName = \"BlogEditorMetadata\";\n\nexport { BlogEditorMetadata };\n","\"use client\"\n\nimport React from 'react'\nimport { mergeStyles, resolveDot } from '../../../hooks/useDotMap'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorLanguageTabs Props\n */\nexport interface BlogEditorLanguageTabsProps {\n /** dot 유틸리티 스타일 */\n dot?: string\n /** 인라인 스타일 */\n style?: React.CSSProperties\n}\n\n/**\n * BlogEditorLanguageTabs 컴포넌트\n * 언어 탭 네비게이션 + 미리보기 토글 (sticky)\n */\nconst BlogEditorLanguageTabs = React.forwardRef<HTMLDivElement, BlogEditorLanguageTabsProps>(\n ({ dot, style }, ref) => {\n const { languages, activeLanguage, setActiveLanguage, showPreview, setShowPreview, features, labels } = useBlogEditor()\n\n return (\n <div\n ref={ref}\n style={mergeStyles(\n resolveDot('flex items-center border-b border-border bg-background'),\n { position: 'sticky', top: 0, zIndex: 10 },\n resolveDot(dot),\n style\n )}\n role=\"tablist\"\n aria-label=\"언어 선택\"\n >\n <div style={resolveDot('flex flex-1')}>\n {languages.map((lang) => {\n const isActive = activeLanguage === lang.key\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 style={mergeStyles(\n resolveDot('flex-1 px-4 py-3 text-sm font-medium transition-colors'),\n isActive\n ? resolveDot('bg-primary/10 text-primary border-b-2 border-primary')\n : resolveDot('text-muted-foreground hover:bg-muted')\n )}\n >\n {lang.flag && <span style={{ marginRight: '0.375rem' }}>{lang.flag}</span>}\n {lang.label}\n {lang.isPrimary && ' *'}\n </button>\n )\n })}\n </div>\n\n {features.enablePreview && (\n <button\n type=\"button\"\n onClick={() => setShowPreview(!showPreview)}\n style={resolveDot('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 { mergeStyles, resolveDot } from '../../../hooks/useDotMap'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorContent Props\n */\nexport interface BlogEditorContentProps {\n /** dot 유틸리티 스타일 */\n dot?: string\n /** 인라인 스타일 */\n style?: React.CSSProperties\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 ({ dot, style, 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 inputStyle = resolveDot(\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\n const labelStyle = resolveDot('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\n ref={ref}\n style={mergeStyles(resolveDot('p-6 space-y-4'), resolveDot(dot), style)}\n >\n {/* 제목 */}\n <div>\n <label style={labelStyle}>{getLangLabel(labels.titleLabel)}</label>\n <input\n type=\"text\"\n value={formData.title[activeLanguage] || ''}\n onChange={(e) => handleTitleChange(e.target.value)}\n style={inputStyle}\n placeholder={labels.titlePlaceholder}\n />\n </div>\n\n {/* 요약 */}\n {features.enableExcerpt && (\n <div>\n <label style={labelStyle}>{getLangLabel(labels.excerpt)}</label>\n <textarea\n value={formData.excerpt[activeLanguage] || ''}\n onChange={(e) => updateMultilingualField('excerpt', activeLanguage, e.target.value)}\n rows={2}\n style={mergeStyles(inputStyle, { resize: 'none' })}\n placeholder={labels.excerptPlaceholder}\n />\n </div>\n )}\n\n {/* 본문 */}\n <div>\n <label style={labelStyle}>\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 style={mergeStyles(inputStyle, { fontFamily: 'monospace', fontSize: '0.875rem', resize: 'vertical', minHeight: '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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\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 { mergeStyles, resolveDot } from '../../../hooks/useDotMap'\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 /** dot 유틸리티 스타일 */\n dot?: string\n /** 인라인 스타일 */\n style?: React.CSSProperties\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: '' },\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, dot, style }, 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 style={mergeStyles(\n resolveDot('flex flex-wrap gap-1 px-4 py-2 border-b border-border bg-muted'),\n resolveDot(dot),\n style\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 style={resolveDot('p-2 text-muted-foreground transition-colors rounded')}\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 { mergeStyles, resolveDot } from \"../../../hooks/useDotMap\";\nimport { useBlogEditor } from \"./BlogEditorContext\";\nimport { parseMarkdown } from \"./utils/markdown\";\nimport { Prose } from \"../../Prose\";\n\n/**\n * BlogEditorPreview Props\n */\nexport interface BlogEditorPreviewProps {\n /** 커스텀 마크다운 렌더러 / Custom markdown renderer */\n renderMarkdown?: (content: string) => React.ReactNode;\n /** dot 유틸리티 스타일 */\n dot?: string;\n /** 인라인 스타일 */\n style?: React.CSSProperties;\n}\n\n/**\n * BlogEditorPreview 컴포넌트\n * 마크다운 미리보기\n */\nconst BlogEditorPreview = React.forwardRef<\n HTMLDivElement,\n BlogEditorPreviewProps\n>(({ renderMarkdown, dot, style }, ref) => {\n const { formData, activeLanguage, languages, labels } = useBlogEditor();\n\n const primaryLanguage =\n languages.find((l) => l.isPrimary)?.key || languages[0]?.key;\n\n // 현재 언어의 콘텐츠, 없으면 기본 언어 콘텐츠\n const title =\n formData.title[activeLanguage] ||\n formData.title[primaryLanguage] ||\n labels.noTitle;\n const content =\n formData.content[activeLanguage] || formData.content[primaryLanguage] || \"\";\n\n // 마크다운 렌더링\n const renderedContent = React.useMemo(() => {\n if (renderMarkdown) {\n return renderMarkdown(content);\n }\n // 기본 마크다운 파서 사용\n return <div dangerouslySetInnerHTML={{ __html: parseMarkdown(content) }} />;\n }, [content, renderMarkdown]);\n\n return (\n <div\n ref={ref}\n style={mergeStyles(resolveDot(\"p-6\"), resolveDot(dot), style)}\n >\n <h3 style={resolveDot(\"text-xl font-bold text-foreground mb-4\")}>\n {title}\n </h3>\n <Prose style={{ maxWidth: \"none\" }}>{renderedContent}</Prose>\n </div>\n );\n});\n\nBlogEditorPreview.displayName = \"BlogEditorPreview\";\n\nexport { BlogEditorPreview };\n","\"use client\"\n\nimport React from 'react'\nimport { mergeStyles, resolveDot } from '../../../hooks/useDotMap'\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 /** dot 유틸리티 스타일 */\n dot?: string\n /** 인라인 스타일 */\n style?: React.CSSProperties\n}\n\n/**\n * BlogEditorActions 컴포넌트\n * 저장/발행/취소 버튼\n */\nconst BlogEditorActions = React.forwardRef<HTMLDivElement, BlogEditorActionsProps>(\n ({ cancelLink, dot, style }, ref) => {\n const { labels, submitting, handleSave, handleCancel, isEditMode, autoSaveStatus, features } = useBlogEditor()\n\n return (\n <div\n ref={ref}\n style={mergeStyles(resolveDot('flex items-center justify-end gap-3'), resolveDot(dot), style)}\n >\n {/* 자동저장 상태 */}\n {features.enableAutoSave && autoSaveStatus !== 'idle' && (\n <span style={resolveDot('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 style={resolveDot('px-4 py-2 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 style={resolveDot('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 style={resolveDot('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 { mergeStyles, resolveDot } from '../../../hooks/useDotMap'\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 /** dot 유틸리티 스타일 */\n dot?: string\n /** 인라인 스타일 */\n style?: React.CSSProperties\n}\n\n/**\n * BlogEditorTranslate 컴포넌트\n * AI 번역 버튼\n */\nconst BlogEditorTranslate = React.forwardRef<HTMLDivElement, BlogEditorTranslateProps>(\n ({ hint, dot, style }, 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 style={mergeStyles(\n resolveDot('px-6 py-3 bg-muted border-b border-border flex items-center justify-between'),\n resolveDot(dot),\n style\n )}\n >\n <div style={resolveDot('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 style={mergeStyles(\n resolveDot('inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors'),\n translateSuccess\n ? resolveDot('bg-green-100 text-green-700')\n : resolveDot('bg-primary text-white 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 { mergeStyles, resolveDot } from '../../../hooks/useDotMap'\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 /** dot 유틸리티 스타일 */\n dot?: string\n /** 인라인 스타일 */\n style?: React.CSSProperties\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 dot: dotProp,\n style,\n children,\n}: BlogEditorRootProps) {\n const { showPreview, error, variant, features } = useBlogEditor()\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n // variant별 컨테이너 스타일\n const containerVariantStyle: React.CSSProperties =\n variant === 'glass'\n ? {\n background: 'linear-gradient(to bottom right, rgb(243,244,246), rgb(229,231,235))',\n }\n : {}\n\n const containerStyle = mergeStyles(\n variant === 'glass' ? containerVariantStyle : variant === 'minimal' ? {} : resolveDot('bg-muted'),\n resolveDot(dotProp),\n style\n )\n\n // variant별 콘텐츠 컨테이너 스타일\n const contentContainerStyle: React.CSSProperties =\n variant === 'glass'\n ? {\n background: 'rgba(255,255,255,0.1)',\n backdropFilter: 'blur(4px)',\n border: '1px solid rgba(255,255,255,0.2)',\n borderRadius: '0.75rem',\n overflow: 'hidden',\n }\n : variant === 'minimal'\n ? mergeStyles(resolveDot('rounded-xl overflow-hidden bg-transparent border border-border'))\n : mergeStyles(resolveDot('rounded-xl overflow-hidden bg-background'))\n\n const innerStyle = mergeStyles(\n resolveDot('mx-auto px-4 py-8'),\n maxWidth ? resolveDot(maxWidth) : undefined\n )\n\n // 커스텀 자식 요소가 있으면 그걸 렌더링\n if (children) {\n return (\n <div style={containerStyle}>\n <div style={innerStyle}>\n {children}\n </div>\n </div>\n )\n }\n\n // 기본 레이아웃\n return (\n <div style={containerStyle}>\n <div style={innerStyle}>\n {/* 헤더 */}\n <BlogEditorHeader onBack={onBack} backLink={backLink} />\n\n {/* 에러 메시지 */}\n {error && (\n <div style={mergeStyles(\n resolveDot('mb-6 p-4 border rounded-lg'),\n {\n background: 'rgb(254,242,242)',\n borderColor: 'rgb(254,202,202)',\n color: 'rgb(220,38,38)',\n }\n )}>\n {error}\n </div>\n )}\n\n <div style={resolveDot('space-y-6')}>\n {/* 메타데이터 */}\n <BlogEditorMetadata />\n\n {/* 콘텐츠 영역 */}\n <div style={contentContainerStyle}>\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 dot,\n style,\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 dot={dot}\n style={style}\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"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {a}from'./chunk-7CGJQSJO.mjs';var n={normal:"all 200ms ease-in-out",instant:"all 100ms ease-out",slow:"all 300ms ease-out",spring:`all 180ms ${a.springy}`,colors:"background-color 200ms ease-in-out, color 200ms ease-in-out",bgBorder:"background-color 200ms ease-in-out, border-color 200ms ease-in-out",transform:"transform 200ms ease-out",micro:"opacity 120ms ease, transform 100ms ease",smooth:"all 300ms ease-in-out",bg:"background-color 200ms ease-in-out"};var o={light:"blur(4px)",medium:"blur(8px)",heavy:"blur(12px)"},e={light:"rgba(255, 255, 255, 0.1)",medium:"rgba(255, 255, 255, 0.3)",heavy:"rgba(255, 255, 255, 0.5)"},t={light:"1px solid rgba(255, 255, 255, 0.2)",medium:"1px solid rgba(255, 255, 255, 0.3)",heavy:"1px solid rgba(226, 232, 240, 0.5)"};function l(s="light"){return {backdropFilter:o[s],WebkitBackdropFilter:o[s],backgroundColor:e[s],border:t[s]}}export{n as a,l as b};//# sourceMappingURL=chunk-LPHUWTQ2.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-LPHUWTQ2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/styles/transition.ts","../src/lib/styles/glass.ts"],"names":["TRANSITIONS","EASING_FUNCTIONS","BLUR_MAP","BG_MAP","BORDER_MAP","createGlassStyle","intensity"],"mappings":"qCAeO,IAAMA,EAAc,CAEzB,MAAA,CAAQ,uBAAA,CAER,OAAA,CAAS,qBAET,IAAA,CAAM,oBAAA,CAEN,MAAA,CAAQ,CAAA,UAAA,EAAaC,EAAiB,OAAO,CAAA,CAAA,CAE7C,MAAA,CAAQ,6DAAA,CAER,SACE,oEAAA,CAEF,SAAA,CAAW,0BAAA,CAEX,KAAA,CAAO,2CAEP,MAAA,CAAQ,uBAAA,CAER,EAAA,CAAI,oCACN,EC5BA,IAAMC,CAAAA,CAA2C,CAC/C,KAAA,CAAO,YACP,MAAA,CAAQ,WAAA,CACR,KAAA,CAAO,YACT,EAEMC,CAAAA,CAAyC,CAC7C,KAAA,CAAO,0BAAA,CACP,OAAQ,0BAAA,CACR,KAAA,CAAO,0BACT,CAAA,CAEMC,EAA6C,CACjD,KAAA,CAAO,oCAAA,CACP,MAAA,CAAQ,qCACR,KAAA,CAAO,oCACT,CAAA,CAYO,SAASC,EACdC,CAAAA,CAA4B,OAAA,CACb,CACf,OAAO,CACL,cAAA,CAAgBJ,CAAAA,CAASI,CAAS,CAAA,CAClC,qBAAsBJ,CAAAA,CAASI,CAAS,CAAA,CACxC,eAAA,CAAiBH,EAAOG,CAAS,CAAA,CACjC,OAAQF,CAAAA,CAAWE,CAAS,CAC9B,CACF","file":"chunk-LPHUWTQ2.mjs","sourcesContent":["/**\n * Shared transition presets for HUA-UI components\n *\n * Standard durations:\n * - instant: 100ms (micro-interactions)\n * - normal: 200ms (most components)\n * - slow: 300ms (heavy elements)\n * - spring: 180ms with HUA signature springy easing\n */\n\nimport { EASING_FUNCTIONS } from \"../motion/presets\";\n\nexport type TransitionPreset = \"instant\" | \"normal\" | \"slow\" | \"spring\";\n\n/** Pre-built transition strings for common use cases */\nexport const TRANSITIONS = {\n /** all 200ms ease-in-out — default for most components */\n normal: \"all 200ms ease-in-out\",\n /** all 100ms ease-out — snappy micro-interactions */\n instant: \"all 100ms ease-out\",\n /** all 300ms ease-out — deliberate, heavy elements */\n slow: \"all 300ms ease-out\",\n /** all 180ms springy — HUA signature */\n spring: `all 180ms ${EASING_FUNCTIONS.springy}`,\n /** background-color + color — dropdown items */\n colors: \"background-color 200ms ease-in-out, color 200ms ease-in-out\",\n /** background-color + border-color — switch track */\n bgBorder:\n \"background-color 200ms ease-in-out, border-color 200ms ease-in-out\",\n /** transform only — switch thumb, chevron rotation */\n transform: \"transform 200ms ease-out\",\n /** opacity + transform — Pressable micro-interaction */\n micro: \"opacity 120ms ease, transform 100ms ease\",\n /** all 300ms ease-in-out — Toast items */\n smooth: \"all 300ms ease-in-out\",\n /** background-color only — close button hover */\n bg: \"background-color 200ms ease-in-out\",\n} as const;\n\n/**\n * Create a transition string for specific CSS properties with a preset timing.\n *\n * @example\n * createPropertyTransition([\"transform\", \"box-shadow\"], \"normal\")\n * // → \"transform 200ms ease-in-out, box-shadow 200ms ease-in-out\"\n */\nexport function createPropertyTransition(\n properties: string[],\n preset: TransitionPreset = \"normal\",\n): string {\n const timings: Record<TransitionPreset, string> = {\n instant: \"100ms ease-out\",\n normal: \"200ms ease-in-out\",\n slow: \"300ms ease-out\",\n spring: `180ms ${EASING_FUNCTIONS.springy}`,\n };\n return properties.map((prop) => `${prop} ${timings[preset]}`).join(\", \");\n}\n","/**\n * Glass effect utility\n * Shared glass/frosted-glass style generator for HUA-UI components.\n */\n\nimport type { CSSProperties } from \"react\";\n\nexport type GlassIntensity = \"light\" | \"medium\" | \"heavy\";\n\nconst BLUR_MAP: Record<GlassIntensity, string> = {\n light: \"blur(4px)\",\n medium: \"blur(8px)\",\n heavy: \"blur(12px)\",\n};\n\nconst BG_MAP: Record<GlassIntensity, string> = {\n light: \"rgba(255, 255, 255, 0.1)\",\n medium: \"rgba(255, 255, 255, 0.3)\",\n heavy: \"rgba(255, 255, 255, 0.5)\",\n};\n\nconst BORDER_MAP: Record<GlassIntensity, string> = {\n light: \"1px solid rgba(255, 255, 255, 0.2)\",\n medium: \"1px solid rgba(255, 255, 255, 0.3)\",\n heavy: \"1px solid rgba(226, 232, 240, 0.5)\",\n};\n\n/**\n * Creates glass/frosted-glass CSSProperties.\n *\n * @param intensity - \"light\" (4px blur), \"medium\" (8px), \"heavy\" (12px)\n * @returns CSSProperties with backdrop-filter + webkit prefix\n *\n * @example\n * const glassStyle = createGlassStyle(\"light\")\n * // { backdropFilter: \"blur(4px)\", ... }\n */\nexport function createGlassStyle(\n intensity: GlassIntensity = \"light\",\n): CSSProperties {\n return {\n backdropFilter: BLUR_MAP[intensity],\n WebkitBackdropFilter: BLUR_MAP[intensity],\n backgroundColor: BG_MAP[intensity],\n border: BORDER_MAP[intensity],\n };\n}\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {e}from'./chunk-RICRFXFP.mjs';import {b,a}from'./chunk-LPHUWTQ2.mjs';import {d,e as e$1}from'./chunk-OBMOTQEU.mjs';import b$1,{useState,useMemo}from'react';import {dotVariants}from'@hua-labs/dot';import {jsx}from'react/jsx-runtime';var R=dotVariants({base:"inline-flex items-center border px-2.5 py-0.5 text-xs font-semibold",variants:{variant:{default:"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)]",secondary:"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)]",destructive:"bg-[var(--badge-destructive-bg)] text-slate-50",error:"bg-[var(--badge-destructive-bg)] text-slate-50",outline:"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)]",glass:"bg-[var(--badge-glass-bg)] border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)]"},rounded:{none:"rounded-none",sm:"rounded",md:"rounded-md",lg:"rounded-lg",xl:"rounded-xl",full:"rounded-full"}},defaultVariants:{variant:"default",rounded:"full"}}),T={default:{opacity:.8},secondary:{opacity:.8},destructive:{opacity:.8},error:{opacity:.8},outline:{backgroundColor:"var(--badge-outline-hover-bg)"},glass:{opacity:.8}},C=b("light"),N=b$1.memo(b$1.forwardRef(({dot:t,variant:e$2="default",rounded:r="full",style:o,...m},v)=>{let[a$1,s]=useState(false),[d$1,n]=useState(false),p=useMemo(()=>{let x=R({variant:e$2,rounded:r});return d(x,{transition:a.normal},e$2==="glass"?C:void 0,a$1?T[e$2]:void 0,d$1?e:void 0,e$1(t),o)},[e$2,r,a$1,d$1,t,o]);return jsx("div",{ref:v,style:p,onMouseEnter:()=>s(true),onMouseLeave:()=>s(false),onFocus:()=>n(true),onBlur:()=>n(false),...m})}));N.displayName="Badge";export{N as a};//# sourceMappingURL=chunk-M4JE7TQL.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-M4JE7TQL.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Badge.tsx"],"names":["badgeVariantStyles","dotVariants","VARIANT_HOVER","GLASS_EXTRAS","createGlassStyle","Badge","React","dotProp","variant","rounded","style","props","ref","isHovered","setIsHovered","useState","isFocused","setIsFocused","computedStyle","useMemo","base","mergeStyles","TRANSITIONS","FOCUS_RING_CONTROL","resolveDot","jsx"],"mappings":"+OASO,IAAMA,CAAAA,CAAqBC,WAAAA,CAAY,CAC5C,IAAA,CAAM,sEACN,QAAA,CAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,+DAAA,CACT,UACE,mEAAA,CACF,WAAA,CAAa,gDAAA,CACb,KAAA,CAAO,gDAAA,CACP,OAAA,CACE,8FACF,KAAA,CACE,qGACJ,CAAA,CACA,OAAA,CAAS,CACP,IAAA,CAAM,eACN,EAAA,CAAI,SAAA,CACJ,EAAA,CAAI,YAAA,CACJ,EAAA,CAAI,YAAA,CACJ,GAAI,YAAA,CACJ,IAAA,CAAM,cACR,CACF,CAAA,CACA,eAAA,CAAiB,CACf,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,MACX,CACF,CAAC,EAGKC,CAAAA,CAAqD,CACzD,OAAA,CAAS,CAAE,OAAA,CAAS,EAAI,EACxB,SAAA,CAAW,CAAE,OAAA,CAAS,EAAI,CAAA,CAC1B,WAAA,CAAa,CAAE,OAAA,CAAS,EAAI,CAAA,CAC5B,KAAA,CAAO,CAAE,OAAA,CAAS,EAAI,CAAA,CACtB,OAAA,CAAS,CAAE,eAAA,CAAiB,+BAAgC,CAAA,CAC5D,MAAO,CAAE,OAAA,CAAS,EAAI,CACxB,CAAA,CAGMC,CAAAA,CAAoCC,EAAiB,OAAO,CAAA,CA+B5DC,CAAAA,CAAQC,GAAAA,CAAM,IAAA,CAClBA,GAAAA,CAAM,WACJ,CACE,CAAE,GAAA,CAAKC,CAAAA,CAAS,OAAA,CAAAC,GAAAA,CAAU,UAAW,OAAA,CAAAC,CAAAA,CAAU,OAAQ,KAAA,CAAAC,CAAAA,CAAO,GAAGC,CAAM,CAAA,CACvEC,CAAAA,GACG,CACH,GAAM,CAACC,IAAWC,CAAY,CAAA,CAAIC,QAAAA,CAAS,KAAK,CAAA,CAC1C,CAACC,IAAWC,CAAY,CAAA,CAAIF,QAAAA,CAAS,KAAK,CAAA,CAE1CG,CAAAA,CAAgBC,QAAQ,IAAM,CAClC,IAAMC,CAAAA,CAAOpB,CAAAA,CAAmB,CAC9B,QAAAQ,GAAAA,CACA,OAAA,CAAAC,CACF,CAAC,CAAA,CACD,OAAOY,EACLD,CAAAA,CACA,CAAE,UAAA,CAAYE,CAAAA,CAAY,MAAO,CAAA,CACjCd,MAAY,OAAA,CAAUL,CAAAA,CAAe,MAAA,CACrCU,GAAAA,CAAYX,CAAAA,CAAcM,GAAO,EAAI,MAAA,CACrCQ,GAAAA,CAAYO,CAAAA,CAAqB,MAAA,CACjCC,GAAAA,CAAWjB,CAAO,EAClBG,CACF,CACF,CAAA,CAAG,CAACF,GAAAA,CAASC,CAAAA,CAASI,IAAWG,GAAAA,CAAWT,CAAAA,CAASG,CAAK,CAAC,CAAA,CAE3D,OACEe,IAAC,KAAA,CAAA,CACC,GAAA,CAAKb,CAAAA,CACL,KAAA,CAAOM,CAAAA,CACP,YAAA,CAAc,IAAMJ,CAAAA,CAAa,IAAI,CAAA,CACrC,YAAA,CAAc,IAAMA,CAAAA,CAAa,KAAK,CAAA,CACtC,OAAA,CAAS,IAAMG,CAAAA,CAAa,IAAI,CAAA,CAChC,OAAQ,IAAMA,CAAAA,CAAa,KAAK,CAAA,CAC/B,GAAGN,CAAAA,CACN,CAEJ,CACF,CACF,EACAN,CAAAA,CAAM,WAAA,CAAc,OAAA","file":"chunk-M4JE7TQL.mjs","sourcesContent":["\"use client\";\n\nimport React, { useState, useMemo } from \"react\";\nimport { dotVariants } from \"@hua-labs/dot\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\nimport { createGlassStyle } from \"../lib/styles/glass\";\nimport { FOCUS_RING_CONTROL } from \"../lib/styles/focus\";\nimport { TRANSITIONS } from \"../lib/styles/transition\";\n\nexport const badgeVariantStyles = dotVariants({\n base: \"inline-flex items-center border px-2.5 py-0.5 text-xs font-semibold\",\n variants: {\n variant: {\n default: \"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)]\",\n secondary:\n \"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)]\",\n destructive: \"bg-[var(--badge-destructive-bg)] text-slate-50\",\n error: \"bg-[var(--badge-destructive-bg)] text-slate-50\",\n outline:\n \"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)]\",\n glass:\n \"bg-[var(--badge-glass-bg)] border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)]\",\n },\n rounded: {\n none: \"rounded-none\",\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n xl: \"rounded-xl\",\n full: \"rounded-full\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n rounded: \"full\",\n },\n});\n\n/** Variant-specific hover overrides */\nconst VARIANT_HOVER: Record<string, React.CSSProperties> = {\n default: { opacity: 0.8 },\n secondary: { opacity: 0.8 },\n destructive: { opacity: 0.8 },\n error: { opacity: 0.8 },\n outline: { backgroundColor: \"var(--badge-outline-hover-bg)\" },\n glass: { opacity: 0.8 },\n};\n\n/** Glass variant extras (backdrop-blur) */\nconst GLASS_EXTRAS: React.CSSProperties = createGlassStyle(\"light\");\n\n/**\n * Badge component props\n */\nexport interface BadgeProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"className\"\n> {\n variant?:\n | \"default\"\n | \"secondary\"\n | \"destructive\"\n | \"error\"\n | \"outline\"\n | \"glass\";\n rounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n dot?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Badge component\n *\n * A small badge component for displaying status or category.\n *\n * @example\n * <Badge>New</Badge>\n * <Badge variant=\"destructive\">Done</Badge>\n * <Badge variant=\"outline\">Pending</Badge>\n */\nconst Badge = React.memo(\n React.forwardRef<HTMLDivElement, BadgeProps>(\n (\n { dot: dotProp, variant = \"default\", rounded = \"full\", style, ...props },\n ref,\n ) => {\n const [isHovered, setIsHovered] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const computedStyle = useMemo(() => {\n const base = badgeVariantStyles({\n variant,\n rounded,\n }) as React.CSSProperties;\n return mergeStyles(\n base,\n { transition: TRANSITIONS.normal },\n variant === \"glass\" ? GLASS_EXTRAS : undefined,\n isHovered ? VARIANT_HOVER[variant] : undefined,\n isFocused ? FOCUS_RING_CONTROL : undefined,\n resolveDot(dotProp),\n style,\n );\n }, [variant, rounded, isHovered, isFocused, dotProp, style]);\n\n return (\n <div\n ref={ref}\n style={computedStyle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n {...props}\n />\n );\n },\n ),\n);\nBadge.displayName = \"Badge\";\n\nexport { Badge };\n"]}
|