@hua-labs/ui 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +91 -43
- package/dist/{ComponentLayout-BhM4VSoq.d.mts → ComponentLayout-Clf6C2jV.d.mts} +37 -3
- 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 +136 -56
- package/dist/advanced-motion.mjs +1 -1
- package/dist/advanced.d.mts +69 -36
- 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-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-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-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 -7
- 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 +4 -2
- 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 +8 -3
- 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/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 +358 -127
- 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 +17 -3
- package/dist/lib/icon-providers.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/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 +48 -21
- 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 -37
- 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/package.json +39 -15
- 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/chunk-5DPW7SVD.mjs +0 -4
- package/dist/chunk-5DPW7SVD.mjs.map +0 -1
- package/dist/chunk-5L5HIPKA.mjs +0 -3
- package/dist/chunk-5L5HIPKA.mjs.map +0 -1
- package/dist/chunk-CNW22G24.mjs +0 -13
- package/dist/chunk-CNW22G24.mjs.map +0 -1
- package/dist/chunk-CW66UBQG.mjs +0 -3
- package/dist/chunk-CW66UBQG.mjs.map +0 -1
- package/dist/chunk-EPY3432E.mjs +0 -3
- package/dist/chunk-EPY3432E.mjs.map +0 -1
- package/dist/chunk-F2M4YDDQ.mjs +0 -3
- package/dist/chunk-F2M4YDDQ.mjs.map +0 -1
- package/dist/chunk-FHMFDCX2.mjs +0 -3
- package/dist/chunk-FHMFDCX2.mjs.map +0 -1
- package/dist/chunk-HBIUCLFL.mjs +0 -3
- package/dist/chunk-HBIUCLFL.mjs.map +0 -1
- package/dist/chunk-HEBXAFRY.mjs +0 -3
- package/dist/chunk-HEBXAFRY.mjs.map +0 -1
- package/dist/chunk-IG47LMOD.mjs +0 -3
- package/dist/chunk-IG47LMOD.mjs.map +0 -1
- package/dist/chunk-J47ZEXEL.mjs +0 -3
- package/dist/chunk-J47ZEXEL.mjs.map +0 -1
- package/dist/chunk-K2FOFIST.mjs +0 -3
- package/dist/chunk-K2FOFIST.mjs.map +0 -1
- package/dist/chunk-LL6QPRD7.mjs +0 -3
- package/dist/chunk-LL6QPRD7.mjs.map +0 -1
- package/dist/chunk-NMJLOK6M.mjs +0 -3
- package/dist/chunk-NMJLOK6M.mjs.map +0 -1
- package/dist/chunk-O24K56OS.mjs +0 -3
- package/dist/chunk-O24K56OS.mjs.map +0 -1
- package/dist/chunk-OIWG3IJ7.mjs +0 -3
- package/dist/chunk-OIWG3IJ7.mjs.map +0 -1
- package/dist/chunk-OLLU7ZFH.mjs +0 -3
- package/dist/chunk-OLLU7ZFH.mjs.map +0 -1
- package/dist/chunk-Q76JW7X5.mjs +0 -73
- package/dist/chunk-Q76JW7X5.mjs.map +0 -1
- package/dist/chunk-QRM66RQG.mjs +0 -3
- package/dist/chunk-QRM66RQG.mjs.map +0 -1
- package/dist/chunk-QRRP7TGF.mjs +0 -13
- package/dist/chunk-QRRP7TGF.mjs.map +0 -1
- package/dist/chunk-SD6XGDAC.mjs +0 -3
- package/dist/chunk-SD6XGDAC.mjs.map +0 -1
- package/dist/chunk-SDFVGFXT.mjs +0 -3
- package/dist/chunk-SDFVGFXT.mjs.map +0 -1
- package/dist/chunk-SMLDNOV3.mjs +0 -8
- package/dist/chunk-SMLDNOV3.mjs.map +0 -1
- package/dist/chunk-TAP6MYDW.mjs +0 -3
- package/dist/chunk-TAP6MYDW.mjs.map +0 -1
- package/dist/chunk-TBZ645BI.mjs +0 -3
- package/dist/chunk-TBZ645BI.mjs.map +0 -1
- package/dist/chunk-V2DNYJR6.mjs +0 -3
- package/dist/chunk-V2DNYJR6.mjs.map +0 -1
- package/dist/chunk-VBABZXL7.mjs +0 -3
- package/dist/chunk-VBABZXL7.mjs.map +0 -1
- package/dist/chunk-WYBSHTGY.mjs +0 -3
- package/dist/chunk-WYBSHTGY.mjs.map +0 -1
- package/dist/chunk-ZQUMJQYV.mjs +0 -3
- package/dist/chunk-ZQUMJQYV.mjs.map +0 -1
- package/dist/chunk-ZY23NOT4.mjs +0 -3
- package/dist/chunk-ZY23NOT4.mjs.map +0 -1
- package/dist/components/EmptyState.d.ts +0 -62
- package/dist/components/EmptyState.d.ts.map +0 -1
package/dist/sdui/types.d.ts
CHANGED
|
@@ -19,6 +19,42 @@ export interface SDUINode {
|
|
|
19
19
|
when?: SDUICondition;
|
|
20
20
|
/** 이벤트 핸들러 */
|
|
21
21
|
on?: SDUIEventHandlers;
|
|
22
|
+
/** Cross-platform styling via dot engine */
|
|
23
|
+
dot?: string;
|
|
24
|
+
/** Array iteration: render children per item */
|
|
25
|
+
each?: SDUIEachBinding;
|
|
26
|
+
/** Accessibility constraints */
|
|
27
|
+
constraints?: SDUIConstraints;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 배열 반복 바인딩
|
|
31
|
+
*/
|
|
32
|
+
export interface SDUIEachBinding {
|
|
33
|
+
/** Data path to array (예: "emotions", "report.entries") */
|
|
34
|
+
of: string;
|
|
35
|
+
/** Item variable name (default: "item") */
|
|
36
|
+
as?: string;
|
|
37
|
+
/** Index variable name (default: "index") */
|
|
38
|
+
indexAs?: string;
|
|
39
|
+
/** Item key path for stable React keys (예: "id", "name"). Falls back to index. */
|
|
40
|
+
key?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 접근성 제약 조건
|
|
44
|
+
*/
|
|
45
|
+
export interface SDUIConstraints {
|
|
46
|
+
/** Semantic role */
|
|
47
|
+
role?: 'button' | 'link' | 'heading' | 'img' | 'list' | 'listitem' | 'region' | 'navigation' | 'main' | 'alert' | 'status' | 'dialog' | 'tab' | 'tabpanel' | 'tablist' | 'none';
|
|
48
|
+
/** Accessible label */
|
|
49
|
+
label?: string;
|
|
50
|
+
/** Heading level (1-6) */
|
|
51
|
+
level?: number;
|
|
52
|
+
/** Hidden from a11y tree */
|
|
53
|
+
hidden?: boolean;
|
|
54
|
+
/** Minimum tap target size in px (web: min-width/min-height, native: hitSlop) */
|
|
55
|
+
minTapTarget?: number;
|
|
56
|
+
/** Max lines before truncation (web: line-clamp, native: numberOfLines) */
|
|
57
|
+
truncate?: number;
|
|
22
58
|
}
|
|
23
59
|
/**
|
|
24
60
|
* 조건부 렌더링
|
|
@@ -52,6 +88,8 @@ export interface SDUIAction {
|
|
|
52
88
|
* 페이지 스키마 (전체 페이지 정의)
|
|
53
89
|
*/
|
|
54
90
|
export interface SDUIPageSchema {
|
|
91
|
+
/** 스키마 버전 (미지정 = v1 호환) */
|
|
92
|
+
schemaVersion?: number;
|
|
55
93
|
/** 페이지 ID */
|
|
56
94
|
id: string;
|
|
57
95
|
/** 페이지 제목 */
|
package/dist/sdui/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sdui/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,aAAa;IACb,QAAQ,CAAC,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC/B,sBAAsB;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc;IACd,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,cAAc;IACd,EAAE,CAAC,EAAE,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sdui/types.ts"],"names":[],"mappings":"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"}
|
package/dist/sdui.d.mts
CHANGED
|
@@ -21,6 +21,42 @@ interface SDUINode {
|
|
|
21
21
|
when?: SDUICondition;
|
|
22
22
|
/** 이벤트 핸들러 */
|
|
23
23
|
on?: SDUIEventHandlers;
|
|
24
|
+
/** Cross-platform styling via dot engine */
|
|
25
|
+
dot?: string;
|
|
26
|
+
/** Array iteration: render children per item */
|
|
27
|
+
each?: SDUIEachBinding;
|
|
28
|
+
/** Accessibility constraints */
|
|
29
|
+
constraints?: SDUIConstraints;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 배열 반복 바인딩
|
|
33
|
+
*/
|
|
34
|
+
interface SDUIEachBinding {
|
|
35
|
+
/** Data path to array (예: "emotions", "report.entries") */
|
|
36
|
+
of: string;
|
|
37
|
+
/** Item variable name (default: "item") */
|
|
38
|
+
as?: string;
|
|
39
|
+
/** Index variable name (default: "index") */
|
|
40
|
+
indexAs?: string;
|
|
41
|
+
/** Item key path for stable React keys (예: "id", "name"). Falls back to index. */
|
|
42
|
+
key?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 접근성 제약 조건
|
|
46
|
+
*/
|
|
47
|
+
interface SDUIConstraints {
|
|
48
|
+
/** Semantic role */
|
|
49
|
+
role?: 'button' | 'link' | 'heading' | 'img' | 'list' | 'listitem' | 'region' | 'navigation' | 'main' | 'alert' | 'status' | 'dialog' | 'tab' | 'tabpanel' | 'tablist' | 'none';
|
|
50
|
+
/** Accessible label */
|
|
51
|
+
label?: string;
|
|
52
|
+
/** Heading level (1-6) */
|
|
53
|
+
level?: number;
|
|
54
|
+
/** Hidden from a11y tree */
|
|
55
|
+
hidden?: boolean;
|
|
56
|
+
/** Minimum tap target size in px (web: min-width/min-height, native: hitSlop) */
|
|
57
|
+
minTapTarget?: number;
|
|
58
|
+
/** Max lines before truncation (web: line-clamp, native: numberOfLines) */
|
|
59
|
+
truncate?: number;
|
|
24
60
|
}
|
|
25
61
|
/**
|
|
26
62
|
* 조건부 렌더링
|
|
@@ -54,6 +90,8 @@ interface SDUIAction {
|
|
|
54
90
|
* 페이지 스키마 (전체 페이지 정의)
|
|
55
91
|
*/
|
|
56
92
|
interface SDUIPageSchema {
|
|
93
|
+
/** 스키마 버전 (미지정 = v1 호환) */
|
|
94
|
+
schemaVersion?: number;
|
|
57
95
|
/** 페이지 ID */
|
|
58
96
|
id: string;
|
|
59
97
|
/** 페이지 제목 */
|
|
@@ -102,6 +140,56 @@ interface SDUIRendererProps {
|
|
|
102
140
|
onNavigate?: (path: string) => void;
|
|
103
141
|
}
|
|
104
142
|
|
|
143
|
+
/**
|
|
144
|
+
* SDUI Core — platform-agnostic logic
|
|
145
|
+
*
|
|
146
|
+
* SDUIRenderer에서 추출한 순수 함수 + v2 유틸리티
|
|
147
|
+
*/
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* 데이터 경로로 값 가져오기
|
|
151
|
+
* 예: "user.profile.name" → data.user.profile.name
|
|
152
|
+
*/
|
|
153
|
+
declare function getByPath(obj: Record<string, unknown>, path: string): unknown;
|
|
154
|
+
/**
|
|
155
|
+
* 데이터 경로로 값 설정하기 (immutable)
|
|
156
|
+
*/
|
|
157
|
+
declare function setByPath(obj: Record<string, unknown>, path: string, value: unknown): Record<string, unknown>;
|
|
158
|
+
/**
|
|
159
|
+
* 조건 평가
|
|
160
|
+
*/
|
|
161
|
+
declare function evaluateCondition(condition: SDUICondition, data: Record<string, unknown>): boolean;
|
|
162
|
+
/**
|
|
163
|
+
* Props에서 데이터 바인딩 처리
|
|
164
|
+
* {{ path }} 형식을 실제 데이터로 치환
|
|
165
|
+
*/
|
|
166
|
+
declare function resolveProps(props: Record<string, unknown>, data: Record<string, unknown>): Record<string, unknown>;
|
|
167
|
+
/**
|
|
168
|
+
* 텍스트 내 {{ path }} 바인딩을 데이터로 치환
|
|
169
|
+
*/
|
|
170
|
+
declare function resolveTextBindings(text: string, data: Record<string, unknown>): string;
|
|
171
|
+
/**
|
|
172
|
+
* dot 문자열 내 {{ path }} 바인딩 resolve
|
|
173
|
+
* 예: "bg-{{ emotion.color }}" + {emotion: {color: "cyan-500"}} → "bg-cyan-500"
|
|
174
|
+
*/
|
|
175
|
+
declare function resolveDotString(dot: string, data: Record<string, unknown>): string;
|
|
176
|
+
/**
|
|
177
|
+
* each 반복 결과 항목
|
|
178
|
+
*/
|
|
179
|
+
interface EachIterationItem {
|
|
180
|
+
/** Scoped data (부모 data + item/index 주입) */
|
|
181
|
+
scopedData: Record<string, unknown>;
|
|
182
|
+
/** Stable React key (each.key path → item value, fallback: index) */
|
|
183
|
+
key: string;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* each 바인딩을 처리하여 scoped data + key 배열 반환
|
|
187
|
+
*
|
|
188
|
+
* 각 항목은 부모 data를 복사 + item/index 변수 주입
|
|
189
|
+
* each.key가 있으면 item에서 해당 경로의 값을 React key로 사용
|
|
190
|
+
*/
|
|
191
|
+
declare function iterateEach(each: SDUIEachBinding, data: Record<string, unknown>): EachIterationItem[];
|
|
192
|
+
|
|
105
193
|
/**
|
|
106
194
|
* 기본 컴포넌트 레지스트리
|
|
107
195
|
*/
|
|
@@ -130,4 +218,4 @@ declare function SDUIFromJSON({ json, ...props }: Omit<SDUIRendererProps, "schem
|
|
|
130
218
|
json: string;
|
|
131
219
|
}): react_jsx_runtime.JSX.Element;
|
|
132
220
|
|
|
133
|
-
export { type SDUIAction, type SDUIComponentRegistry, type SDUICondition, type SDUIContext, type SDUIEventHandlers, SDUIFromJSON, type SDUINode, type SDUIPageSchema, SDUIRenderer, type SDUIRendererProps, defaultRegistry, extendRegistry, hasComponent, useSDUI };
|
|
221
|
+
export { type EachIterationItem, type SDUIAction, type SDUIComponentRegistry, type SDUICondition, type SDUIConstraints, type SDUIContext, type SDUIEachBinding, type SDUIEventHandlers, SDUIFromJSON, type SDUINode, type SDUIPageSchema, SDUIRenderer, type SDUIRendererProps, defaultRegistry, evaluateCondition, extendRegistry, getByPath, hasComponent, iterateEach, resolveDotString, resolveProps, resolveTextBindings, setByPath, useSDUI };
|
package/dist/sdui.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {a as a$9,b as b$5,c as c$3,d as d$3,f as f$1,g,h,e as e$2}from'./chunk-QRM66RQG.mjs';import {a as a$3}from'./chunk-IG47LMOD.mjs';import {a as a$1}from'./chunk-V2DNYJR6.mjs';import {a as a$7}from'./chunk-SDFVGFXT.mjs';import {a,b}from'./chunk-5DPW7SVD.mjs';import {c as c$2,b as b$2,a as a$5}from'./chunk-K2FOFIST.mjs';import {a as a$4}from'./chunk-SMLDNOV3.mjs';import {f,e,d,c,b as b$1,a as a$2}from'./chunk-CW66UBQG.mjs';import {a as a$6}from'./chunk-J47ZEXEL.mjs';import {b as b$3,a as a$8}from'./chunk-LL6QPRD7.mjs';import {c as c$1,d as d$2,b as b$4}from'./chunk-F2M4YDDQ.mjs';import {d as d$1}from'./chunk-O24K56OS.mjs';import'./chunk-SD6XGDAC.mjs';import {l}from'./chunk-ZQUMJQYV.mjs';import {e as e$1}from'./chunk-QEMPERUK.mjs';import'./chunk-EAZEI74V.mjs';import {createContext,useState,useContext,useMemo,useCallback}from'react';import {jsx,jsxs}from'react/jsx-runtime';var fe=({children:e,justify:t,align:r,className:n="",style:o,backgroundColor:s,padding:a,margin:c,borderRadius:i,border:u,...m})=>{let d={...o,...s&&{backgroundColor:s},...a!==void 0&&{padding:typeof a=="number"?`${a}px`:a},...c!==void 0&&{margin:typeof c=="number"?`${c}px`:c},...i!==void 0&&{borderRadius:typeof i=="number"?`${i}px`:i},...u&&{border:u}};return jsx("div",{className:e$1((t||r)&&"flex",t&&oe[t],r&&ae[r],n),style:Object.keys(d).length>0?d:void 0,...m,children:e})},ye=({size:e=16,className:t=""})=>jsx("div",{className:t,style:{width:e,height:e,flexShrink:0}}),oe={start:"justify-start",center:"justify-center",end:"justify-end",between:"justify-between"},ae={start:"items-start",center:"items-center",end:"items-end",stretch:"items-stretch"},Se=({children:e,direction:t="row",gap:r=0,justify:n="start",align:o="stretch",className:s="",style:a,backgroundColor:c,padding:i,...u})=>{let m={gap:`${r*4}px`,...a,...c&&{backgroundColor:c},...i!==void 0&&{padding:typeof i=="number"?`${i}px`:i}};return jsx("div",{className:`flex ${t==="column"?"flex-col":"flex-row"} ${oe[n]} ${ae[o]} ${s}`,style:m,...u,children:e})},be=({children:e,cols:t=1,gap:r=4,className:n="",style:o,backgroundColor:s,padding:a,...c})=>{let i={gridTemplateColumns:`repeat(${t}, 1fr)`,gap:`${r*4}px`,...o,...s&&{backgroundColor:s},...a!==void 0&&{padding:typeof a=="number"?`${a}px`:a}};return jsx("div",{className:`grid ${n}`,style:i,...c,children:e})},y={left:"text-left",center:"text-center",right:"text-right"};function S(e){let t={};return e.fontSize&&(t.fontSize=e.fontSize),e.lineHeight&&(t.lineHeight=e.lineHeight),e.fontWeight&&(t.fontWeight=e.fontWeight),e.letterSpacing&&(t.letterSpacing=e.letterSpacing),t}var he=({children:e,variant:t="body",align:r="center",className:n="",style:o,fontSize:s,lineHeight:a,fontWeight:c,letterSpacing:i,...u})=>{let m={body:"text-foreground",muted:"text-muted-foreground text-sm",lead:"text-xl text-muted-foreground"},d=S({fontSize:s,lineHeight:a,fontWeight:c,letterSpacing:i}),g=Object.keys(d).length>0?{...o,...d}:o;return jsx("p",{className:`${m[t]} ${y[r]} ${n}`,style:g,...u,children:e})},xe=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h1",{className:`text-4xl md:text-5xl font-bold ${y[t]} ${r}`,style:m,...i,children:e})},Re=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h2",{className:`text-3xl md:text-4xl font-bold ${y[t]} ${r}`,style:m,...i,children:e})},ve=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h3",{className:`text-2xl md:text-3xl font-semibold ${y[t]} ${r}`,style:m,...i,children:e})},Ie=({children:e,align:t="center",className:r="",style:n,fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c,...i})=>{let u=S({fontSize:o,lineHeight:s,fontWeight:a,letterSpacing:c}),m=Object.keys(u).length>0?{...n,...u}:n;return jsx("h4",{className:`text-xl md:text-2xl font-semibold ${y[t]} ${r}`,style:m,...i,children:e})},ke=({children:e,href:t="#",className:r="",...n})=>{let o=t.startsWith("http://")||t.startsWith("https://");return jsx("a",{href:t,className:`text-primary hover:underline ${r}`,...o?{target:"_blank",rel:"noopener noreferrer"}:{},...n,children:e})},Ce=({className:e="",alt:t="",...r})=>jsx("img",{className:`max-w-full h-auto ${e}`,alt:t,...r}),De=({name:e="star",size:t=24,className:r=""})=>jsx(l,{name:e,size:t,className:r}),Ue=({children:e,className:t="",...r})=>jsx("section",{className:`py-10 ${t}`,...r,children:e}),we=({className:e="",...t})=>jsx("hr",{className:`border-border ${e}`,...t}),Te=({children:e,sticky:t=true,transparent:r=false,blur:n=true,overlay:o=false,className:s="",...a})=>jsx("header",{className:e$1("w-full px-4 py-3 z-50",o?"absolute top-0 left-0 right-0":t&&"sticky top-0",r?"bg-transparent":"bg-background/80",n&&!r&&"backdrop-blur-md",!r&&"border-b border-border",s),...a,children:jsx("div",{className:"max-w-7xl mx-auto",children:e})}),Pe=({defaultChecked:e=false,onChange:t,...r})=>{let[n,o]=useState(e);return jsx(b$3,{...r,checked:n,onChange:s=>{o(s.target.checked),t==null||t(s);}})},He=({defaultChecked:e=false,onChange:t,...r})=>{let[n,o]=useState(e);return jsx(d$2,{...r,checked:n,onChange:s=>{o(s.target.checked),t==null||t(s);}})},Ne=({defaultValue:e="",onChange:t,...r})=>{let[n,o]=useState(e);return jsx(b$4,{...r,value:n,onChange:s=>{o(s.target.value),t==null||t(s);}})},$e=({defaultValue:e="",onChange:t,resize:r="vertical",...n})=>{let[o,s]=useState(e);return jsx(a$8,{...n,resize:r,value:o,onChange:a=>{s(a.target.value),t==null||t(a);}})},Fe=({items:e=[],type:t="single",collapsible:r=true,defaultValue:n,className:o=""})=>jsx(a$9,{type:t,collapsible:r,defaultValue:n,className:o,children:e.map((s,a)=>{let c=s.value||`item-${a}`;return jsxs(b$5,{value:c,children:[jsx(c$3,{children:s.title}),jsx(d$3,{children:s.content})]},c)})}),Me=({tabs:e=[],defaultValue:t,variant:r="default",className:n=""})=>{var s;let o=((s=e[0])==null?void 0:s.value)||"tab-0";return jsxs(f$1,{defaultValue:t||o,variant:r,className:n,children:[jsx(g,{children:e.map((a,c)=>{let i=a.value||`tab-${c}`;return jsx(h,{value:i,children:a.label},i)})}),e.map((a,c)=>{let i=a.value||`tab-${c}`;return jsx(e$2,{value:i,children:a.content},i)})]})},R={Box:fe,Spacer:ye,Flex:Se,Grid:be,Section:Ue,Container:a$7,Divider:we,Text:he,H1:xe,H2:Re,H3:ve,H4:Ie,Link:ke,Image:Ce,Icon:De,Button:d$1,Badge:a$6,Avatar:a$5,AvatarImage:b$2,AvatarFallback:c$2,Input:Ne,Textarea:$e,Label:c$1,Checkbox:Pe,Switch:He,Skeleton:a$4,Progress:a$3,Card:a$2,CardHeader:b$1,CardTitle:c,CardDescription:d,CardContent:e,CardFooter:f,Alert:a$1,Header:Te,HeroSection:b,ScrollProgress:a,Accordion:Fe,Tabs:Me};function Le(e){return {...R,...e}}function Ae(e,t){return t in e}var le=createContext(null);function ue(){let e=useContext(le);if(!e)throw new Error("useSDUI must be used within SDUIRenderer");return e}function v(e,t){return t.split(".").reduce((r,n)=>{if(r&&typeof r=="object"&&n in r)return r[n]},e)}function Ve(e,t,r){let n=t.split("."),o={...e},s=o;for(let a=0;a<n.length-1;a++){let c=n[a];s[c]={...s[c]||{}},s=s[c];}return s[n[n.length-1]]=r,o}function ze(e,t){let r=v(t,e.path);switch(e.operator){case "eq":return r===e.value;case "neq":return r!==e.value;case "gt":return typeof r=="number"&&r>e.value;case "lt":return typeof r=="number"&&r<e.value;case "gte":return typeof r=="number"&&r>=e.value;case "lte":return typeof r=="number"&&r<=e.value;case "exists":return r!=null;case "notExists":return r==null;default:return true}}function C(e,t){let r={};for(let[n,o]of Object.entries(e))if(typeof o=="string"){let s=o.match(/^\{\{\s*(.+?)\s*\}\}$/);s?r[n]=v(t,s[1]):r[n]=o.replace(/\{\{\s*(.+?)\s*\}\}/g,(a,c)=>{let i=v(t,c);return i!==void 0?String(i):""});}else Array.isArray(o)?r[n]=o.map(s=>typeof s=="object"&&s!==null?C(s,t):s):typeof o=="object"&&o!==null?r[n]=C(o,t):r[n]=o;return r}function me({node:e,registry:t}){let{data:r,handleAction:n}=ue();if(e.when&&!ze(e.when,r))return null;let o=t[e.type];if(!o)return console.warn(`[SDUI] Unknown component type: ${e.type}`),jsxs("div",{className:"p-4 border border-destructive/50 bg-destructive/10 rounded text-sm text-destructive",children:["Unknown component: ",e.type]});let s=e.props?C(e.props,r):{},a={};e.on&&(e.on.click&&(a.onClick=()=>n(e.on.click)),e.on.submit&&(a.onSubmit=m=>{m.preventDefault(),n(e.on.submit);}));let c=null;return e.children&&(typeof e.children=="string"?c=e.children.replace(/\{\{\s*(.+?)\s*\}\}/g,(m,d)=>{let g=v(r,d);return g!==void 0?String(g):""}):Array.isArray(e.children)&&(c=e.children.map((m,d)=>jsx(me,{node:m,registry:t},m.key||`child-${d}`)))),["Divider","Input","Textarea","Checkbox","Switch","Progress","Skeleton","Image","ScrollProgress"].includes(e.type)||c===null?jsx(o,{...s,...a}):jsx(o,{...s,...a,children:c})}function de({schema:e,components:t,data:r={},onAction:n,onNavigate:o}){let s="root"in e,a=s?e.root:e,c=s?e.data:{},[i,u]=useState({...c,...r}),m=useMemo(()=>({...R,...t}),[t]),d=useCallback((p,b)=>{u(h=>Ve(h,p,b));},[]),g=useCallback(p=>{o?o(p):typeof window!="undefined"&&(window.location.href=p);},[o]),D=useCallback(p=>{var b,h,U;switch(p.type){case "navigate":g((b=p.payload)==null?void 0:b.path);break;case "setState":(h=p.payload)!=null&&h.path&&((U=p.payload)==null?void 0:U.value)!==void 0&&d(p.payload.path,p.payload.value);break;case "api":n==null||n(p);break;case "custom":n==null||n(p);break;default:n==null||n(p);}},[g,d,n]),ge=useMemo(()=>({data:i,setData:d,handleAction:D,navigate:g}),[i,d,D,g]);return jsx(le.Provider,{value:ge,children:jsx(me,{node:a,registry:m})})}function We({json:e,...t}){try{let r=JSON.parse(e);return jsx(de,{schema:r,...t})}catch(r){return jsxs("div",{className:"p-4 border border-destructive bg-destructive/10 rounded",children:[jsx("p",{className:"font-semibold text-destructive",children:"SDUI Parse Error"}),jsx("pre",{className:"text-sm mt-2 text-destructive/80",children:r.message})]})}}
|
|
3
|
-
export{
|
|
2
|
+
import {a as a$i}from'./chunk-CQBMR7VU.mjs';import {a as a$8,b as b$4,c as c$3,d as d$2,f as f$2,g as g$1,h as h$1,e as e$2}from'./chunk-BOX4TONF.mjs';import {f as f$1,a as a$6,b as b$2,d as d$3,e as e$3,c as c$4,l}from'./chunk-GAIUZVNC.mjs';import {a}from'./chunk-AJOGTUWS.mjs';import {a as a$e}from'./chunk-C2DOXNBK.mjs';import {a as a$5}from'./chunk-B2MRZJQA.mjs';import'./chunk-A5YOVVM5.mjs';import {b,c,d as d$5,a as a$d}from'./chunk-32OZGTPV.mjs';import {a as a$b}from'./chunk-JNW3CLCA.mjs';import {b as b$6}from'./chunk-KPNNAQLI.mjs';import {c as c$1,b as b$1,a as a$2}from'./chunk-XXHDNZTG.mjs';import {b as b$5,a as a$c}from'./chunk-MR46CSMC.mjs';import {a as a$h}from'./chunk-SPZ7SZH4.mjs';import {a as a$1}from'./chunk-D7MTTTQY.mjs';import {a as a$a}from'./chunk-EK6BLFVQ.mjs';import {k as k$1,j,i,h,g,f}from'./chunk-UR3TIWBS.mjs';import {a as a$3}from'./chunk-M4JE7TQL.mjs';import {b as b$3,a as a$7}from'./chunk-AQTSQYH2.mjs';import {a as a$g}from'./chunk-ZZ67E3M5.mjs';import {d,e as e$1,c as c$2}from'./chunk-I6NCGF6E.mjs';import {a as a$4}from'./chunk-JY3QVUGW.mjs';import'./chunk-RICRFXFP.mjs';import'./chunk-LPHUWTQ2.mjs';import'./chunk-7T3IUG3G.mjs';import'./chunk-7CGJQSJO.mjs';import {e as e$4,d as d$4,i as i$1}from'./chunk-ZTHUGQZL.mjs';import {a as a$9}from'./chunk-ZVCGC6EV.mjs';import {a as a$f}from'./chunk-DABVKUJN.mjs';import {m as m$1}from'./chunk-NSDWT2JM.mjs';import {d as d$1,e}from'./chunk-OBMOTQEU.mjs';import'./chunk-EAZEI74V.mjs';import {createContext,useState,useContext,useMemo,useCallback}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';function k(t,e){return e.split(".").reduce((r,n)=>{if(r&&typeof r=="object"&&n in r)return r[n]},t)}function L(t,e,r){let n=e.split("."),o={...t},i=o;for(let a=0;a<n.length-1;a++){let s=n[a];i[s]={...i[s]||{}},i=i[s];}return i[n[n.length-1]]=r,o}function F(t,e){let r=k(e,t.path);switch(t.operator){case "eq":return r===t.value;case "neq":return r!==t.value;case "gt":return typeof r=="number"&&r>t.value;case "lt":return typeof r=="number"&&r<t.value;case "gte":return typeof r=="number"&&r>=t.value;case "lte":return typeof r=="number"&&r<=t.value;case "exists":return r!=null;case "notExists":return r==null;default:return true}}function v(t,e){let r={};for(let[n,o]of Object.entries(t))if(typeof o=="string"){let i=o.match(/^\{\{\s*(.+?)\s*\}\}$/);i?r[n]=k(e,i[1]):r[n]=C(o,e);}else Array.isArray(o)?r[n]=o.map(i=>typeof i=="object"&&i!==null?v(i,e):i):typeof o=="object"&&o!==null?r[n]=v(o,e):r[n]=o;return r}function C(t,e){return t.replace(/\{\{\s*(.+?)\s*\}\}/g,(r,n)=>{let o=k(e,n);return o!==void 0?String(o):""})}function M(t,e){return C(t,e)}function N(t,e){let r=k(e,t.of);if(!Array.isArray(r))return [];let n=t.as||"item",o=t.indexAs||"index";return r.map((i,a)=>{let s={...e,[n]:i,[o]:a},d=String(a);if(t.key&&i&&typeof i=="object"){let c=k(i,t.key);c!=null&&(d=String(c));}return {scopedData:s,key:d}})}function m(...t){return t.filter(Boolean).join(" ")}var Ot={start:"justify-start",center:"justify-center",end:"justify-end",between:"justify-between"},zt={start:"items-start",center:"items-center",end:"items-end",stretch:"items-stretch"},x={left:"text-left",center:"text-center",right:"text-right"};function E(t,e){let r={...t,...e.backgroundColor&&{backgroundColor:e.backgroundColor},...e.padding!==void 0&&{padding:typeof e.padding=="number"?`${e.padding}px`:e.padding},...e.margin!==void 0&&{margin:typeof e.margin=="number"?`${e.margin}px`:e.margin},...e.borderRadius!==void 0&&{borderRadius:typeof e.borderRadius=="number"?`${e.borderRadius}px`:e.borderRadius},...e.border&&{border:e.border}};return Object.keys(r).length>0?r:void 0}function D(t,e){let r={};return e.fontSize&&(r.fontSize=e.fontSize),e.lineHeight&&(r.lineHeight=e.lineHeight),e.fontWeight&&(r.fontWeight=e.fontWeight),e.letterSpacing&&(r.letterSpacing=e.letterSpacing),Object.keys(r).length===0?t:t?{...t,...r}:r}var Jt=({children:t,justify:e,align:r,style:n,backgroundColor:o,padding:i,margin:a,borderRadius:s,border:d,dot:c,...f})=>jsx(a$6,{dot:m((e||r)&&"flex",e&&Ot[e],r&&zt[r],c),style:E(n,{backgroundColor:o,padding:i,margin:a,borderRadius:s,border:d}),...f,children:t}),Kt=({size:t=16,dot:e})=>jsx(a$6,{dot:m("shrink-0",e),style:{width:t,height:t}}),_t=({children:t,direction:e="row",gap:r=0,justify:n="start",align:o="stretch",style:i,backgroundColor:a,padding:s,dot:d,...c})=>jsx(a$6,{dot:m("flex",e==="column"&&"flex-col",r>0&&`gap-${r}`,Ot[n],zt[o],d),style:E(i,{backgroundColor:a,padding:s}),...c,children:t}),Gt=({children:t,cols:e=1,gap:r=4,style:n,backgroundColor:o,padding:i,dot:a,...s})=>jsx(a$6,{dot:m("grid",`grid-cols-${e}`,r>0&&`gap-${r}`,a),style:E(n,{backgroundColor:o,padding:i}),...s,children:t}),Qt=({children:t,dot:e,...r})=>jsx(a$6,{as:"section",dot:m("py-10",e),...r,children:t}),Xt=({dot:t,style:e$1,...r})=>jsx("hr",{style:d$1(e(m("border-border",t)),e$1),...r}),Yt={body:"text-foreground",muted:"text-muted-foreground text-sm",lead:"text-xl text-muted-foreground"},Zt=({children:t,variant:e="body",align:r="center",style:n,fontSize:o,lineHeight:i,fontWeight:a,letterSpacing:s,dot:d,...c})=>jsx(b$2,{as:"p",dot:m(Yt[e],x[r],d),style:D(n,{fontSize:o,lineHeight:i,fontWeight:a,letterSpacing:s}),...c,children:t}),te=({children:t,align:e="center",style:r,fontSize:n,lineHeight:o,fontWeight:i,letterSpacing:a,dot:s,...d})=>jsx(b$2,{as:"h1",dot:m("text-4xl font-bold",x[e],s),style:D(r,{fontSize:n,lineHeight:o,fontWeight:i,letterSpacing:a}),...d,children:t}),ee=({children:t,align:e="center",style:r,fontSize:n,lineHeight:o,fontWeight:i,letterSpacing:a,dot:s,...d})=>jsx(b$2,{as:"h2",dot:m("text-3xl font-bold",x[e],s),style:D(r,{fontSize:n,lineHeight:o,fontWeight:i,letterSpacing:a}),...d,children:t}),re=({children:t,align:e="center",style:r,fontSize:n,lineHeight:o,fontWeight:i,letterSpacing:a,dot:s,...d})=>jsx(b$2,{as:"h3",dot:m("text-2xl font-semibold",x[e],s),style:D(r,{fontSize:n,lineHeight:o,fontWeight:i,letterSpacing:a}),...d,children:t}),ne=({children:t,align:e="center",style:r,fontSize:n,lineHeight:o,fontWeight:i,letterSpacing:a,dot:s,...d})=>jsx(b$2,{as:"h4",dot:m("text-xl font-semibold",x[e],s),style:D(r,{fontSize:n,lineHeight:o,fontWeight:i,letterSpacing:a}),...d,children:t}),oe=({children:t,href:e$1="#",dot:r,style:n,...o})=>{let i=e$1.startsWith("http://")||e$1.startsWith("https://");return jsx("a",{href:e$1,style:d$1(e(m("text-primary",r)),n),...i?{target:"_blank",rel:"noopener noreferrer"}:{},...o,children:t})},ie=({alt:t="",dot:e$1,style:r,...n})=>jsx("img",{alt:t,style:d$1({maxWidth:"100%",height:"auto"},e(e$1),r),...n}),ae=({name:t="star",size:e=24})=>jsx(m$1,{name:t,size:e}),se=({children:t,sticky:e=true,transparent:r=false,blur:n=true,overlay:o=false,dot:i,style:a,...s})=>jsx(a$6,{as:"header",dot:m("w-full px-4 py-3 z-50",o?"absolute top-0 left-0 right-0":e?"sticky top-0":void 0,r?"bg-transparent":"bg-background/80",n&&!r&&"backdrop-blur-md",!r&&"border-b border-border",i),style:a,...s,children:jsx(a$6,{dot:"max-w-7xl mx-auto",children:t})}),le=({defaultChecked:t=false,onChange:e,...r})=>{let[n,o]=useState(t);return jsx(b$3,{...r,checked:n,onChange:i=>{o(i.target.checked),e==null||e(i);}})},de=({defaultChecked:t=false,onChange:e,...r})=>{let[n,o]=useState(t);return jsx(e$1,{...r,checked:n,onChange:i=>{o(i.target.checked),e==null||e(i);}})},ce=({defaultValue:t="",onChange:e,...r})=>{let[n,o]=useState(t);return jsx(c$2,{...r,value:n,onChange:i=>{o(i.target.value),e==null||e(i);}})},ue=({defaultValue:t="",onChange:e,resize:r="vertical",...n})=>{let[o,i]=useState(t);return jsx(a$7,{...n,resize:r,value:o,onChange:a=>{i(a.target.value),e==null||e(a);}})},ge=({items:t=[],type:e="single",collapsible:r=true,defaultValue:n})=>jsx(a$8,{type:e,collapsible:r,defaultValue:n,children:t.map((o,i)=>{let a=o.value||`item-${i}`;return jsxs(b$4,{value:a,children:[jsx(c$3,{children:o.title}),jsx(d$2,{children:o.content})]},a)})}),me=({tabs:t=[],defaultValue:e,variant:r="default"})=>{var o;let n=((o=t[0])==null?void 0:o.value)||"tab-0";return jsxs(f$2,{defaultValue:e||n,variant:r,children:[jsx(g$1,{children:t.map((i,a)=>{let s=i.value||`tab-${a}`;return jsx(h$1,{value:s,children:i.label},s)})}),t.map((i,a)=>{let s=i.value||`tab-${a}`;return jsx(e$2,{value:s,children:i.content},s)})]})},pe=({children:t,direction:e="vertical",spacing:r="md",align:n="start",justify:o="start",wrap:i=false,dot:a,...s})=>jsx(d$3,{direction:e,spacing:r,align:n,justify:o,wrap:i,dot:a,...s,children:t}),fe=({children:t,style:e="default",effect:r="none",padding:n="md",rounded:o="lg",dot:i,...a})=>jsx(e$3,{style:e,effect:r,padding:n,rounded:o,dot:i,...a,children:t}),ye=({title:t="Section",description:e,dot:r,...n})=>jsx(b$5,{title:t,description:e,dot:r,...n}),be=({children:t,title:e="Component",description:r="",dot:n,...o})=>jsx(b$6,{title:e,description:r,dot:n,...o,children:t}),Se=({children:t,dot:e,disabled:r,...n})=>jsx(c$4,{dot:e,disabled:r,...n,children:t}),Re=({items:t,showHomeIcon:e,variant:r="default",dot:n,children:o,...i})=>jsx(a$9,{items:t,showHomeIcon:e,variant:r,dot:n,...i,children:o}),he=({totalPages:t=10,variant:e="default",size:r="md",shape:n="square",dot:o,...i})=>{let[a,s]=useState(1);return jsx(e$4,{currentPage:a,totalPages:t,onPageChange:s,variant:e,size:r,shape:n,dot:o,...i})},ke=({children:t,defaultValue:e,variant:r="pills",scale:n="medium",dot:o,...i})=>jsx(d$4,{defaultValue:e,variant:r,scale:n,dot:o,...i,children:t}),ve=({prevPage:t,nextPage:e,showOnMobile:r=true,dot:n,...o})=>jsx(i$1,{prevPage:t,nextPage:e,showOnMobile:r,dot:n,...o}),Ce=({items:t=[],position:e="right",dot:r,...n})=>jsx(a$a,{items:t,position:e,dot:r,...n}),xe=({title:t="Feature",description:e="",icon:r,variant:n="default",size:o="md",hover:i="scale",gradient:a="blue",dot:s,...d})=>jsx(a$b,{title:t,description:e,icon:r,variant:n,size:o,hover:i,gradient:a,dot:s,...d}),De=({children:t,title:e="Info",icon:r="info",tone:n="blue",dot:o,...i})=>jsx(d$5,{title:e,icon:r,tone:n,dot:o,...i,children:t}),Ie=({title:t,items:e=[],columns:r=4,loading:n=false,dot:o,...i})=>jsx(a$c,{title:t,items:e,columns:r,loading:n,dot:o,...i}),Pe=({size:t="md",variant:e="button",showLabel:r=false,currentLanguage:n="ko",dot:o,...i})=>{let[a,s]=useState(n);return jsx(a$d,{size:t,variant:e,showLabel:r,currentLanguage:a,onLanguageChange:s,dot:o,...i})},we=({size:t="md",variant:e="button",showLabel:r=false,dot:n,...o})=>jsx(l,{size:t,variant:e,showLabel:r,dot:n,...o}),Te=({children:t,title:e$1,description:r,size:n="md",triggerLabel:o="Open Modal",dot:i,...a})=>{let[s,d]=useState(false),{style:c,...f}=a;return jsxs("div",{...f,style:{display:"contents",...c},children:[jsx("button",{onClick:()=>d(true),style:d$1(e("inline-flex items-center justify-center px-4 py-2 rounded-md bg-primary text-primary-foreground text-sm font-medium cursor-pointer border-none"),{}),children:o}),jsx(a$e,{isOpen:s,onClose:()=>d(false),title:e$1,description:r,size:n,dot:i,children:t})]})},Ue=({children:t,content:e="Tooltip",position:r="top",variant:n="default",delay:o=300,dot:i,...a})=>jsx(a$f,{content:e,position:r,variant:n,delay:o,dot:i,...a,children:t}),He=({children:t,triggerLabel:e$1="Open",position:r="bottom",align:n="center",dot:o,...i})=>jsx(a$g,{trigger:jsx("button",{style:d$1(e("inline-flex items-center justify-center px-3 py-2 rounded-md border border-border bg-background text-sm cursor-pointer"),{}),children:e$1}),position:r,align:n,dot:o,...i,children:t}),Le=({children:t,side:e$1="right",size:r="md",triggerLabel:n="Open Drawer",dot:o,...i})=>{let[a,s]=useState(false),{style:d,...c}=i;return jsxs("div",{...c,style:{display:"contents",...d},children:[jsx("button",{onClick:()=>s(true),style:d$1(e("inline-flex items-center justify-center px-4 py-2 rounded-md bg-primary text-primary-foreground text-sm font-medium cursor-pointer border-none"),{}),children:n}),jsx(a$h,{isOpen:a,onClose:()=>s(false),side:e$1,size:r,dot:o,children:t})]})},Fe=({children:t,height:e$1="md",triggerLabel:r="Open Sheet",showDragHandle:n=true,dot:o,...i})=>{let[a,s]=useState(false),{style:d,...c}=i;return jsxs("div",{...c,style:{display:"contents",...d},children:[jsx("button",{onClick:()=>s(true),style:d$1(e("inline-flex items-center justify-center px-4 py-2 rounded-md bg-primary text-primary-foreground text-sm font-medium cursor-pointer border-none"),{}),children:r}),jsx(a$i,{isOpen:a,onClose:()=>s(false),height:e$1,showDragHandle:n,dot:o,children:t})]})},U={Box:Jt,Spacer:Kt,Flex:_t,Grid:Gt,Section:Qt,Container:a$5,Divider:Xt,Text:Zt,H1:te,H2:ee,H3:re,H4:ne,Link:oe,Image:ie,Icon:ae,Button:a$4,Badge:a$3,Avatar:a$2,AvatarImage:b$1,AvatarFallback:c$1,Input:ce,Textarea:ue,Label:d,Checkbox:le,Switch:de,Skeleton:a$1,Progress:f$1,Card:f,CardHeader:g,CardTitle:h,CardDescription:i,CardContent:j,CardFooter:k$1,Alert:a,Header:se,HeroSection:c,ScrollProgress:b,Accordion:ge,Tabs:me,Stack:pe,Panel:fe,SectionHeader:ye,ComponentLayout:be,Pressable:Se,Breadcrumb:Re,Pagination:he,Navigation:ke,PageNavigation:ve,DotNav:Ce,FeatureCard:xe,InfoCard:De,StatsPanel:Ie,LanguageToggle:Pe,ThemeToggle:we,Modal:Te,Tooltip:Ue,Popover:He,Drawer:Le,BottomSheet:Fe};function Me(t){return {...U,...t}}function Ne(t,e){return Object.prototype.hasOwnProperty.call(t,e)}var O=createContext(null);function H(){let t=useContext(O);if(!t)throw new Error("useSDUI must be used within SDUIRenderer");return t}function Oe({data:t,children:e}){let r=H(),n=useMemo(()=>({...r,data:t}),[r,t]);return jsx(O.Provider,{value:n,children:e})}function ze(t){let e={},r={};return t.role&&(e.role=t.role),t.label&&(e["aria-label"]=t.label),t.level!==void 0&&(e["aria-level"]=t.level),t.hidden!==void 0&&(e["aria-hidden"]=t.hidden),t.minTapTarget!==void 0&&(r.minWidth=t.minTapTarget,r.minHeight=t.minTapTarget),t.truncate!==void 0&&(r.overflow="hidden",r.display="-webkit-box",r.WebkitLineClamp=t.truncate,r.WebkitBoxOrient="vertical"),{attrs:e,style:r}}function Vt({node:t,registry:e}){let{data:r,handleAction:n}=H();if(t.when&&!F(t.when,r))return null;if(t.each){let o=N(t.each,r);return o.length===0?null:jsx(Fragment,{children:o.map(({scopedData:i,key:a})=>jsx(Oe,{data:i,children:jsx(jt,{node:t,registry:e})},a))})}return jsx(jt,{node:t,registry:e})}function jt({node:t,registry:e$1}){let{data:r,handleAction:n}=H(),o=e$1[t.type];if(!o)return console.warn(`[SDUI] Unknown component type: ${t.type}`),jsxs("div",{style:{...e("p-4"),border:"1px solid #ef4444",...e("rounded"),fontSize:14,color:"#ef4444",backgroundColor:"rgba(239,68,68,0.1)"},children:["Unknown component: ",t.type]});let i=t.props?v(t.props,r):{};if(t.dot&&(i.dot=M(t.dot,r)),t.constraints){let{attrs:f,style:y}=ze(t.constraints);Object.assign(i,f),Object.keys(y).length>0&&(i.style={...i.style||{},...y});}let a={};t.on&&(t.on.click&&(a.onClick=()=>n(t.on.click)),t.on.submit&&(a.onSubmit=f=>{f.preventDefault(),n(t.on.submit);}));let s=null;return t.children&&(typeof t.children=="string"?s=C(t.children,r):Array.isArray(t.children)&&(s=t.children.map((f,y)=>jsx(Vt,{node:f,registry:e$1},f.key||`child-${y}`)))),["Divider","Input","Textarea","Checkbox","Switch","Progress","Skeleton","Image","ScrollProgress","PageNavigation","DotNav","StatsPanel","LanguageToggle","ThemeToggle","SectionHeader","Pagination"].includes(t.type)||s===null?jsx(o,{...i,...a}):jsx(o,{...i,...a,children:s})}function Wt({schema:t,components:e,data:r={},onAction:n,onNavigate:o}){let i="root"in t,a=i?t.root:t,s=i?t.data:{},[d,c]=useState({...s,...r}),f=useMemo(()=>({...U,...e}),[e]),y=useCallback((u,w)=>{c(T=>L(T,u,w));},[]),P=useCallback(u=>{o?o(u):typeof window!="undefined"&&(window.location.href=u);},[o]),z=useCallback(u=>{var w,T,j;switch(u.type){case "navigate":P((w=u.payload)==null?void 0:w.path);break;case "setState":(T=u.payload)!=null&&T.path&&((j=u.payload)==null?void 0:j.value)!==void 0&&y(u.payload.path,u.payload.value);break;case "api":n==null||n(u);break;case "custom":n==null||n(u);break;default:n==null||n(u);}},[P,y,n]),qt=useMemo(()=>({data:d,setData:y,handleAction:z,navigate:P}),[d,y,z,P]);return jsx(O.Provider,{value:qt,children:jsx(Vt,{node:a,registry:f})})}function je({json:t,...e$1}){try{let r=JSON.parse(t);return jsx(Wt,{schema:r,...e$1})}catch(r){return jsxs("div",{style:{...e("p-4"),border:"1px solid #ef4444",...e("rounded"),backgroundColor:"rgba(239,68,68,0.1)"},children:[jsx("p",{style:{fontWeight:600,color:"#ef4444"},children:"SDUI Parse Error"}),jsx("pre",{style:{fontSize:14,...e("mt-2"),color:"rgba(239,68,68,0.8)"},children:r.message})]})}}
|
|
3
|
+
export{je as SDUIFromJSON,Wt as SDUIRenderer,U as defaultRegistry,F as evaluateCondition,Me as extendRegistry,k as getByPath,Ne as hasComponent,N as iterateEach,M as resolveDotString,v as resolveProps,C as resolveTextBindings,L as setByPath,H as useSDUI};//# sourceMappingURL=sdui.mjs.map
|
|
4
4
|
//# sourceMappingURL=sdui.mjs.map
|
package/dist/sdui.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sdui/registry.tsx","../src/sdui/SDUIRenderer.tsx"],"names":["Box","children","justify","align","className","style","backgroundColor","padding","margin","borderRadius","border","props","customStyle","jsx","cn","justifyMap","alignMap","Spacer","size","Flex","direction","gap","Grid","cols","textAlignMap","getTypographyStyle","Text","variant","fontSize","lineHeight","fontWeight","letterSpacing","variantClasses","typoStyle","mergedStyle","H1","H2","H3","H4","Link","href","isExternal","Image","alt","SDUIIcon","name","Icon","Section","Divider","Header","sticky","transparent","blur","overlay","SDUICheckbox","defaultChecked","onChange","checked","setChecked","useState","Checkbox","e","SDUISwitch","Switch","SDUIInput","defaultValue","value","setValue","Input","SDUITextarea","resize","Textarea","SDUIAccordion","items","type","collapsible","Accordion","item","index","jsxs","AccordionItem","AccordionTrigger","AccordionContent","SDUITabs","tabs","_a","firstValue","Tabs","TabsList","tab","TabsTrigger","TabsContent","defaultRegistry","Container","Button","Badge","Avatar","AvatarImage","AvatarFallback","Label","Skeleton","Progress","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Alert","HeroSection","ScrollProgress","extendRegistry","customComponents","hasComponent","registry","SDUIContextInternal","createContext","useSDUI","context","useContext","getByPath","obj","path","acc","key","setByPath","keys","result","current","i","evaluateCondition","condition","data","resolveProps","resolved","bindingMatch","_","val","NodeRenderer","node","handleAction","Component","resolvedProps","eventProps","child","SDUIRenderer","schema","components","initialData","onAction","onNavigate","isPageSchema","rootNode","schemaData","setDataState","useMemo","setData","useCallback","prev","navigate","action","_b","_c","contextValue","SDUIFromJSON","json","error"],"mappings":"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","file":"sdui.mjs","sourcesContent":["\"use client\";\n\n/**\n * SDUI Component Registry\n *\n * 컴포넌트 타입 문자열 → 실제 React 컴포넌트 매핑\n */\n\nimport React, { useState } from \"react\";\nimport type { SDUIComponentRegistry } from \"./types\";\nimport { cn } from \"../lib/utils\";\n\n// 기본 컴포넌트들\nimport { Button } from \"../components/Button\";\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from \"../components/Card\";\nimport { Badge } from \"../components/Badge\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../components/Avatar\";\nimport { Container } from \"../components/Container\";\nimport { Input } from \"../components/Input\";\nimport { Textarea } from \"../components/Textarea\";\nimport { Label } from \"../components/Label\";\nimport { Checkbox, type CheckboxProps } from \"../components/Checkbox\";\nimport { Switch, type SwitchProps } from \"../components/Switch\";\nimport { type InputProps } from \"../components/Input\";\nimport { type TextareaProps } from \"../components/Textarea\";\nimport { Skeleton } from \"../components/Skeleton\";\nimport { Progress } from \"../components/Progress\";\nimport { Alert } from \"../components/Alert\";\nimport { Icon } from \"../components/Icon\";\nimport type { IconName } from \"../lib/icons\";\n\n// Advanced 컴포넌트들\nimport { HeroSection } from \"../components/HeroSection\";\nimport { ScrollProgress } from \"../components/ScrollProgress\";\n\n// Interactive 컴포넌트들\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from \"../components/Accordion\";\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"../components/Tabs\";\n\n// 레이아웃 프리미티브\nconst Box: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n // 커스텀 스타일 props (DOM에 직접 전달하지 않음)\n backgroundColor?: string;\n padding?: string | number;\n margin?: string | number;\n borderRadius?: string | number;\n border?: string;\n}> = ({\n children,\n justify,\n align,\n className = \"\",\n style,\n // 커스텀 props 분리 (DOM에 전달 X)\n backgroundColor,\n padding,\n margin,\n borderRadius,\n border,\n ...props\n}) => {\n // 커스텀 props를 style 객체로 병합\n const customStyle: React.CSSProperties = {\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n ...(margin !== undefined && { margin: typeof margin === 'number' ? `${margin}px` : margin }),\n ...(borderRadius !== undefined && { borderRadius: typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius }),\n ...(border && { border }),\n };\n\n return (\n <div\n className={cn(\n (justify || align) && \"flex\",\n justify && justifyMap[justify],\n align && alignMap[align],\n className\n )}\n style={Object.keys(customStyle).length > 0 ? customStyle : undefined}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// Spacer - 공백용 void 컴포넌트\nconst Spacer: React.FC<{ size?: number; className?: string }> = ({ size = 16, className = \"\" }) => (\n <div className={className} style={{ width: size, height: size, flexShrink: 0 }} />\n);\n\n// 정렬 매핑\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n};\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n};\n\nconst Flex: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n direction?: \"row\" | \"column\";\n gap?: number;\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n backgroundColor?: string;\n padding?: string | number;\n}> = ({\n children,\n direction = \"row\",\n gap = 0,\n justify = \"start\",\n align = \"stretch\",\n className = \"\",\n style,\n backgroundColor,\n padding,\n ...props\n}) => {\n const customStyle: React.CSSProperties = {\n gap: `${gap * 4}px`,\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n };\n\n return (\n <div\n className={`flex ${direction === \"column\" ? \"flex-col\" : \"flex-row\"} ${justifyMap[justify]} ${alignMap[align]} ${className}`}\n style={customStyle}\n {...props}\n >\n {children}\n </div>\n );\n};\n\nconst Grid: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n cols?: number;\n gap?: number;\n backgroundColor?: string;\n padding?: string | number;\n}> = ({\n children,\n cols = 1,\n gap = 4,\n className = \"\",\n style,\n backgroundColor,\n padding,\n ...props\n}) => {\n const customStyle: React.CSSProperties = {\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gap: `${gap * 4}px`,\n ...style,\n ...(backgroundColor && { backgroundColor }),\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n };\n\n return (\n <div\n className={`grid ${className}`}\n style={customStyle}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n// 텍스트 정렬 매핑\nconst textAlignMap = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n\n// 타이포그래피 스타일 props 타입\ninterface TypographyStyleProps {\n fontSize?: string;\n lineHeight?: string;\n fontWeight?: string;\n letterSpacing?: string;\n}\n\n// 타이포그래피 스타일 props를 style 객체로 변환\nfunction getTypographyStyle(props: TypographyStyleProps): React.CSSProperties {\n const style: React.CSSProperties = {};\n if (props.fontSize) style.fontSize = props.fontSize;\n if (props.lineHeight) style.lineHeight = props.lineHeight;\n if (props.fontWeight) style.fontWeight = props.fontWeight;\n if (props.letterSpacing) style.letterSpacing = props.letterSpacing;\n return style;\n}\n\nconst Text: React.FC<React.HTMLAttributes<HTMLParagraphElement> & {\n variant?: \"body\" | \"muted\" | \"lead\";\n align?: \"left\" | \"center\" | \"right\";\n} & TypographyStyleProps> = ({\n children,\n variant = \"body\",\n align = \"center\",\n className = \"\",\n style,\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n ...props\n}) => {\n const variantClasses = {\n body: \"text-foreground\",\n muted: \"text-muted-foreground text-sm\",\n lead: \"text-xl text-muted-foreground\",\n };\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n\n return (\n <p\n className={`${variantClasses[variant]} ${textAlignMap[align]} ${className}`}\n style={mergedStyle}\n {...props}\n >\n {children}\n </p>\n );\n};\n\n// Heading 컴포넌트들 (정렬 + 타이포그래피 스타일 지원)\ntype HeadingProps = React.HTMLAttributes<HTMLHeadingElement> & {\n align?: \"left\" | \"center\" | \"right\";\n} & TypographyStyleProps;\n\nconst H1: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h1 className={`text-4xl md:text-5xl font-bold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h1>\n );\n};\n\nconst H2: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h2 className={`text-3xl md:text-4xl font-bold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h2>\n );\n};\n\nconst H3: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h3 className={`text-2xl md:text-3xl font-semibold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h3>\n );\n};\n\nconst H4: React.FC<HeadingProps> = ({\n children, align = \"center\", className = \"\", style,\n fontSize, lineHeight, fontWeight, letterSpacing,\n ...props\n}) => {\n const typoStyle = getTypographyStyle({ fontSize, lineHeight, fontWeight, letterSpacing });\n const mergedStyle = Object.keys(typoStyle).length > 0 ? { ...style, ...typoStyle } : style;\n return (\n <h4 className={`text-xl md:text-2xl font-semibold ${textAlignMap[align]} ${className}`} style={mergedStyle} {...props}>{children}</h4>\n );\n};\n\nconst Link: React.FC<React.AnchorHTMLAttributes<HTMLAnchorElement>> = ({\n children,\n href = \"#\",\n className = \"\",\n ...props\n}) => {\n // 절대 경로 처리: http/https로 시작하지 않으면 그대로, 시작하면 외부 링크\n const isExternal = href.startsWith(\"http://\") || href.startsWith(\"https://\");\n\n return (\n <a\n href={href}\n className={`text-primary hover:underline ${className}`}\n {...(isExternal ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {})}\n {...props}\n >\n {children}\n </a>\n );\n};\n\nconst Image: React.FC<React.ImgHTMLAttributes<HTMLImageElement>> = ({ className = \"\", alt = \"\", ...props }) => (\n <img className={`max-w-full h-auto ${className}`} alt={alt} {...props} />\n);\n\n// SDUI용 Icon 래퍼 (name을 string으로 받음)\nconst SDUIIcon: React.FC<{ name?: string; size?: number; className?: string }> = ({\n name = \"star\",\n size = 24,\n className = \"\",\n}) => <Icon name={name as IconName} size={size} className={className} />;\n\nconst Section: React.FC<React.HTMLAttributes<HTMLElement>> = ({\n children,\n className = \"\",\n ...props\n}) => (\n <section className={`py-10 ${className}`} {...props}>\n {children}\n </section>\n);\n\nconst Divider: React.FC<React.HTMLAttributes<HTMLHRElement>> = ({ className = \"\", ...props }) => (\n <hr className={`border-border ${className}`} {...props} />\n);\n\n// Header - 네비게이션 헤더 (GNB)\nconst Header: React.FC<React.HTMLAttributes<HTMLElement> & {\n sticky?: boolean;\n transparent?: boolean;\n blur?: boolean;\n overlay?: boolean;\n}> = ({\n children,\n sticky = true,\n transparent = false,\n blur = true,\n overlay = false,\n className = \"\",\n ...props\n}) => (\n <header\n className={cn(\n \"w-full px-4 py-3 z-50\",\n overlay ? \"absolute top-0 left-0 right-0\" : sticky && \"sticky top-0\",\n transparent ? \"bg-transparent\" : \"bg-background/80\",\n blur && !transparent && \"backdrop-blur-md\",\n !transparent && \"border-b border-border\",\n className\n )}\n {...props}\n >\n <div className=\"max-w-7xl mx-auto\">\n {children}\n </div>\n </header>\n);\n\n/**\n * SDUI용 Uncontrolled 래퍼 컴포넌트들\n * 프리뷰에서 인터랙션이 동작하도록 자체 상태 관리\n */\n\n// Uncontrolled Checkbox - 클릭하면 상태 토글\nconst SDUICheckbox: React.FC<CheckboxProps> = ({ defaultChecked = false, onChange, ...props }) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Checkbox\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Switch - 클릭하면 상태 토글\nconst SDUISwitch: React.FC<SwitchProps> = ({ defaultChecked = false, onChange, ...props }) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Switch\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Input - 자체 상태 관리\nconst SDUIInput: React.FC<InputProps> = ({ defaultValue = \"\", onChange, ...props }) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Input\n {...props}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Textarea - 자체 상태 관리 + resize 지원\nconst SDUITextarea: React.FC<TextareaProps> = ({ defaultValue = \"\", onChange, resize = \"vertical\", ...props }) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Textarea\n {...props}\n resize={resize}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n/**\n * SDUI용 간단한 Accordion - 데이터 기반\n * items 배열로 아코디언 생성\n */\ninterface SimpleAccordionItem {\n title: string;\n content: string;\n value?: string;\n}\n\nconst SDUIAccordion: React.FC<{\n items?: SimpleAccordionItem[];\n type?: \"single\" | \"multiple\";\n collapsible?: boolean;\n defaultValue?: string;\n className?: string;\n}> = ({\n items = [],\n type = \"single\",\n collapsible = true,\n defaultValue,\n className = \"\",\n}) => {\n return (\n <Accordion\n type={type}\n collapsible={collapsible}\n defaultValue={defaultValue}\n className={className}\n >\n {items.map((item, index) => {\n const value = item.value || `item-${index}`;\n return (\n <AccordionItem key={value} value={value}>\n <AccordionTrigger>{item.title}</AccordionTrigger>\n <AccordionContent>{item.content}</AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordion>\n );\n};\n\n/**\n * SDUI용 간단한 Tabs - 데이터 기반\n * tabs 배열로 탭 생성\n */\ninterface SimpleTabItem {\n label: string;\n content: string;\n value?: string;\n}\n\nconst SDUITabs: React.FC<{\n tabs?: SimpleTabItem[];\n defaultValue?: string;\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\";\n className?: string;\n}> = ({\n tabs = [],\n defaultValue,\n variant = \"default\",\n className = \"\",\n}) => {\n const firstValue = tabs[0]?.value || \"tab-0\";\n\n return (\n <Tabs\n defaultValue={defaultValue || firstValue}\n variant={variant}\n className={className}\n >\n <TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsTrigger key={value} value={value}>\n {tab.label}\n </TabsTrigger>\n );\n })}\n </TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsContent key={value} value={value}>\n {tab.content}\n </TabsContent>\n );\n })}\n </Tabs>\n );\n};\n\n/**\n * 기본 컴포넌트 레지스트리\n */\nexport const defaultRegistry: SDUIComponentRegistry = {\n // 레이아웃\n Box,\n Spacer,\n Flex,\n Grid,\n Section,\n Container,\n Divider,\n\n // 타이포그래피\n Text,\n H1,\n H2,\n H3,\n H4,\n Link,\n\n // 미디어\n Image,\n Icon: SDUIIcon,\n\n // 기본 UI\n Button,\n Badge,\n Avatar,\n AvatarImage,\n AvatarFallback,\n Input: SDUIInput,\n Textarea: SDUITextarea,\n Label,\n Checkbox: SDUICheckbox,\n Switch: SDUISwitch,\n Skeleton,\n Progress,\n\n // 카드\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n\n // 피드백\n Alert,\n\n // Advanced (Pro)\n Header,\n HeroSection,\n ScrollProgress,\n\n // Interactive (Pro)\n Accordion: SDUIAccordion,\n Tabs: SDUITabs,\n};\n\n/**\n * 레지스트리 확장 헬퍼\n */\nexport function extendRegistry(\n customComponents: SDUIComponentRegistry\n): SDUIComponentRegistry {\n return {\n ...defaultRegistry,\n ...customComponents,\n };\n}\n\n/**\n * 컴포넌트 존재 여부 확인\n */\nexport function hasComponent(registry: SDUIComponentRegistry, type: string): boolean {\n return type in registry;\n}\n","\"use client\";\n\n/**\n * SDUI Renderer\n *\n * JSON 스키마를 받아서 실제 React 컴포넌트로 렌더링\n */\n\nimport React, { createContext, useContext, useState, useCallback, useMemo } from \"react\";\nimport type {\n SDUINode,\n SDUIPageSchema,\n SDUIRendererProps,\n SDUIContext,\n SDUIAction,\n SDUICondition,\n SDUIComponentRegistry,\n} from \"./types\";\nimport { defaultRegistry } from \"./registry\";\n\n// SDUI Context\nconst SDUIContextInternal = createContext<SDUIContext | null>(null);\n\n/**\n * SDUI Context Hook\n */\nexport function useSDUI(): SDUIContext {\n const context = useContext(SDUIContextInternal);\n if (!context) {\n throw new Error(\"useSDUI must be used within SDUIRenderer\");\n }\n return context;\n}\n\n/**\n * 데이터 경로로 값 가져오기\n * 예: \"user.profile.name\" → data.user.profile.name\n */\nfunction getByPath(obj: Record<string, unknown>, path: string): unknown {\n return path.split(\".\").reduce((acc: unknown, key) => {\n if (acc && typeof acc === \"object\" && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * 데이터 경로로 값 설정하기\n */\nfunction setByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): Record<string, unknown> {\n const keys = path.split(\".\");\n const result = { ...obj };\n let current: Record<string, unknown> = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n current[key] = { ...(current[key] as Record<string, unknown> || {}) };\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n return result;\n}\n\n/**\n * 조건 평가\n */\nfunction evaluateCondition(\n condition: SDUICondition,\n data: Record<string, unknown>\n): boolean {\n const value = getByPath(data, condition.path);\n\n switch (condition.operator) {\n case \"eq\":\n return value === condition.value;\n case \"neq\":\n return value !== condition.value;\n case \"gt\":\n return typeof value === \"number\" && value > (condition.value as number);\n case \"lt\":\n return typeof value === \"number\" && value < (condition.value as number);\n case \"gte\":\n return typeof value === \"number\" && value >= (condition.value as number);\n case \"lte\":\n return typeof value === \"number\" && value <= (condition.value as number);\n case \"exists\":\n return value !== undefined && value !== null;\n case \"notExists\":\n return value === undefined || value === null;\n default:\n return true;\n }\n}\n\n/**\n * Props에서 데이터 바인딩 처리\n * {{ path }} 형식을 실제 데이터로 치환\n */\nfunction resolveProps(\n props: Record<string, unknown>,\n data: Record<string, unknown>\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === \"string\") {\n // {{ path }} 패턴 처리\n const bindingMatch = value.match(/^\\{\\{\\s*(.+?)\\s*\\}\\}$/);\n if (bindingMatch) {\n resolved[key] = getByPath(data, bindingMatch[1]);\n } else {\n // 문자열 내 부분 바인딩: \"Hello, {{ user.name }}!\"\n resolved[key] = value.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n }\n } else if (Array.isArray(value)) {\n resolved[key] = value.map((item) =>\n typeof item === \"object\" && item !== null\n ? resolveProps(item as Record<string, unknown>, data)\n : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n resolved[key] = resolveProps(value as Record<string, unknown>, data);\n } else {\n resolved[key] = value;\n }\n }\n\n return resolved;\n}\n\n/**\n * 단일 노드 렌더러\n */\ninterface NodeRendererProps {\n node: SDUINode;\n registry: SDUIComponentRegistry;\n}\n\nfunction NodeRenderer({ node, registry }: NodeRendererProps) {\n const { data, handleAction } = useSDUI();\n\n // 조건부 렌더링 체크\n if (node.when && !evaluateCondition(node.when, data)) {\n return null;\n }\n\n // 컴포넌트 찾기\n const Component = registry[node.type];\n if (!Component) {\n console.warn(`[SDUI] Unknown component type: ${node.type}`);\n return (\n <div className=\"p-4 border border-destructive/50 bg-destructive/10 rounded text-sm text-destructive\">\n Unknown component: {node.type}\n </div>\n );\n }\n\n // Props 처리\n const resolvedProps = node.props ? resolveProps(node.props, data) : {};\n\n // 이벤트 핸들러 처리\n const eventProps: Record<string, unknown> = {};\n if (node.on) {\n if (node.on.click) {\n eventProps.onClick = () => handleAction(node.on!.click!);\n }\n if (node.on.submit) {\n eventProps.onSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n handleAction(node.on!.submit!);\n };\n }\n }\n\n // Children 처리\n let children: React.ReactNode = null;\n if (node.children) {\n if (typeof node.children === \"string\") {\n // 문자열 바인딩 처리\n children = node.children.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n } else if (Array.isArray(node.children)) {\n children = node.children.map((child, index) => (\n <NodeRenderer\n key={child.key || `child-${index}`}\n node={child}\n registry={registry}\n />\n ));\n }\n }\n\n // void 엘리먼트는 children을 받지 않음\n const voidElements = ['Divider', 'Input', 'Textarea', 'Checkbox', 'Switch', 'Progress', 'Skeleton', 'Image', 'ScrollProgress'];\n const isVoidElement = voidElements.includes(node.type);\n\n if (isVoidElement || children === null) {\n return <Component {...resolvedProps} {...eventProps} />;\n }\n\n return (\n <Component {...resolvedProps} {...eventProps}>\n {children}\n </Component>\n );\n}\n\n/**\n * SDUI Renderer 메인 컴포넌트\n */\nexport function SDUIRenderer({\n schema,\n components,\n data: initialData = {},\n onAction,\n onNavigate,\n}: SDUIRendererProps) {\n // 페이지 스키마인지 노드인지 확인\n const isPageSchema = \"root\" in schema;\n const rootNode = isPageSchema ? (schema as SDUIPageSchema).root : (schema as SDUINode);\n const schemaData = isPageSchema ? (schema as SDUIPageSchema).data : {};\n\n // 데이터 상태\n const [data, setDataState] = useState<Record<string, unknown>>({\n ...schemaData,\n ...initialData,\n });\n\n // 레지스트리 병합\n const registry = useMemo(\n () => ({ ...defaultRegistry, ...components }),\n [components]\n );\n\n // 데이터 업데이트\n const setData = useCallback((path: string, value: unknown) => {\n setDataState((prev) => setByPath(prev, path, value));\n }, []);\n\n // 네비게이션\n const navigate = useCallback(\n (path: string) => {\n if (onNavigate) {\n onNavigate(path);\n } else if (typeof window !== \"undefined\") {\n window.location.href = path;\n }\n },\n [onNavigate]\n );\n\n // 액션 핸들러\n const handleAction = useCallback(\n (action: SDUIAction) => {\n switch (action.type) {\n case \"navigate\":\n navigate(action.payload?.path as string);\n break;\n case \"setState\":\n if (action.payload?.path && action.payload?.value !== undefined) {\n setData(action.payload.path as string, action.payload.value);\n }\n break;\n case \"api\":\n // API 호출은 외부에서 처리\n onAction?.(action);\n break;\n case \"custom\":\n onAction?.(action);\n break;\n default:\n onAction?.(action);\n }\n },\n [navigate, setData, onAction]\n );\n\n // Context 값\n const contextValue: SDUIContext = useMemo(\n () => ({\n data,\n setData,\n handleAction,\n navigate,\n }),\n [data, setData, handleAction, navigate]\n );\n\n return (\n <SDUIContextInternal.Provider value={contextValue}>\n <NodeRenderer node={rootNode} registry={registry} />\n </SDUIContextInternal.Provider>\n );\n}\n\n/**\n * JSON 문자열에서 렌더링 (편의용)\n */\nexport function SDUIFromJSON({\n json,\n ...props\n}: Omit<SDUIRendererProps, \"schema\"> & { json: string }) {\n try {\n const schema = JSON.parse(json);\n return <SDUIRenderer schema={schema} {...props} />;\n } catch (error) {\n return (\n <div className=\"p-4 border border-destructive bg-destructive/10 rounded\">\n <p className=\"font-semibold text-destructive\">SDUI Parse Error</p>\n <pre className=\"text-sm mt-2 text-destructive/80\">\n {(error as Error).message}\n </pre>\n </div>\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/sdui/core.ts","../src/sdui/registry.tsx","../src/sdui/SDUIRenderer.tsx"],"names":["getByPath","obj","path","acc","key","setByPath","value","keys","result","current","i","evaluateCondition","condition","data","resolveProps","props","resolved","bindingMatch","resolveTextBindings","item","text","_","val","resolveDotString","dot","iterateEach","each","items","itemKey","indexKey","index","scopedData","keyVal","buildDot","parts","justifyDot","alignDot","textAlignDot","buildCustomStyle","base","overrides","s","buildTypoStyle","t","extra","Box","children","justify","align","style","backgroundColor","padding","margin","borderRadius","border","dotProp","rest","jsx","Spacer","size","Flex","direction","gap","Grid","cols","Section","Divider","mergeStyles","resolveDot","variantDotMap","Text","variant","fontSize","lineHeight","fontWeight","letterSpacing","H1","H2","H3","H4","Link","href","isExternal","Image","alt","SDUIIcon","name","Icon","Header","sticky","transparent","blur","overlay","SDUICheckbox","defaultChecked","onChange","checked","setChecked","useState","Checkbox","e","SDUISwitch","Switch","SDUIInput","defaultValue","setValue","Input","SDUITextarea","resize","Textarea","SDUIAccordion","type","collapsible","Accordion","jsxs","AccordionItem","AccordionTrigger","AccordionContent","SDUITabs","tabs","_a","firstValue","Tabs","TabsList","tab","TabsTrigger","TabsContent","SDUIStack","spacing","wrap","Stack","SDUIPanel","panelStyle","effect","rounded","Panel","SDUISectionHeader","title","description","SectionHeader","SDUIComponentLayout","ComponentLayout","SDUIPressable","disabled","Pressable","SDUIBreadcrumb","showHomeIcon","Breadcrumb","SDUIPagination","totalPages","shape","currentPage","setCurrentPage","Pagination","SDUINavigation","scale","NavigationComponent","SDUIPageNavigation","prevPage","nextPage","showOnMobile","PageNavigation","SDUIDotNav","position","DotNav","SDUIFeatureCard","icon","hover","gradient","FeatureCard","SDUIInfoCard","tone","InfoCard","SDUIStatsPanel","columns","loading","StatsPanel","SDUILanguageToggle","showLabel","currentLanguage","lang","setLang","LanguageToggle","SDUIThemeToggle","ThemeToggle","SDUIModal","triggerLabel","isOpen","setIsOpen","restStyle","restWithoutStyle","Modal","SDUITooltip","content","delay","Tooltip","SDUIPopover","Popover","SDUIDrawer","side","Drawer","SDUIBottomSheet","height","showDragHandle","BottomSheet","defaultRegistry","Container","Button","Badge","Avatar","AvatarImage","AvatarFallback","Label","Skeleton","Progress","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Alert","HeroSection","ScrollProgress","extendRegistry","customComponents","hasComponent","registry","SDUIContextInternal","createContext","useSDUI","context","useContext","ScopedDataProvider","parentCtx","scopedCtx","useMemo","resolveConstraints","constraints","attrs","NodeRenderer","node","handleAction","iterations","Fragment","NodeRendererInner","Component","resolvedProps","constraintStyle","eventProps","child","SDUIRenderer","schema","components","initialData","onAction","onNavigate","isPageSchema","rootNode","schemaData","setDataState","setData","useCallback","prev","navigate","action","_b","_c","contextValue","SDUIFromJSON","json","error"],"mappings":"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","file":"sdui.mjs","sourcesContent":["/**\n * SDUI Core — platform-agnostic logic\n *\n * SDUIRenderer에서 추출한 순수 함수 + v2 유틸리티\n */\n\nimport type { SDUICondition, SDUIEachBinding } from \"./types\";\n\n/**\n * 데이터 경로로 값 가져오기\n * 예: \"user.profile.name\" → data.user.profile.name\n */\nexport function getByPath(obj: Record<string, unknown>, path: string): unknown {\n return path.split(\".\").reduce((acc: unknown, key) => {\n if (acc && typeof acc === \"object\" && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * 데이터 경로로 값 설정하기 (immutable)\n */\nexport function setByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): Record<string, unknown> {\n const keys = path.split(\".\");\n const result = { ...obj };\n let current: Record<string, unknown> = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n current[key] = { ...(current[key] as Record<string, unknown> || {}) };\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n return result;\n}\n\n/**\n * 조건 평가\n */\nexport function evaluateCondition(\n condition: SDUICondition,\n data: Record<string, unknown>\n): boolean {\n const value = getByPath(data, condition.path);\n\n switch (condition.operator) {\n case \"eq\":\n return value === condition.value;\n case \"neq\":\n return value !== condition.value;\n case \"gt\":\n return typeof value === \"number\" && value > (condition.value as number);\n case \"lt\":\n return typeof value === \"number\" && value < (condition.value as number);\n case \"gte\":\n return typeof value === \"number\" && value >= (condition.value as number);\n case \"lte\":\n return typeof value === \"number\" && value <= (condition.value as number);\n case \"exists\":\n return value !== undefined && value !== null;\n case \"notExists\":\n return value === undefined || value === null;\n default:\n return true;\n }\n}\n\n/**\n * Props에서 데이터 바인딩 처리\n * {{ path }} 형식을 실제 데이터로 치환\n */\nexport function resolveProps(\n props: Record<string, unknown>,\n data: Record<string, unknown>\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === \"string\") {\n // {{ path }} 패턴 처리\n const bindingMatch = value.match(/^\\{\\{\\s*(.+?)\\s*\\}\\}$/);\n if (bindingMatch) {\n resolved[key] = getByPath(data, bindingMatch[1]);\n } else {\n // 문자열 내 부분 바인딩: \"Hello, {{ user.name }}!\"\n resolved[key] = resolveTextBindings(value, data);\n }\n } else if (Array.isArray(value)) {\n resolved[key] = value.map((item) =>\n typeof item === \"object\" && item !== null\n ? resolveProps(item as Record<string, unknown>, data)\n : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n resolved[key] = resolveProps(value as Record<string, unknown>, data);\n } else {\n resolved[key] = value;\n }\n }\n\n return resolved;\n}\n\n/**\n * 텍스트 내 {{ path }} 바인딩을 데이터로 치환\n */\nexport function resolveTextBindings(\n text: string,\n data: Record<string, unknown>\n): string {\n return text.replace(/\\{\\{\\s*(.+?)\\s*\\}\\}/g, (_, path) => {\n const val = getByPath(data, path);\n return val !== undefined ? String(val) : \"\";\n });\n}\n\n/**\n * dot 문자열 내 {{ path }} 바인딩 resolve\n * 예: \"bg-{{ emotion.color }}\" + {emotion: {color: \"cyan-500\"}} → \"bg-cyan-500\"\n */\nexport function resolveDotString(\n dot: string,\n data: Record<string, unknown>\n): string {\n return resolveTextBindings(dot, data);\n}\n\n/**\n * each 반복 결과 항목\n */\nexport interface EachIterationItem {\n /** Scoped data (부모 data + item/index 주입) */\n scopedData: Record<string, unknown>;\n /** Stable React key (each.key path → item value, fallback: index) */\n key: string;\n}\n\n/**\n * each 바인딩을 처리하여 scoped data + key 배열 반환\n *\n * 각 항목은 부모 data를 복사 + item/index 변수 주입\n * each.key가 있으면 item에서 해당 경로의 값을 React key로 사용\n */\nexport function iterateEach(\n each: SDUIEachBinding,\n data: Record<string, unknown>\n): EachIterationItem[] {\n const items = getByPath(data, each.of);\n if (!Array.isArray(items)) {\n return [];\n }\n\n const itemKey = each.as || \"item\";\n const indexKey = each.indexAs || \"index\";\n\n return items.map((item, index) => {\n const scopedData = {\n ...data,\n [itemKey]: item,\n [indexKey]: index,\n };\n\n // Resolve stable key from item\n let key = String(index);\n if (each.key && item && typeof item === \"object\") {\n const keyVal = getByPath(item as Record<string, unknown>, each.key);\n if (keyVal !== undefined && keyVal !== null) {\n key = String(keyVal);\n }\n }\n\n return { scopedData, key };\n });\n}\n","\"use client\";\n\n/**\n * SDUI Component Registry\n *\n * 컴포넌트 타입 문자열 → 실제 React 컴포넌트 매핑\n * dot 기반 cross-platform 스타일링\n */\n\nimport React, { useState } from \"react\";\nimport type { SDUIComponentRegistry } from \"./types\";\nimport { resolveDot, mergeStyles } from \"../hooks/useDotMap\";\n\n// hua-ui primitives (dot 지원)\nimport { Box as PrimitiveBox } from \"../components/Box\";\nimport { Text as PrimitiveText } from \"../components/Text\";\n\n// 기본 컴포넌트들\nimport { Button } from \"../components/Button\";\nimport {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n} from \"../components/Card\";\nimport { Badge } from \"../components/Badge\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../components/Avatar\";\nimport { Container } from \"../components/Container\";\nimport { Input } from \"../components/Input\";\nimport { Textarea } from \"../components/Textarea\";\nimport { Label } from \"../components/Label\";\nimport { Checkbox, type CheckboxProps } from \"../components/Checkbox\";\nimport { Switch, type SwitchProps } from \"../components/Switch\";\nimport { type InputProps } from \"../components/Input\";\nimport { type TextareaProps } from \"../components/Textarea\";\nimport { Skeleton } from \"../components/Skeleton\";\nimport { Progress } from \"../components/Progress\";\nimport { Alert } from \"../components/Alert\";\nimport { Icon } from \"../components/Icon\";\nimport type { IconName } from \"../lib/icons\";\n\n// Advanced 컴포넌트들\nimport { HeroSection } from \"../components/HeroSection\";\nimport { ScrollProgress } from \"../components/ScrollProgress\";\n\n// Batch A1 — Layout\nimport { Stack } from \"../components/Stack\";\nimport { Panel } from \"../components/Panel\";\nimport { SectionHeader } from \"../components/SectionHeader\";\nimport { ComponentLayout } from \"../components/ComponentLayout\";\nimport { Pressable } from \"../components/Pressable\";\n\n// Batch A2 — Navigation\nimport { Breadcrumb } from \"../components/Breadcrumb\";\nimport { Pagination } from \"../components/Pagination\";\nimport { Navigation } from \"../components/Navigation\";\nimport { PageNavigation } from \"../components/PageNavigation\";\nimport { DotNav } from \"../components/advanced/DotNav\";\nimport type { DotNavItem } from \"../components/advanced/DotNav\";\n\n// Batch A3 — Display\nimport { FeatureCard } from \"../components/FeatureCard\";\nimport { InfoCard } from \"../components/InfoCard\";\nimport { StatsPanel } from \"../components/StatsPanel\";\nimport type { StatsPanelItem } from \"../components/StatsPanel\";\nimport { LanguageToggle } from \"../components/LanguageToggle\";\nimport { ThemeToggle } from \"../components/ThemeToggle\";\n\n// Batch A4 — Overlay\nimport { Modal } from \"../components/Modal\";\nimport { Tooltip } from \"../components/Tooltip\";\nimport { Popover } from \"../components/Popover\";\nimport { Drawer } from \"../components/Drawer\";\nimport { BottomSheet } from \"../components/BottomSheet\";\n\n// Interactive 컴포넌트들\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from \"../components/Accordion\";\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"../components/Tabs\";\n\n// ── Helpers ──────────────────────────────────────────────\n\n/** dot 토큰 조합 (falsy 자동 필터) */\nfunction buildDot(...parts: (string | false | undefined | null)[]): string {\n return parts.filter(Boolean).join(\" \");\n}\n\nconst justifyDot: Record<string, string> = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n};\nconst alignDot: Record<string, string> = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n};\nconst textAlignDot: Record<string, string> = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n\n/** 임의값 style props → CSSProperties */\nfunction buildCustomStyle(\n base: React.CSSProperties | undefined,\n overrides: {\n backgroundColor?: string;\n padding?: string | number;\n margin?: string | number;\n borderRadius?: string | number;\n border?: string;\n },\n): React.CSSProperties | undefined {\n const s: React.CSSProperties = {\n ...base,\n ...(overrides.backgroundColor && {\n backgroundColor: overrides.backgroundColor,\n }),\n ...(overrides.padding !== undefined && {\n padding:\n typeof overrides.padding === \"number\"\n ? `${overrides.padding}px`\n : overrides.padding,\n }),\n ...(overrides.margin !== undefined && {\n margin:\n typeof overrides.margin === \"number\"\n ? `${overrides.margin}px`\n : overrides.margin,\n }),\n ...(overrides.borderRadius !== undefined && {\n borderRadius:\n typeof overrides.borderRadius === \"number\"\n ? `${overrides.borderRadius}px`\n : overrides.borderRadius,\n }),\n ...(overrides.border && { border: overrides.border }),\n };\n return Object.keys(s).length > 0 ? s : undefined;\n}\n\n/** 타이포그래피 style props */\ninterface TypographyStyleProps {\n fontSize?: string;\n lineHeight?: string;\n fontWeight?: string;\n letterSpacing?: string;\n}\n\nfunction buildTypoStyle(\n base: React.CSSProperties | undefined,\n t: TypographyStyleProps,\n): React.CSSProperties | undefined {\n const extra: React.CSSProperties = {};\n if (t.fontSize) extra.fontSize = t.fontSize;\n if (t.lineHeight) extra.lineHeight = t.lineHeight;\n if (t.fontWeight) extra.fontWeight = t.fontWeight;\n if (t.letterSpacing) extra.letterSpacing = t.letterSpacing;\n if (Object.keys(extra).length === 0) return base;\n return base ? { ...base, ...extra } : extra;\n}\n\n// ── Layout ──────────────────────────────────────────────\n\nconst Box: React.FC<{\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n backgroundColor?: string;\n padding?: string | number;\n margin?: string | number;\n borderRadius?: string | number;\n border?: string;\n dot?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}> = ({\n children,\n justify,\n align,\n style,\n backgroundColor,\n padding,\n margin,\n borderRadius,\n border,\n dot: dotProp,\n ...rest\n}) => (\n <PrimitiveBox\n dot={buildDot(\n (justify || align) && \"flex\",\n justify && justifyDot[justify],\n align && alignDot[align],\n dotProp,\n )}\n style={buildCustomStyle(style, {\n backgroundColor,\n padding,\n margin,\n borderRadius,\n border,\n })}\n {...rest}\n >\n {children}\n </PrimitiveBox>\n);\n\nconst Spacer: React.FC<{ size?: number; dot?: string }> = ({\n size = 16,\n dot: dotProp,\n}) => (\n <PrimitiveBox\n dot={buildDot(\"shrink-0\", dotProp)}\n style={{ width: size, height: size }}\n />\n);\n\nconst Flex: React.FC<{\n direction?: \"row\" | \"column\";\n gap?: number;\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n backgroundColor?: string;\n padding?: string | number;\n dot?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}> = ({\n children,\n direction = \"row\",\n gap = 0,\n justify = \"start\",\n align = \"stretch\",\n style,\n backgroundColor,\n padding,\n dot: dotProp,\n ...rest\n}) => (\n <PrimitiveBox\n dot={buildDot(\n \"flex\",\n direction === \"column\" && \"flex-col\",\n gap > 0 && `gap-${gap}`,\n justifyDot[justify],\n alignDot[align],\n dotProp,\n )}\n style={buildCustomStyle(style, { backgroundColor, padding })}\n {...rest}\n >\n {children}\n </PrimitiveBox>\n);\n\nconst Grid: React.FC<{\n cols?: number;\n gap?: number;\n backgroundColor?: string;\n padding?: string | number;\n dot?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}> = ({\n children,\n cols = 1,\n gap = 4,\n style,\n backgroundColor,\n padding,\n dot: dotProp,\n ...rest\n}) => (\n <PrimitiveBox\n dot={buildDot(\n \"grid\",\n `grid-cols-${cols}`,\n gap > 0 && `gap-${gap}`,\n dotProp,\n )}\n style={buildCustomStyle(style, { backgroundColor, padding })}\n {...rest}\n >\n {children}\n </PrimitiveBox>\n);\n\nconst Section: React.FC<{\n dot?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}> = ({ children, dot: dotProp, ...rest }) => (\n <PrimitiveBox as=\"section\" dot={buildDot(\"py-10\", dotProp)} {...rest}>\n {children}\n </PrimitiveBox>\n);\n\nconst Divider: React.FC<{\n dot?: string;\n style?: React.CSSProperties;\n}> = ({ dot: dotProp, style, ...rest }) => (\n <hr\n style={mergeStyles(resolveDot(buildDot(\"border-border\", dotProp)), style)}\n {...rest}\n />\n);\n\n// ── Typography ──────────────────────────────────────────\n\nconst variantDotMap: Record<string, string> = {\n body: \"text-foreground\",\n muted: \"text-muted-foreground text-sm\",\n lead: \"text-xl text-muted-foreground\",\n};\n\nconst Text: React.FC<\n {\n variant?: \"body\" | \"muted\" | \"lead\";\n align?: \"left\" | \"center\" | \"right\";\n dot?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n } & TypographyStyleProps\n> = ({\n children,\n variant = \"body\",\n align = \"center\",\n style,\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n dot: dotProp,\n ...rest\n}) => (\n <PrimitiveText\n as=\"p\"\n dot={buildDot(variantDotMap[variant], textAlignDot[align], dotProp)}\n style={buildTypoStyle(style, {\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n })}\n {...rest}\n >\n {children}\n </PrimitiveText>\n);\n\ntype HeadingProps = {\n align?: \"left\" | \"center\" | \"right\";\n dot?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n} & TypographyStyleProps;\n\nconst H1: React.FC<HeadingProps> = ({\n children,\n align = \"center\",\n style,\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n dot: dotProp,\n ...rest\n}) => (\n <PrimitiveText\n as=\"h1\"\n dot={buildDot(\"text-4xl font-bold\", textAlignDot[align], dotProp)}\n style={buildTypoStyle(style, {\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n })}\n {...rest}\n >\n {children}\n </PrimitiveText>\n);\n\nconst H2: React.FC<HeadingProps> = ({\n children,\n align = \"center\",\n style,\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n dot: dotProp,\n ...rest\n}) => (\n <PrimitiveText\n as=\"h2\"\n dot={buildDot(\"text-3xl font-bold\", textAlignDot[align], dotProp)}\n style={buildTypoStyle(style, {\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n })}\n {...rest}\n >\n {children}\n </PrimitiveText>\n);\n\nconst H3: React.FC<HeadingProps> = ({\n children,\n align = \"center\",\n style,\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n dot: dotProp,\n ...rest\n}) => (\n <PrimitiveText\n as=\"h3\"\n dot={buildDot(\"text-2xl font-semibold\", textAlignDot[align], dotProp)}\n style={buildTypoStyle(style, {\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n })}\n {...rest}\n >\n {children}\n </PrimitiveText>\n);\n\nconst H4: React.FC<HeadingProps> = ({\n children,\n align = \"center\",\n style,\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n dot: dotProp,\n ...rest\n}) => (\n <PrimitiveText\n as=\"h4\"\n dot={buildDot(\"text-xl font-semibold\", textAlignDot[align], dotProp)}\n style={buildTypoStyle(style, {\n fontSize,\n lineHeight,\n fontWeight,\n letterSpacing,\n })}\n {...rest}\n >\n {children}\n </PrimitiveText>\n);\n\nconst Link: React.FC<{\n href?: string;\n target?: string;\n rel?: string;\n dot?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}> = ({ children, href = \"#\", dot: dotProp, style, ...rest }) => {\n const isExternal = href.startsWith(\"http://\") || href.startsWith(\"https://\");\n return (\n <a\n href={href}\n style={mergeStyles(resolveDot(buildDot(\"text-primary\", dotProp)), style)}\n {...(isExternal ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {})}\n {...rest}\n >\n {children}\n </a>\n );\n};\n\nconst Image: React.FC<{\n src?: string;\n alt?: string;\n width?: number | string;\n height?: number | string;\n dot?: string;\n style?: React.CSSProperties;\n}> = ({ alt = \"\", dot: dotProp, style, ...rest }) => (\n <img\n alt={alt}\n style={mergeStyles(\n { maxWidth: \"100%\", height: \"auto\" },\n resolveDot(dotProp),\n style,\n )}\n {...rest}\n />\n);\n\n// SDUI용 Icon 래퍼\nconst SDUIIcon: React.FC<{ name?: string; size?: number }> = ({\n name = \"star\",\n size = 24,\n}) => <Icon name={name as IconName} size={size} />;\n\n// ── Advanced ────────────────────────────────────────────\n\nconst Header: React.FC<{\n sticky?: boolean;\n transparent?: boolean;\n blur?: boolean;\n overlay?: boolean;\n dot?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}> = ({\n children,\n sticky = true,\n transparent = false,\n blur = true,\n overlay = false,\n dot: dotProp,\n style,\n ...rest\n}) => (\n <PrimitiveBox\n as=\"header\"\n dot={buildDot(\n \"w-full px-4 py-3 z-50\",\n overlay\n ? \"absolute top-0 left-0 right-0\"\n : sticky\n ? \"sticky top-0\"\n : undefined,\n transparent ? \"bg-transparent\" : \"bg-background/80\",\n blur && !transparent && \"backdrop-blur-md\",\n !transparent && \"border-b border-border\",\n dotProp,\n )}\n style={style}\n {...rest}\n >\n <PrimitiveBox dot=\"max-w-7xl mx-auto\">{children}</PrimitiveBox>\n </PrimitiveBox>\n);\n\n/**\n * SDUI용 Uncontrolled 래퍼 컴포넌트들\n * 프리뷰에서 인터랙션이 동작하도록 자체 상태 관리\n */\n\n// Uncontrolled Checkbox - 클릭하면 상태 토글\nconst SDUICheckbox: React.FC<CheckboxProps> = ({\n defaultChecked = false,\n onChange,\n ...props\n}) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Checkbox\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Switch - 클릭하면 상태 토글\nconst SDUISwitch: React.FC<SwitchProps> = ({\n defaultChecked = false,\n onChange,\n ...props\n}) => {\n const [checked, setChecked] = useState(defaultChecked);\n return (\n <Switch\n {...props}\n checked={checked}\n onChange={(e) => {\n setChecked(e.target.checked);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Input - 자체 상태 관리\nconst SDUIInput: React.FC<InputProps> = ({\n defaultValue = \"\",\n onChange,\n ...props\n}) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Input\n {...props}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n// Uncontrolled Textarea - 자체 상태 관리 + resize 지원\nconst SDUITextarea: React.FC<TextareaProps> = ({\n defaultValue = \"\",\n onChange,\n resize = \"vertical\",\n ...props\n}) => {\n const [value, setValue] = useState(defaultValue);\n return (\n <Textarea\n {...props}\n resize={resize}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n onChange?.(e);\n }}\n />\n );\n};\n\n/**\n * SDUI용 간단한 Accordion - 데이터 기반\n */\ninterface SimpleAccordionItem {\n title: string;\n content: string;\n value?: string;\n}\n\nconst SDUIAccordion: React.FC<{\n items?: SimpleAccordionItem[];\n type?: \"single\" | \"multiple\";\n collapsible?: boolean;\n defaultValue?: string;\n}> = ({ items = [], type = \"single\", collapsible = true, defaultValue }) => {\n return (\n <Accordion\n type={type}\n collapsible={collapsible}\n defaultValue={defaultValue}\n >\n {items.map((item, index) => {\n const value = item.value || `item-${index}`;\n return (\n <AccordionItem key={value} value={value}>\n <AccordionTrigger>{item.title}</AccordionTrigger>\n <AccordionContent>{item.content}</AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordion>\n );\n};\n\n/**\n * SDUI용 간단한 Tabs - 데이터 기반\n */\ninterface SimpleTabItem {\n label: string;\n content: string;\n value?: string;\n}\n\nconst SDUITabs: React.FC<{\n tabs?: SimpleTabItem[];\n defaultValue?: string;\n variant?: \"default\" | \"pills\" | \"underline\" | \"cards\";\n}> = ({ tabs = [], defaultValue, variant = \"default\" }) => {\n const firstValue = tabs[0]?.value || \"tab-0\";\n\n return (\n <Tabs defaultValue={defaultValue || firstValue} variant={variant}>\n <TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsTrigger key={value} value={value}>\n {tab.label}\n </TabsTrigger>\n );\n })}\n </TabsList>\n {tabs.map((tab, index) => {\n const value = tab.value || `tab-${index}`;\n return (\n <TabsContent key={value} value={value}>\n {tab.content}\n </TabsContent>\n );\n })}\n </Tabs>\n );\n};\n\n// ── Batch A1 — Layout SDUI wrappers ─────────────────────────────────────────\n\nconst SDUIStack: React.FC<{\n direction?: \"vertical\" | \"horizontal\";\n spacing?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n justify?: \"start\" | \"center\" | \"end\" | \"between\" | \"around\" | \"evenly\";\n wrap?: boolean;\n dot?: string;\n children?: React.ReactNode;\n [key: string]: unknown;\n}> = ({\n children,\n direction = \"vertical\",\n spacing = \"md\",\n align = \"start\",\n justify = \"start\",\n wrap = false,\n dot: dotProp,\n ...rest\n}) => (\n <Stack\n direction={direction}\n spacing={spacing}\n align={align}\n justify={justify}\n wrap={wrap}\n dot={dotProp}\n {...(rest as React.HTMLAttributes<HTMLDivElement>)}\n >\n {children}\n </Stack>\n);\n\nconst SDUIPanel: React.FC<{\n style?:\n | \"default\"\n | \"solid\"\n | \"glass\"\n | \"outline\"\n | \"elevated\"\n | \"neon\"\n | \"holographic\"\n | \"cyberpunk\"\n | \"minimal\"\n | \"luxury\";\n effect?: \"none\" | \"glow\" | \"shadow\" | \"gradient\" | \"animated\";\n padding?:\n | \"none\"\n | \"small\"\n | \"sm\"\n | \"medium\"\n | \"md\"\n | \"large\"\n | \"lg\"\n | \"xl\"\n | \"custom\";\n rounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\" | \"custom\";\n dot?: string;\n children?: React.ReactNode;\n [key: string]: unknown;\n}> = ({\n children,\n style: panelStyle = \"default\",\n effect = \"none\",\n padding = \"md\",\n rounded = \"lg\",\n dot: dotProp,\n ...rest\n}) => (\n <Panel\n style={panelStyle}\n effect={effect}\n padding={padding}\n rounded={rounded}\n dot={dotProp}\n {...(rest as Omit<React.HTMLAttributes<HTMLDivElement>, \"style\">)}\n >\n {children}\n </Panel>\n);\n\nconst SDUISectionHeader: React.FC<{\n title?: string;\n description?: string;\n dot?: string;\n [key: string]: unknown;\n}> = ({ title = \"Section\", description, dot: dotProp, ...rest }) => (\n <SectionHeader\n title={title}\n description={description}\n dot={dotProp}\n {...(rest as React.HTMLAttributes<HTMLDivElement>)}\n />\n);\n\nconst SDUIComponentLayout: React.FC<{\n title?: string;\n description?: string;\n dot?: string;\n children?: React.ReactNode;\n [key: string]: unknown;\n}> = ({\n children,\n title = \"Component\",\n description = \"\",\n dot: dotProp,\n ...rest\n}) => (\n <ComponentLayout\n title={title}\n description={description}\n dot={dotProp}\n {...(rest as React.HTMLAttributes<HTMLDivElement>)}\n >\n {children}\n </ComponentLayout>\n);\n\nconst SDUIPressable: React.FC<{\n dot?: string;\n disabled?: boolean;\n children?: React.ReactNode;\n [key: string]: unknown;\n}> = ({ children, dot: dotProp, disabled, ...rest }) => (\n <Pressable\n dot={dotProp}\n disabled={disabled}\n {...(rest as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n {children}\n </Pressable>\n);\n\n// ── Batch A2 — Navigation SDUI wrappers ─────────────────────────────────────\n\nconst SDUIBreadcrumb: React.FC<{\n items?: Array<{ label: string; href?: string }>;\n showHomeIcon?: boolean;\n variant?: \"default\" | \"subtle\" | \"transparent\" | \"glass\";\n dot?: string;\n children?: React.ReactNode;\n [key: string]: unknown;\n}> = ({\n items,\n showHomeIcon,\n variant = \"default\",\n dot: dotProp,\n children,\n ...rest\n}) => (\n <Breadcrumb\n items={items}\n showHomeIcon={showHomeIcon}\n variant={variant}\n dot={dotProp}\n {...(rest as React.HTMLAttributes<HTMLDivElement>)}\n >\n {children}\n </Breadcrumb>\n);\n\nconst SDUIPagination: React.FC<{\n totalPages?: number;\n variant?: \"default\" | \"outlined\" | \"minimal\";\n size?: \"sm\" | \"md\" | \"lg\";\n shape?: \"square\" | \"circle\";\n dot?: string;\n [key: string]: unknown;\n}> = ({\n totalPages = 10,\n variant = \"default\",\n size = \"md\",\n shape = \"square\",\n dot: dotProp,\n ...rest\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n return (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setCurrentPage}\n variant={variant}\n size={size}\n shape={shape}\n dot={dotProp}\n {...(rest as React.HTMLAttributes<HTMLDivElement>)}\n />\n );\n};\n\nconst SDUINavigation: React.FC<{\n defaultValue?: string;\n variant?: \"pills\" | \"underline\" | \"cards\";\n scale?: \"small\" | \"medium\" | \"large\";\n dot?: string;\n children?: React.ReactNode;\n [key: string]: unknown;\n}> = ({\n children,\n defaultValue,\n variant = \"pills\",\n scale = \"medium\",\n dot: dotProp,\n ...rest\n}) => (\n <Navigation\n defaultValue={defaultValue}\n variant={variant}\n scale={scale}\n dot={dotProp}\n {...(rest as Omit<React.HTMLAttributes<HTMLDivElement>, \"defaultValue\">)}\n >\n {children}\n </Navigation>\n);\n\nconst SDUIPageNavigation: React.FC<{\n prevPage?: { title: string; href: string };\n nextPage?: { title: string; href: string };\n showOnMobile?: boolean;\n dot?: string;\n [key: string]: unknown;\n}> = ({ prevPage, nextPage, showOnMobile = true, dot: dotProp, ...rest }) => (\n <PageNavigation\n prevPage={prevPage}\n nextPage={nextPage}\n showOnMobile={showOnMobile}\n dot={dotProp}\n {...(rest as React.HTMLAttributes<HTMLDivElement>)}\n />\n);\n\nconst SDUIDotNav: React.FC<{\n items?: DotNavItem[];\n position?: \"left\" | \"right\";\n dot?: string;\n [key: string]: unknown;\n}> = ({ items = [], position = \"right\", dot: dotProp, ...rest }) => (\n <DotNav\n items={items}\n position={position}\n dot={dotProp}\n {...(rest as React.HTMLAttributes<HTMLElement>)}\n />\n);\n\n// ── Batch A3 — Display SDUI wrappers ────────────────────────────────────────\n\nconst SDUIFeatureCard: React.FC<{\n title?: string;\n description?: string;\n icon?: string;\n variant?: \"default\" | \"gradient\" | \"glass\" | \"neon\";\n size?: \"sm\" | \"md\" | \"lg\";\n hover?: \"scale\" | \"glow\" | \"slide\" | \"none\";\n gradient?: \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\";\n dot?: string;\n [key: string]: unknown;\n}> = ({\n title = \"Feature\",\n description = \"\",\n icon,\n variant = \"default\",\n size = \"md\",\n hover = \"scale\",\n gradient = \"blue\",\n dot: dotProp,\n ...rest\n}) => (\n <FeatureCard\n title={title}\n description={description}\n icon={icon as Parameters<typeof FeatureCard>[0][\"icon\"]}\n variant={variant}\n size={size}\n hover={hover}\n gradient={gradient}\n dot={dotProp}\n {...(rest as React.HTMLAttributes<HTMLDivElement>)}\n />\n);\n\nconst SDUIInfoCard: React.FC<{\n title?: string;\n icon?: string;\n tone?: \"blue\" | \"purple\" | \"green\" | \"orange\";\n dot?: string;\n children?: React.ReactNode;\n [key: string]: unknown;\n}> = ({\n children,\n title = \"Info\",\n icon = \"info\",\n tone = \"blue\",\n dot: dotProp,\n ...rest\n}) => (\n <InfoCard\n title={title}\n icon={icon as Parameters<typeof InfoCard>[0][\"icon\"]}\n tone={tone}\n dot={dotProp}\n {...(rest as React.HTMLAttributes<HTMLDivElement>)}\n >\n {children}\n </InfoCard>\n);\n\nconst SDUIStatsPanel: React.FC<{\n title?: string;\n items?: StatsPanelItem[];\n columns?: 1 | 2 | 3 | 4;\n loading?: boolean;\n dot?: string;\n [key: string]: unknown;\n}> = ({\n title,\n items = [],\n columns = 4,\n loading = false,\n dot: dotProp,\n ...rest\n}) => (\n <StatsPanel\n title={title}\n items={items}\n columns={columns}\n loading={loading}\n dot={dotProp}\n {...(rest as React.HTMLAttributes<HTMLDivElement>)}\n />\n);\n\nconst SDUILanguageToggle: React.FC<{\n size?: \"sm\" | \"md\" | \"lg\";\n variant?: \"button\" | \"icon\" | \"dropdown\";\n showLabel?: boolean;\n currentLanguage?: string;\n dot?: string;\n [key: string]: unknown;\n}> = ({\n size = \"md\",\n variant = \"button\",\n showLabel = false,\n currentLanguage = \"ko\",\n dot: dotProp,\n ...rest\n}) => {\n const [lang, setLang] = useState(currentLanguage);\n return (\n <LanguageToggle\n size={size}\n variant={variant}\n showLabel={showLabel}\n currentLanguage={lang}\n onLanguageChange={setLang}\n dot={dotProp}\n {...(rest as React.HTMLAttributes<HTMLElement>)}\n />\n );\n};\n\nconst SDUIThemeToggle: React.FC<{\n size?: \"sm\" | \"md\" | \"lg\";\n variant?: \"button\" | \"icon\" | \"switch\";\n showLabel?: boolean;\n dot?: string;\n [key: string]: unknown;\n}> = ({\n size = \"md\",\n variant = \"button\",\n showLabel = false,\n dot: dotProp,\n ...rest\n}) => (\n <ThemeToggle\n size={size}\n variant={variant}\n showLabel={showLabel}\n dot={dotProp}\n {...(rest as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n />\n);\n\n// ── Batch A4 — Overlay SDUI wrappers ────────────────────────────────────────\n\nconst SDUIModal: React.FC<{\n title?: string;\n description?: string;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\n triggerLabel?: string;\n dot?: string;\n children?: React.ReactNode;\n [key: string]: unknown;\n}> = ({\n children,\n title,\n description,\n size = \"md\",\n triggerLabel = \"Open Modal\",\n dot: dotProp,\n ...rest\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const { style: restStyle, ...restWithoutStyle } =\n rest as React.HTMLAttributes<HTMLDivElement>;\n return (\n <div {...restWithoutStyle} style={{ display: \"contents\", ...restStyle }}>\n <button\n onClick={() => setIsOpen(true)}\n style={mergeStyles(\n resolveDot(\n \"inline-flex items-center justify-center px-4 py-2 rounded-md bg-primary text-primary-foreground text-sm font-medium cursor-pointer border-none\",\n ),\n {},\n )}\n >\n {triggerLabel}\n </button>\n <Modal\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n title={title}\n description={description}\n size={size}\n dot={dotProp}\n >\n {children}\n </Modal>\n </div>\n );\n};\n\nconst SDUITooltip: React.FC<{\n content?: string;\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n variant?: \"default\" | \"light\" | \"dark\";\n delay?: number;\n dot?: string;\n children?: React.ReactNode;\n [key: string]: unknown;\n}> = ({\n children,\n content = \"Tooltip\",\n position = \"top\",\n variant = \"default\",\n delay = 300,\n dot: dotProp,\n ...rest\n}) => (\n <Tooltip\n content={content}\n position={position}\n variant={variant}\n delay={delay}\n dot={dotProp}\n {...(rest as React.HTMLAttributes<HTMLDivElement>)}\n >\n {children}\n </Tooltip>\n);\n\nconst SDUIPopover: React.FC<{\n triggerLabel?: string;\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"start\" | \"center\" | \"end\";\n dot?: string;\n children?: React.ReactNode;\n [key: string]: unknown;\n}> = ({\n children,\n triggerLabel = \"Open\",\n position = \"bottom\",\n align = \"center\",\n dot: dotProp,\n ...rest\n}) => (\n <Popover\n trigger={\n <button\n style={mergeStyles(\n resolveDot(\n \"inline-flex items-center justify-center px-3 py-2 rounded-md border border-border bg-background text-sm cursor-pointer\",\n ),\n {},\n )}\n >\n {triggerLabel}\n </button>\n }\n position={position}\n align={align}\n dot={dotProp}\n {...(rest as React.HTMLAttributes<HTMLDivElement>)}\n >\n {children}\n </Popover>\n);\n\nconst SDUIDrawer: React.FC<{\n side?: \"left\" | \"right\" | \"top\" | \"bottom\";\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n triggerLabel?: string;\n dot?: string;\n children?: React.ReactNode;\n [key: string]: unknown;\n}> = ({\n children,\n side = \"right\",\n size = \"md\",\n triggerLabel = \"Open Drawer\",\n dot: dotProp,\n ...rest\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const { style: restStyle, ...restWithoutStyle } =\n rest as React.HTMLAttributes<HTMLDivElement>;\n return (\n <div {...restWithoutStyle} style={{ display: \"contents\", ...restStyle }}>\n <button\n onClick={() => setIsOpen(true)}\n style={mergeStyles(\n resolveDot(\n \"inline-flex items-center justify-center px-4 py-2 rounded-md bg-primary text-primary-foreground text-sm font-medium cursor-pointer border-none\",\n ),\n {},\n )}\n >\n {triggerLabel}\n </button>\n <Drawer\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n side={side}\n size={size}\n dot={dotProp}\n >\n {children}\n </Drawer>\n </div>\n );\n};\n\nconst SDUIBottomSheet: React.FC<{\n height?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n triggerLabel?: string;\n showDragHandle?: boolean;\n dot?: string;\n children?: React.ReactNode;\n [key: string]: unknown;\n}> = ({\n children,\n height = \"md\",\n triggerLabel = \"Open Sheet\",\n showDragHandle = true,\n dot: dotProp,\n ...rest\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const { style: restStyle, ...restWithoutStyle } =\n rest as React.HTMLAttributes<HTMLDivElement>;\n return (\n <div {...restWithoutStyle} style={{ display: \"contents\", ...restStyle }}>\n <button\n onClick={() => setIsOpen(true)}\n style={mergeStyles(\n resolveDot(\n \"inline-flex items-center justify-center px-4 py-2 rounded-md bg-primary text-primary-foreground text-sm font-medium cursor-pointer border-none\",\n ),\n {},\n )}\n >\n {triggerLabel}\n </button>\n <BottomSheet\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n height={height}\n showDragHandle={showDragHandle}\n dot={dotProp}\n >\n {children}\n </BottomSheet>\n </div>\n );\n};\n\n/**\n * 기본 컴포넌트 레지스트리\n */\nexport const defaultRegistry: SDUIComponentRegistry = {\n // 레이아웃\n Box,\n Spacer,\n Flex,\n Grid,\n Section,\n Container,\n Divider,\n\n // 타이포그래피\n Text,\n H1,\n H2,\n H3,\n H4,\n Link,\n\n // 미디어\n Image,\n Icon: SDUIIcon,\n\n // 기본 UI\n Button,\n Badge,\n Avatar,\n AvatarImage,\n AvatarFallback,\n Input: SDUIInput,\n Textarea: SDUITextarea,\n Label,\n Checkbox: SDUICheckbox,\n Switch: SDUISwitch,\n Skeleton,\n Progress,\n\n // 카드\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n\n // 피드백\n Alert,\n\n // Advanced (Pro)\n Header,\n HeroSection,\n ScrollProgress,\n\n // Interactive (Pro)\n Accordion: SDUIAccordion,\n Tabs: SDUITabs,\n\n // Batch A1 — Layout\n Stack: SDUIStack,\n Panel: SDUIPanel,\n SectionHeader: SDUISectionHeader,\n ComponentLayout: SDUIComponentLayout,\n Pressable: SDUIPressable,\n\n // Batch A2 — Navigation\n Breadcrumb: SDUIBreadcrumb,\n Pagination: SDUIPagination,\n Navigation: SDUINavigation,\n PageNavigation: SDUIPageNavigation,\n DotNav: SDUIDotNav,\n\n // Batch A3 — Display\n FeatureCard: SDUIFeatureCard,\n InfoCard: SDUIInfoCard,\n StatsPanel: SDUIStatsPanel,\n LanguageToggle: SDUILanguageToggle,\n ThemeToggle: SDUIThemeToggle,\n\n // Batch A4 — Overlay\n Modal: SDUIModal,\n Tooltip: SDUITooltip,\n Popover: SDUIPopover,\n Drawer: SDUIDrawer,\n BottomSheet: SDUIBottomSheet,\n};\n\n/**\n * 레지스트리 확장 헬퍼\n */\nexport function extendRegistry(\n customComponents: SDUIComponentRegistry,\n): SDUIComponentRegistry {\n return {\n ...defaultRegistry,\n ...customComponents,\n };\n}\n\n/**\n * 컴포넌트 존재 여부 확인\n */\nexport function hasComponent(\n registry: SDUIComponentRegistry,\n type: string,\n): boolean {\n return Object.prototype.hasOwnProperty.call(registry, type);\n}\n","\"use client\";\n\n/**\n * SDUI Renderer\n *\n * JSON 스키마를 받아서 실제 React 컴포넌트로 렌더링\n */\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n} from \"react\";\nimport type {\n SDUINode,\n SDUIPageSchema,\n SDUIRendererProps,\n SDUIContext,\n SDUIAction,\n SDUIComponentRegistry,\n SDUIConstraints,\n} from \"./types\";\nimport { defaultRegistry } from \"./registry\";\nimport { resolveDot } from \"../hooks/useDotMap\";\nimport {\n evaluateCondition,\n resolveProps,\n resolveTextBindings,\n resolveDotString,\n iterateEach,\n setByPath,\n} from \"./core\";\n\n// SDUI Context\nconst SDUIContextInternal = createContext<SDUIContext | null>(null);\n\n/**\n * SDUI Context Hook\n */\nexport function useSDUI(): SDUIContext {\n const context = useContext(SDUIContextInternal);\n if (!context) {\n throw new Error(\"useSDUI must be used within SDUIRenderer\");\n }\n return context;\n}\n\n/**\n * Scoped data provider for each iteration\n */\nfunction ScopedDataProvider({\n data,\n children,\n}: {\n data: Record<string, unknown>;\n children: React.ReactNode;\n}) {\n const parentCtx = useSDUI();\n const scopedCtx = useMemo(() => ({ ...parentCtx, data }), [parentCtx, data]);\n return (\n <SDUIContextInternal.Provider value={scopedCtx}>\n {children}\n </SDUIContextInternal.Provider>\n );\n}\n\n/**\n * constraints → HTML 속성 매핑\n */\nfunction resolveConstraints(constraints: SDUIConstraints): {\n attrs: Record<string, unknown>;\n style: React.CSSProperties;\n} {\n const attrs: Record<string, unknown> = {};\n const style: React.CSSProperties = {};\n\n if (constraints.role) attrs.role = constraints.role;\n if (constraints.label) attrs[\"aria-label\"] = constraints.label;\n if (constraints.level !== undefined) attrs[\"aria-level\"] = constraints.level;\n if (constraints.hidden !== undefined)\n attrs[\"aria-hidden\"] = constraints.hidden;\n\n if (constraints.minTapTarget !== undefined) {\n style.minWidth = constraints.minTapTarget;\n style.minHeight = constraints.minTapTarget;\n }\n if (constraints.truncate !== undefined) {\n style.overflow = \"hidden\";\n style.display = \"-webkit-box\";\n style.WebkitLineClamp = constraints.truncate;\n style.WebkitBoxOrient = \"vertical\";\n }\n\n return { attrs, style };\n}\n\n/**\n * 단일 노드 렌더러\n */\ninterface NodeRendererProps {\n node: SDUINode;\n registry: SDUIComponentRegistry;\n}\n\nfunction NodeRenderer({ node, registry }: NodeRendererProps) {\n const { data, handleAction } = useSDUI();\n\n // 조건부 렌더링 체크\n if (node.when && !evaluateCondition(node.when, data)) {\n return null;\n }\n\n // each 처리: 배열 반복 렌더링\n if (node.each) {\n const iterations = iterateEach(node.each, data);\n if (iterations.length === 0) return null;\n\n return (\n <>\n {iterations.map(({ scopedData, key }) => (\n <ScopedDataProvider key={key} data={scopedData}>\n <NodeRendererInner node={node} registry={registry} />\n </ScopedDataProvider>\n ))}\n </>\n );\n }\n\n return <NodeRendererInner node={node} registry={registry} />;\n}\n\n/**\n * 내부 노드 렌더러 (each 처리 이후)\n */\nfunction NodeRendererInner({ node, registry }: NodeRendererProps) {\n const { data, handleAction } = useSDUI();\n\n // 컴포넌트 찾기\n const Component = registry[node.type];\n if (!Component) {\n console.warn(`[SDUI] Unknown component type: ${node.type}`);\n return (\n <div\n style={{\n ...resolveDot(\"p-4\"),\n border: \"1px solid #ef4444\",\n ...resolveDot(\"rounded\"),\n fontSize: 14,\n color: \"#ef4444\",\n backgroundColor: \"rgba(239,68,68,0.1)\",\n }}\n >\n Unknown component: {node.type}\n </div>\n );\n }\n\n // Props 처리\n const resolvedProps = node.props ? resolveProps(node.props, data) : {};\n\n // dot 처리: 바인딩 resolve 후 props에 주입\n if (node.dot) {\n resolvedProps.dot = resolveDotString(node.dot, data);\n }\n\n // constraints → aria-* + style 매핑\n if (node.constraints) {\n const { attrs, style: constraintStyle } = resolveConstraints(\n node.constraints,\n );\n Object.assign(resolvedProps, attrs);\n if (Object.keys(constraintStyle).length > 0) {\n resolvedProps.style = {\n ...((resolvedProps.style as React.CSSProperties) || {}),\n ...constraintStyle,\n };\n }\n }\n\n // 이벤트 핸들러 처리\n const eventProps: Record<string, unknown> = {};\n if (node.on) {\n if (node.on.click) {\n eventProps.onClick = () => handleAction(node.on!.click!);\n }\n if (node.on.submit) {\n eventProps.onSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n handleAction(node.on!.submit!);\n };\n }\n }\n\n // Children 처리\n let children: React.ReactNode = null;\n if (node.children) {\n if (typeof node.children === \"string\") {\n children = resolveTextBindings(node.children, data);\n } else if (Array.isArray(node.children)) {\n children = node.children.map((child, index) => (\n <NodeRenderer\n key={child.key || `child-${index}`}\n node={child}\n registry={registry}\n />\n ));\n }\n }\n\n // void 엘리먼트는 children을 받지 않음\n const voidElements = [\n \"Divider\",\n \"Input\",\n \"Textarea\",\n \"Checkbox\",\n \"Switch\",\n \"Progress\",\n \"Skeleton\",\n \"Image\",\n \"ScrollProgress\",\n // Batch A2/A3 void elements\n \"PageNavigation\",\n \"DotNav\",\n \"StatsPanel\",\n \"LanguageToggle\",\n \"ThemeToggle\",\n \"SectionHeader\",\n \"Pagination\",\n ];\n const isVoidElement = voidElements.includes(node.type);\n\n if (isVoidElement || children === null) {\n return <Component {...resolvedProps} {...eventProps} />;\n }\n\n return (\n <Component {...resolvedProps} {...eventProps}>\n {children}\n </Component>\n );\n}\n\n/**\n * SDUI Renderer 메인 컴포넌트\n */\nexport function SDUIRenderer({\n schema,\n components,\n data: initialData = {},\n onAction,\n onNavigate,\n}: SDUIRendererProps) {\n // 페이지 스키마인지 노드인지 확인\n const isPageSchema = \"root\" in schema;\n const rootNode = isPageSchema\n ? (schema as SDUIPageSchema).root\n : (schema as SDUINode);\n const schemaData = isPageSchema ? (schema as SDUIPageSchema).data : {};\n\n // 데이터 상태\n const [data, setDataState] = useState<Record<string, unknown>>({\n ...schemaData,\n ...initialData,\n });\n\n // 레지스트리 병합\n const registry = useMemo(\n () => ({ ...defaultRegistry, ...components }),\n [components],\n );\n\n // 데이터 업데이트\n const setData = useCallback((path: string, value: unknown) => {\n setDataState((prev) => setByPath(prev, path, value));\n }, []);\n\n // 네비게이션\n const navigate = useCallback(\n (path: string) => {\n if (onNavigate) {\n onNavigate(path);\n } else if (typeof window !== \"undefined\") {\n window.location.href = path;\n }\n },\n [onNavigate],\n );\n\n // 액션 핸들러\n const handleAction = useCallback(\n (action: SDUIAction) => {\n switch (action.type) {\n case \"navigate\":\n navigate(action.payload?.path as string);\n break;\n case \"setState\":\n if (action.payload?.path && action.payload?.value !== undefined) {\n setData(action.payload.path as string, action.payload.value);\n }\n break;\n case \"api\":\n // API 호출은 외부에서 처리\n onAction?.(action);\n break;\n case \"custom\":\n onAction?.(action);\n break;\n default:\n onAction?.(action);\n }\n },\n [navigate, setData, onAction],\n );\n\n // Context 값\n const contextValue: SDUIContext = useMemo(\n () => ({\n data,\n setData,\n handleAction,\n navigate,\n }),\n [data, setData, handleAction, navigate],\n );\n\n return (\n <SDUIContextInternal.Provider value={contextValue}>\n <NodeRenderer node={rootNode} registry={registry} />\n </SDUIContextInternal.Provider>\n );\n}\n\n/**\n * JSON 문자열에서 렌더링 (편의용)\n */\nexport function SDUIFromJSON({\n json,\n ...props\n}: Omit<SDUIRendererProps, \"schema\"> & { json: string }) {\n try {\n const schema = JSON.parse(json);\n return <SDUIRenderer schema={schema} {...props} />;\n } catch (error) {\n return (\n <div\n style={{\n ...resolveDot(\"p-4\"),\n border: \"1px solid #ef4444\",\n ...resolveDot(\"rounded\"),\n backgroundColor: \"rgba(239,68,68,0.1)\",\n }}\n >\n <p style={{ fontWeight: 600, color: \"#ef4444\" }}>SDUI Parse Error</p>\n <pre\n style={{\n fontSize: 14,\n ...resolveDot(\"mt-2\"),\n color: \"rgba(239,68,68,0.8)\",\n }}\n >\n {(error as Error).message}\n </pre>\n </div>\n );\n }\n}\n"]}
|