@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,41 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {a}from'./chunk-JY3QVUGW.mjs';import {m}from'./chunk-NSDWT2JM.mjs';import {e,d}from'./chunk-OBMOTQEU.mjs';import W,{useState,useMemo,useEffect,useCallback}from'react';import {jsxs,jsx,Fragment}from'react/jsx-runtime';var pe={sm:{height:40,width:40},md:{height:48,width:48},lg:{height:56,width:56}},ue={display:"inline-flex",alignItems:"center",justifyContent:"center",border:"none",background:"none",cursor:"pointer",transition:"background-color 200ms ease-in-out",outline:"none",padding:0,...e("rounded-lg")},fe={display:"inline-flex",alignItems:"center",border:"none",background:"none",cursor:"pointer",fontSize:14,fontWeight:500,transition:"background-color 200ms ease-in-out",outline:"none",...e("rounded-lg gap-3 pt-3 pb-3 pl-4 pr-4")},Y={backgroundColor:"var(--color-muted)"},Z={boxShadow:"0 0 0 1px var(--color-ring), 0 0 0 3px var(--color-ring)"},$={position:"relative"},X={position:"absolute",top:"100%",right:0,width:192,backgroundColor:"var(--color-background)",boxShadow:"0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -1px rgba(0,0,0,0.06)",border:"1px solid var(--color-border)",zIndex:50,...e("rounded-lg mt-2 pt-2 pb-2")},me={width:"100%",textAlign:"left",display:"flex",alignItems:"center",border:"none",background:"none",cursor:"pointer",transition:"background-color 200ms ease-in-out",...e("pt-3 pb-3 pl-4 pr-4 gap-3")},be={backgroundColor:"color-mix(in srgb, var(--color-primary) 10%, transparent)",color:"var(--color-primary)"},O={fontSize:18,lineHeight:1},Se={fontSize:14,fontWeight:500,color:"var(--color-foreground)"},ve={width:16,height:16,transition:"transform 200ms ease-in-out",flexShrink:0};function K({language:o,isActive:d$1,onSelect:R}){let[C,v]=useState(false),r=useMemo(()=>d(me,d$1?be:void 0,C&&!d$1?Y:void 0),[d$1,C]);return jsxs("button",{style:r,onClick:()=>R(o.code),onMouseEnter:()=>v(true),onMouseLeave:()=>v(false),children:[jsx("span",{style:O,children:o.flag}),jsx("span",{style:Se,children:o.name})]})}var he=W.forwardRef(({dot:o,style:d$1,size:R="md",variant:C="button",showLabel:v=false,languages:r=[{code:"ko",name:"\uD55C\uAD6D\uC5B4",flag:"\u{1F1F0}\u{1F1F7}"},{code:"en",name:"English",flag:"\u{1F1FA}\u{1F1F8}"},{code:"ja",name:"\u65E5\u672C\u8A9E",flag:"\u{1F1EF}\u{1F1F5}"},{code:"zh",name:"\u4E2D\u6587",flag:"\u{1F1E8}\u{1F1F3}"}],currentLanguage:h="ko",onLanguageChange:u,...c},P)=>{let[p,f]=useState(false),[m,n]=useState(false),[E,I]=useState(false),x=W.useRef(null),k=r.find(i=>i.code===h)||r[0];W.useEffect(()=>{let i=s=>{x.current&&!x.current.contains(s.target)&&f(false);};return p&&document.addEventListener("mousedown",i),()=>{document.removeEventListener("mousedown",i);}},[p]);let N=i=>{u==null||u(i),f(false);},_=useMemo(()=>d(ue,pe[R],m?Y:void 0,E?Z:void 0,e(o),d$1),[R,m,E,o,d$1]),L=useMemo(()=>d(fe,m?Y:void 0,E?Z:void 0,e(o),d$1),[m,E,o,d$1]),w={onMouseEnter:()=>n(true),onMouseLeave:()=>n(false),onFocus:()=>I(true),onBlur:()=>I(false)};return C==="icon"?jsxs("div",{ref:x,style:$,...c,children:[jsx("button",{style:_,onClick:()=>f(!p),...w,children:jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center"},children:jsx("span",{style:O,children:k.flag})})}),p&&jsx("div",{style:X,children:r.map(i=>jsx(K,{language:i,isActive:h===i.code,onSelect:N},i.code))})]}):C==="dropdown"?jsxs("div",{ref:x,style:$,...c,children:[jsxs("button",{style:L,onClick:()=>f(!p),...w,children:[jsx("span",{style:O,children:k.flag}),v&&jsx("span",{style:{color:"var(--color-foreground)"},children:k.name}),jsx("svg",{style:{...ve,transform:p?"rotate(180deg)":"rotate(0deg)"},fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),p&&jsx("div",{style:X,children:r.map(i=>jsx(K,{language:i,isActive:h===i.code,onSelect:N},i.code))})]}):jsxs("button",{style:L,onClick:()=>{let s=(r.findIndex(T=>T.code===h)+1)%r.length;u==null||u(r[s].code);},...w,...c,children:[jsx("span",{style:O,children:k.flag}),v&&jsx("span",{style:{color:"var(--color-foreground)"},children:k.name})]})});he.displayName="LanguageToggle";var Ee=W.forwardRef(({height:o=2,color:d$1="gradient",position:R="top",animated:C=true,showPercentage:v=false,dot:r,style:h,...u},c)=>{let[P,p]=useState(0);useEffect(()=>{let n=()=>{let E=window.scrollY,I=document.documentElement.scrollHeight-window.innerHeight,x=I>0?E/I*100:0;p(x);};return n(),window.addEventListener("scroll",n,{passive:true}),window.addEventListener("resize",n,{passive:true}),()=>{window.removeEventListener("scroll",n),window.removeEventListener("resize",n);}},[]);let f={default:"bg-foreground",primary:"bg-primary",secondary:"bg-muted-foreground",gradient:"bg-gradient-to-r from-teal-600 via-cyan-500 to-teal-600"},m={top:"top-0 left-0 right-0",bottom:"bottom-0 left-0 right-0"};return jsxs("div",{ref:c,style:d(e("fixed z-50"),e(m[R]),{height:`${o}px`},e(r),h),...u,children:[jsx("div",{style:e("absolute inset-0 w-full h-full bg-border/30")}),jsx("div",{style:d(e("absolute top-0 left-0 h-full origin-left transition-all duration-100 ease-out"),e(f[d$1]||f.gradient),{width:`${P}%`,transformOrigin:"left"})}),v&&jsxs("div",{style:e("absolute top-2 right-2 text-xs text-muted-foreground bg-card px-2 py-1 rounded border border-border"),children:[Math.round(P),"%"]})]})});Ee.displayName="ScrollProgress";var Ie={position:"relative",width:"100%",display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",textAlign:"center",overflow:"hidden",...e("pl-4 pr-4")},Pe={sm:{minHeight:"400px"},md:{minHeight:"500px"},lg:{minHeight:"600px"},xl:{minHeight:"700px"},full:{minHeight:"100vh"}},ke={marginTop:"-4rem",...e("pt-16")},D={position:"absolute",inset:0,zIndex:0,pointerEvents:"none"},_e={position:"absolute",top:0,left:0,width:"20rem",height:"20rem",transform:"translate(-33%, -33%)",borderRadius:"9999px",background:"linear-gradient(to bottom right, #4fd1c5, #06b6d4, #0d9488)",opacity:.4,filter:"blur(64px)"},Le={position:"absolute",bottom:0,right:0,width:"18rem",height:"18rem",transform:"translate(25%, 25%)",borderRadius:"9999px",background:"linear-gradient(to top right, #22d3ee, #14b8a6, #10b981)",opacity:.35,filter:"blur(64px)"},we={position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",width:"12rem",height:"12rem",borderRadius:"9999px",background:"rgba(20, 184, 166, 0.2)",filter:"blur(40px)"},Ae={position:"absolute",inset:0,background:"linear-gradient(to bottom right, color-mix(in srgb, var(--color-secondary) 50%, transparent), var(--color-background), color-mix(in srgb, var(--color-secondary) 30%, transparent))"},He={position:"absolute",inset:0,width:"100%",height:"100%",objectFit:"cover",opacity:.2},Ne={position:"absolute",inset:0,width:"100%",height:"100%",objectFit:"cover",opacity:.3},Be={position:"absolute",inset:0,background:"linear-gradient(to top, var(--color-background), color-mix(in srgb, var(--color-background) 50%, transparent), transparent)"},Oe={position:"relative",zIndex:10,maxWidth:"56rem",marginLeft:"auto",marginRight:"auto"},De={sm:{fontSize:"1.875rem",lineHeight:1.25},md:{fontSize:"2.25rem",lineHeight:1.25},lg:{fontSize:"2.25rem",lineHeight:1.25},xl:{fontSize:"2.25rem",lineHeight:1.25},full:{fontSize:"2.5rem",lineHeight:1.25}},Me={fontWeight:800,color:"var(--color-foreground)",...e("mb-4")},ze={sm:{fontSize:"1rem",lineHeight:1.375},md:{fontSize:"1.125rem",lineHeight:1.375},lg:{fontSize:"1.125rem",lineHeight:1.375},xl:{fontSize:"1.25rem",lineHeight:1.375},full:{fontSize:"1.25rem",lineHeight:1.375}},We={display:"block",fontWeight:600,color:"var(--color-muted-foreground)",...e("mt-2")},Fe={display:"block",background:"linear-gradient(to right, #0d9488, #06b6d4, #10b981)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent",backgroundClip:"text"},Ye={sm:{fontSize:"0.875rem",lineHeight:1.625},md:{fontSize:"1rem",lineHeight:1.625},lg:{fontSize:"1rem",lineHeight:1.625},xl:{fontSize:"1rem",lineHeight:1.625},full:{fontSize:"1.125rem",lineHeight:1.625}},Ve={color:"var(--color-muted-foreground)",maxWidth:"42rem",marginLeft:"auto",marginRight:"auto",...e("mb-6")},Ge={display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",...e("gap-4")},Ue={display:"flex",justifyContent:"center",...e("gap-2 mt-8")},je={width:"0.625rem",height:"0.625rem",borderRadius:"9999px",border:"none",cursor:"pointer",transition:"all 300ms ease",padding:0},Ze={width:"2rem",background:"var(--color-primary)"},$e={background:"color-mix(in srgb, var(--color-muted-foreground) 30%, transparent)"},Xe={display:"flex",justifyContent:"center",maxWidth:"20rem",marginLeft:"auto",marginRight:"auto",...e("gap-1 mt-8")},Ke={flex:1,height:"0.25rem",borderRadius:"9999px",overflow:"hidden",background:"color-mix(in srgb, var(--color-muted-foreground) 20%, transparent)",border:"none",padding:0,cursor:"pointer"},qe={height:"100%",width:"100%",background:"var(--color-primary)",transition:"all 300ms ease"},Je={height:"100%",width:0,background:"var(--color-primary)",transition:"all 300ms ease"},Qe={display:"flex",alignItems:"center",justifyContent:"center",fontSize:"0.875rem",color:"var(--color-muted-foreground)",...e("gap-2 mt-8")},et={color:"var(--color-foreground)",fontWeight:600},te={position:"absolute",top:"50%",transform:"translateY(-50%)",zIndex:20,borderRadius:"9999px",...e("p-2"),background:"color-mix(in srgb, var(--color-card) 80%, transparent)",backdropFilter:"blur(4px)",WebkitBackdropFilter:"blur(4px)",border:"1px solid var(--color-border)",color:"var(--color-foreground)",cursor:"pointer",transition:"background-color 200ms ease"},tt={left:"1rem"},rt={right:"1rem"},re={width:"1.25rem",height:"1.25rem"},ot=W.forwardRef(({title:o,subtitle:d$1,description:R,primaryAction:C,secondaryAction:v,slides:r,autoPlay:h=false,interval:u=5e3,indicator:c="dots",showControls:P=true,pauseOnHover:p=true,background:f="gradient",customBackground:m,size:n="lg",fullBleed:E=false,dot:I,style:x,...k},N)=>{let[_,L]=useState(0),[w,i]=useState(false),s=r&&r.length>0,T=(r==null?void 0:r.length)||0,M=useCallback(()=>{s&&L(y=>(y+1)%T);},[s,T]),se=useCallback(()=>{s&&L(y=>(y-1+T)%T);},[s,T]),U=useCallback(y=>{L(y);},[]);useEffect(()=>{if(!h||!s||w)return;let y=setInterval(M,u);return ()=>clearInterval(y)},[h,s,w,u,M]);let a$1=s?r[_]:{title:o||"",subtitle:d$1,description:R||"",primaryAction:C,secondaryAction:v,background:f},ae=s&&a$1.background||f,le=useMemo(()=>d(Ie,Pe[n],E?ke:void 0,e(I),x),[n,E,I,x]),ce={none:null,gradient:jsxs("div",{style:D,children:[jsx("div",{style:_e}),jsx("div",{style:Le}),jsx("div",{style:we})]}),particles:jsx("div",{style:D,children:jsx("div",{style:Ae})}),video:m?jsx("div",{style:D,children:jsx("video",{autoPlay:true,loop:true,muted:true,playsInline:true,style:He,children:jsx("source",{src:m,type:"video/mp4"})})}):null,image:m||s&&a$1.backgroundImage?jsxs("div",{style:D,children:[jsx("img",{src:s&&a$1.backgroundImage||m,alt:"",style:Ne}),jsx("div",{style:Be})]}):null},de=()=>{if(!s||c==="none")return null;switch(c){case "dots":return jsx("div",{style:Ue,children:r.map((y,b)=>jsx("button",{onClick:()=>U(b),style:d(je,_===b?Ze:$e),"aria-label":`Go to slide ${b+1}`},b))});case "line":return jsx("div",{style:Xe,children:r.map((y,b)=>jsx("button",{onClick:()=>U(b),style:Ke,"aria-label":`Go to slide ${b+1}`,children:jsx("div",{style:_===b?qe:Je})},b))});case "numbers":return jsxs("div",{style:Qe,children:[jsx("span",{style:et,children:_+1}),jsx("span",{children:"/"}),jsx("span",{children:T})]});default:return null}};return jsxs("section",{ref:N,style:le,onMouseEnter:()=>p&&i(true),onMouseLeave:()=>p&&i(false),...k,children:[ce[ae],jsxs("div",{style:Oe,children:[jsxs("div",{children:[jsxs("h1",{style:d(Me,De[n]),children:[jsx("span",{style:Fe,children:a$1.title}),a$1.subtitle&&jsx("span",{style:d(We,ze[n]),children:a$1.subtitle})]}),jsx("div",{style:d(Ve,Ye[n]),children:a$1.description.split(`
|
|
3
|
+
`).map((y,b,ge)=>jsxs(W.Fragment,{children:[y,b<ge.length-1&&jsx("br",{})]},b))}),(a$1.primaryAction||a$1.secondaryAction)&&jsxs("div",{style:Ge,children:[a$1.primaryAction&&jsxs(a,{href:a$1.primaryAction.href,size:n==="xl"||n==="full"?"lg":"md",hover:"scale",dot:"inline-flex items-center gap-2",children:[a$1.primaryAction.icon,a$1.primaryAction.label]}),a$1.secondaryAction&&jsxs(a,{href:a$1.secondaryAction.href,variant:"outline",size:n==="xl"||n==="full"?"lg":"md",hover:"scale",dot:"inline-flex items-center gap-2",children:[a$1.secondaryAction.icon,a$1.secondaryAction.label]})]})]},s?_:0),de()]}),s&&P&&T>1&&jsxs(Fragment,{children:[jsx("button",{onClick:se,style:d(te,tt),"aria-label":"Previous slide",children:jsx("svg",{style:re,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 19l-7-7 7-7"})})}),jsx("button",{onClick:M,style:d(te,rt),"aria-label":"Next slide",children:jsx("svg",{style:re,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})})})]})]})});ot.displayName="HeroSection";var ne="hua-info-card-vars";function it(){if(typeof document=="undefined"||document.getElementById(ne))return;let o=document.createElement("style");o.id=ne,o.textContent=`
|
|
4
|
+
:root {
|
|
5
|
+
--ic-blue-bg: linear-gradient(to right, #eef2ff, #eef2ff);
|
|
6
|
+
--ic-blue-border: #c7d2fe;
|
|
7
|
+
--ic-blue-icon: #4f46e5;
|
|
8
|
+
--ic-blue-title: #1e1b4b;
|
|
9
|
+
--ic-purple-bg: linear-gradient(to right, #f5f3ff, #fdf2f8);
|
|
10
|
+
--ic-purple-border: #d8b4fe;
|
|
11
|
+
--ic-purple-icon: #9333ea;
|
|
12
|
+
--ic-purple-title: #3b0764;
|
|
13
|
+
--ic-green-bg: linear-gradient(to right, #f0fdf4, #ecfdf5);
|
|
14
|
+
--ic-green-border: #bbf7d0;
|
|
15
|
+
--ic-green-icon: #16a34a;
|
|
16
|
+
--ic-green-title: #052e16;
|
|
17
|
+
--ic-orange-bg: linear-gradient(to right, #fff7ed, #fff1f2);
|
|
18
|
+
--ic-orange-border: #fed7aa;
|
|
19
|
+
--ic-orange-icon: #ea580c;
|
|
20
|
+
--ic-orange-title: #431407;
|
|
21
|
+
}
|
|
22
|
+
.dark {
|
|
23
|
+
--ic-blue-bg: linear-gradient(to right, rgba(67,56,202,0.2), rgba(67,56,202,0.2));
|
|
24
|
+
--ic-blue-border: #4338ca;
|
|
25
|
+
--ic-blue-icon: #818cf8;
|
|
26
|
+
--ic-blue-title: #e0e7ff;
|
|
27
|
+
--ic-purple-bg: linear-gradient(to right, rgba(107,33,168,0.2), rgba(131,24,67,0.2));
|
|
28
|
+
--ic-purple-border: #7e22ce;
|
|
29
|
+
--ic-purple-icon: #c084fc;
|
|
30
|
+
--ic-purple-title: #f3e8ff;
|
|
31
|
+
--ic-green-bg: linear-gradient(to right, rgba(21,128,61,0.2), rgba(6,95,70,0.2));
|
|
32
|
+
--ic-green-border: #15803d;
|
|
33
|
+
--ic-green-icon: #86efac;
|
|
34
|
+
--ic-green-title: #dcfce7;
|
|
35
|
+
--ic-orange-bg: linear-gradient(to right, rgba(194,65,12,0.2), rgba(159,18,57,0.2));
|
|
36
|
+
--ic-orange-border: #c2410c;
|
|
37
|
+
--ic-orange-icon: #fdba74;
|
|
38
|
+
--ic-orange-title: #ffedd5;
|
|
39
|
+
}
|
|
40
|
+
`,document.head.appendChild(o);}var st={blue:{bg:"var(--ic-blue-bg)",border:"var(--ic-blue-border)",icon:"var(--ic-blue-icon)",title:"var(--ic-blue-title)"},purple:{bg:"var(--ic-purple-bg)",border:"var(--ic-purple-border)",icon:"var(--ic-purple-icon)",title:"var(--ic-purple-title)"},green:{bg:"var(--ic-green-bg)",border:"var(--ic-green-border)",icon:"var(--ic-green-icon)",title:"var(--ic-green-title)"},orange:{bg:"var(--ic-orange-bg)",border:"var(--ic-orange-border)",icon:"var(--ic-orange-icon)",title:"var(--ic-orange-title)"}},at=W.forwardRef(({dot:o,style:d$1,title:R,icon:C,tone:v="blue",children:r,...h},u)=>{let c=st[v];W.useEffect(()=>{it();},[]);let P=useMemo(()=>d({background:c.bg,border:`1px solid ${c.border}`,...e("rounded-lg p-4")},e(o),d$1),[c,o,d$1]),p=useMemo(()=>({height:"1.25rem",width:"1.25rem",color:c.icon,flexShrink:0,...e("mr-3 mt-0.5")}),[c.icon]),f=useMemo(()=>({fontSize:"0.875rem",fontWeight:500,color:c.title,display:"block",...e("mb-2")}),[c.title]),m$1={color:"var(--color-foreground, inherit)",fontSize:"0.875rem",lineHeight:"1.625"};return jsx("div",{ref:u,style:P,...h,children:jsxs("div",{style:{display:"flex",alignItems:"flex-start",...e("mb-2")},children:[jsx("span",{style:p,children:jsx(m,{name:C,dot:"h-full w-full"})}),jsxs("div",{style:{flex:1},children:[jsx("span",{style:f,children:R}),jsx("div",{style:m$1,children:r})]})]})})});at.displayName="InfoCard";export{he as a,Ee as b,ot as c,at as d};//# sourceMappingURL=chunk-32OZGTPV.mjs.map
|
|
41
|
+
//# sourceMappingURL=chunk-32OZGTPV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/LanguageToggle.tsx","../src/components/ScrollProgress.tsx","../src/components/HeroSection.tsx","../src/components/InfoCard.tsx"],"names":["SIZE_STYLES","BASE_BUTTON","resolveDot","BASE_LABELED_BUTTON","HOVER_BG","FOCUS_RING","DROPDOWN_CONTAINER","DROPDOWN_MENU","DROPDOWN_ITEM_BASE","DROPDOWN_ITEM_ACTIVE","FLAG_TEXT","LABEL_TEXT","CHEVRON_BASE","DropdownItem","language","isActive","onSelect","isHovered","setIsHovered","useState","itemStyle","useMemo","mergeStyles","jsxs","jsx","LanguageToggle","React","dotProp","style","size","variant","showLabel","languages","currentLanguage","onLanguageChange","props","_ref","isOpen","setIsOpen","isButtonHovered","setIsButtonHovered","isButtonFocused","setIsButtonFocused","dropdownRef","currentLang","lang","handleClickOutside","event","handleLanguageChange","languageCode","iconButtonStyle","labeledButtonStyle","buttonHandlers","nextIndex","ScrollProgress","height","color","position","_animated","showPercentage","ref","progress","setProgress","useEffect","updateProgress","scrollTop","docHeight","currentProgress","progressColors","positionClasses","SECTION_BASE","FULL_BLEED_STYLE","BG_LAYER","BLOB_TOP_LEFT","BLOB_BOTTOM_RIGHT","BLOB_CENTER","PARTICLES_LAYER","VIDEO_STYLE","IMAGE_STYLE","IMAGE_OVERLAY","CONTENT_AREA","TITLE_SIZE_STYLES","TITLE_BASE","SUBTITLE_SIZE_STYLES","SUBTITLE_BASE","GRADIENT_TEXT_STYLE","DESC_SIZE_STYLES","DESC_BASE","ACTIONS_ROW","DOTS_ROW","DOT_BASE","DOT_ACTIVE","DOT_INACTIVE","LINE_ROW","LINE_TRACK","LINE_FILL_ACTIVE","LINE_FILL_INACTIVE","NUMBERS_ROW","NUMBER_CURRENT","CTRL_BTN_BASE","CTRL_PREV","CTRL_NEXT","SVG_ICON","HeroSection","title","subtitle","description","primaryAction","secondaryAction","slides","autoPlay","interval","indicator","showControls","pauseOnHover","background","customBackground","fullBleed","currentSlide","setCurrentSlide","isPaused","setIsPaused","isSlideMode","slideCount","nextSlide","useCallback","prev","prevSlide","goToSlide","index","timer","currentContent","currentBg","sectionStyle","backgroundContent","renderIndicator","_","line","i","arr","Button","Fragment","INFO_CARD_STYLE_ID","ensureInfoCardVars","TONE_VARS","InfoCard","icon","tone","children","vars","containerStyle","iconStyle","titleStyle","bodyStyle","Icon"],"mappings":"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","file":"chunk-32OZGTPV.mjs","sourcesContent":["\"use client\";\n\nimport React, { useState, useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\n\n// ─── Style constants ────────────────────────────────────────────────────────\n\nconst SIZE_STYLES: Record<string, React.CSSProperties> = {\n sm: { height: 40, width: 40 },\n md: { height: 48, width: 48 },\n lg: { height: 56, width: 56 },\n};\n\nconst BASE_BUTTON: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n border: \"none\",\n background: \"none\",\n cursor: \"pointer\",\n transition: \"background-color 200ms ease-in-out\",\n outline: \"none\",\n padding: 0,\n ...resolveDot(\"rounded-lg\"),\n};\n\nconst BASE_LABELED_BUTTON: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n border: \"none\",\n background: \"none\",\n cursor: \"pointer\",\n fontSize: 14,\n fontWeight: 500,\n transition: \"background-color 200ms ease-in-out\",\n outline: \"none\",\n ...resolveDot(\"rounded-lg gap-3 pt-3 pb-3 pl-4 pr-4\"),\n};\n\nconst HOVER_BG: React.CSSProperties = {\n backgroundColor: \"var(--color-muted)\",\n};\n\nconst FOCUS_RING: React.CSSProperties = {\n boxShadow: \"0 0 0 1px var(--color-ring), 0 0 0 3px var(--color-ring)\",\n};\n\nconst DROPDOWN_CONTAINER: React.CSSProperties = {\n position: \"relative\",\n};\n\nconst DROPDOWN_MENU: React.CSSProperties = {\n position: \"absolute\",\n top: \"100%\",\n right: 0,\n width: 192,\n backgroundColor: \"var(--color-background)\",\n boxShadow: \"0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -1px rgba(0,0,0,0.06)\",\n border: \"1px solid var(--color-border)\",\n zIndex: 50,\n ...resolveDot(\"rounded-lg mt-2 pt-2 pb-2\"),\n};\n\nconst DROPDOWN_ITEM_BASE: React.CSSProperties = {\n width: \"100%\",\n textAlign: \"left\",\n display: \"flex\",\n alignItems: \"center\",\n border: \"none\",\n background: \"none\",\n cursor: \"pointer\",\n transition: \"background-color 200ms ease-in-out\",\n ...resolveDot(\"pt-3 pb-3 pl-4 pr-4 gap-3\"),\n};\n\nconst DROPDOWN_ITEM_ACTIVE: React.CSSProperties = {\n backgroundColor: \"color-mix(in srgb, var(--color-primary) 10%, transparent)\",\n color: \"var(--color-primary)\",\n};\n\nconst FLAG_TEXT: React.CSSProperties = {\n fontSize: 18,\n lineHeight: 1,\n};\n\nconst LABEL_TEXT: React.CSSProperties = {\n fontSize: 14,\n fontWeight: 500,\n color: \"var(--color-foreground)\",\n};\n\nconst CHEVRON_BASE: React.CSSProperties = {\n width: 16,\n height: 16,\n transition: \"transform 200ms ease-in-out\",\n flexShrink: 0,\n};\n\n// ─── DropdownItem — extracted to avoid per-loop useState ────────────────────\n\ninterface DropdownItemProps {\n language: { code: string; name: string; flag?: string };\n isActive: boolean;\n onSelect: (code: string) => void;\n}\n\nfunction DropdownItem({ language, isActive, onSelect }: DropdownItemProps) {\n const [isHovered, setIsHovered] = useState(false);\n\n const itemStyle = useMemo(\n () =>\n mergeStyles(\n DROPDOWN_ITEM_BASE,\n isActive ? DROPDOWN_ITEM_ACTIVE : undefined,\n isHovered && !isActive ? HOVER_BG : undefined,\n ),\n [isActive, isHovered],\n );\n\n return (\n <button\n style={itemStyle}\n onClick={() => onSelect(language.code)}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <span style={FLAG_TEXT}>{language.flag}</span>\n <span style={LABEL_TEXT}>{language.name}</span>\n </button>\n );\n}\n\n// ─── Props ──────────────────────────────────────────────────────────────────\n\n/**\n * LanguageToggle 컴포넌트의 props / LanguageToggle component props\n * @typedef {Object} LanguageToggleProps\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Toggle 크기 / Toggle size\n * @property {\"button\" | \"icon\" | \"dropdown\"} [variant=\"button\"] - Toggle 스타일 변형 / Toggle style variant\n * @property {boolean} [showLabel=false] - 라벨 표시 여부 / Show label\n * @property {Array<Object>} [languages] - 언어 목록 / Language list\n * @property {string} languages[].code - 언어 코드 / Language code\n * @property {string} languages[].name - 언어 이름 / Language name\n * @property {string} [languages[].flag] - 언어 플래그 이모지 / Language flag emoji\n * @property {string} [currentLanguage=\"ko\"] - 현재 선택된 언어 코드 / Currently selected language code\n * @property {(language: string) => void} [onLanguageChange] - 언어 변경 콜백 / Language change callback\n * @property {string} [dot] - dot 유틸리티 스타일 문자열 / dot utility style string\n * @property {React.CSSProperties} [style] - 추가 인라인 스타일 / Additional inline style\n */\nexport interface LanguageToggleProps extends Omit<\n React.HTMLAttributes<HTMLElement>,\n \"className\"\n> {\n size?: \"sm\" | \"md\" | \"lg\";\n variant?: \"button\" | \"icon\" | \"dropdown\";\n showLabel?: boolean;\n languages?: Array<{\n code: string;\n name: string;\n flag?: string;\n }>;\n currentLanguage?: string;\n onLanguageChange?: (language: string) => void;\n dot?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Component ──────────────────────────────────────────────────────────────\n\n/**\n * LanguageToggle 컴포넌트 / LanguageToggle component\n *\n * 언어를 전환하는 토글 컴포넌트입니다.\n * 여러 언어를 지원하며, 버튼, 아이콘, 드롭다운 형태로 표시할 수 있습니다.\n *\n * Toggle component for switching languages.\n * Supports multiple languages and can be displayed as button, icon, or dropdown.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <LanguageToggle />\n *\n * @example\n * // 드롭다운 형태 / Dropdown variant\n * <LanguageToggle\n * variant=\"dropdown\"\n * currentLanguage=\"en\"\n * onLanguageChange={(lang) => console.log(lang)}\n * />\n *\n * @param {LanguageToggleProps} props - LanguageToggle 컴포넌트의 props / LanguageToggle component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} LanguageToggle 컴포넌트 / LanguageToggle component\n */\nconst LanguageToggle = React.forwardRef<HTMLDivElement, LanguageToggleProps>(\n (\n {\n dot: dotProp,\n style,\n size = \"md\",\n variant = \"button\",\n showLabel = false,\n languages = [\n { code: \"ko\", name: \"한국어\", flag: \"🇰🇷\" },\n { code: \"en\", name: \"English\", flag: \"🇺🇸\" },\n { code: \"ja\", name: \"日本語\", flag: \"🇯🇵\" },\n { code: \"zh\", name: \"中文\", flag: \"🇨🇳\" },\n ],\n currentLanguage = \"ko\",\n onLanguageChange,\n ...props\n },\n _ref,\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [isButtonHovered, setIsButtonHovered] = useState(false);\n const [isButtonFocused, setIsButtonFocused] = useState(false);\n const dropdownRef = React.useRef<HTMLDivElement>(null);\n\n const currentLang =\n languages.find((lang) => lang.code === currentLanguage) || languages[0];\n\n // Close on outside click\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isOpen]);\n\n const handleLanguageChange = (languageCode: string) => {\n onLanguageChange?.(languageCode);\n setIsOpen(false);\n };\n\n // icon-button shared style (square, centered)\n const iconButtonStyle = useMemo(\n () =>\n mergeStyles(\n BASE_BUTTON,\n SIZE_STYLES[size],\n isButtonHovered ? HOVER_BG : undefined,\n isButtonFocused ? FOCUS_RING : undefined,\n resolveDot(dotProp),\n style,\n ),\n [size, isButtonHovered, isButtonFocused, dotProp, style],\n );\n\n // labeled-button shared style (gap, padding)\n const labeledButtonStyle = useMemo(\n () =>\n mergeStyles(\n BASE_LABELED_BUTTON,\n isButtonHovered ? HOVER_BG : undefined,\n isButtonFocused ? FOCUS_RING : undefined,\n resolveDot(dotProp),\n style,\n ),\n [isButtonHovered, isButtonFocused, dotProp, style],\n );\n\n const buttonHandlers = {\n onMouseEnter: () => setIsButtonHovered(true),\n onMouseLeave: () => setIsButtonHovered(false),\n onFocus: () => setIsButtonFocused(true),\n onBlur: () => setIsButtonFocused(false),\n };\n\n // ── icon variant ─────────────────────────────────────────────────────────\n if (variant === \"icon\") {\n return (\n <div ref={dropdownRef} style={DROPDOWN_CONTAINER} {...props}>\n <button\n style={iconButtonStyle}\n onClick={() => setIsOpen(!isOpen)}\n {...buttonHandlers}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <span style={FLAG_TEXT}>{currentLang.flag}</span>\n </div>\n </button>\n\n {isOpen && (\n <div style={DROPDOWN_MENU}>\n {languages.map((language) => (\n <DropdownItem\n key={language.code}\n language={language}\n isActive={currentLanguage === language.code}\n onSelect={handleLanguageChange}\n />\n ))}\n </div>\n )}\n </div>\n );\n }\n\n // ── dropdown variant ─────────────────────────────────────────────────────\n if (variant === \"dropdown\") {\n return (\n <div ref={dropdownRef} style={DROPDOWN_CONTAINER} {...props}>\n <button\n style={labeledButtonStyle}\n onClick={() => setIsOpen(!isOpen)}\n {...buttonHandlers}\n >\n <span style={FLAG_TEXT}>{currentLang.flag}</span>\n {showLabel && (\n <span style={{ color: \"var(--color-foreground)\" }}>\n {currentLang.name}\n </span>\n )}\n <svg\n style={{\n ...CHEVRON_BASE,\n transform: isOpen ? \"rotate(180deg)\" : \"rotate(0deg)\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n\n {isOpen && (\n <div style={DROPDOWN_MENU}>\n {languages.map((language) => (\n <DropdownItem\n key={language.code}\n language={language}\n isActive={currentLanguage === language.code}\n onSelect={handleLanguageChange}\n />\n ))}\n </div>\n )}\n </div>\n );\n }\n\n // ── default button variant ────────────────────────────────────────────────\n return (\n <button\n style={labeledButtonStyle}\n onClick={() => {\n const currentIndex = languages.findIndex(\n (lang) => lang.code === currentLanguage,\n );\n const nextIndex = (currentIndex + 1) % languages.length;\n onLanguageChange?.(languages[nextIndex].code);\n }}\n {...buttonHandlers}\n {...props}\n >\n <span style={FLAG_TEXT}>{currentLang.flag}</span>\n {showLabel && (\n <span style={{ color: \"var(--color-foreground)\" }}>\n {currentLang.name}\n </span>\n )}\n </button>\n );\n },\n);\nLanguageToggle.displayName = \"LanguageToggle\";\n\nexport { LanguageToggle };\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { mergeStyles, resolveDot } from '../hooks/useDotMap'\n\n/**\n * ScrollProgress 컴포넌트의 props / ScrollProgress component props\n * @typedef {Object} ScrollProgressProps\n * @property {number} [height=2] - 진행률 바 높이 (px) / Progress bar height (px)\n * @property {'default' | 'primary' | 'secondary' | 'gradient'} [color='gradient'] - 진행률 바 색상 / Progress bar color\n * @property {'top' | 'bottom'} [position='top'] - 표시 위치 / Display position\n * @property {boolean} [animated=true] - 애니메이션 활성화 여부 / Enable animation\n * @property {boolean} [showPercentage=false] - 퍼센트 표시 여부 / Show percentage\n */\nexport interface ScrollProgressProps {\n height?: number\n color?: 'default' | 'primary' | 'secondary' | 'gradient'\n position?: 'top' | 'bottom'\n animated?: boolean\n showPercentage?: boolean\n /** dot 유틸리티 스트링 (인라인 스타일로 변환) / dot utility string (converted to inline style) */\n dot?: string\n style?: React.CSSProperties\n}\n\n/**\n * ScrollProgress 컴포넌트 / ScrollProgress component\n *\n * 페이지 스크롤 진행률을 표시하는 컴포넌트입니다.\n * 페이지 상단 또는 하단에 고정되어 표시됩니다.\n *\n * Component that displays page scroll progress.\n * Fixed at top or bottom of the page.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ScrollProgress />\n *\n * @example\n * // 하단에 표시, 퍼센트 포함 / Display at bottom with percentage\n * <ScrollProgress\n * position=\"bottom\"\n * color=\"primary\"\n * showPercentage\n * height={4}\n * />\n *\n * @param {ScrollProgressProps} props - ScrollProgress 컴포넌트의 props / ScrollProgress component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ScrollProgress 컴포넌트 / ScrollProgress component\n */\nconst ScrollProgress = React.forwardRef<HTMLDivElement, ScrollProgressProps>(({\n height = 2,\n color = 'gradient',\n position = 'top',\n animated: _animated = true,\n showPercentage = false,\n dot: dotProp,\n style,\n ...props\n}, ref) => {\n const [progress, setProgress] = useState(0)\n\n useEffect(() => {\n const updateProgress = () => {\n const scrollTop = window.scrollY\n const docHeight = document.documentElement.scrollHeight - window.innerHeight\n const currentProgress = docHeight > 0 ? (scrollTop / docHeight) * 100 : 0\n setProgress(currentProgress)\n }\n\n // 초기 실행\n updateProgress()\n\n window.addEventListener('scroll', updateProgress, { passive: true })\n window.addEventListener('resize', updateProgress, { passive: true })\n\n return () => {\n window.removeEventListener('scroll', updateProgress)\n window.removeEventListener('resize', updateProgress)\n }\n }, [])\n\n // 색상 옵션 (Teal 브랜드 기반)\n const progressColors: Record<string, string> = {\n default: 'bg-foreground',\n primary: 'bg-primary',\n secondary: 'bg-muted-foreground',\n gradient: 'bg-gradient-to-r from-teal-600 via-cyan-500 to-teal-600'\n }\n\n const positionClasses = {\n top: 'top-0 left-0 right-0',\n bottom: 'bottom-0 left-0 right-0'\n }\n\n return (\n <div\n ref={ref}\n style={mergeStyles(\n resolveDot('fixed z-50'),\n resolveDot(positionClasses[position]),\n { height: `${height}px` },\n resolveDot(dotProp),\n style\n )}\n {...props}\n >\n {/* 배경 바 */}\n <div style={resolveDot('absolute inset-0 w-full h-full bg-border/30')} />\n\n {/* 진행률 바 - absolute로 배경 위에 표시 */}\n <div\n style={mergeStyles(\n resolveDot('absolute top-0 left-0 h-full origin-left transition-all duration-100 ease-out'),\n resolveDot(progressColors[color] || progressColors.gradient),\n { width: `${progress}%`, transformOrigin: 'left' }\n )}\n />\n\n {/* 퍼센트 표시 (선택사항) */}\n {showPercentage && (\n <div style={resolveDot('absolute top-2 right-2 text-xs text-muted-foreground bg-card px-2 py-1 rounded border border-border')}>\n {Math.round(progress)}%\n </div>\n )}\n </div>\n )\n})\n\nScrollProgress.displayName = 'ScrollProgress'\n\nexport { ScrollProgress }\n","\"use client\";\n\nimport React, { useState, useEffect, useCallback, useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\nimport { Button } from \"./Button\";\n\n// ── Static style constants ────────────────────────────────────────────────────\n\nconst SECTION_BASE: React.CSSProperties = {\n position: \"relative\",\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n textAlign: \"center\",\n overflow: \"hidden\",\n ...resolveDot(\"pl-4 pr-4\"),\n};\n\nconst SIZE_STYLES: Record<string, React.CSSProperties> = {\n sm: { minHeight: \"400px\" },\n md: { minHeight: \"500px\" },\n lg: { minHeight: \"600px\" },\n xl: { minHeight: \"700px\" },\n full: { minHeight: \"100vh\" },\n};\n\nconst FULL_BLEED_STYLE: React.CSSProperties = {\n marginTop: \"-4rem\", // -mt-16 (음수 margin 유지)\n ...resolveDot(\"pt-16\"),\n};\n\n// Background decoration layer\nconst BG_LAYER: React.CSSProperties = {\n position: \"absolute\",\n inset: 0,\n zIndex: 0,\n pointerEvents: \"none\",\n};\n\n// Gradient blobs\nconst BLOB_TOP_LEFT: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"20rem\",\n height: \"20rem\",\n transform: \"translate(-33%, -33%)\",\n borderRadius: \"9999px\",\n background: \"linear-gradient(to bottom right, #4fd1c5, #06b6d4, #0d9488)\",\n opacity: 0.4,\n filter: \"blur(64px)\",\n};\n\nconst BLOB_BOTTOM_RIGHT: React.CSSProperties = {\n position: \"absolute\",\n bottom: 0,\n right: 0,\n width: \"18rem\",\n height: \"18rem\",\n transform: \"translate(25%, 25%)\",\n borderRadius: \"9999px\",\n background: \"linear-gradient(to top right, #22d3ee, #14b8a6, #10b981)\",\n opacity: 0.35,\n filter: \"blur(64px)\",\n};\n\nconst BLOB_CENTER: React.CSSProperties = {\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"12rem\",\n height: \"12rem\",\n borderRadius: \"9999px\",\n background: \"rgba(20, 184, 166, 0.2)\",\n filter: \"blur(40px)\",\n};\n\nconst PARTICLES_LAYER: React.CSSProperties = {\n position: \"absolute\",\n inset: 0,\n background:\n \"linear-gradient(to bottom right, color-mix(in srgb, var(--color-secondary) 50%, transparent), var(--color-background), color-mix(in srgb, var(--color-secondary) 30%, transparent))\",\n};\n\nconst VIDEO_STYLE: React.CSSProperties = {\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n opacity: 0.2,\n};\n\nconst IMAGE_STYLE: React.CSSProperties = {\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n opacity: 0.3,\n};\n\nconst IMAGE_OVERLAY: React.CSSProperties = {\n position: \"absolute\",\n inset: 0,\n background:\n \"linear-gradient(to top, var(--color-background), color-mix(in srgb, var(--color-background) 50%, transparent), transparent)\",\n};\n\n// Content area\nconst CONTENT_AREA: React.CSSProperties = {\n position: \"relative\",\n zIndex: 10,\n maxWidth: \"56rem\", // max-w-4xl\n marginLeft: \"auto\",\n marginRight: \"auto\",\n};\n\n// Title size styles (base font size; responsive handled via JS state / media queries not available inline)\nconst TITLE_SIZE_STYLES: Record<string, React.CSSProperties> = {\n sm: { fontSize: \"1.875rem\", lineHeight: 1.25 }, // text-3xl\n md: { fontSize: \"2.25rem\", lineHeight: 1.25 }, // text-4xl\n lg: { fontSize: \"2.25rem\", lineHeight: 1.25 }, // text-4xl\n xl: { fontSize: \"2.25rem\", lineHeight: 1.25 },\n full: { fontSize: \"2.5rem\", lineHeight: 1.25 }, // text-4xl\n};\n\nconst TITLE_BASE: React.CSSProperties = {\n fontWeight: 800,\n color: \"var(--color-foreground)\",\n ...resolveDot(\"mb-4\"),\n};\n\nconst SUBTITLE_SIZE_STYLES: Record<string, React.CSSProperties> = {\n sm: { fontSize: \"1rem\", lineHeight: 1.375 }, // text-base\n md: { fontSize: \"1.125rem\", lineHeight: 1.375 }, // text-lg\n lg: { fontSize: \"1.125rem\", lineHeight: 1.375 },\n xl: { fontSize: \"1.25rem\", lineHeight: 1.375 }, // text-xl\n full: { fontSize: \"1.25rem\", lineHeight: 1.375 },\n};\n\nconst SUBTITLE_BASE: React.CSSProperties = {\n display: \"block\",\n fontWeight: 600,\n color: \"var(--color-muted-foreground)\",\n ...resolveDot(\"mt-2\"),\n};\n\nconst GRADIENT_TEXT_STYLE: React.CSSProperties = {\n display: \"block\",\n background: \"linear-gradient(to right, #0d9488, #06b6d4, #10b981)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\",\n};\n\nconst DESC_SIZE_STYLES: Record<string, React.CSSProperties> = {\n sm: { fontSize: \"0.875rem\", lineHeight: 1.625 }, // text-sm\n md: { fontSize: \"1rem\", lineHeight: 1.625 }, // text-base\n lg: { fontSize: \"1rem\", lineHeight: 1.625 },\n xl: { fontSize: \"1rem\", lineHeight: 1.625 },\n full: { fontSize: \"1.125rem\", lineHeight: 1.625 }, // text-lg\n};\n\nconst DESC_BASE: React.CSSProperties = {\n color: \"var(--color-muted-foreground)\",\n maxWidth: \"42rem\",\n marginLeft: \"auto\",\n marginRight: \"auto\",\n ...resolveDot(\"mb-6\"),\n};\n\nconst ACTIONS_ROW: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n ...resolveDot(\"gap-4\"),\n};\n\n// Indicator styles\nconst DOTS_ROW: React.CSSProperties = {\n display: \"flex\",\n justifyContent: \"center\",\n ...resolveDot(\"gap-2 mt-8\"),\n};\n\nconst DOT_BASE: React.CSSProperties = {\n width: \"0.625rem\",\n height: \"0.625rem\",\n borderRadius: \"9999px\",\n border: \"none\",\n cursor: \"pointer\",\n transition: \"all 300ms ease\",\n padding: 0,\n};\n\nconst DOT_ACTIVE: React.CSSProperties = {\n width: \"2rem\",\n background: \"var(--color-primary)\",\n};\n\nconst DOT_INACTIVE: React.CSSProperties = {\n background:\n \"color-mix(in srgb, var(--color-muted-foreground) 30%, transparent)\",\n};\n\nconst LINE_ROW: React.CSSProperties = {\n display: \"flex\",\n justifyContent: \"center\",\n maxWidth: \"20rem\",\n marginLeft: \"auto\",\n marginRight: \"auto\",\n ...resolveDot(\"gap-1 mt-8\"),\n};\n\nconst LINE_TRACK: React.CSSProperties = {\n flex: 1,\n height: \"0.25rem\",\n borderRadius: \"9999px\",\n overflow: \"hidden\",\n background:\n \"color-mix(in srgb, var(--color-muted-foreground) 20%, transparent)\",\n border: \"none\",\n padding: 0,\n cursor: \"pointer\",\n};\n\nconst LINE_FILL_ACTIVE: React.CSSProperties = {\n height: \"100%\",\n width: \"100%\",\n background: \"var(--color-primary)\",\n transition: \"all 300ms ease\",\n};\n\nconst LINE_FILL_INACTIVE: React.CSSProperties = {\n height: \"100%\",\n width: 0,\n background: \"var(--color-primary)\",\n transition: \"all 300ms ease\",\n};\n\nconst NUMBERS_ROW: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"0.875rem\",\n color: \"var(--color-muted-foreground)\",\n ...resolveDot(\"gap-2 mt-8\"),\n};\n\nconst NUMBER_CURRENT: React.CSSProperties = {\n color: \"var(--color-foreground)\",\n fontWeight: 600,\n};\n\n// Slide controls\nconst CTRL_BTN_BASE: React.CSSProperties = {\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n zIndex: 20,\n borderRadius: \"9999px\",\n ...resolveDot(\"p-2\"),\n background: \"color-mix(in srgb, var(--color-card) 80%, transparent)\",\n backdropFilter: \"blur(4px)\",\n WebkitBackdropFilter: \"blur(4px)\",\n border: \"1px solid var(--color-border)\",\n color: \"var(--color-foreground)\",\n cursor: \"pointer\",\n transition: \"background-color 200ms ease\",\n};\n\nconst CTRL_PREV: React.CSSProperties = { left: \"1rem\" };\nconst CTRL_NEXT: React.CSSProperties = { right: \"1rem\" };\n\nconst SVG_ICON: React.CSSProperties = { width: \"1.25rem\", height: \"1.25rem\" };\n\n// ── Interfaces ────────────────────────────────────────────────────────────────\n\n/**\n * 슬라이드 아이템 인터페이스\n */\nexport interface HeroSlide {\n title: string;\n subtitle?: string;\n description: string;\n primaryAction?: {\n label: string;\n href: string;\n icon?: React.ReactNode;\n };\n secondaryAction?: {\n label: string;\n href: string;\n icon?: React.ReactNode;\n };\n background?: \"none\" | \"gradient\" | \"particles\" | \"image\";\n backgroundImage?: string;\n}\n\n/**\n * HeroSection 컴포넌트의 props\n */\nexport interface HeroSectionProps extends Omit<\n React.HTMLAttributes<HTMLElement>,\n \"className\"\n> {\n // 단일 모드 props\n title?: string;\n subtitle?: string;\n description?: string;\n primaryAction?: {\n label: string;\n href: string;\n icon?: React.ReactNode;\n };\n secondaryAction?: {\n label: string;\n href: string;\n icon?: React.ReactNode;\n };\n // 슬라이드 모드 props\n slides?: HeroSlide[];\n autoPlay?: boolean;\n interval?: number;\n indicator?: \"dots\" | \"line\" | \"numbers\" | \"none\";\n showControls?: boolean;\n pauseOnHover?: boolean;\n // 공통 props\n background?: \"none\" | \"gradient\" | \"particles\" | \"video\" | \"image\";\n customBackground?: string;\n /**\n * 히어로 섹션 크기\n * - sm: 400px, md: 500px, lg: 600px, xl: 700px\n * - full: 100vh (뷰포트 전체)\n */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n /**\n * 헤더 뒤까지 확장 (fixed header가 있을 때)\n * true면 -mt-16 / pt-16 적용되어 헤더 뒤로 들어감\n */\n fullBleed?: boolean;\n /** dot utility string for additional styles */\n dot?: string;\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\n/**\n * HeroSection 컴포넌트\n *\n * 단일 히어로 또는 슬라이드 히어로를 지원합니다.\n * slides prop이 있으면 슬라이드 모드로 동작합니다.\n */\nconst HeroSection = React.forwardRef<HTMLElement, HeroSectionProps>(\n (\n {\n // 단일 모드\n title,\n subtitle,\n description,\n primaryAction,\n secondaryAction,\n // 슬라이드 모드\n slides,\n autoPlay = false,\n interval = 5000,\n indicator = \"dots\",\n showControls = true,\n pauseOnHover = true,\n // 공통\n background = \"gradient\",\n customBackground,\n size = \"lg\",\n fullBleed = false,\n dot: dotProp,\n style,\n ...props\n },\n ref,\n ) => {\n const [currentSlide, setCurrentSlide] = useState(0);\n const [isPaused, setIsPaused] = useState(false);\n\n const isSlideMode = slides && slides.length > 0;\n const slideCount = slides?.length || 0;\n\n const nextSlide = useCallback(() => {\n if (!isSlideMode) return;\n setCurrentSlide((prev) => (prev + 1) % slideCount);\n }, [isSlideMode, slideCount]);\n\n const prevSlide = useCallback(() => {\n if (!isSlideMode) return;\n setCurrentSlide((prev) => (prev - 1 + slideCount) % slideCount);\n }, [isSlideMode, slideCount]);\n\n const goToSlide = useCallback((index: number) => {\n setCurrentSlide(index);\n }, []);\n\n useEffect(() => {\n if (!autoPlay || !isSlideMode || isPaused) return;\n const timer = setInterval(nextSlide, interval);\n return () => clearInterval(timer);\n }, [autoPlay, isSlideMode, isPaused, interval, nextSlide]);\n\n const currentContent = isSlideMode\n ? slides[currentSlide]\n : {\n title: title || \"\",\n subtitle,\n description: description || \"\",\n primaryAction,\n secondaryAction,\n background,\n };\n\n const currentBg = isSlideMode\n ? currentContent.background || background\n : background;\n\n // Compute section style\n const sectionStyle = useMemo(\n () =>\n mergeStyles(\n SECTION_BASE,\n SIZE_STYLES[size],\n fullBleed ? FULL_BLEED_STYLE : undefined,\n resolveDot(dotProp),\n style,\n ),\n [size, fullBleed, dotProp, style],\n );\n\n // Background elements\n const backgroundContent: Record<string, React.ReactNode> = {\n none: null,\n gradient: (\n <div style={BG_LAYER}>\n <div style={BLOB_TOP_LEFT} />\n <div style={BLOB_BOTTOM_RIGHT} />\n <div style={BLOB_CENTER} />\n </div>\n ),\n particles: (\n <div style={BG_LAYER}>\n <div style={PARTICLES_LAYER} />\n </div>\n ),\n video: customBackground ? (\n <div style={BG_LAYER}>\n <video autoPlay loop muted playsInline style={VIDEO_STYLE}>\n <source src={customBackground} type=\"video/mp4\" />\n </video>\n </div>\n ) : null,\n image:\n customBackground ||\n (isSlideMode && (currentContent as HeroSlide).backgroundImage) ? (\n <div style={BG_LAYER}>\n <img\n src={\n (isSlideMode &&\n (currentContent as HeroSlide).backgroundImage) ||\n customBackground\n }\n alt=\"\"\n style={IMAGE_STYLE}\n />\n <div style={IMAGE_OVERLAY} />\n </div>\n ) : null,\n };\n\n // Indicator renderer\n const renderIndicator = () => {\n if (!isSlideMode || indicator === \"none\") return null;\n\n switch (indicator) {\n case \"dots\":\n return (\n <div style={DOTS_ROW}>\n {slides.map((_, index) => (\n <button\n key={index}\n onClick={() => goToSlide(index)}\n style={mergeStyles(\n DOT_BASE,\n currentSlide === index ? DOT_ACTIVE : DOT_INACTIVE,\n )}\n aria-label={`Go to slide ${index + 1}`}\n />\n ))}\n </div>\n );\n\n case \"line\":\n return (\n <div style={LINE_ROW}>\n {slides.map((_, index) => (\n <button\n key={index}\n onClick={() => goToSlide(index)}\n style={LINE_TRACK}\n aria-label={`Go to slide ${index + 1}`}\n >\n <div\n style={\n currentSlide === index\n ? LINE_FILL_ACTIVE\n : LINE_FILL_INACTIVE\n }\n />\n </button>\n ))}\n </div>\n );\n\n case \"numbers\":\n return (\n <div style={NUMBERS_ROW}>\n <span style={NUMBER_CURRENT}>{currentSlide + 1}</span>\n <span>/</span>\n <span>{slideCount}</span>\n </div>\n );\n\n default:\n return null;\n }\n };\n\n return (\n <section\n ref={ref}\n style={sectionStyle}\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\n {...props}\n >\n {backgroundContent[currentBg]}\n\n {/* 슬라이드 콘텐츠 */}\n <div style={CONTENT_AREA}>\n <div key={isSlideMode ? currentSlide : 0}>\n <h1 style={mergeStyles(TITLE_BASE, TITLE_SIZE_STYLES[size])}>\n <span style={GRADIENT_TEXT_STYLE}>{currentContent.title}</span>\n {currentContent.subtitle && (\n <span\n style={mergeStyles(SUBTITLE_BASE, SUBTITLE_SIZE_STYLES[size])}\n >\n {currentContent.subtitle}\n </span>\n )}\n </h1>\n\n <div style={mergeStyles(DESC_BASE, DESC_SIZE_STYLES[size])}>\n {currentContent.description.split(\"\\n\").map((line, i, arr) => (\n <React.Fragment key={i}>\n {line}\n {i < arr.length - 1 && <br />}\n </React.Fragment>\n ))}\n </div>\n\n {(currentContent.primaryAction ||\n currentContent.secondaryAction) && (\n <div style={ACTIONS_ROW}>\n {currentContent.primaryAction && (\n <Button\n href={currentContent.primaryAction.href}\n size={size === \"xl\" || size === \"full\" ? \"lg\" : \"md\"}\n hover=\"scale\"\n dot=\"inline-flex items-center gap-2\"\n >\n {currentContent.primaryAction.icon}\n {currentContent.primaryAction.label}\n </Button>\n )}\n\n {currentContent.secondaryAction && (\n <Button\n href={currentContent.secondaryAction.href}\n variant=\"outline\"\n size={size === \"xl\" || size === \"full\" ? \"lg\" : \"md\"}\n hover=\"scale\"\n dot=\"inline-flex items-center gap-2\"\n >\n {currentContent.secondaryAction.icon}\n {currentContent.secondaryAction.label}\n </Button>\n )}\n </div>\n )}\n </div>\n\n {/* 인디케이터 */}\n {renderIndicator()}\n </div>\n\n {/* 좌우 컨트롤 */}\n {isSlideMode && showControls && slideCount > 1 && (\n <>\n <button\n onClick={prevSlide}\n style={mergeStyles(CTRL_BTN_BASE, CTRL_PREV)}\n aria-label=\"Previous slide\"\n >\n <svg\n style={SVG_ICON}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n <button\n onClick={nextSlide}\n style={mergeStyles(CTRL_BTN_BASE, CTRL_NEXT)}\n aria-label=\"Next slide\"\n >\n <svg\n style={SVG_ICON}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n </>\n )}\n </section>\n );\n },\n);\n\nHeroSection.displayName = \"HeroSection\";\n\nexport { HeroSection };\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\nimport { Icon } from \"./Icon\";\nimport type { IconName } from \"../lib/icons\";\n\n/**\n * InfoCard tone CSS variables — injected once into <head>.\n * Light values are on :root, dark values on .dark (next-themes convention).\n */\nconst INFO_CARD_STYLE_ID = \"hua-info-card-vars\";\n\nfunction ensureInfoCardVars() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(INFO_CARD_STYLE_ID)) return;\n const style = document.createElement(\"style\");\n style.id = INFO_CARD_STYLE_ID;\n style.textContent = `\n:root {\n --ic-blue-bg: linear-gradient(to right, #eef2ff, #eef2ff);\n --ic-blue-border: #c7d2fe;\n --ic-blue-icon: #4f46e5;\n --ic-blue-title: #1e1b4b;\n --ic-purple-bg: linear-gradient(to right, #f5f3ff, #fdf2f8);\n --ic-purple-border: #d8b4fe;\n --ic-purple-icon: #9333ea;\n --ic-purple-title: #3b0764;\n --ic-green-bg: linear-gradient(to right, #f0fdf4, #ecfdf5);\n --ic-green-border: #bbf7d0;\n --ic-green-icon: #16a34a;\n --ic-green-title: #052e16;\n --ic-orange-bg: linear-gradient(to right, #fff7ed, #fff1f2);\n --ic-orange-border: #fed7aa;\n --ic-orange-icon: #ea580c;\n --ic-orange-title: #431407;\n}\n.dark {\n --ic-blue-bg: linear-gradient(to right, rgba(67,56,202,0.2), rgba(67,56,202,0.2));\n --ic-blue-border: #4338ca;\n --ic-blue-icon: #818cf8;\n --ic-blue-title: #e0e7ff;\n --ic-purple-bg: linear-gradient(to right, rgba(107,33,168,0.2), rgba(131,24,67,0.2));\n --ic-purple-border: #7e22ce;\n --ic-purple-icon: #c084fc;\n --ic-purple-title: #f3e8ff;\n --ic-green-bg: linear-gradient(to right, rgba(21,128,61,0.2), rgba(6,95,70,0.2));\n --ic-green-border: #15803d;\n --ic-green-icon: #86efac;\n --ic-green-title: #dcfce7;\n --ic-orange-bg: linear-gradient(to right, rgba(194,65,12,0.2), rgba(159,18,57,0.2));\n --ic-orange-border: #c2410c;\n --ic-orange-icon: #fdba74;\n --ic-orange-title: #ffedd5;\n}\n`;\n document.head.appendChild(style);\n}\n\ntype Tone = \"blue\" | \"purple\" | \"green\" | \"orange\";\n\nconst TONE_VARS: Record<\n Tone,\n { bg: string; border: string; icon: string; title: string }\n> = {\n blue: {\n bg: \"var(--ic-blue-bg)\",\n border: \"var(--ic-blue-border)\",\n icon: \"var(--ic-blue-icon)\",\n title: \"var(--ic-blue-title)\",\n },\n purple: {\n bg: \"var(--ic-purple-bg)\",\n border: \"var(--ic-purple-border)\",\n icon: \"var(--ic-purple-icon)\",\n title: \"var(--ic-purple-title)\",\n },\n green: {\n bg: \"var(--ic-green-bg)\",\n border: \"var(--ic-green-border)\",\n icon: \"var(--ic-green-icon)\",\n title: \"var(--ic-green-title)\",\n },\n orange: {\n bg: \"var(--ic-orange-bg)\",\n border: \"var(--ic-orange-border)\",\n icon: \"var(--ic-orange-icon)\",\n title: \"var(--ic-orange-title)\",\n },\n};\n\n/**\n * InfoCard 컴포넌트의 props / InfoCard component props\n * @typedef {Object} InfoCardProps\n * @property {string} title - 카드 제목 / Card title\n * @property {IconName} icon - 카드 아이콘 / Card icon\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\"} [tone=\"blue\"] - InfoCard 톤 색상 / InfoCard tone color\n * @property {string} [dot] - dot 스타일 유틸리티 문자열 / Dot style utility string\n * @property {React.CSSProperties} [style] - 인라인 스타일 / Inline style\n */\nexport interface InfoCardProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"className\"\n> {\n title: string;\n icon: IconName;\n tone?: \"blue\" | \"purple\" | \"green\" | \"orange\";\n dot?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * InfoCard 컴포넌트 / InfoCard component\n *\n * 정보를 표시하는 카드 컴포넌트입니다.\n * 아이콘, 제목, 내용을 포함하며, 다양한 톤 색상을 지원합니다.\n *\n * Card component that displays information.\n * Includes icon, title, and content, supports various tone colors.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <InfoCard\n * icon=\"info\"\n * title=\"정보\"\n * tone=\"blue\"\n * >\n * 이것은 정보 카드입니다.\n * </InfoCard>\n *\n * @example\n * // 다양한 톤 / Various tones\n * <InfoCard icon=\"check\" title=\"성공\" tone=\"green\">\n * 작업이 완료되었습니다.\n * </InfoCard>\n *\n * @param {InfoCardProps} props - InfoCard 컴포넌트의 props / InfoCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} InfoCard 컴포넌트 / InfoCard component\n */\nexport const InfoCard = React.forwardRef<HTMLDivElement, InfoCardProps>(\n (\n { dot: dotProp, style, title, icon, tone = \"blue\", children, ...props },\n ref,\n ) => {\n const vars = TONE_VARS[tone];\n\n // Inject CSS variable definitions on first render (client-side only)\n React.useEffect(() => {\n ensureInfoCardVars();\n }, []);\n\n const containerStyle = useMemo<React.CSSProperties>(\n () =>\n mergeStyles(\n {\n background: vars.bg,\n border: `1px solid ${vars.border}`,\n ...resolveDot(\"rounded-lg p-4\"),\n },\n resolveDot(dotProp),\n style,\n ),\n [vars, dotProp, style],\n );\n\n const iconStyle = useMemo<React.CSSProperties>(\n () => ({\n height: \"1.25rem\",\n width: \"1.25rem\",\n color: vars.icon,\n flexShrink: 0,\n ...resolveDot(\"mr-3 mt-0.5\"),\n }),\n [vars.icon],\n );\n\n const titleStyle = useMemo<React.CSSProperties>(\n () => ({\n fontSize: \"0.875rem\",\n fontWeight: 500,\n color: vars.title,\n display: \"block\",\n ...resolveDot(\"mb-2\"),\n }),\n [vars.title],\n );\n\n const bodyStyle: React.CSSProperties = {\n color: \"var(--color-foreground, inherit)\",\n fontSize: \"0.875rem\",\n lineHeight: \"1.625\",\n };\n\n return (\n <div ref={ref} style={containerStyle} {...props}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n ...resolveDot(\"mb-2\"),\n }}\n >\n <span style={iconStyle}>\n <Icon name={icon} dot=\"h-full w-full\" />\n </span>\n <div style={{ flex: 1 }}>\n <span style={titleStyle}>{title}</span>\n <div style={bodyStyle}>{children}</div>\n </div>\n </div>\n </div>\n );\n },\n);\n\nInfoCard.displayName = \"InfoCard\";\n\nexport default InfoCard;\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {m}from'./chunk-NSDWT2JM.mjs';import {e}from'./chunk-OBMOTQEU.mjs';import h,{useMemo}from'react';import {dotCSS}from'@hua-labs/dot/class';import {jsx,jsxs}from'react/jsx-runtime';var M={default:"#9ca3af",warning:"#eab308",info:"#6366f1",error:"#ef4444",success:"#22c55e"},N={sm:{paddingY:"2rem",iconSize:"2rem",iconMarginBottom:"0.75rem",titleFontSize:"1rem",descFontSize:"0.875rem",buttonPadding:"0.5rem 1rem",buttonFontSize:"0.875rem"},md:{paddingY:"3rem",iconSize:"3rem",iconMarginBottom:"1rem",titleFontSize:"1.125rem",descFontSize:"0.875rem",buttonPadding:"0.5rem 1.5rem",buttonFontSize:"0.875rem"},lg:{paddingY:"4rem",iconSize:"4rem",iconMarginBottom:"1.5rem",titleFontSize:"1.25rem",descFontSize:"1rem",buttonPadding:"0.75rem 2rem",buttonFontSize:"1rem"}},B=h.forwardRef(({icon:n="inbox",title:f,description:s,actionText:o,actionHref:i,actionOnClick:m$1,variant:u="default",size:S="md",dot:d,style:b,...p},z)=>{let c=M[u],t=N[S],a=useMemo(()=>{let v=["text-center",`py-[${t.paddingY}]`,d].filter(Boolean).join(" ");return dotCSS(v)},[d,t.paddingY]),l={display:"inline-flex",alignItems:"center",justifyContent:"center",...e("rounded-lg"),fontWeight:500,backgroundColor:"var(--color-muted, #f3f4f6)",color:"var(--color-foreground, #374151)",border:"1px solid var(--color-border, #d1d5db)",transition:"background-color 200ms",cursor:"pointer",padding:t.buttonPadding,fontSize:t.buttonFontSize},y=o&&(i||m$1)&&jsx("div",{style:{...e("mt-6")},children:i?jsx("a",{href:i,"aria-label":o,style:l,children:o}):jsx("button",{onClick:m$1,"aria-label":o,style:l,children:o})});return jsxs("div",{ref:z,className:a.className,style:b,...p,children:[n&&jsx("div",{style:{margin:"0 auto",width:t.iconSize,height:t.iconSize,marginBottom:t.iconMarginBottom,color:c},children:typeof n=="string"?jsx(m,{name:n,style:{width:"100%",height:"100%",color:c}}):n}),jsx("h3",{style:{fontWeight:600,...e("mb-2"),color:"var(--color-foreground, #111827)",fontSize:t.titleFontSize},children:f}),s&&jsx("p",{style:{...e("mb-4"),color:"var(--color-muted-foreground, #6b7280)",fontSize:t.descFontSize},children:s}),y,a.css&&jsx("style",{dangerouslySetInnerHTML:{__html:a.css}})]})});B.displayName="DashboardEmptyState";export{B as a};//# sourceMappingURL=chunk-6WBFZ2KV.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-6WBFZ2KV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/dashboard/EmptyState.tsx"],"names":["variantIconColor","sizeConfig","DashboardEmptyState","React","icon","title","description","actionText","actionHref","actionOnClick","variant","size","dot","style","props","ref","iconColor","sizes","dotCls","useMemo","tokens","dotCSS","buttonStyle","resolveDot","actionButton","jsx","jsxs","Icon"],"mappings":"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","file":"chunk-6WBFZ2KV.mjs","sourcesContent":["\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { dotCSS } from \"@hua-labs/dot/class\";\nimport { resolveDot } from \"../../hooks/useDotMap\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\n\n/**\n * DashboardEmptyState 컴포넌트의 props / DashboardEmptyState component props\n * @typedef {Object} DashboardEmptyStateProps\n * @property {IconName | React.ReactNode} [icon=\"inbox\"] - 아이콘 / Icon\n * @property {string} title - 제목 / Title\n * @property {string} [description] - 설명 / Description\n * @property {string} [actionText] - 액션 버튼 텍스트 / Action button text\n * @property {string} [actionHref] - 액션 버튼 링크 URL / Action button link URL\n * @property {() => void} [actionOnClick] - 액션 버튼 클릭 핸들러 / Action button click handler\n * @property {\"default\" | \"warning\" | \"info\" | \"error\" | \"success\"} [variant=\"default\"] - 스타일 변형 / Style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {string} [dot] - dot 유틸리티 스트링 / dot utility string\n */\nexport interface DashboardEmptyStateProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"className\"\n> {\n icon?: IconName | React.ReactNode;\n title: string;\n description?: string;\n actionText?: string;\n actionHref?: string;\n actionOnClick?: () => void;\n variant?: \"default\" | \"warning\" | \"info\" | \"error\" | \"success\";\n size?: \"sm\" | \"md\" | \"lg\";\n dot?: string;\n}\n\nconst variantIconColor = {\n default: \"#9ca3af\",\n warning: \"#eab308\",\n info: \"#6366f1\",\n error: \"#ef4444\",\n success: \"#22c55e\",\n};\n\nconst sizeConfig = {\n sm: {\n paddingY: \"2rem\",\n iconSize: \"2rem\",\n iconMarginBottom: \"0.75rem\",\n titleFontSize: \"1rem\",\n descFontSize: \"0.875rem\",\n buttonPadding: \"0.5rem 1rem\",\n buttonFontSize: \"0.875rem\",\n },\n md: {\n paddingY: \"3rem\",\n iconSize: \"3rem\",\n iconMarginBottom: \"1rem\",\n titleFontSize: \"1.125rem\",\n descFontSize: \"0.875rem\",\n buttonPadding: \"0.5rem 1.5rem\",\n buttonFontSize: \"0.875rem\",\n },\n lg: {\n paddingY: \"4rem\",\n iconSize: \"4rem\",\n iconMarginBottom: \"1.5rem\",\n titleFontSize: \"1.25rem\",\n descFontSize: \"1rem\",\n buttonPadding: \"0.75rem 2rem\",\n buttonFontSize: \"1rem\",\n },\n};\n\n/**\n * DashboardEmptyState 컴포넌트\n *\n * 대시보드에서 빈 상태를 표시하는 컴포넌트입니다.\n * 데이터가 없을 때 사용자에게 안내 메시지와 액션을 제공합니다.\n *\n * Empty state component for dashboards.\n * Displays a message and action when there is no data to show.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <DashboardEmptyState\n * icon=\"inbox\"\n * title=\"데이터가 없습니다\"\n * description=\"새로운 데이터를 추가해보세요\"\n * actionText=\"데이터 추가\"\n * actionOnClick={handleAdd}\n * />\n *\n * @example\n * // 경고 스타일 / Warning style\n * <DashboardEmptyState\n * icon=\"warning\"\n * title=\"오류가 발생했습니다\"\n * description=\"잠시 후 다시 시도해주세요\"\n * variant=\"warning\"\n * size=\"lg\"\n * />\n *\n * @param {DashboardEmptyStateProps} props - DashboardEmptyState 컴포넌트의 props / DashboardEmptyState component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DashboardEmptyState 컴포넌트 / DashboardEmptyState component\n */\nexport const DashboardEmptyState = React.forwardRef<\n HTMLDivElement,\n DashboardEmptyStateProps\n>(\n (\n {\n icon = \"inbox\",\n title,\n description,\n actionText,\n actionHref,\n actionOnClick,\n variant = \"default\",\n size = \"md\",\n dot,\n style,\n ...props\n },\n ref,\n ) => {\n const iconColor = variantIconColor[variant];\n const sizes = sizeConfig[size];\n\n const dotCls = useMemo(() => {\n const tokens = [\"text-center\", `py-[${sizes.paddingY}]`, dot]\n .filter(Boolean)\n .join(\" \");\n return dotCSS(tokens);\n }, [dot, sizes.paddingY]);\n\n const buttonStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ...resolveDot(\"rounded-lg\"),\n fontWeight: 500,\n backgroundColor: \"var(--color-muted, #f3f4f6)\",\n color: \"var(--color-foreground, #374151)\",\n border: \"1px solid var(--color-border, #d1d5db)\",\n transition: \"background-color 200ms\",\n cursor: \"pointer\",\n padding: sizes.buttonPadding,\n fontSize: sizes.buttonFontSize,\n };\n\n const actionButton = actionText && (actionHref || actionOnClick) && (\n <div style={{ ...resolveDot(\"mt-6\") }}>\n {actionHref ? (\n <a href={actionHref} aria-label={actionText} style={buttonStyle}>\n {actionText}\n </a>\n ) : (\n <button\n onClick={actionOnClick}\n aria-label={actionText}\n style={buttonStyle}\n >\n {actionText}\n </button>\n )}\n </div>\n );\n\n return (\n <div ref={ref} className={dotCls.className} style={style} {...props}>\n {/* 아이콘 */}\n {icon && (\n <div\n style={{\n margin: \"0 auto\",\n width: sizes.iconSize,\n height: sizes.iconSize,\n marginBottom: sizes.iconMarginBottom,\n color: iconColor,\n }}\n >\n {typeof icon === \"string\" ? (\n <Icon\n name={icon as IconName}\n style={{ width: \"100%\", height: \"100%\", color: iconColor }}\n />\n ) : (\n icon\n )}\n </div>\n )}\n\n {/* 제목 */}\n <h3\n style={{\n fontWeight: 600,\n ...resolveDot(\"mb-2\"),\n color: \"var(--color-foreground, #111827)\",\n fontSize: sizes.titleFontSize,\n }}\n >\n {title}\n </h3>\n\n {/* 설명 */}\n {description && (\n <p\n style={{\n ...resolveDot(\"mb-4\"),\n color: \"var(--color-muted-foreground, #6b7280)\",\n fontSize: sizes.descFontSize,\n }}\n >\n {description}\n </p>\n )}\n\n {/* 액션 버튼 */}\n {actionButton}\n {dotCls.css && (\n <style dangerouslySetInnerHTML={{ __html: dotCls.css }} />\n )}\n </div>\n );\n },\n);\n\nDashboardEmptyState.displayName = \"DashboardEmptyState\";\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var s={subtle:"cubic-bezier(0.25, 0.1, 0.25, 1)",soft:"cubic-bezier(0.22, 1, 0.36, 1)",springy:"cubic-bezier(0.34, 1.56, 0.64, 1)",bouncy:"cubic-bezier(0.68, -0.55, 0.265, 1.55)",snappy:"cubic-bezier(0.19, 1, 0.22, 1)"},o={subtle:150,soft:250,springy:300,bouncy:400,snappy:180},t={preset:"springy",duration:180,scale:.008,translateY:-0.5},e={button:{preset:"springy",duration:180,scale:.008,translateY:-0.5},card:{preset:"soft",duration:220,scale:.005,translateY:-1},menuItem:{preset:"subtle",duration:150,translateX:1},modal:{preset:"springy",duration:250,scale:.01},dropdown:{preset:"soft",duration:180,translateY:-2},tooltip:{preset:"snappy",duration:120,scale:.02},checkbox:{preset:"springy",duration:200,scale:.03},switch:{preset:"springy",duration:180}},i={"--hua-motion-duration":"180ms","--hua-motion-easing":s.springy,"--hua-motion-scale-hover":"1.008","--hua-motion-scale-active":"0.992","--hua-motion-translate-y":"-0.5px"};export{s as a,o as b,t as c,e as d,i as e};//# sourceMappingURL=chunk-7CGJQSJO.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-7CGJQSJO.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/motion/presets.ts"],"names":["EASING_FUNCTIONS","DURATIONS","HUA_DEFAULT_MOTION","COMPONENT_MOTION_DEFAULTS","CSS_MOTION_VARS"],"mappings":"AA8CO,IAAMA,CAAAA,CAAsD,CAEjE,MAAA,CAAQ,kCAAA,CAER,IAAA,CAAM,gCAAA,CAEN,OAAA,CAAS,mCAAA,CAET,MAAA,CAAQ,wCAAA,CAER,MAAA,CAAQ,gCACV,CAAA,CAKaC,CAAAA,CAA+C,CAC1D,MAAA,CAAQ,GAAA,CACR,IAAA,CAAM,GAAA,CACN,OAAA,CAAS,GAAA,CACT,MAAA,CAAQ,GAAA,CACR,MAAA,CAAQ,GACV,CAAA,CAMaC,CAAAA,CAAwC,CACnD,MAAA,CAAQ,SAAA,CACR,QAAA,CAAU,GAAA,CACV,KAAA,CAAO,IAAA,CACP,UAAA,CAAY,IACd,CAAA,CAMaC,CAAAA,CAA4B,CACvC,MAAA,CAAQ,CACN,MAAA,CAAQ,SAAA,CACR,QAAA,CAAU,GAAA,CACV,KAAA,CAAO,IAAA,CACP,UAAA,CAAY,IACd,CAAA,CACA,IAAA,CAAM,CACJ,MAAA,CAAQ,MAAA,CACR,QAAA,CAAU,GAAA,CACV,KAAA,CAAO,IAAA,CACP,UAAA,CAAY,EACd,EACA,QAAA,CAAU,CACR,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,GAAA,CACV,UAAA,CAAY,CACd,CAAA,CACA,KAAA,CAAO,CACL,MAAA,CAAQ,SAAA,CACR,QAAA,CAAU,GAAA,CACV,KAAA,CAAO,GACT,CAAA,CACA,QAAA,CAAU,CACR,MAAA,CAAQ,MAAA,CACR,QAAA,CAAU,GAAA,CACV,UAAA,CAAY,EACd,CAAA,CACA,OAAA,CAAS,CACP,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,GAAA,CACV,KAAA,CAAO,GACT,CAAA,CACA,QAAA,CAAU,CACR,MAAA,CAAQ,SAAA,CACR,QAAA,CAAU,GAAA,CACV,KAAA,CAAO,GACT,CAAA,CACA,MAAA,CAAQ,CACN,MAAA,CAAQ,SAAA,CACR,QAAA,CAAU,GACZ,CACF,CAAA,CAMaC,CAAAA,CAAkB,CAC7B,uBAAA,CAAyB,OAAA,CACzB,qBAAA,CAAuBJ,CAAAA,CAAiB,OAAA,CACxC,0BAAA,CAA4B,OAAA,CAC5B,2BAAA,CAA6B,OAAA,CAC7B,2BAA4B,QAC9B","file":"chunk-7CGJQSJO.mjs","sourcesContent":["/**\n * HUA-UI 마이크로 모션 프리셋\n *\n * 핵심 철학: \"스륵 부드럽고 아주 조금 쫀득\"\n * - 스륵: 자연스럽고 부드러운 시작/끝\n * - 쫀득: 약간의 오버슈트로 생동감\n */\n\nimport type { MicroMotionPreset, SpringConfig, MicroMotionConfig } from './types'\n\n/**\n * 스프링 물리 프리셋\n * CSS cubic-bezier로 근사화된 값들\n */\nexport const SPRING_CONFIGS: Record<MicroMotionPreset, SpringConfig> = {\n subtle: {\n stiffness: 400,\n damping: 30,\n mass: 1,\n },\n soft: {\n stiffness: 300,\n damping: 25,\n mass: 1,\n },\n springy: {\n stiffness: 350,\n damping: 20,\n mass: 0.8,\n },\n bouncy: {\n stiffness: 400,\n damping: 15,\n mass: 0.7,\n },\n snappy: {\n stiffness: 500,\n damping: 35,\n mass: 0.5,\n },\n}\n\n/**\n * CSS easing 함수 (스프링 근사)\n * 각 프리셋에 맞는 cubic-bezier 값\n */\nexport const EASING_FUNCTIONS: Record<MicroMotionPreset, string> = {\n // 미세한 반응 - 거의 linear에 가까움\n subtle: 'cubic-bezier(0.25, 0.1, 0.25, 1)',\n // 부드러운 ease-out\n soft: 'cubic-bezier(0.22, 1, 0.36, 1)',\n // 약간의 오버슈트 (쫀득!)\n springy: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n // 더 큰 오버슈트\n bouncy: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\n // 빠르고 날카로운\n snappy: 'cubic-bezier(0.19, 1, 0.22, 1)',\n}\n\n/**\n * 기본 지속시간 (ms)\n */\nexport const DURATIONS: Record<MicroMotionPreset, number> = {\n subtle: 150,\n soft: 250,\n springy: 300,\n bouncy: 400,\n snappy: 180,\n}\n\n/**\n * HUA-UI 기본 마이크로 모션 설정\n * \"스륵 쫀득\"의 정수 - 아주 미세하게!\n */\nexport const HUA_DEFAULT_MOTION: MicroMotionConfig = {\n preset: 'springy',\n duration: 180,\n scale: 0.008, // 0.8% 스케일 변화 (아주아주 미세)\n translateY: -0.5, // 0.5px 위로 살짝\n}\n\n/**\n * 컴포넌트별 기본 모션 설정\n * 아주 미세한 반동으로 생동감 있게\n */\nexport const COMPONENT_MOTION_DEFAULTS = {\n button: {\n preset: 'springy' as MicroMotionPreset,\n duration: 180,\n scale: 0.008, // 0.8% - 아주아주 미세\n translateY: -0.5, // 0.5px\n },\n card: {\n preset: 'soft' as MicroMotionPreset,\n duration: 220,\n scale: 0.005, // 0.5%\n translateY: -1,\n },\n menuItem: {\n preset: 'subtle' as MicroMotionPreset,\n duration: 150,\n translateX: 1, // 1px\n },\n modal: {\n preset: 'springy' as MicroMotionPreset,\n duration: 250,\n scale: 0.01,\n },\n dropdown: {\n preset: 'soft' as MicroMotionPreset,\n duration: 180,\n translateY: -2,\n },\n tooltip: {\n preset: 'snappy' as MicroMotionPreset,\n duration: 120,\n scale: 0.02,\n },\n checkbox: {\n preset: 'springy' as MicroMotionPreset,\n duration: 200,\n scale: 0.03, // 체크박스는 조금 더\n },\n switch: {\n preset: 'springy' as MicroMotionPreset,\n duration: 180,\n },\n}\n\n/**\n * CSS 변수로 사용할 수 있는 기본값들\n * 미세한 스프링 반동 느낌\n */\nexport const CSS_MOTION_VARS = {\n '--hua-motion-duration': '180ms',\n '--hua-motion-easing': EASING_FUNCTIONS.springy,\n '--hua-motion-scale-hover': '1.008', // 0.8% 확대 (아주아주 미세)\n '--hua-motion-scale-active': '0.992', // 0.8% 축소\n '--hua-motion-translate-y': '-0.5px',\n} as const\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import i,{useState,useEffect}from'react';function f(...n){return t=>{n.forEach(e=>{typeof e=="function"?e(t):e!=null&&(e.current=t);});}}function a(n,t){return e=>{n==null||n(e),e.defaultPrevented||t==null||t(e);}}function l(n,t){if(!(!n&&!t))return [n,t].filter(Boolean).join(" ")}function R(n,t){if(!(!n&&!t))return {...n,...t}}function p(n,t){let e={...n};for(let o in t){let r=n[o],s=t[o];/^on[A-Z]/.test(o)?r&&s?e[o]=a(r,s):e[o]=s||r:o==="className"?e[o]=l(r,s):o==="style"?e[o]=R(r,s):e[o]=s!==void 0?s:r;}return e}function m(n){return i.isValidElement(n)}var g=i.forwardRef(({children:n,...t},e)=>{let o=i.Children.toArray(n);if(o.length!==1)return process.env.NODE_ENV!=="production"&&console.warn("[Slot] asChild\uB294 \uC815\uD655\uD788 \uD558\uB098\uC758 \uC790\uC2DD \uC694\uC18C\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4."),null;let r=o[0];if(!m(r))return process.env.NODE_ENV!=="production"&&console.warn("[Slot] \uC790\uC2DD\uC740 \uC720\uD6A8\uD55C React \uC694\uC18C\uC5EC\uC57C \uD569\uB2C8\uB2E4."),null;let s=r.props,c=r.ref,u=p(t,s),d=f(e,c);return i.cloneElement(r,{...u,ref:d})});g.displayName="Slot";function h(){let[n,t]=useState(false);return useEffect(()=>{if(typeof window=="undefined")return;let e=window.matchMedia("(prefers-reduced-motion: reduce)");t(e.matches);let o=r=>{t(r.matches);};return e.addEventListener("change",o),()=>{e.removeEventListener("change",o);}},[]),n}export{f as a,p as b,g as c,h as d};//# sourceMappingURL=chunk-7T3IUG3G.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-7T3IUG3G.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/Slot.tsx","../src/hooks/useReducedMotion.ts"],"names":["composeRefs","refs","node","ref","composeEventHandlers","parentHandler","childHandler","event","mergeClassName","slotClassName","childClassName","mergeStyle","slotStyle","childStyle","mergeProps","slotProps","childProps","mergedProps","propName","slotValue","childValue","isSlottable","child","React","Slot","children","forwardedRef","childArray","childRef","mergedRef","useReducedMotion","prefersReducedMotion","setPrefersReducedMotion","useState","useEffect","mediaQuery","handleChange","e"],"mappings":"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","file":"chunk-7T3IUG3G.mjs","sourcesContent":["\"use client\";\n\nimport React from \"react\";\n\n/**\n * Slot 컴포넌트\n *\n * Radix UI의 asChild 패턴을 구현합니다.\n * 자식 요소의 props와 ref를 병합하여 하나의 요소로 렌더링합니다.\n *\n * @example\n * // Button에서 asChild 사용\n * <Button asChild>\n * <Link href=\"/home\">홈으로</Link>\n * </Button>\n *\n * @see https://www.radix-ui.com/primitives/docs/utilities/slot\n */\n\ntype SlotProps = React.HTMLAttributes<HTMLElement> & {\n children?: React.ReactNode;\n};\n\n/**\n * 여러 ref를 하나로 합칩니다\n */\nfunction composeRefs<T>(\n ...refs: (React.Ref<T> | undefined)[]\n): React.RefCallback<T> {\n return (node) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref != null) {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n };\n}\n\n/**\n * 이벤트 핸들러를 합성합니다\n * \n * 부모(slot) 핸들러를 먼저 실행하고, 그 다음 자식 핸들러를 실행합니다.\n * defaultPrevented가 true이면 자식 핸들러는 실행하지 않습니다.\n */\nfunction composeEventHandlers<E>(\n parentHandler?: (event: E) => void,\n childHandler?: (event: E) => void\n): (event: E) => void {\n return (event) => {\n parentHandler?.(event);\n if (!(event as unknown as { defaultPrevented: boolean }).defaultPrevented) {\n childHandler?.(event);\n }\n };\n}\n\n/**\n * className을 병합합니다\n */\nfunction mergeClassName(\n slotClassName?: string,\n childClassName?: string\n): string | undefined {\n if (!slotClassName && !childClassName) return undefined;\n return [slotClassName, childClassName].filter(Boolean).join(' ');\n}\n\n/**\n * style을 병합합니다\n */\nfunction mergeStyle(\n slotStyle?: React.CSSProperties,\n childStyle?: React.CSSProperties\n): React.CSSProperties | undefined {\n if (!slotStyle && !childStyle) return undefined;\n return { ...slotStyle, ...childStyle };\n}\n\n/**\n * props를 병합합니다 (이벤트 핸들러, className, style 등)\n */\nfunction mergeProps(\n slotProps: Record<string, unknown>,\n childProps: Record<string, unknown>\n): Record<string, unknown> {\n const mergedProps: Record<string, unknown> = { ...slotProps };\n\n for (const propName in childProps) {\n const slotValue = slotProps[propName];\n const childValue = childProps[propName];\n\n // 이벤트 핸들러 병합 (부모(slot) → 자식 순서)\n if (/^on[A-Z]/.test(propName)) {\n if (slotValue && childValue) {\n mergedProps[propName] = composeEventHandlers(\n slotValue as (event: unknown) => void,\n childValue as (event: unknown) => void\n );\n } else {\n mergedProps[propName] = childValue || slotValue;\n }\n }\n // className 병합\n else if (propName === \"className\") {\n mergedProps[propName] = mergeClassName(\n slotValue as string | undefined,\n childValue as string | undefined\n );\n }\n // style 병합\n else if (propName === \"style\") {\n mergedProps[propName] = mergeStyle(\n slotValue as React.CSSProperties | undefined,\n childValue as React.CSSProperties | undefined\n );\n }\n // 그 외: 자식 값 우선\n else {\n mergedProps[propName] = childValue !== undefined ? childValue : slotValue;\n }\n }\n\n return mergedProps;\n}\n\n/**\n * 유효한 단일 React 요소인지 확인\n */\nfunction isSlottable(child: React.ReactNode): child is React.ReactElement {\n return React.isValidElement(child);\n}\n\n/**\n * Slot 컴포넌트\n *\n * 자식 요소에 부모의 props를 주입합니다.\n * asChild 패턴을 구현할 때 사용합니다.\n */\nconst Slot = React.forwardRef<HTMLElement, SlotProps>(\n ({ children, ...slotProps }, forwardedRef) => {\n const childArray = React.Children.toArray(children);\n\n // 유효한 단일 자식이 있는지 확인\n if (childArray.length !== 1) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[Slot] asChild는 정확히 하나의 자식 요소가 필요합니다.\"\n );\n }\n return null;\n }\n\n const child = childArray[0];\n\n if (!isSlottable(child)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[Slot] 자식은 유효한 React 요소여야 합니다.\");\n }\n return null;\n }\n\n // 자식 요소의 props와 ref 추출\n const childProps = child.props as Record<string, unknown>;\n const childRef = (child as unknown as { ref?: React.Ref<HTMLElement> }).ref;\n\n // props와 ref 병합\n const mergedProps = mergeProps(slotProps, childProps);\n const mergedRef = composeRefs(forwardedRef, childRef);\n\n return React.cloneElement(child, {\n ...mergedProps,\n ref: mergedRef,\n } as React.Attributes);\n }\n);\n\nSlot.displayName = \"Slot\";\n\nexport { Slot, composeRefs, mergeProps };\nexport type { SlotProps };\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\n\n/**\n * useReducedMotion 훅 / useReducedMotion hook\n *\n * 사용자의 모션 감소 선호 설정을 감지하는 훅입니다.\n * 접근성을 위해 애니메이션을 조건부로 적용할 때 사용합니다.\n *\n * Hook that detects user's reduced motion preference.\n * Used for conditionally applying animations for accessibility.\n *\n * @returns {boolean} 모션 감소 선호 여부 / Whether reduced motion is preferred\n *\n * @example\n * const prefersReducedMotion = useReducedMotion();\n *\n * return (\n * <div\n * className={prefersReducedMotion ? \"\" : \"animate-bounce\"}\n * style={{ transition: prefersReducedMotion ? \"none\" : \"all 0.3s\" }}\n * >\n * Content\n * </div>\n * );\n *\n * @example\n * // 조건부 애니메이션 / Conditional animation\n * const prefersReducedMotion = useReducedMotion();\n *\n * const variants = {\n * initial: { opacity: 0, y: prefersReducedMotion ? 0 : 20 },\n * animate: { opacity: 1, y: 0 },\n * };\n */\nexport function useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n // Check if window is available (SSR safety)\n if (typeof window === \"undefined\") return;\n\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n\n // Set initial value\n setPrefersReducedMotion(mediaQuery.matches);\n\n // Listen for changes\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n\n return () => {\n mediaQuery.removeEventListener(\"change\", handleChange);\n };\n }, []);\n\n return prefersReducedMotion;\n}\n\nexport default useReducedMotion;\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {createContext,useState,useEffect,useContext}from'react';import {jsx}from'react/jsx-runtime';var p={theme:"system",setTheme:()=>null,resolvedTheme:"light",toggleTheme:()=>null},T=createContext(p);function E({children:r,defaultTheme:u="light",storageKey:s="hua-ui-theme",enableSystem:i=true,enableTransition:h=true,...g}){let[t,n]=useState(u),[a,d]=useState("light");useEffect(()=>{if(typeof window!="undefined"){let e=localStorage.getItem(s);e&&n(e);}},[s]),useEffect(()=>{let e=window.document.documentElement;if(e.classList.remove("light","dark"),t==="system"&&i){let o=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";e.classList.add(o),d(o);}else e.classList.add(t),d(t);h&&e.classList.add("transition-colors","duration-300");},[t,i,h]),useEffect(()=>{if(t==="system"&&i){let e=window.matchMedia("(prefers-color-scheme: dark)"),o=()=>{let c=e.matches?"dark":"light";d(c),document.documentElement.classList.remove("light","dark"),document.documentElement.classList.add(c);};return e.addEventListener("change",o),()=>e.removeEventListener("change",o)}},[t,i]);let v={theme:t,setTheme:e=>{typeof window!="undefined"&&localStorage.setItem(s,e),n(e);},resolvedTheme:a,toggleTheme:()=>{let e=a==="light"?"dark":"light";typeof window!="undefined"&&localStorage.setItem(s,e),n(e);}};return jsx(T.Provider,{...g,value:v,children:r})}var L=()=>{let r=useContext(T);if(r===void 0)throw new Error("useTheme must be used within a ThemeProvider");return r};export{E as a,L as b};//# sourceMappingURL=chunk-A5YOVVM5.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-A5YOVVM5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ThemeProvider.tsx"],"names":["initialState","ThemeProviderContext","createContext","ThemeProvider","children","defaultTheme","storageKey","enableSystem","enableTransition","props","theme","setTheme","useState","resolvedTheme","setResolvedTheme","useEffect","savedTheme","root","systemTheme","mediaQuery","handleChange","value","newTheme","jsx","useTheme","context","useContext"],"mappings":"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","file":"chunk-A5YOVVM5.mjs","sourcesContent":["\"use client\"\n\nimport React, { createContext, useContext, useEffect, useState } from \"react\"\n\ntype Theme = \"light\" | \"dark\" | \"system\"\n\n/**\n * ThemeProvider 컴포넌트의 props / ThemeProvider component props\n * @typedef {Object} ThemeProviderProps\n * @property {React.ReactNode} children - 자식 컴포넌트 / Child components\n * @property {\"light\" | \"dark\" | \"system\"} [defaultTheme=\"light\"] - 기본 테마 / Default theme\n * @property {string} [storageKey=\"hua-ui-theme\"] - localStorage 키 / localStorage key\n * @property {boolean} [enableSystem=true] - 시스템 테마 감지 활성화 / Enable system theme detection\n * @property {boolean} [enableTransition=true] - 테마 전환 애니메이션 활성화 / Enable theme transition animation\n */\nexport interface ThemeProviderProps {\n children: React.ReactNode\n defaultTheme?: Theme\n storageKey?: string\n enableSystem?: boolean\n enableTransition?: boolean\n}\n\n/**\n * ThemeProvider의 상태 타입 / ThemeProvider state type\n * @typedef {Object} ThemeProviderState\n * @property {\"light\" | \"dark\" | \"system\"} theme - 현재 테마 / Current theme\n * @property {(theme: \"light\" | \"dark\" | \"system\") => void} setTheme - 테마 설정 함수 / Theme setter function\n * @property {\"light\" | \"dark\"} resolvedTheme - 실제 적용된 테마 (system일 경우 시스템 테마) / Actually applied theme (system theme when system is selected)\n * @property {() => void} toggleTheme - 테마 토글 함수 / Theme toggle function\n */\nexport interface ThemeProviderState {\n theme: Theme\n setTheme: (theme: Theme) => void\n resolvedTheme: \"light\" | \"dark\"\n toggleTheme: () => void\n}\n\nconst initialState: ThemeProviderState = {\n theme: \"system\",\n setTheme: () => null,\n resolvedTheme: \"light\",\n toggleTheme: () => null,\n}\n\nconst ThemeProviderContext = createContext<ThemeProviderState>(initialState)\n\n/**\n * ThemeProvider 컴포넌트 / ThemeProvider component\n * \n * 테마 관리를 위한 Context Provider 컴포넌트입니다.\n * localStorage에 테마를 저장하고, 시스템 테마를 감지할 수 있습니다.\n * useTheme 훅을 통해 테마 상태에 접근할 수 있습니다.\n * \n * Context Provider component for theme management.\n * Saves theme to localStorage and can detect system theme.\n * Access theme state through useTheme hook.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ThemeProvider>\n * <App />\n * </ThemeProvider>\n * \n * @example\n * // 커스텀 설정 / Custom settings\n * <ThemeProvider\n * defaultTheme=\"dark\"\n * storageKey=\"my-app-theme\"\n * enableSystem={true}\n * enableTransition={true}\n * >\n * <App />\n * </ThemeProvider>\n * \n * @param {ThemeProviderProps} props - ThemeProvider 컴포넌트의 props / ThemeProvider component props\n * @returns {JSX.Element} ThemeProvider 컴포넌트 / ThemeProvider component\n */\nexport function ThemeProvider({\n children,\n defaultTheme = \"light\", // system에서 light로 변경\n storageKey = \"hua-ui-theme\",\n enableSystem = true,\n enableTransition = true,\n ...props\n}: ThemeProviderProps): React.ReactElement {\n const [theme, setTheme] = useState<Theme>(defaultTheme)\n const [resolvedTheme, setResolvedTheme] = useState<\"light\" | \"dark\">(\"light\")\n\n useEffect(() => {\n // localStorage에서 테마 가져오기 (클라이언트에서만)\n if (typeof window !== 'undefined') {\n const savedTheme = localStorage.getItem(storageKey) as Theme\n if (savedTheme) {\n setTheme(savedTheme)\n }\n }\n }, [storageKey])\n\n useEffect(() => {\n const root = window.document.documentElement\n\n root.classList.remove(\"light\", \"dark\")\n\n if (theme === \"system\" && enableSystem) {\n const systemTheme = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\"\n\n root.classList.add(systemTheme)\n setResolvedTheme(systemTheme)\n } else {\n root.classList.add(theme)\n setResolvedTheme(theme as \"light\" | \"dark\")\n }\n\n if (enableTransition) {\n root.classList.add(\"transition-colors\", \"duration-300\")\n }\n }, [theme, enableSystem, enableTransition])\n\n useEffect(() => {\n if (theme === \"system\" && enableSystem) {\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\")\n\n const handleChange = () => {\n const systemTheme = mediaQuery.matches ? \"dark\" : \"light\"\n setResolvedTheme(systemTheme)\n document.documentElement.classList.remove(\"light\", \"dark\")\n document.documentElement.classList.add(systemTheme)\n }\n\n mediaQuery.addEventListener(\"change\", handleChange)\n return () => mediaQuery.removeEventListener(\"change\", handleChange)\n }\n }, [theme, enableSystem])\n\n const value = {\n theme,\n setTheme: (theme: Theme) => {\n if (typeof window !== 'undefined') {\n localStorage.setItem(storageKey, theme)\n }\n setTheme(theme)\n },\n resolvedTheme,\n toggleTheme: () => {\n const newTheme = resolvedTheme === \"light\" ? \"dark\" : \"light\"\n if (typeof window !== 'undefined') {\n localStorage.setItem(storageKey, newTheme)\n }\n setTheme(newTheme)\n },\n }\n\n return (\n <ThemeProviderContext.Provider {...props} value={value}>\n {children}\n </ThemeProviderContext.Provider>\n )\n}\n\n/**\n * useTheme 훅 / useTheme hook\n * \n * ThemeProvider의 테마 상태에 접근하는 훅입니다.\n * ThemeProvider 내부에서만 사용할 수 있습니다.\n * \n * Hook to access ThemeProvider's theme state.\n * Can only be used inside ThemeProvider.\n * \n * @example\n * const { theme, setTheme, resolvedTheme, toggleTheme } = useTheme()\n * \n * @returns {ThemeProviderState} 테마 상태와 함수들 / Theme state and functions\n * @throws {Error} ThemeProvider 외부에서 사용 시 에러 발생 / Error when used outside ThemeProvider\n */\nexport const useTheme = () => {\n const context = useContext(ThemeProviderContext)\n\n if (context === undefined)\n throw new Error(\"useTheme must be used within a ThemeProvider\")\n\n return context\n} "]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {b,a}from'./chunk-LPHUWTQ2.mjs';import {e,d}from'./chunk-OBMOTQEU.mjs';import l,{useState,useMemo}from'react';import {dotVariants}from'@hua-labs/dot';import {jsx,jsxs}from'react/jsx-runtime';var H={none:"rounded-none",sm:"rounded",md:"rounded-md",lg:"rounded-lg",xl:"rounded-xl",full:"rounded-full"},O={none:"",sm:"shadow-sm",md:"shadow-md",lg:"shadow-lg",xl:"shadow-xl","2xl":"shadow-2xl"};dotVariants({base:"relative rounded-lg border p-4",variants:{variant:{default:"bg-white/10 border-white/30 text-white",success:"bg-green-500/10 border-green-400/30 text-green-200",warning:"bg-yellow-500/10 border-yellow-400/30 text-yellow-200",error:"bg-red-500/10 border-red-400/30 text-red-200",info:"bg-indigo-500/10 border-cyan-400/30 text-cyan-200"}},defaultVariants:{variant:"default"}});var T={position:"relative",...e("p-4"),borderWidth:"1px",borderStyle:"solid"},W={default:{backgroundColor:"color-mix(in srgb, var(--color-foreground) 10%, transparent)",borderColor:"color-mix(in srgb, var(--color-foreground) 30%, transparent)",color:"var(--color-foreground)"},success:{backgroundColor:"color-mix(in srgb, var(--color-success) 10%, transparent)",borderColor:"color-mix(in srgb, var(--color-success) 30%, transparent)",color:"var(--color-success)"},warning:{backgroundColor:"color-mix(in srgb, var(--color-warning) 10%, transparent)",borderColor:"color-mix(in srgb, var(--color-warning) 30%, transparent)",color:"var(--color-warning)"},error:{backgroundColor:"color-mix(in srgb, var(--color-destructive) 10%, transparent)",borderColor:"color-mix(in srgb, var(--color-destructive) 30%, transparent)",color:"var(--color-destructive)"},info:{backgroundColor:"color-mix(in srgb, var(--color-info) 10%, transparent)",borderColor:"color-mix(in srgb, var(--color-info) 30%, transparent)",color:"var(--color-info)"}},C={default:{color:"var(--color-muted-foreground)"},success:{color:"var(--color-success)"},warning:{color:"var(--color-warning)"},error:{color:"var(--color-destructive)"},info:{color:"var(--color-info)"}},D={backgroundColor:"rgba(0, 0, 0, 0.05)"},B=({variant:o})=>{switch(o){case "success":return jsx("svg",{style:{width:"1.25rem",height:"1.25rem"},fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})});case "warning":return jsx("svg",{style:{width:"1.25rem",height:"1.25rem"},fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})});case "error":return jsx("svg",{style:{width:"1.25rem",height:"1.25rem"},fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})});case "info":return jsx("svg",{style:{width:"1.25rem",height:"1.25rem"},fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})});default:return null}},i=l.forwardRef(({dot:o,style:n,variant:e$1="default",rounded:s="lg",shadow:d$1="none",title:m,description:v,icon:c,action:f,closable:p=false,onClose:R,children:h,...k},A)=>{let[b$1,x]=useState(false),L=useMemo(()=>d(T,e(H[s]),d$1!=="none"?e(O[d$1]):void 0,b("light"),W[e$1],e(o),n),[e$1,s,d$1,o,n]),M=useMemo(()=>d({flexShrink:0,...e("mt-0.5")},C[e$1]),[e$1]),N=useMemo(()=>d({display:"inline-flex",...e("rounded-md p-1.5"),transition:a.bg,outline:"none",border:"none",cursor:"pointer",background:"transparent"},C[e$1],b$1?D:void 0),[e$1,b$1]),E=jsx(B,{variant:e$1}),y=c!=null?c:E;return jsx("div",{ref:A,style:L,...k,children:jsxs("div",{style:{display:"flex",alignItems:"flex-start",...e("gap-3")},children:[y&&jsx("div",{style:M,children:y}),jsxs("div",{style:{flex:1,minWidth:0},children:[m&&jsx("h4",{style:{margin:0,...e("mb-1"),fontSize:"0.875rem",fontWeight:600,lineHeight:"1.25rem"},children:m}),v&&jsx("p",{style:{margin:0,fontSize:"0.875rem",lineHeight:"1.625"},children:v}),h&&jsx("div",{style:e("mt-2"),children:h})]}),(f||p)&&jsxs("div",{style:{flexShrink:0,display:"flex",alignItems:"center",...e("gap-2")},children:[f,p&&jsx("button",{onClick:R,style:N,onMouseEnter:()=>x(true),onMouseLeave:()=>x(false),"aria-label":"\uB2EB\uAE30",children:jsx("svg",{style:{width:"1rem",height:"1rem"},fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]})]})})});i.displayName="Alert";var V=l.forwardRef(({dot:o,style:n,...e},s)=>jsx(i,{ref:s,variant:"success",dot:o,style:n,...e}));V.displayName="AlertSuccess";var _=l.forwardRef(({dot:o,style:n,...e},s)=>jsx(i,{ref:s,variant:"warning",dot:o,style:n,...e}));_.displayName="AlertWarning";var j=l.forwardRef(({dot:o,style:n,...e},s)=>jsx(i,{ref:s,variant:"error",dot:o,style:n,...e}));j.displayName="AlertError";var z=l.forwardRef(({dot:o,style:n,...e},s)=>jsx(i,{ref:s,variant:"info",dot:o,style:n,...e}));z.displayName="AlertInfo";export{i as a,V as b,_ as c,j as d,z as e};//# sourceMappingURL=chunk-AJOGTUWS.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-AJOGTUWS.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Alert.tsx"],"names":["ROUNDED_MAP","SHADOW_MAP","dotVariants","BASE_CONTAINER","resolveDot","VARIANT_CONTAINER","VARIANT_ICON","CLOSE_HOVER","DefaultIcon","variant","jsx","Alert","React","dotProp","style","rounded","shadow","title","description","icon","action","closable","onClose","children","props","ref","closeHovered","setCloseHovered","useState","containerStyle","useMemo","mergeStyles","createGlassStyle","iconWrapStyle","closeButtonStyle","TRANSITIONS","defaultIcon","resolvedIcon","jsxs","AlertSuccess","dot","AlertWarning","AlertError","AlertInfo"],"mappings":"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","file":"chunk-AJOGTUWS.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 { TRANSITIONS } from \"../lib/styles/transition\";\n\nconst ROUNDED_MAP: Record<string, string> = {\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\nconst SHADOW_MAP: Record<string, string> = {\n none: \"\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n xl: \"shadow-xl\",\n \"2xl\": \"shadow-2xl\",\n};\n\n// ---------------------------------------------------------------------------\n// Variant style maps\n// ---------------------------------------------------------------------------\n\nexport const alertVariantStyles = dotVariants({\n base: \"relative rounded-lg border p-4\",\n variants: {\n variant: {\n default: \"bg-white/10 border-white/30 text-white\",\n success: \"bg-green-500/10 border-green-400/30 text-green-200\",\n warning: \"bg-yellow-500/10 border-yellow-400/30 text-yellow-200\",\n error: \"bg-red-500/10 border-red-400/30 text-red-200\",\n info: \"bg-indigo-500/10 border-cyan-400/30 text-cyan-200\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n});\n\n/** Base container styles as plain CSSProperties (rounded/shadow applied dynamically) */\nconst BASE_CONTAINER: React.CSSProperties = {\n position: \"relative\",\n ...resolveDot(\"p-4\"),\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n};\n\n/**\n * Per-variant container styles — uses semantic CSS variables.\n * Text color uses the base token (not -foreground) because -foreground\n * is #fff designed for solid fills, not subtle 10%-tinted surfaces.\n */\nconst VARIANT_CONTAINER: Record<string, React.CSSProperties> = {\n default: {\n backgroundColor:\n \"color-mix(in srgb, var(--color-foreground) 10%, transparent)\",\n borderColor: \"color-mix(in srgb, var(--color-foreground) 30%, transparent)\",\n color: \"var(--color-foreground)\",\n },\n success: {\n backgroundColor:\n \"color-mix(in srgb, var(--color-success) 10%, transparent)\",\n borderColor: \"color-mix(in srgb, var(--color-success) 30%, transparent)\",\n color: \"var(--color-success)\",\n },\n warning: {\n backgroundColor:\n \"color-mix(in srgb, var(--color-warning) 10%, transparent)\",\n borderColor: \"color-mix(in srgb, var(--color-warning) 30%, transparent)\",\n color: \"var(--color-warning)\",\n },\n error: {\n backgroundColor:\n \"color-mix(in srgb, var(--color-destructive) 10%, transparent)\",\n borderColor:\n \"color-mix(in srgb, var(--color-destructive) 30%, transparent)\",\n color: \"var(--color-destructive)\",\n },\n info: {\n backgroundColor: \"color-mix(in srgb, var(--color-info) 10%, transparent)\",\n borderColor: \"color-mix(in srgb, var(--color-info) 30%, transparent)\",\n color: \"var(--color-info)\",\n },\n};\n\n/** Per-variant icon color styles */\nconst VARIANT_ICON: Record<string, React.CSSProperties> = {\n default: { color: \"var(--color-muted-foreground)\" },\n success: { color: \"var(--color-success)\" },\n warning: { color: \"var(--color-warning)\" },\n error: { color: \"var(--color-destructive)\" },\n info: { color: \"var(--color-info)\" },\n};\n\n/** Close button hover overlay */\nconst CLOSE_HOVER: React.CSSProperties = {\n backgroundColor: \"rgba(0, 0, 0, 0.05)\",\n};\n\n// ---------------------------------------------------------------------------\n// Default icons (SVG, internal — className kept for sizing only)\n// ---------------------------------------------------------------------------\n\nconst DefaultIcon: React.FC<{ variant: string }> = ({ variant }) => {\n switch (variant) {\n case \"success\":\n return (\n <svg\n style={{ width: \"1.25rem\", height: \"1.25rem\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n );\n case \"warning\":\n return (\n <svg\n style={{ width: \"1.25rem\", height: \"1.25rem\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\"\n />\n </svg>\n );\n case \"error\":\n return (\n <svg\n style={{ width: \"1.25rem\", height: \"1.25rem\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n );\n case \"info\":\n return (\n <svg\n style={{ width: \"1.25rem\", height: \"1.25rem\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n );\n default:\n return null;\n }\n};\n\n// ---------------------------------------------------------------------------\n// AlertProps\n// ---------------------------------------------------------------------------\n\n/**\n * Alert 컴포넌트의 props\n * @typedef {Object} AlertProps\n * @property {\"default\" | \"success\" | \"warning\" | \"error\" | \"info\"} [variant=\"default\"] - Alert 스타일 변형\n * @property {string} [title] - Alert 제목\n * @property {string} [description] - Alert 설명\n * @property {React.ReactNode} [icon] - 커스텀 아이콘\n * @property {React.ReactNode} [action] - 액션 버튼/요소\n * @property {boolean} [closable=false] - 닫기 버튼 표시 여부\n * @property {() => void} [onClose] - 닫기 버튼 클릭 시 호출되는 콜백\n * @property {string} [dot] - dot 유틸리티 스트링 (추가 스타일)\n * @property {React.CSSProperties} [style] - 인라인 스타일\n */\nexport interface AlertProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"className\"\n> {\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\";\n rounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n shadow?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n action?: React.ReactNode;\n closable?: boolean;\n onClose?: () => void;\n dot?: string;\n style?: React.CSSProperties;\n}\n\n// ---------------------------------------------------------------------------\n// Alert\n// ---------------------------------------------------------------------------\n\n/**\n * Alert 컴포넌트 / Alert component\n *\n * 사용자에게 중요한 정보나 경고를 표시하는 컴포넌트입니다.\n * 다양한 변형(variant)을 지원하며, 아이콘, 제목, 설명, 액션 버튼을 포함할 수 있습니다.\n *\n * Component for displaying important information or warnings to users.\n * Supports various variants and can include icons, titles, descriptions, and action buttons.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Alert variant=\"info\" title=\"정보\" description=\"이것은 정보 메시지입니다.\" />\n *\n * @example\n * // 닫기 버튼 포함 / With close button\n * <Alert\n * variant=\"warning\"\n * title=\"경고\"\n * closable\n * onClose={() => console.log('닫기')}\n * />\n *\n * @example\n * // 커스텀 아이콘과 액션 / Custom icon and action\n * <Alert\n * variant=\"success\"\n * icon={<Icon name=\"check\" />}\n * action={<Button size=\"sm\">확인</Button>}\n * >\n * 작업이 완료되었습니다.\n * </Alert>\n *\n * @param {AlertProps} props - Alert 컴포넌트의 props / Alert component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Alert 컴포넌트 / Alert component\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n dot: dotProp,\n style,\n variant = \"default\",\n rounded = \"lg\",\n shadow = \"none\",\n title,\n description,\n icon,\n action,\n closable = false,\n onClose,\n children,\n ...props\n },\n ref,\n ) => {\n const [closeHovered, setCloseHovered] = useState(false);\n\n const containerStyle = useMemo(\n () =>\n mergeStyles(\n BASE_CONTAINER,\n resolveDot(ROUNDED_MAP[rounded]),\n shadow !== \"none\" ? resolveDot(SHADOW_MAP[shadow]) : undefined,\n createGlassStyle(\"light\"),\n VARIANT_CONTAINER[variant],\n resolveDot(dotProp),\n style,\n ),\n [variant, rounded, shadow, dotProp, style],\n );\n\n const iconWrapStyle = useMemo(\n () =>\n mergeStyles(\n { flexShrink: 0, ...resolveDot(\"mt-0.5\") } as React.CSSProperties,\n VARIANT_ICON[variant],\n ),\n [variant],\n );\n\n const closeButtonStyle = useMemo(\n (): React.CSSProperties =>\n mergeStyles(\n {\n display: \"inline-flex\",\n ...resolveDot(\"rounded-md p-1.5\"),\n transition: TRANSITIONS.bg,\n outline: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n background: \"transparent\",\n } as React.CSSProperties,\n VARIANT_ICON[variant],\n closeHovered ? CLOSE_HOVER : undefined,\n ),\n [variant, closeHovered],\n );\n\n const defaultIcon = <DefaultIcon variant={variant} />;\n const resolvedIcon = icon ?? defaultIcon;\n\n return (\n <div ref={ref} style={containerStyle} {...props}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n ...resolveDot(\"gap-3\"),\n }}\n >\n {/* 아이콘 */}\n {resolvedIcon && <div style={iconWrapStyle}>{resolvedIcon}</div>}\n\n {/* 내용 */}\n <div style={{ flex: 1, minWidth: 0 }}>\n {title && (\n <h4\n style={{\n margin: 0,\n ...resolveDot(\"mb-1\"),\n fontSize: \"0.875rem\",\n fontWeight: 600,\n lineHeight: \"1.25rem\",\n }}\n >\n {title}\n </h4>\n )}\n {description && (\n <p\n style={{ margin: 0, fontSize: \"0.875rem\", lineHeight: \"1.625\" }}\n >\n {description}\n </p>\n )}\n {children && <div style={resolveDot(\"mt-2\")}>{children}</div>}\n </div>\n\n {/* 액션 */}\n {(action || closable) && (\n <div\n style={{\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n ...resolveDot(\"gap-2\"),\n }}\n >\n {action}\n {closable && (\n <button\n onClick={onClose}\n style={closeButtonStyle}\n onMouseEnter={() => setCloseHovered(true)}\n onMouseLeave={() => setCloseHovered(false)}\n aria-label=\"닫기\"\n >\n <svg\n style={{ width: \"1rem\", height: \"1rem\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n },\n);\nAlert.displayName = \"Alert\";\n\n// ---------------------------------------------------------------------------\n// Convenience components\n// ---------------------------------------------------------------------------\n\nexport const AlertSuccess = React.forwardRef<\n HTMLDivElement,\n Omit<AlertProps, \"variant\">\n>(({ dot, style, ...props }, ref) => (\n <Alert ref={ref} variant=\"success\" dot={dot} style={style} {...props} />\n));\nAlertSuccess.displayName = \"AlertSuccess\";\n\nexport const AlertWarning = React.forwardRef<\n HTMLDivElement,\n Omit<AlertProps, \"variant\">\n>(({ dot, style, ...props }, ref) => (\n <Alert ref={ref} variant=\"warning\" dot={dot} style={style} {...props} />\n));\nAlertWarning.displayName = \"AlertWarning\";\n\nexport const AlertError = React.forwardRef<\n HTMLDivElement,\n Omit<AlertProps, \"variant\">\n>(({ dot, style, ...props }, ref) => (\n <Alert ref={ref} variant=\"error\" dot={dot} style={style} {...props} />\n));\nAlertError.displayName = \"AlertError\";\n\nexport const AlertInfo = React.forwardRef<\n HTMLDivElement,\n Omit<AlertProps, \"variant\">\n>(({ dot, style, ...props }, ref) => (\n <Alert ref={ref} variant=\"info\" dot={dot} style={style} {...props} />\n));\nAlertInfo.displayName = \"AlertInfo\";\n\nexport { Alert };\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {b as b$1,a as a$2}from'./chunk-I6NCGF6E.mjs';import {f,a as a$1,i,j as j$1,d as d$1,g,h}from'./chunk-RICRFXFP.mjs';import {b,a}from'./chunk-LPHUWTQ2.mjs';import {m}from'./chunk-NSDWT2JM.mjs';import {d,e}from'./chunk-OBMOTQEU.mjs';import G,{useState,useMemo}from'react';import {dotVariants}from'@hua-labs/dot';import {jsx,jsxs}from'react/jsx-runtime';var j=dotVariants({base:"flex w-full rounded-md border",variants:{variant:{default:"border-[var(--color-input)] bg-[var(--color-background)] text-[var(--color-foreground)]",outline:"border-2 border-[var(--color-input)] bg-transparent text-[var(--color-foreground)]",filled:"border-transparent bg-[var(--color-secondary)]/50 text-[var(--color-foreground)]",ghost:"border-transparent bg-transparent text-[var(--color-foreground)]",glass:""},size:{sm:"px-3 py-2 text-sm",md:"px-4 py-3 text-base",lg:"px-4 py-3 text-lg"},resize:{none:"",vertical:"",horizontal:"",both:""}},defaultVariants:{variant:"default",size:"md",resize:"vertical"}}),ee={none:{resize:"none"},vertical:{resize:"vertical"},horizontal:{resize:"horizontal"},both:{resize:"both"}},re={sm:{minHeight:"80px"},md:{minHeight:"100px"},lg:{minHeight:"120px"}},oe={glass:{...b("light"),borderColor:"rgba(255, 255, 255, 0.3)",color:"white"}},Y={default:f,outline:f,filled:{...f,backgroundColor:"var(--color-background)"},ghost:{outline:"none",boxShadow:"0 0 0 1px var(--color-muted-foreground)",backgroundColor:"var(--color-muted)",borderColor:"var(--color-border)"},glass:{outline:"none",boxShadow:"0 0 0 1px color-mix(in srgb, var(--color-ring) 20%, transparent)",borderColor:"color-mix(in srgb, var(--color-ring) 50%, transparent)",backgroundColor:"rgba(255, 255, 255, 0.2)"}},te=G.forwardRef(({dot:f,style:d$1,variant:i$1="default",size:u="md",error:s=false,success:l=false,resize:R="vertical",...o},k)=>{var v;let[S,m]=useState(false),[r,E]=useState(false),O=o["aria-invalid"],a$3=s||(O!==void 0?O:false),C=(v=o.disabled)!=null?v:false,I=useMemo(()=>{var h$1;let n=d({transition:a.normal},j({variant:i$1,size:u,resize:R}),oe[i$1],ee[R],re[u]);if(C)return d(n,a$1,e(f),d$1);let e$1={};return S&&!r&&(e$1=a$2),r&&(a$3?e$1=g:l?e$1=h:e$1=(h$1=Y[i$1])!=null?h$1:Y.default),r||(a$3?e$1=d(e$1,i):l&&(e$1=d(e$1,j$1))),d(n,e$1,e(f),d$1)},[i$1,u,R,S,r,C,a$3,l,f,d$1]);return jsx("textarea",{style:I,ref:k,"aria-invalid":a$3||void 0,onMouseEnter:()=>m(true),onMouseLeave:()=>m(false),onFocus:n=>{var e;E(true),(e=o.onFocus)==null||e.call(o,n);},onBlur:n=>{var e;E(false),(e=o.onBlur)==null||e.call(o,n);},...o})});te.displayName="Textarea";var ie={sm:{width:"1rem",height:"1rem"},md:{width:"1.25rem",height:"1.25rem"},lg:{width:"1.5rem",height:"1.5rem"}},se={sm:12,md:14,lg:16},le={display:"flex",alignItems:"center",justifyContent:"center",borderRadius:"0.25rem",border:"1px solid",transition:a.normal,cursor:"pointer",position:"relative",flexShrink:0},de={default:{borderColor:"var(--color-input)",backgroundColor:"var(--color-background)"},outline:{borderWidth:"2px",borderColor:"var(--color-input)",backgroundColor:"transparent"},filled:{borderColor:"transparent",backgroundColor:"var(--color-muted)"},glass:{...b("light"),borderColor:"rgba(255,255,255,0.3)"}},ce={backgroundColor:"var(--color-primary)",borderColor:"var(--color-primary)",boxShadow:"0 1px 3px color-mix(in srgb, var(--color-primary) 20%, transparent)"},fe={borderColor:"var(--color-destructive, hsl(0 84% 60%))"},ue={borderColor:"var(--color-success)"},Se={cursor:"not-allowed",opacity:.5},me=G.forwardRef(({variant:f="default",size:d$2="md",error:i=false,success:u=false,label:s,description:l,id:R,dot:o,style:k,onFocus:S,onBlur:m$1,...r},E)=>{var P,A;let O=G.useId(),a$1=R||O,C=s?`${a$1}-label`:void 0,I=l?`${a$1}-description`:void 0,[v,n]=useState(false),[e$1,h]=useState(false),W=r.checked!==void 0,c=(A=(P=r.checked)!=null?P:r.defaultChecked)!=null?A:false,X=W&&!r.onChange&&!r.readOnly,b=!!r.disabled,$=useMemo(()=>{let x=d(le,ie[d$2],de[f]);return d(x,c?void 0:i?fe:u?ue:void 0,e$1&&!c&&!b?b$1:void 0,c?ce:void 0,v?d$1:void 0,b?Se:void 0)},[d$2,f,c,i,u,v,e$1,b]),K=d({display:"flex",alignItems:"flex-start",...e("gap-3")},e(o),k);return jsxs("div",{style:K,children:[jsxs("div",{style:{position:"relative"},children:[jsx("input",{type:"checkbox",id:a$1,style:{position:"absolute",width:"100%",height:"100%",opacity:0,cursor:b?"not-allowed":"pointer",zIndex:10,margin:0,padding:0,inset:0},ref:E,"aria-checked":c,"aria-invalid":i,"aria-label":s?void 0:r["aria-label"],"aria-labelledby":s?C:void 0,"aria-describedby":I,role:"checkbox",readOnly:X||r.readOnly,onFocus:x=>{n(true),S==null||S(x);},onBlur:x=>{n(false),m$1==null||m$1(x);},...r}),jsx("div",{style:$,onMouseEnter:()=>h(true),onMouseLeave:()=>h(false),"aria-hidden":"true",children:jsx("span",{style:{display:"inline-flex",color:"white",transition:a.normal,opacity:c?1:0,transform:c?"scale(1)":"scale(0)"},children:jsx(m,{name:"check",size:se[d$2]})})})]}),(s||l)&&jsxs("div",{style:{display:"flex",flexDirection:"column"},children:[s&&jsx("label",{htmlFor:a$1,id:C,style:{fontSize:"0.875rem",fontWeight:500,color:"var(--color-foreground)",cursor:b?"not-allowed":"pointer",opacity:b?.5:1},children:s}),l&&jsx("p",{id:I,style:{fontSize:"0.875rem",color:"var(--color-muted-foreground)",margin:0},children:l})]})]})});me.displayName="Checkbox";export{te as a,me as b};//# sourceMappingURL=chunk-AQTSQYH2.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-AQTSQYH2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Textarea.tsx","../src/components/Checkbox.tsx"],"names":["textareaVariantStyles","dotVariants","RESIZE_STYLE","MIN_HEIGHT","VARIANT_EXTRAS","createGlassStyle","VARIANT_FOCUS","FORM_FOCUS_BASE","Textarea","React","dotProp","styleProp","variant","size","error","success","resize","props","ref","_a","isHovered","setIsHovered","useState","isFocused","setIsFocused","ariaInvalid","isInvalid","isDisabled","computedStyle","useMemo","base","mergeStyles","TRANSITIONS","DISABLED_INPUT","resolveDot","stateStyles","FORM_HOVER","FORM_FOCUS_ERROR","FORM_FOCUS_SUCCESS","FORM_BORDER_ERROR","FORM_BORDER_SUCCESS","jsx","e","SIZE_STYLES","ICON_SIZES","BASE_BOX_STYLE","VARIANT_BASE","CHECKED_STYLE","ERROR_BORDER","SUCCESS_BORDER","DISABLED_STYLE","Checkbox","label","description","id","style","onFocus","onBlur","_b","generatedId","checkboxId","labelId","descriptionId","isControlled","isChecked","needsReadOnly","boxStyle","CONTROL_HOVER_BORDER","FOCUS_RING_CONTROL_SOFT","wrapperStyle","jsxs","Icon"],"mappings":"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","file":"chunk-AQTSQYH2.mjs","sourcesContent":["\"use client\";\n\nimport React, { useState, useMemo } from \"react\";\nimport { dotVariants } from \"@hua-labs/dot\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\nimport type { CSSProperties } from \"react\";\nimport { createGlassStyle } from \"../lib/styles/glass\";\nimport {\n FORM_FOCUS_BASE,\n FORM_FOCUS_ERROR,\n FORM_FOCUS_SUCCESS,\n FORM_BORDER_ERROR,\n FORM_BORDER_SUCCESS,\n FORM_DISABLED,\n} from \"../lib/styles/focus\";\nimport { FORM_HOVER } from \"../lib/styles/hover\";\nimport { TRANSITIONS } from \"../lib/styles/transition\";\n\nexport const textareaVariantStyles = dotVariants({\n base: \"flex w-full rounded-md border\",\n variants: {\n variant: {\n default:\n \"border-[var(--color-input)] bg-[var(--color-background)] text-[var(--color-foreground)]\",\n outline:\n \"border-2 border-[var(--color-input)] bg-transparent text-[var(--color-foreground)]\",\n filled:\n \"border-transparent bg-[var(--color-secondary)]/50 text-[var(--color-foreground)]\",\n ghost: \"border-transparent bg-transparent text-[var(--color-foreground)]\",\n glass: \"\",\n },\n size: {\n sm: \"px-3 py-2 text-sm\",\n md: \"px-4 py-3 text-base\",\n lg: \"px-4 py-3 text-lg\",\n },\n resize: {\n none: \"\",\n vertical: \"\",\n horizontal: \"\",\n both: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n resize: \"vertical\",\n },\n});\n\n/** Resize → CSSProperties mapping (can't be dot utilities) */\nconst RESIZE_STYLE: Record<string, CSSProperties> = {\n none: { resize: \"none\" },\n vertical: { resize: \"vertical\" },\n horizontal: { resize: \"horizontal\" },\n both: { resize: \"both\" },\n};\n\n/** MinHeight per size */\nconst MIN_HEIGHT: Record<string, CSSProperties> = {\n sm: { minHeight: \"80px\" },\n md: { minHeight: \"100px\" },\n lg: { minHeight: \"120px\" },\n};\n\n/** Extra base styles per variant (can't be expressed as dot utilities) */\nconst VARIANT_EXTRAS: Record<string, CSSProperties> = {\n glass: {\n ...createGlassStyle(\"light\"),\n borderColor: \"rgba(255, 255, 255, 0.3)\",\n color: \"white\",\n },\n};\n\n/** Focus styles per variant (ghost/filled/glass have unique overrides) */\nconst VARIANT_FOCUS: Record<string, CSSProperties> = {\n default: FORM_FOCUS_BASE,\n outline: FORM_FOCUS_BASE,\n filled: {\n ...FORM_FOCUS_BASE,\n backgroundColor: \"var(--color-background)\",\n },\n ghost: {\n outline: \"none\",\n boxShadow: \"0 0 0 1px var(--color-muted-foreground)\",\n backgroundColor: \"var(--color-muted)\",\n borderColor: \"var(--color-border)\",\n },\n glass: {\n outline: \"none\",\n boxShadow:\n \"0 0 0 1px color-mix(in srgb, var(--color-ring) 20%, transparent)\",\n borderColor: \"color-mix(in srgb, var(--color-ring) 50%, transparent)\",\n backgroundColor: \"rgba(255, 255, 255, 0.2)\",\n },\n};\n\n/**\n * Textarea 컴포넌트의 props / Textarea component props\n */\nexport interface TextareaProps extends Omit<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n \"className\" | \"size\"\n> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\";\n size?: \"sm\" | \"md\" | \"lg\";\n error?: boolean;\n success?: boolean;\n resize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\";\n dot?: string;\n style?: CSSProperties;\n}\n\n/**\n * Textarea 컴포넌트 / Textarea component\n *\n * 여러 줄 텍스트 입력을 위한 텍스트 영역 컴포넌트입니다.\n * 다양한 스타일 변형과 크기를 지원하며, 접근성 속성을 포함합니다.\n *\n * Text area component for multi-line text input.\n * Supports various style variants and sizes, includes accessibility attributes.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Textarea placeholder=\"내용을 입력하세요\" />\n *\n * @example\n * // 에러 상태 / Error state\n * <Textarea\n * error\n * placeholder=\"에러가 발생했습니다\"\n * aria-label=\"설명 입력\"\n * />\n *\n * @example\n * // 크기 조절 비활성화 / Disable resize\n * <Textarea\n * resize=\"none\"\n * rows={5}\n * placeholder=\"고정 크기 텍스트 영역\"\n * />\n *\n * @param {TextareaProps} props - Textarea 컴포넌트의 props / Textarea component props\n * @param {React.Ref<HTMLTextAreaElement>} ref - textarea 요소 ref / textarea element ref\n * @returns {JSX.Element} Textarea 컴포넌트 / Textarea component\n *\n * @todo 접근성 개선: aria-invalid 속성 자동 추가 필요 / Accessibility improvement: auto-add aria-invalid attribute\n */\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n dot: dotProp,\n style: styleProp,\n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n resize = \"vertical\",\n ...props\n },\n ref,\n ) => {\n const [isHovered, setIsHovered] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const ariaInvalid = props[\"aria-invalid\" as keyof typeof props] as\n | boolean\n | undefined;\n const isInvalid =\n error || (ariaInvalid !== undefined ? ariaInvalid : false);\n const isDisabled = props.disabled ?? false;\n\n const computedStyle = useMemo(() => {\n const base = mergeStyles(\n { transition: TRANSITIONS.normal },\n textareaVariantStyles({ variant, size, resize }) as CSSProperties,\n VARIANT_EXTRAS[variant],\n RESIZE_STYLE[resize],\n MIN_HEIGHT[size],\n );\n\n if (isDisabled) {\n return mergeStyles(base, FORM_DISABLED, resolveDot(dotProp), styleProp);\n }\n\n let stateStyles: CSSProperties = {};\n\n if (isHovered && !isFocused) {\n stateStyles = FORM_HOVER;\n }\n\n if (isFocused) {\n if (isInvalid) {\n stateStyles = FORM_FOCUS_ERROR;\n } else if (success) {\n stateStyles = FORM_FOCUS_SUCCESS;\n } else {\n stateStyles = VARIANT_FOCUS[variant] ?? VARIANT_FOCUS.default;\n }\n }\n\n // Error/success border (non-focus)\n if (!isFocused) {\n if (isInvalid) {\n stateStyles = mergeStyles(stateStyles, FORM_BORDER_ERROR);\n } else if (success) {\n stateStyles = mergeStyles(stateStyles, FORM_BORDER_SUCCESS);\n }\n }\n\n return mergeStyles(base, stateStyles, resolveDot(dotProp), styleProp);\n }, [\n variant,\n size,\n resize,\n isHovered,\n isFocused,\n isDisabled,\n isInvalid,\n success,\n dotProp,\n styleProp,\n ]);\n\n return (\n <textarea\n style={computedStyle}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onFocus={(e) => {\n setIsFocused(true);\n props.onFocus?.(e);\n }}\n onBlur={(e) => {\n setIsFocused(false);\n props.onBlur?.(e);\n }}\n {...props}\n />\n );\n },\n);\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","\"use client\";\n\nimport React, { useState, useMemo } from \"react\";\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\";\nimport { Icon } from \"./Icon\";\nimport { createGlassStyle } from \"../lib/styles/glass\";\nimport { FOCUS_RING_CONTROL_SOFT } from \"../lib/styles/focus\";\nimport { CONTROL_HOVER_BORDER } from \"../lib/styles/hover\";\nimport { TRANSITIONS } from \"../lib/styles/transition\";\n\n/**\n * Checkbox 컴포넌트의 props / Checkbox component props\n * @typedef {Object} CheckboxProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Checkbox 스타일 변형 / Checkbox style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Checkbox 크기 / Checkbox size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 체크박스 레이블 텍스트 / Checkbox label text\n * @property {string} [description] - 체크박스 설명 텍스트 / Checkbox description text\n * @property {string} [dot] - dot 스타일 유틸리티 문자열 / Dot style utility string\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'className'>}\n */\nexport interface CheckboxProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\" | \"className\"\n> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\";\n size?: \"sm\" | \"md\" | \"lg\";\n error?: boolean;\n success?: boolean;\n label?: string;\n description?: string;\n dot?: string;\n style?: React.CSSProperties;\n}\n\n/** Sizes as CSSProperties */\nconst SIZE_STYLES: Record<string, React.CSSProperties> = {\n sm: { width: \"1rem\", height: \"1rem\" },\n md: { width: \"1.25rem\", height: \"1.25rem\" },\n lg: { width: \"1.5rem\", height: \"1.5rem\" },\n};\n\nconst ICON_SIZES: Record<string, number> = {\n sm: 12,\n md: 14,\n lg: 16,\n};\n\n/** Base visual box styles shared by all variants */\nconst BASE_BOX_STYLE: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"0.25rem\",\n border: \"1px solid\",\n transition: TRANSITIONS.normal,\n cursor: \"pointer\",\n position: \"relative\",\n flexShrink: 0,\n};\n\n/** Variant base styles (unchecked) */\nconst VARIANT_BASE: Record<string, React.CSSProperties> = {\n default: {\n borderColor: \"var(--color-input)\",\n backgroundColor: \"var(--color-background)\",\n },\n outline: {\n borderWidth: \"2px\",\n borderColor: \"var(--color-input)\",\n backgroundColor: \"transparent\",\n },\n filled: {\n borderColor: \"transparent\",\n backgroundColor: \"var(--color-muted)\",\n },\n glass: {\n ...createGlassStyle(\"light\"),\n borderColor: \"rgba(255,255,255,0.3)\",\n },\n};\n\n/** Checked state overrides (all variants use primary color) */\nconst CHECKED_STYLE: React.CSSProperties = {\n backgroundColor: \"var(--color-primary)\",\n borderColor: \"var(--color-primary)\",\n boxShadow:\n \"0 1px 3px color-mix(in srgb, var(--color-primary) 20%, transparent)\",\n};\n\n/** Error border override */\nconst ERROR_BORDER: React.CSSProperties = {\n borderColor: \"var(--color-destructive, hsl(0 84% 60%))\",\n};\n\n/** Success border override */\nconst SUCCESS_BORDER: React.CSSProperties = {\n borderColor: \"var(--color-success)\",\n};\n\n/** Disabled overlay */\nconst DISABLED_STYLE: React.CSSProperties = {\n cursor: \"not-allowed\",\n opacity: 0.5,\n};\n\n/**\n * Checkbox 컴포넌트 / Checkbox component\n *\n * 체크박스 입력 필드를 제공하는 컴포넌트입니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n *\n * Checkbox input field component.\n * Automatically sets ARIA attributes for accessibility support.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Checkbox label=\"이용약관에 동의합니다\" />\n *\n * @example\n * // 에러 상태와 설명 / Error state with description\n * <Checkbox\n * label=\"필수 항목\"\n * description=\"이 항목은 필수입니다\"\n * error\n * />\n *\n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [checked, setChecked] = useState(false)\n * <Checkbox\n * checked={checked}\n * onChange={(e) => setChecked(e.target.checked)}\n * label=\"동의\"\n * />\n *\n * @param {CheckboxProps} props - Checkbox 컴포넌트의 props / Checkbox component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Checkbox 컴포넌트 / Checkbox component\n */\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n dot: dotProp,\n style,\n onFocus,\n onBlur,\n ...props\n },\n ref,\n ) => {\n const generatedId = React.useId();\n const checkboxId = id || generatedId;\n const labelId = label ? `${checkboxId}-label` : undefined;\n const descriptionId = description ? `${checkboxId}-description` : undefined;\n\n const [isFocused, setIsFocused] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n\n // Support both controlled and uncontrolled modes\n const isControlled = props.checked !== undefined;\n const isChecked = props.checked ?? props.defaultChecked ?? false;\n // Add readOnly if controlled without onChange to suppress React warning\n const needsReadOnly = isControlled && !props.onChange && !props.readOnly;\n\n const isDisabled = !!props.disabled;\n\n /** Computed style for the visual checkbox box */\n const boxStyle = useMemo((): React.CSSProperties => {\n const base = mergeStyles(\n BASE_BOX_STYLE,\n SIZE_STYLES[size],\n VARIANT_BASE[variant],\n );\n\n // State overrides: error / success border (unchecked only)\n const stateBorder: React.CSSProperties | undefined = !isChecked\n ? error\n ? ERROR_BORDER\n : success\n ? SUCCESS_BORDER\n : undefined\n : undefined;\n\n // Hover: only when unchecked and not disabled\n const hoverStyle =\n isHovered && !isChecked && !isDisabled\n ? CONTROL_HOVER_BORDER\n : undefined;\n\n // Checked fills with primary\n const checkedStyle = isChecked ? CHECKED_STYLE : undefined;\n\n // Focus ring\n const focusStyle = isFocused ? FOCUS_RING_CONTROL_SOFT : undefined;\n\n // Disabled\n const disabledStyle = isDisabled ? DISABLED_STYLE : undefined;\n\n return mergeStyles(\n base,\n stateBorder,\n hoverStyle,\n checkedStyle,\n focusStyle,\n disabledStyle,\n );\n }, [\n size,\n variant,\n isChecked,\n error,\n success,\n isFocused,\n isHovered,\n isDisabled,\n ]);\n\n /** Wrapper row style */\n const wrapperStyle: React.CSSProperties = mergeStyles(\n { display: \"flex\", alignItems: \"flex-start\", ...resolveDot(\"gap-3\") },\n resolveDot(dotProp),\n style,\n );\n\n return (\n <div style={wrapperStyle}>\n <div style={{ position: \"relative\" }}>\n {/* Hidden accessible input — sits on top for click/keyboard interaction */}\n <input\n type=\"checkbox\"\n id={checkboxId}\n style={{\n position: \"absolute\",\n width: \"100%\",\n height: \"100%\",\n opacity: 0,\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n zIndex: 10,\n margin: 0,\n padding: 0,\n inset: 0,\n }}\n ref={ref}\n aria-checked={isChecked}\n aria-invalid={error}\n aria-label={!label ? props[\"aria-label\"] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"checkbox\"\n readOnly={needsReadOnly || props.readOnly}\n onFocus={(e) => {\n setIsFocused(true);\n onFocus?.(e);\n }}\n onBlur={(e) => {\n setIsFocused(false);\n onBlur?.(e);\n }}\n {...props}\n />\n {/* Visual checkbox box */}\n <div\n style={boxStyle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n aria-hidden=\"true\"\n >\n <span\n style={{\n display: \"inline-flex\",\n color: \"white\",\n transition: TRANSITIONS.normal,\n opacity: isChecked ? 1 : 0,\n transform: isChecked ? \"scale(1)\" : \"scale(0)\",\n }}\n >\n <Icon name=\"check\" size={ICON_SIZES[size]} />\n </span>\n </div>\n </div>\n {(label || description) && (\n <div style={{ display: \"flex\", flexDirection: \"column\" }}>\n {label && (\n <label\n htmlFor={checkboxId}\n id={labelId}\n style={{\n fontSize: \"0.875rem\",\n fontWeight: 500,\n color: \"var(--color-foreground)\",\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.5 : 1,\n }}\n >\n {label}\n </label>\n )}\n {description && (\n <p\n id={descriptionId}\n style={{\n fontSize: \"0.875rem\",\n color: \"var(--color-muted-foreground)\",\n margin: 0,\n }}\n >\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n );\n },\n);\nCheckbox.displayName = \"Checkbox\";\n\nexport { Checkbox };\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {d,e}from'./chunk-OBMOTQEU.mjs';import x,{useMemo}from'react';import {dotVariants,dot}from'@hua-labs/dot';import {jsx}from'react/jsx-runtime';var g=e=>dot(e),S=dotVariants({base:"w-full",variants:{size:{sm:"max-w-2xl",md:"max-w-4xl",lg:"max-w-6xl",xl:"max-w-7xl",full:"max-w-full"},padding:{none:"",sm:"px-4 py-8",md:"px-6 py-12",lg:"px-8 py-16",xl:"px-12 py-20"}},defaultVariants:{size:"lg",padding:"md"}}),w={marginLeft:"auto",marginRight:"auto"},C=x.forwardRef(({dot:e$1,size:a="lg",padding:n="md",centered:o=true,fluid:t=false,style:r,...i},m)=>{let d$1=useMemo(()=>{let p=S({size:t?"full":a,padding:n});return d(p,t?g("max-w-full"):void 0,o?w:void 0,e(e$1),r)},[a,n,o,t,e$1,r]);return jsx("div",{ref:m,style:d$1,...i})});C.displayName="Container";export{C as a};//# sourceMappingURL=chunk-B2MRZJQA.mjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-B2MRZJQA.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Container.tsx"],"names":["s","input","dotFn","containerVariants","dotVariants","CENTERED_STYLE","Container","React","dotProp","size","padding","centered","fluid","style","props","ref","computedStyle","useMemo","base","mergeStyles","resolveDot","jsx"],"mappings":"qJAMA,IAAMA,EAAKC,CAAAA,EAAkBC,GAAAA,CAAMD,CAAK,CAAA,CAE3BE,CAAAA,CAAoBC,WAAAA,CAAY,CAC3C,IAAA,CAAM,SACN,QAAA,CAAU,CACR,IAAA,CAAM,CACJ,GAAI,WAAA,CACJ,EAAA,CAAI,WAAA,CACJ,EAAA,CAAI,YACJ,EAAA,CAAI,WAAA,CACJ,IAAA,CAAM,YACR,CAAA,CACA,OAAA,CAAS,CACP,IAAA,CAAM,GACN,EAAA,CAAI,WAAA,CACJ,EAAA,CAAI,YAAA,CACJ,GAAI,YAAA,CACJ,EAAA,CAAI,aACN,CACF,EACA,eAAA,CAAiB,CACf,IAAA,CAAM,IAAA,CACN,QAAS,IACX,CACF,CAAC,CAAA,CAEKC,EAAsC,CAC1C,UAAA,CAAY,MAAA,CACZ,WAAA,CAAa,MACf,CAAA,CAwBMC,CAAAA,CAAYC,CAAAA,CAAM,UAAA,CACtB,CAAC,CACC,GAAA,CAAKC,GAAAA,CACL,IAAA,CAAAC,CAAAA,CAAO,IAAA,CACP,OAAA,CAAAC,CAAAA,CAAU,KACV,QAAA,CAAAC,CAAAA,CAAW,IAAA,CACX,KAAA,CAAAC,EAAQ,KAAA,CACR,KAAA,CAAAC,CAAAA,CACA,GAAGC,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAMC,IAAgBC,OAAAA,CAAQ,IAAM,CAClC,IAAMC,EAAOf,CAAAA,CAAkB,CAC7B,IAAA,CAAMS,CAAAA,CAAQ,OAASH,CAAAA,CACvB,OAAA,CAAAC,CACF,CAAC,EACD,OAAOS,CAAAA,CACLD,CAAAA,CACAN,CAAAA,CAAQZ,CAAAA,CAAE,YAAY,CAAA,CAAI,MAAA,CAC1BW,EAAWN,CAAAA,CAAiB,MAAA,CAC5Be,CAAAA,CAAWZ,GAAO,EAClBK,CACF,CACF,CAAA,CAAG,CAACJ,EAAMC,CAAAA,CAASC,CAAAA,CAAUC,CAAAA,CAAOJ,GAAAA,CAASK,CAAK,CAAC,CAAA,CAEnD,OACEQ,GAAAA,CAAC,OACC,GAAA,CAAKN,CAAAA,CACL,KAAA,CAAOC,GAAAA,CACN,GAAGF,CAAAA,CACN,CAEJ,CACF,EACAR,EAAU,WAAA,CAAc,WAAA","file":"chunk-B2MRZJQA.mjs","sourcesContent":["\"use client\"\n\nimport React, { useMemo } from \"react\"\nimport { dotVariants, dot as dotFn } from \"@hua-labs/dot\"\nimport { mergeStyles, resolveDot } from \"../hooks/useDotMap\"\n\nconst s = (input: string) => dotFn(input) as React.CSSProperties\n\nexport const containerVariants = dotVariants({\n base: \"w-full\",\n variants: {\n size: {\n sm: \"max-w-2xl\",\n md: \"max-w-4xl\",\n lg: \"max-w-6xl\",\n xl: \"max-w-7xl\",\n full: \"max-w-full\",\n },\n padding: {\n none: \"\",\n sm: \"px-4 py-8\",\n md: \"px-6 py-12\",\n lg: \"px-8 py-16\",\n xl: \"px-12 py-20\",\n },\n },\n defaultVariants: {\n size: \"lg\",\n padding: \"md\",\n },\n})\n\nconst CENTERED_STYLE: React.CSSProperties = {\n marginLeft: 'auto',\n marginRight: 'auto',\n}\n\n/**\n * Container 컴포넌트의 props\n */\nexport interface ContainerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'className'> {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n centered?: boolean\n fluid?: boolean\n dot?: string\n}\n\n/**\n * Container 컴포넌트\n *\n * 콘텐츠를 감싸는 컨테이너 컴포넌트입니다.\n * 반응형 최대 너비와 패딩을 제공하여 일관된 레이아웃을 구성합니다.\n *\n * @example\n * <Container><h1>제목</h1></Container>\n * <Container size=\"sm\" padding=\"none\"><div>콘텐츠</div></Container>\n * <Container fluid padding=\"xl\"><div>전체 너비</div></Container>\n */\nconst Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n ({\n dot: dotProp,\n size = \"lg\",\n padding = \"md\",\n centered = true,\n fluid = false,\n style,\n ...props\n }, ref) => {\n const computedStyle = useMemo(() => {\n const base = containerVariants({\n size: fluid ? \"full\" : size,\n padding,\n }) as React.CSSProperties\n return mergeStyles(\n base,\n fluid ? s(\"max-w-full\") : undefined,\n centered ? CENTERED_STYLE : undefined,\n resolveDot(dotProp),\n style,\n )\n }, [size, padding, centered, fluid, dotProp, style])\n\n return (\n <div\n ref={ref}\n style={computedStyle}\n {...props}\n />\n )\n }\n)\nContainer.displayName = \"Container\"\n\nexport { Container }\n"]}
|